Case Studies / GBP Multi-Location Dashboard
Google Business Profile Google Apps Script Looker Studio Google Sheets

They Had Dozens of Google Business Profile Locations and No Way to See Them Together. We Built the Dashboard Without Exposing One Client's Data to Another.

Google Business Profile Insights works fine for one location. For a portfolio of dozens spread across different clients, different cities, and different industries, it's a fragmented mess. Here's how we built a Google Apps Script that pulls 8 performance metrics daily from the GBP API into per-client Google Sheets, then unified everything in Looker Studio so the client could see all stores as one entity and drill into each individually, while guaranteeing no client could ever see another's data.

8 Metrics

Per Location, Daily

365 Days

Rolling Window

Per-Client

Data Isolation

The Problem

Dozens of Locations. No Unified View. And a Data-Privacy Constraint That Ruled Out the Obvious Fix.

This client managed a portfolio of Google Business Profile locations across multiple businesses: different brands, different cities, different industries. Each location had its own GBP Insights dashboard, and logging into each one individually to check performance was unsustainable. They needed a single dashboard showing every location's metrics side by side, with the ability to roll up all locations into one entity-level view.

The obvious solution, dumping all the data into one Google Sheet and connecting it to Looker Studio, had a fatal flaw. If any individual business owner looked at the source spreadsheet, they would see every other client's performance data. That was unacceptable. The data had to be unified for reporting but isolated at the storage layer.

On top of the privacy constraint, there were the usual GBP API challenges: paginated location listings across multiple business accounts, date objects that Looker Studio can't parse natively, and the need for a rolling 365-day window that self-maintained without manual intervention.

"The privacy requirement flipped the architecture. Instead of one big data pool, we needed many small ones, each locked to its own client, and a reporting layer that stitched them together without ever letting the raw data touch."

Our Solution

A Google Apps Script That Pulls 8 Metrics Daily Into Per-Client Sheets, Then Looker Studio Stitches It Together

The architecture had three layers: a Google Apps Script that pulled data from the GBP API and wrote it to individual client spreadsheets, a file-management system that kept every client's data in its own isolated Google Sheet inside a dedicated Drive folder, and a Looker Studio configuration that connected to each spreadsheet as a separate data source, giving the client both a unified cross-location view and per-location drill-down, while guaranteeing that opening any individual spreadsheet only showed one client's numbers.

1

Active Client Filter: Only Pull Data for Locations That Matter

The script starts by reading a "Clients" sheet in the master spreadsheet. Column A holds Location IDs, one per row starting at row 2. Only locations found in this list get their metrics pulled. This means adding or removing a client is a single-row edit in a spreadsheet, not a code change. It also means the script never accidentally pulls data for locations that aren't supposed to be in the dashboard.

2

Discover Every Location Across Every Business Account

The script calls the Google Business Account Management API to retrieve all business accounts associated with the credentials. For each account, it makes a paginated API request to list all physical locations, fetching up to 100 per request and continuing until every page is retrieved. This means new locations added to any account are automatically discovered on the next run without anyone needing to update a configuration.

3

Per-Client File Management: One Sheet Per Business, Locked in Its Own Folder

This is the step that solves the privacy constraint. For every discovered location, the script checks a "Client_Mapping" sheet in the master spreadsheet. If the location already has a Google Sheet ID logged there, it opens that existing sheet. If not, it creates a new Google Sheet named GBP Data - [Business Name], moves it into a dedicated Google Drive folder, and logs the new sheet's ID and URL in Client_Mapping.

Within each client spreadsheet, the script ensures a tab named GBP_Data exists with five column headers: Date, Location ID, Location Name, Metric Name, and Value. Every client's data lives in its own spreadsheet, in its own Drive folder. If a client opens their spreadsheet, they see only their own locations and their own metrics. Nothing else.

4

Pull 8 Performance Metrics Across a Rolling 365-Day Window

For every active location, the script calls the Business Profile Performance API and requests eight metrics:

  • Website Clicks : how many people clicked through to the website from the GBP listing.
  • Call Clicks : how many people tapped the call button on the listing.
  • Desktop Maps Impressions : how many times the listing appeared in Google Maps on desktop.
  • Desktop Search Impressions : how many times the listing appeared in Google Search results on desktop.
  • Mobile Maps Impressions : how many times the listing appeared in Google Maps on mobile.
  • Mobile Search Impressions : how many times the listing appeared in Google Search results on mobile.
  • Conversations : how many message threads were started through the listing.
  • Direction Requests : how many people requested driving directions to the location.

The date range is a strict 365-day window ending on the current day. Every run overwrites the previous year's data for each location, so if Google backfills or corrects historical metrics, the sheet automatically reflects the updated numbers without accumulating duplicates.

