Analytics
Read daily performance metrics and the search keywords that triggered impressions for a Google Business Profile location.
When you finish this page you can read a Google Business Profile (googlebusiness) location's daily impressions, website clicks, calls, direction requests, conversations, bookings and food orders, and the search keywords that triggered its impressions. You need a connected Google Business Profile account (accountId). Both endpoints read location-level data going back at most 18 months.
Per-post analytics do not exist for Google Business Profile. Google deprecated the per-post insights endpoint and did not ship a replacement, so per-post views, clicks and likes no longer exist on Google's side. The two location-level endpoints below are the engagement data Google exposes.
Read performance metrics
Call GET /v1/analytics/googlebusiness/performance with accountId and a date range (Performance metrics). startDate defaults to 30 days ago and endDate to today; metrics narrows the response to a comma-separated list and defaults to every metric. Google delivers the data 2 to 3 days late.
import Zernio from '@zernio/node';
const zernio = new Zernio();
const { data: performance } = await zernio.analytics.getGoogleBusinessPerformance({
query: {
accountId: '66b2e19d8c3f5a7e9d0b1c2d',
startDate: '2026-08-01',
endDate: '2026-08-31'
}
});
console.log(performance.metrics.WEBSITE_CLICKS.total);Response (200), one key per metric with the sum and the daily series:
{
"success": true,
"accountId": "66b2e19d8c3f5a7e9d0b1c2d",
"platform": "googlebusiness",
"dateRange": { "startDate": "2026-08-01", "endDate": "2026-08-31" },
"metrics": {
"WEBSITE_CLICKS": {
"total": 42,
"values": [
{ "date": "2026-08-01", "value": 3 },
{ "date": "2026-08-02", "value": 1 }
]
},
"CALL_CLICKS": {
"total": 7,
"values": [{ "date": "2026-08-01", "value": 1 }]
},
"BUSINESS_IMPRESSIONS_MOBILE_SEARCH": {
"total": 156,
"values": [{ "date": "2026-08-01", "value": 8 }]
}
},
"dataDelay": "Data may be delayed 2-3 days"
}The metrics are BUSINESS_IMPRESSIONS_DESKTOP_MAPS, BUSINESS_IMPRESSIONS_DESKTOP_SEARCH, BUSINESS_IMPRESSIONS_MOBILE_MAPS, BUSINESS_IMPRESSIONS_MOBILE_SEARCH, BUSINESS_CONVERSATIONS, BUSINESS_DIRECTION_REQUESTS, CALL_CLICKS, WEBSITE_CLICKS, BUSINESS_BOOKINGS, BUSINESS_FOOD_ORDERS and BUSINESS_FOOD_MENU_CLICKS.
Read search keywords
Call GET /v1/analytics/googlebusiness/search-keywords with accountId and a month range (Search keywords). Google aggregates keywords by month and drops those under an impression threshold it does not publish. startMonth defaults to 3 months ago and endMonth to the current month.
const { data: keywords } = await zernio.analytics.getGoogleBusinessSearchKeywords({
query: { accountId: '66b2e19d8c3f5a7e9d0b1c2d', startMonth: '2026-06', endMonth: '2026-08' }
});
for (const k of keywords.keywords) console.log(k.keyword, k.impressions);Response (200):
{
"success": true,
"accountId": "66b2e19d8c3f5a7e9d0b1c2d",
"platform": "googlebusiness",
"monthRange": { "startMonth": "2026-06", "endMonth": "2026-08" },
"keywords": [
{ "keyword": "restaurant near me", "impressions": 245 },
{ "keyword": "best tapas barcelona", "impressions": 89 },
{ "keyword": "zernio", "impressions": 34 }
],
"note": "Keywords below a minimum impression threshold are excluded by Google"
}If it fails
A 400 on the performance endpoint means a metric name in metrics is not one Google supports; the response lists the valid ones:
{
"error": "Invalid metrics: INVALID_METRIC",
"validMetrics": [
"BUSINESS_IMPRESSIONS_DESKTOP_MAPS",
"BUSINESS_IMPRESSIONS_DESKTOP_SEARCH",
"BUSINESS_IMPRESSIONS_MOBILE_MAPS",
"BUSINESS_IMPRESSIONS_MOBILE_SEARCH",
"BUSINESS_CONVERSATIONS",
"BUSINESS_DIRECTION_REQUESTS",
"CALL_CLICKS",
"WEBSITE_CLICKS",
"BUSINESS_BOOKINGS",
"BUSINESS_FOOD_ORDERS",
"BUSINESS_FOOD_MENU_CLICKS"
]
}Pick names from validMetrics and retry. On the keywords endpoint a 400 with "Invalid startMonth format. Use YYYY-MM." means the month is not YYYY-MM. A 403 means accountId is not one of your accounts.
Both endpoints also answer 402 when the team has no analytics access, which is the first thing a legacy plan hits:
{
"error": "Analytics add-on required",
"code": "analytics_addon_required"
}Analytics is included on usage-based billing (pricing); a legacy plan needs it enabled before either endpoint returns data. Error handling covers the envelope.
Related
- Performance metrics: every query parameter.
- Search keywords: the month-range parameters.
- Business Profile Management: the listing details behind these numbers.
- Rate limits: how often analytics refresh.