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.
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.
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.
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.
| 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.
A campaign that turns unprofitable is visible the next morning.
A shortlist of negative keyword candidates. The keywords themselves are added by hand, in the Google Ads web interface.
https://www.googleapis.com/auth/adwords.
login-customer-id.
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 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_DAYSAd 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_DAYSSearch 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.
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.
The Google Ads API compliance team can reach us at the address below, and we answer within one business day.