5

Clean the Data for Looker Studio, Then Stitch Every Sheet Into One Dashboard

The raw data from the GBP API needs work before Looker Studio can use it reliably. The script handles three cleaning steps on every run:

  • Date Sanitization : the GBP API returns dates as year/month/day objects. The script converts every date into a standard YYYY-MM-DD string and formats the entire Date column as Plain Text (@) so Looker Studio never encounters a formatting discrepancy.
  • Metric Name Translation : raw API names like BUSINESS_IMPRESSIONS_DESKTOP_MAPS are mapped to human-readable names like "Desktop Maps" using a lookup object, so the dashboard labels are immediately understandable.
  • Brute-Force Overwrite with Duplicate Prevention : the script reads any existing data in the GBP_Data tab, converts existing dates (which Google Sheets often silently changes into date objects) back into clean YYYY-MM-DD strings, filters out any rows matching the current Location ID to prevent duplicates, merges the remaining rows (if other locations share that sheet) with the fresh 365 days of data, and writes the updated dataset back.

Once every client spreadsheet is populated and self-maintaining, Looker Studio connects to each one as a separate data source. The dashboard blends them into a single unified view of total impressions across all locations, total calls, and total direction requests, with filters and drill-downs that let the client isolate any individual location or group of locations for comparison. The client sees everything together. But if any individual business owner opens their source spreadsheet, they see only their own data.

Why the Per-Client Sheet Architecture Matters

Data Isolation Without Sacrificing Unified Reporting

The obvious architecture, one big Google Sheet with every location's data, is simpler to build. One script, one data source, one Looker Studio connection. But it fails the privacy test the moment any client asks to see the raw data behind their dashboard.

By giving each client their own spreadsheet in a dedicated Drive folder, the system guarantees data isolation at the storage layer. The Client_Mapping sheet in the master spreadsheet is the only place where all location-to-sheet relationships are recorded, and that sheet lives in a separate, access-controlled master spreadsheet that clients never see.

Looker Studio handles the unification. Because it can connect to multiple Google Sheets as separate data sources and blend them in a single report, the client gets the unified cross-location view they need without the raw data ever being pooled in one place. It's slightly more work to set up, since each new client spreadsheet needs to be added as a data source in Looker Studio, but the privacy guarantee is worth the extra configuration step.

The Results

From Logging Into Dozens of GBP Dashboards to One Screen That Shows Everything

Unified

Cross-Location View

All locations rolled up into one entity-level dashboard showing total impressions, clicks, calls, and directions across every store.

Per-Client

Data Isolation

Every client's data lives in its own Google Sheet. Open it and you see only that client's locations and metrics.

Self-Healing

Rolling 365-Day Window

Every run overwrites the trailing year. Backfilled or corrected Google data updates automatically with no duplicates or gaps.

What the Client Could Do After That They Couldn't Before

  • See every location's performance on one screen instead of logging into dozens of individual GBP Insights dashboards, the client opened one Looker Studio report and saw everything.
  • Compare locations side by side: which store gets the most direction requests? Which city drives the most website clicks? Which listing generates the most phone calls? The dashboard made these comparisons trivial.
  • Roll up all locations into a single entity view for reporting to stakeholders or evaluating the total GBP footprint, one number told the whole story.
  • Share data with individual clients safely. If a business owner wanted to see their raw numbers, they got a link to their own spreadsheet. They saw their data. Nobody else's.
  • Stop worrying about data freshness. The rolling 365-day window meant the dashboard was always current. No manual exports, no stale reports, no wondering whether the numbers were up to date.

Does Any of This Sound Like Your Situation?

This architecture applies to any business managing multiple Google Business Profile locations, whether they're all your own stores or you're an agency or franchise operator managing locations for multiple clients.

You manage multiple GBP locations and logging into each one individually is eating hours every week

You need to compare location performance: which store is winning on calls, which city drives the most direction requests

You can't pool all client data into one spreadsheet because each client must only see their own numbers

You're an agency or franchise operator and need to report GBP performance to multiple stakeholders

You're manually exporting GBP Insights data and building reports in Excel, and it's not sustainable

You want to track GBP performance trends over time, not just spot-check today's numbers

If you have multiple GBP locations and the data is scattered across individual Insights dashboards, we can build this. The script connects to the GBP API, the sheets isolate each client's data, and Looker Studio unifies the reporting. The only prerequisite is that the locations exist in a Google Business Account the script can authenticate against.

Common Questions

Managing Multiple GBP Locations? Let's Get Them All on One Screen.

If you're logging into individual GBP Insights dashboards or manually exporting data into spreadsheets, that's time you're never getting back. We can build the automated pipeline and the unified dashboard. You open one report. Everything's there.