Skip to main content

Google: expose campaign budget (incl. explicitly_shared) and impression-share metrics without GAQL

Reading a campaign's current daily budget, whether that budget is shared, and its impression-share metrics currently requires GET /v1/ads/insights GAQL passthrough, which draws on the shared Google operations budget. These are not
exotic reporting needs — they are what you need to answer "is this campaign capped by its budget?", which is the single most common budget question a customer has.

Concretely we need, per campaign: campaign_budget.amount_micros, campaign_budget.explicitly_shared, campaign_budget.resource_name, metrics.search_impression_share, metrics.search_budget_lost_impression_share,
metrics.search_rank_lost_impression_share.

The explicitly_shared flag is a safety requirement, not a nicety. Your team's guidance is not to point budget writes at campaigns on a shared budget until the behaviour is confirmed. Right now the only way for us to know which
campaigns those are is a GAQL call on the quota we are trying to protect — so the safe path and the cheap path are in conflict.

Request: add these to the campaign response (GET /v1/ads/campaigns) or to GET /v1/ads/campaigns/{campaignId}/analytics.
Status: Completed1 comment

Log in to comment and vote

Comments1

  • Miquel Palet López

    Team•

    Sep 9

    Shipped and live. Every field you asked for is now on the normal endpoints, with no GAQL passthrough and no cost to the shared Google operations budget beyond the one call the endpoint already makes.

    Budget, on GET /v1/ads/campaigns. Each Google campaign's budget object now carries amountMicros, resourceName, deliveryMethod and explicitlyShared alongside the existing amount and type. Live example from our own account just now:

    "budget": {
      "type": "daily",
      "amount": 490,
      "amountMicros": "490000000",
      "resourceName": "customers/9122445560/campaignBudgets/15820595193",
      "deliveryMethod": "STANDARD",
      "explicitlyShared": false
    }

    The values populate on the next campaign sync after this deploy, so an account that has not synced yet will briefly show only the old two fields.

    Impression share, on GET /v1/ads/campaigns/{campaignId}/analytics. You get searchImpressionShare, searchBudgetLostImpressionShare and searchRankLostImpressionShare, and we added searchAbsoluteTopImpressionShare and searchTopImpressionShare since they come back in the same query for free.

    On the safety point you raised. You were right that the safe path and the cheap path were in conflict. Beyond exposing the flag, a budget write through PUT /v1/ads/campaigns/{campaignId} now refuses with a clear error when the campaign sits on a shared budget, so you cannot hit that case by accident even if you skip the check.

    Thanks for the precise write-up, it made this straightforward to build.