Internal reporting dashboard for the ad accounts we own.

MidiaCafe builds and operates its own digital products. We advertise those products on Google Ads. We read the results back through the API, into a private dashboard, so that spend can be compared against the revenue our own systems record, and we set up our own campaigns through the same API instead of by hand. This page describes that tool, the data it touches and the limits it operates under.

Who is asking for access.

MidiaCafe Tecnologia LTDA is a small software company in Sengés, Brazil. We own and operate every Google Ads account this developer token will ever touch. All of them sit under a single manager account. We do not manage advertising for clients, we do not resell access, and we have no external users.

  • Legal entity MidiaCafe Tecnologia LTDA
  • Tax ID (CNPJ) 40.456.359/0001-92
  • Address R. Luiz Teodoro, n. 15, Sengés, PR, Brazil
  • Manager account 808-422-9464
  • Access requested Basic Access, own accounts only
  • Developer contact [email protected]

Only properties we own.

Each account below belongs to MidiaCafe and is linked to manager account 808-422-9464. No account outside our own ownership is linked, and none will be.

  • midia.cafe, customer ID 108-677-2058. The single account under the manager today, and the one the tool connects to. It runs the Search campaigns for two properties we own: graficazappi.com.br, our online print shop selling business cards and printed material, and xreset.org, our subscription web app.
  • Further accounts, for properties such as ideiasdepresente.com, our content site, will be linked to the same manager account as their campaigns go live.

One private page, three sections.

The dashboard is a Laravel application that runs on a private host we control. It is not published, not sold and not reachable from the public internet. It has a single user, the owner of the accounts. There is no sign-up, no login for other people and no multi-tenant data model. The layout below is the working interface.

private host, internal only, /ads/performance
Campaign performance, last 30 days
Campaign Impr. Clicks Cost Conv. Revenue CPA Margin
Business cards, Search 18,204 612 R$ 894.20 27 R$ 2,410.00 R$ 33.12 + R$ 691.30
Flyers, Search 9,671 288 R$ 402.90 9 R$ 688.00 R$ 44.76 - R$ 44.10
Brand 4,115 396 R$ 118.40 14 R$ 1,062.00 R$ 8.46 + R$ 604.70

Cost and conversions come from the Google Ads API. Revenue and margin come from our own order database. The join happens locally.

Daily cost against revenue
Revenue, first-party data Cost, Google Ads API

A campaign that turns unprofitable is visible the next morning.

Search terms that spent without converting
  • cartao de visita gratis R$ 61.40, 0 conv.
  • como fazer cartao de visita no canva R$ 48.90, 0 conv.
  • papelaria perto de mim R$ 33.20, 0 conv.
  • template cartao de visita psd R$ 27.75, 0 conv.

A shortlist of negative keyword candidates. The keywords themselves are added by hand, in the Google Ads web interface.

Data flow, once a day.

  1. A scheduled job triggers a report pull once per day.
  2. The job exchanges a stored OAuth refresh token for an access token, scope https://www.googleapis.com/auth/adwords.
  3. It calls GoogleAdsService.SearchStream once per linked account, passing the manager account as login-customer-id.
  4. Rows are written to a local database, keyed by account, campaign and date. Re-running a day overwrites that day instead of duplicating it.
  5. The dashboard joins those rows with conversion and revenue data already collected from our own websites, and renders cost, conversions, cost per acquisition and gross margin per campaign.

Budget and bid decisions are then made by hand, by the account owner, inside the Google Ads web interface. No Google Ads data leaves our infrastructure, is shown to any other person, or is shared with or sold to a third party.

Reporting reads, plus campaign setup.

Reporting is the daily job and it is read only. GoogleAdsService.SearchStream runs the three queries below, once per account per day.

We also create and manage our own campaigns through the API, using CampaignBudgetService, CampaignService, AdGroupService, AdGroupCriterionService and AdGroupAdService. This replaces work we already do by hand in the Google Ads web interface, on the accounts listed above and on no others. New campaigns are created paused and reviewed in the web interface before they are allowed to serve. Bids and budgets are set by a person, not by an unattended algorithm.

Campaign performance by day

SELECT campaign.id, campaign.name, campaign.status, segments.date, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.conversions_value FROM campaign WHERE segments.date DURING LAST_30_DAYS

Ad group performance by day

SELECT ad_group.id, ad_group.name, campaign.name, segments.date, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM ad_group WHERE segments.date DURING LAST_30_DAYS

Search terms, to find negative keyword candidates

SELECT search_term_view.search_term, campaign.name, ad_group.name, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM search_term_view WHERE segments.date DURING LAST_30_DAYS

customers:listAccessibleCustomers is called once, when a new account of ours is linked to the manager account.

Volume and rate limiting

One scheduled pull per account per day, three queries per account, plus occasional manual re-runs during development. Expected volume is on the order of tens of operations per day, far below Basic Access limits. Requests are issued sequentially, one account at a time. Errors are retried with exponential backoff, and RESOURCE_EXHAUSTED or quota errors stop the run instead of retrying in a loop.

Compliance commitments.

  • The token is used only with accounts owned by MidiaCafe and linked to manager account 808-422-9464.
  • The tool is not a product for third parties. It is not distributed, not resold, and has no external users.
  • No Google Ads data is shown to, transferred to, or aggregated for any third party, and none of it is used to build a competitive data set.
  • Credentials are stored with restrictive file permissions, never committed to source control, and can be revoked at any time from the API Center and the Google account permissions page.
  • The tool is developed and operated in house. It is not built on top of, nor operated by, a third-party vendor tool.

Questions about this application.

The Google Ads API compliance team can reach us at the address below, and we answer within one business day.