The short answer
For a dental group of about 3 to 50 or more offices, build one marketing report that uses the same definitions at every door. Give each office one office slug, and carry that slug on tagged links, on the Google Ads campaign name when the campaign is that office, on one GA4 custom dimension, and on the label of that office's tracking number. The sheet has three blocks: a group roll-up, one row per office, and an exceptions list for anything that could not be tied to a door. Read the exceptions on a weekly operations pass. Read the full sheet once a month with leadership. Neither reading is a forecast. None of the Google pages below publish a benchmark, a percent, or a return for doing this.
This guide is for a marketing lead who has to put every location on one sheet. It covers the dictionary, the office identifier, and the layout. A single office should use the monthly practice report and which marketing KPIs a practice tracks. This guide reads the offices side by side. The service page for the measurement stack is dashboards and reporting. The map of the other group jobs is marketing a multi-location practice or DSO.
KPI dictionary
Write the seven definitions once. Three offices and fifty offices use the same sentences. A larger group has more rows. It does not get a private meaning for "qualified." If two offices disagree, the sheet is not ready to compare them.
Calls
Count this
Connected calls to a number labeled with that office, from the one system named in the dictionary, for the same dates as every other row.
Leave this out
A tap on a call button, a click on a call asset, or a Business Profile call-button click. Those are separate measurements.
Qualified calls
Count this
The subset of calls that meet the single rule the group wrote down and uses at every office. Name the rule in the header: a minimum length you set in Google Ads, an imported mark from the practice system, or the lead classification Google describes when call recording is on.
Leave this out
The sum of duration, an AI classification, and a front-desk note. Those are three counts. Only the named rule fills this cell.
Form leads
Count this
Form submissions recorded as the form key event, with that office's slug on the event, and nothing about the person in the payload.
Leave this out
A view of the form page, a click on the submit button that did not send, or a row copied from another office because the slug was blank.
Online bookings
Count this
Booking confirmations for that office in the same dates: either the booking key event with the office slug, or the count the scheduler exported for that door. Say which one the column uses.
Leave this out
A Business Profile booking, which Google counts only when a booking provider manages the profile booking, and which belongs in the profile-actions lines.
Business Profile actions
Count this
The interactions Google shows for that verified profile in the performance report: call-button clicks, website clicks, and direction requests, plus messages or provider bookings only when that profile shows them. Read them from that profile, or from the multi-profile download.
Leave this out
A substitute for calls or for website bookings. The performance report includes actions from organic results and from Google Ads, so adding it to an Ads column counts some activity twice.
Ad cost per office
Count this
The cost Google Ads reports for campaigns whose names are that office, over the same dates. The campaign name is the label you chose so you can find the campaign. Customers do not see it.
Leave this out
A share of a campaign that covers several offices. That cost stays on the exceptions list until the campaign is one office.
New patient starts
Count this
The count the practice's own records show as a new patient start at that office for those dates. If the practice did not export the count, the cell stays empty.
Leave this out
An estimate built from calls, forms, or ad clicks. An agency does not fill this cell. It is not a Google Ads conversion and not a key event.
| Metric | Count this | Leave this out |
|---|---|---|
| Calls | Connected calls to a number labeled with that office, from the one system named in the dictionary, for the same dates as every other row. | A tap on a call button, a click on a call asset, or a Business Profile call-button click. Those are separate measurements. |
| Qualified calls | The subset of calls that meet the single rule the group wrote down and uses at every office. Name the rule in the header: a minimum length you set in Google Ads, an imported mark from the practice system, or the lead classification Google describes when call recording is on. | The sum of duration, an AI classification, and a front-desk note. Those are three counts. Only the named rule fills this cell. |
| Form leads | Form submissions recorded as the form key event, with that office's slug on the event, and nothing about the person in the payload. | A view of the form page, a click on the submit button that did not send, or a row copied from another office because the slug was blank. |
| Online bookings | Booking confirmations for that office in the same dates: either the booking key event with the office slug, or the count the scheduler exported for that door. Say which one the column uses. | A Business Profile booking, which Google counts only when a booking provider manages the profile booking, and which belongs in the profile-actions lines. |
| Business Profile actions | The interactions Google shows for that verified profile in the performance report: call-button clicks, website clicks, and direction requests, plus messages or provider bookings only when that profile shows them. Read them from that profile, or from the multi-profile download. | A substitute for calls or for website bookings. The performance report includes actions from organic results and from Google Ads, so adding it to an Ads column counts some activity twice. |
| Ad cost per office | The cost Google Ads reports for campaigns whose names are that office, over the same dates. The campaign name is the label you chose so you can find the campaign. Customers do not see it. | A share of a campaign that covers several offices. That cost stays on the exceptions list until the campaign is one office. |
| New patient starts | The count the practice's own records show as a new patient start at that office for those dates. If the practice did not export the count, the cell stays empty. | An estimate built from calls, forms, or ad clicks. An agency does not fill this cell. It is not a Google Ads conversion and not a key event. |
A qualified call is only as clear as the rule in the header. Phone call conversion tracking can count a call from an ad, or a call to a forwarding number on the site, when the call lasts at least a minimum length you set. A shorter call is not counted. The same page counts a click on a phone number on a mobile site as a click, not as the call. Measure calls from ads adds a second path: when call recording is on, Google's AI can classify lead quality, and when recording is off or a call cannot be recorded, the count uses the duration you set. Recording, on that page, is limited to calls where both parties are in the United States or Canada. Importing a call your own system already marked is a third path. Pick one for the column.
A key event is an event you mark because the action matters. Reports can show the count by a dimension. You can create a Google Ads conversion from that key event so the two products are aimed at the same action. Marking the event does not make a name safe to attach. How those events are named, without patient details, is already written in GA4 calls, forms, and bookings. This page only requires that the report column and the event are the same action.
One office slug
The slug is a stable label, such as oak-park. It is how the four systems join. It is not a doctor's name, not a patient's name, and not the string on the sign. Publish the list before you rename campaigns. Changing the spelling later splits history into two offices.
UTM parameters
What carries the slug
The same lowercase slug on every tagged link. Set utm_source, utm_medium, and utm_campaign together. When the campaign name is already the office, that name is the slug. When one campaign covers several doors, put the slug in utm_content and keep the campaign name stable.
What stays out
A patient name, email, phone number, or chart id. Google's privacy page lists campaign content among the fields that must not carry that kind of information. Different capitalization is a second office, because the values are case sensitive.
Google Ads campaign name
What carries the slug
The office slug, when that campaign's budget and location settings belong to one door. Google's account is the access and billing layer. Campaigns hold the budget and the settings. A different budget or a different location target is a reason to use a separate campaign.
What stays out
The slug does not go in the public Business Profile name. A location asset can show the profile address, a map or distance, and a call button. That public string stays the real-world name.
GA4 dimension
What carries the slug
One event parameter, registered once as an event-scoped custom dimension, on the form event, the booking event, and the call event. The dimension name uses a space or an underscore. Google does not allow a hyphen in that name.
What stays out
A value per person or per session. Google warns that a high-cardinality dimension can collapse into an (other) row, and that a value which looks like a number can be stored as a number. A patient id fails both tests. A repeated office label that starts with a letter does not.
Call tracking numbers
What carries the slug
A label on each number the group controls, and that label is one office slug. The call report can then be joined to the office row without guessing.
What stays out
A Google forwarding number used as the printed number or as a label shared by two doors. Call reporting assigns that number so Ads can see duration and whether the call connected. Google owns it, and it can be reassigned. It stays inside call reporting and the post-click website swap.
| Place | What carries the slug | What stays out |
|---|---|---|
| UTM parameters | The same lowercase slug on every tagged link. Set utm_source, utm_medium, and utm_campaign together. When the campaign name is already the office, that name is the slug. When one campaign covers several doors, put the slug in utm_content and keep the campaign name stable. | A patient name, email, phone number, or chart id. Google's privacy page lists campaign content among the fields that must not carry that kind of information. Different capitalization is a second office, because the values are case sensitive. |
| Google Ads campaign name | The office slug, when that campaign's budget and location settings belong to one door. Google's account is the access and billing layer. Campaigns hold the budget and the settings. A different budget or a different location target is a reason to use a separate campaign. | The slug does not go in the public Business Profile name. A location asset can show the profile address, a map or distance, and a call button. That public string stays the real-world name. |
| GA4 dimension | One event parameter, registered once as an event-scoped custom dimension, on the form event, the booking event, and the call event. The dimension name uses a space or an underscore. Google does not allow a hyphen in that name. | A value per person or per session. Google warns that a high-cardinality dimension can collapse into an (other) row, and that a value which looks like a number can be stored as a number. A patient id fails both tests. A repeated office label that starts with a letter does not. |
| Call tracking numbers | A label on each number the group controls, and that label is one office slug. The call report can then be joined to the office row without guessing. | A Google forwarding number used as the printed number or as a label shared by two doors. Call reporting assigns that number so Ads can see duration and whether the call connected. Google owns it, and it can be reassigned. It stays inside call reporting and the post-click website swap. |
URL builders describe utm_content as the parameter that tells creatives apart, and they say to set source, medium, and campaign whenever you tag a link. Parameter values are case sensitive. They are omitted from the landing page and page path dimensions and show on page location instead. A group that already has a spelling should keep it. The pattern used with profiles is in profile governance. Do not invent a second spelling for paid links. Avoiding personally identifiable information applies to those campaign fields, to custom dimensions, and to page titles. If you are unsure a field counts, ask counsel. Do not test the question with a patient record.
Account organization is three layers: the account, its campaigns, and its ad groups. The account is the sign-in and the billing. Campaign settings include the campaign name, which customers do not see, and Google recommends a name that describes the campaign so you can find it. Organizing with ad groups says to create a separate campaign when you need a different budget or a different set of location targets. That is the naming rule for ad cost per office: the campaign name is the slug when the campaign is one door. Location assets can show the address, a map or distance, and a call button drawn from the profile of an office you own. They are not a field for the slug. Budgets, shared pools, and which asset type belongs on an owned office are in DSO Google Ads budgets and call attribution.
Register the parameter as an event-scoped custom dimension. That scope is for a category on an action. Google says to prefer a predefined dimension when one exists, and not to create a high-cardinality dimension, because reports can condense that data under an (other) row. The examples to avoid are a unique id per user, a session id, and a timestamp. The same page says a value that looks like a number can be stored as a number. Creating the dimension asks for a name with no hyphen, a scope you cannot change later, and the event parameter name. An editor or administrator can add it to a report 24 to 48 hours after the data was sent and the dimension was created. That interval is Google's note about the dimension. It is not a promise about calls or new patients.
The page has to supply the slug before the tag fires. Tag Manager can hold a value in the data layer for tags and variables. The data layer does not carry itself to the next page, so each office page sets the slug. A data layer variable reads the key you pushed. Point the Analytics tag at that variable. Do not point it at the form fields. A name, a phone number, or the text a visitor typed does not belong in the push.
Call reporting uses a Google forwarding number to record duration, start time, and whether the call connected. For a call longer than 15 seconds it can include the caller number, except in India. That number can sit in the ads report. It does not sit on this sheet. The forwarding number is Google's and can be reassigned, so it is not the profile phone and not a slug you print. The number you control gets the office label. Who answers, and which number stays on the profile, is in office phones, a central call team, or a hybrid.
Report layout
Read the sheet in this order. A group total with the exceptions hidden is the failure mode this layout is meant to prevent.
1. Group roll-up
The first block sums the office rows for the columns that are counts of the same thing: calls, qualified calls, form leads, online bookings, and ad cost for campaigns named as one office. It also states how many offices have an exception. It does not turn Business Profile actions into a count of people. Views on a profile are a separate metric, and a person can appear on more than one door. If a Google Analytics property is linked to the profiles, that link shows the sum of the linked profiles for the metrics Google lists, and it cannot be filtered to one profile. Use it as a check on the group total, not as the office rows.
2. One row per office
The second block is one row for every open office, in the same order as the slug list, for one start date and one end date. Columns are the seven metrics above, filled from the systems the dictionary names. A closed door stays on the list with a status, so a missing row is not mistaken for a quiet office. Sort by the slug, not by whichever office had the largest number that month.
3. Exceptions
The third block lists what the first two blocks could not place: a visit or a form with no office slug, a number shared by more than one office, a campaign whose cost covers several doors, a new-patient cell the practice did not supply, and any call total that mixed two definitions. Leave the rows here. Deleting them makes the roll-up look finished when the tagging is not.
Business Profile performance is available for a verified profile, to an owner or manager signed in on that profile. The report can include call-button clicks, website clicks, direction requests, messages, and bookings when a booking provider is connected. Only metrics that apply to that business are shown. Performance data includes views, searches, and actions from organic results and from Google Ads. If you manage several profiles, you can download them together and compare locations. That download is the per-office source.
Linking those profiles to a GA4 property adds a Business Profile collection with interactions, website clicks, calls, directions, messages, bookings, and menus, summed across the linked profiles. Google says you cannot segment that sum by one profile, and the metrics cover the last 6 months. The link is a group check. It is not the office block. Business Profile actions stay on the office row only when they were read for that profile.
Weekly check and monthly read
Use two readings of the same sheet. They answer different questions. Neither one promises a result.
- •Weekly operations check. Open the exceptions block and any office row that is blank or that lost its slug. Repair the tag, the number label, or the campaign name. A new custom dimension may not be reportable on the day you create it. Google's note is 24 to 48 hours after the data was sent and the dimension was created. The week is a repair pass. It is not a verdict on the marketing.
- •Monthly leadership read. Walk the roll-up, then every office row, then the exceptions that are still open. Use the same definitions and the same date rule as the previous export the group kept. If you compare a number, compare it with that prior export.
A single practice's monthly habit, including which supporting numbers to pull for one door, stays on the practice report. The list of single-practice measures stays on the KPI guide. Do not paste either page into the group sheet and drop the office column. Questions to ask a firm about reconciliation, without a league table, are in how to choose a DSO dental marketing company.
Data-quality checks
Run these three checks before the monthly read. A failed check stays in the exceptions block. It is not smoothed into a neighboring office.
1. Missing office tag
A URL, an event, or a call export with no slug cannot be assigned to a door after the fact. Park it in exceptions. Do not drop it on the first office in the list, and do not create a row called corporate to hide it. UTM parameters are omitted from the landing page and page path dimensions and show on page location, so a check that only reads the path can miss a slug that was sent.
2. Shared numbers
One tracking number labeled for two offices, or one line pasted onto more than one profile, cannot be split by a report. Call reporting can say that a call connected and how long it lasted. It cannot invent which door a shared number belonged to. Give the number one slug, or take it off the per-office columns. Which number is allowed on the profile is in the phone guide.
3. Double-counted calls
A tap on a call asset is charged as a click. A call that lasts at least the minimum length you set can be a conversion, and a shorter call is not. A click on a phone number on a mobile site is a click, not a connected call. Business Profile calls are clicks on the call button, and that performance report includes actions from organic results and from ads. Keep each of those in the column its definition names. Adding them produces a larger call total and a less honest office row.
Office slug and tag checker
Red flags in agency reporting
These are checks on the report a firm hands you. They do not name or rank any firm.
-
1. The deck has a group total and no office rows.
Leadership cannot see which door the calls, forms, or cost belonged to. A total is the first block of the report, not the whole report.
-
2. Qualified means something different at each office.
Then the column cannot be compared. The header has to name one rule: the duration you set, the imported practice mark, or the recorded lead classification, and every office uses that rule.
-
3. The export contains a patient name, a phone number, an email, or a chart note.
The marketing row is the office and the counts. Google's Analytics guidance says not to send information Google could recognize as personally identifiable, including in campaign parameters and custom dimensions. Ask counsel once before anyone turns on call recording or copies a caller number out of call details. Keep patient details out of the sheet.
-
4. New patient starts are filled in without the practice export.
Calls and form leads are not starts. If the practice system did not report the count for that office and those dates, the cell stays empty.
-
5. Shared campaign cost is split across offices by a ratio.
Google reports cost on the campaign. When the campaign covers several doors, that cost is an exception, not an office cost. A separate campaign is how a different budget or a different location target is held apart.
-
6. Unmatched rows were removed so the roll-up looks complete.
The exceptions block is part of the report. A missing slug, a shared number, or a blank start count is the finding. Hiding it does not repair the tag.
Checklist
Twelve checks before the monthly read. Ticks stay in this browser only.
Per-office report checklist
12 items
What DDS Web Solutions builds
DDS Web Solutions builds practice websites. Our team has been building websites since 2014, and we have served 100+ practices. Offices are in Sacramento and San Mateo. The products are Smyly, SmileTrak, and ToothRank. The planning page is DSO and multi-location marketing.
Sources
Wording on these pages can change, so confirm the live page. This is marketing guidance, not legal advice.
- •Google Analytics Help: URL builders, collect campaign data with custom URLs
- •Google Analytics Help: About custom dimensions and metrics
- •Google Analytics Help: Create event-scoped custom dimensions
- •Google Analytics Help: About key events
- •Google Analytics Help: Avoid sending personally identifiable information
- •Google Analytics Help: Connect Google Business Profile to Google Analytics
- •Google Ads Help: About campaign settings
- •Google Ads Help: About your account organization
- •Google Ads Help: Organize your account with ad groups
- •Google Ads Help: About location assets
- •Google Ads Help: About call reporting
- •Google Ads Help: About phone call conversion tracking
- •Google Ads Help: Measure calls from ads
- •Google Business Profile Help: Understand your Business Profile performance and insights
- •Tag Manager Help: Components of Google Tag Manager
- •Tag Manager Help: User-defined variable types for web