An internal tool that reads our clients' Google Ads accounts, prepares the changes an account manager would make by hand, and applies them after a human has approved each one. It extends what our specialists already do by hand; it does not replace them. Built by LKDM, a marketing agency operating from Ukraine, for the accounts our clients have given us access to.
LKDM is a marketing agency based in Ukraine. We run paid advertising, creative production and web development for clients in real estate, e-commerce, hospitality and financial services. Clients pay us a monthly fee for managing their advertising. We do not resell advertising inventory, we do not resell software, and we do not charge anyone for access to this tool.
We work under air raids. Power is cut on a schedule and, after strikes on the grid, without one. Mobile data and home internet drop with it. A campaign that starts overspending at 03:00, or an ad that gets disapproved on a weekend, does not wait for the electricity to come back — and the person who would normally open the interface and fix it may be in a shelter, or offline, or both.
The Bridge exists so that the routine part of that work is prepared automatically and can be approved from a phone in one tap, instead of requiring a laptop, a stable connection and a working browser session. It does not replace the account manager. It removes the requirement that the account manager be physically able to reach a computer at the moment something needs doing.
Nothing reaches a client's account without a person saying yes. That is the whole design, and every limit below follows from it.
The tool pulls performance data through GoogleAdsService.SearchStream
using GAQL queries, on a schedule and on demand.
It compares the account against rules the manager set for that client — spend pace, disapproved ads, search terms that spend without converting, ad groups that stopped serving — and prepares a concrete change as a proposal.
The proposal goes to the account manager with the numbers behind it. The manager approves, edits or rejects it. An unapproved proposal expires; it is never applied by timeout or by default.
Only an approved proposal is written to the account through the API. Every applied change is recorded with who approved it, when, and what the values were before.
All reading goes through GoogleAdsService.SearchStream using GAQL queries.
| Resource | What we use it for |
|---|---|
customer | Account name, currency and time zone, so figures are labelled correctly. |
campaign | Campaign performance: impressions, clicks, cost, conversions, conversion value, CTR, average CPC. |
ad_group | Ad group performance — which groups carry the account and which are not serving. |
ad_group_ad | Ad performance, ad strength and approval status, to catch disapprovals early. |
keyword_view | Keyword performance, to find keywords that spend without converting. |
search_term_view | Actual search queries, to build negative keyword proposals. |
landing_page_view | Landing page performance, to detect pages that get traffic and do not convert. |
geographic_view | Performance by location, for accounts targeting several regions. |
age_range_view, gender_view | Demographic breakdown, to check delivery matches the agreed audience. |
campaign_budget | Configured daily budget, to compare against actual spend pace. |
The tool performs mutate operations only from this list. Anything outside it is done by a person in the Google Ads interface, as it is today.
| Operation | When it is proposed | Limit |
|---|---|---|
CampaignService — status | Campaign is pacing far above the agreed budget, or the client asked to pause. | Pause and resume only. Never removes a campaign. |
CampaignBudgetService — amount | Spend pace needs correcting within the budget the client agreed. | Hard ceiling per account, set by the manager. A proposal above it cannot be created. |
AdGroupService — status | Ad group stopped serving or performs far below the rest of the account. | Pause and resume only. |
AdGroupAdService — status | Ad was disapproved, or a creative variant is being rotated out. | Pause and resume only. Never edits ad text. |
AdGroupCriterionService — negative keywords | Search terms that spend without converting. | Adds negatives only. Does not remove existing ones. |
AdGroupCriterionService — keyword status and bids | Keyword spends without converting, or a manual bid needs correcting. | Within a bid range set per account. Bidding strategy itself is never changed. |
No change is applied without an explicit human approval. There is no auto-apply mode, no timeout that approves by default, and no rule that can be marked "trusted".
Each account has a maximum daily budget and a maximum bid, set by the manager. A proposal that would exceed either cannot be created, let alone approved.
Operations are limited to status changes, budget amounts within a range, and additive negative keywords. Nothing the tool does destroys structure or creative.
Every applied change is recorded with the previous value, the new value, the rule that proposed it and the person who approved it.
Fewer than one hundred read requests per day across all accounts, and mutates only when a proposal has been approved — typically a handful per week per account.
Access exists only because the client granted it in the Google Ads interface. The moment they revoke it, the tool loses access with it.
The Bridge is an extension of what our own specialists already do. It does not make decisions for them and it is not a product anyone buys — it is the part of their routine that a machine can prepare, so their attention goes to the part that needs judgement.
At the time of this application the tool has two users, both members of the LKDM team. There is no public interface, no client login, no sign-up and no external distribution. Clients receive reports as documents and approve larger changes in conversation with their account manager, exactly as they do today. They never access the tool itself.
Not published, sold, licensed or offered to third parties.
Nobody is charged for access. Clients pay for management of their advertising.
We do not own the client accounts and we do not handle their billing.
google-ads Python client libraryData sits on a private server controlled by LKDM. It is not shared with any third party, and nothing produced by the tool is published or sold.
A client's data is used only to produce reporting, proposals and analysis for that same client. Only aggregate advertising performance data is read.
We have read the Google Ads API Terms and Conditions and the Required Minimum Functionality policy. The tool is an internal tool used by the agency that manages the accounts it operates on, it is not distributed to third parties, and no fee is charged for access to it. Its mutate operations are limited to the closed list above, each one requires explicit human approval, and each one is recorded.
Внутрішній інструмент, який читає рекламні кабінети наших клієнтів, готує зміни, що їх зазвичай вносить менеджер руками, і застосовує їх ПІСЛЯ погодження людиною. Це розширення можливостей наших фахівців, а не заміна їм. Працює лише з кабінетами, доступ до яких дали самі клієнти.
LKDM - маркетингова агенція в Україні. Ми ведемо платну рекламу, робимо креатив і сайти. Клієнти платять щомісячну винагороду за ведення реклами. Ми не перепродуємо ні покази, ні програмне забезпечення і не беремо грошей за доступ до цього інструмента.
Ми працюємо під обстрілами. Світло вимикають за графіком, а після влучань у мережу - і без графіка. Разом зі світлом зникає інтернет. Кампанія, яка о третій ночі починає витрачати вдвічі більше, або оголошення, відхилене у вихідні, не чекають, поки дадуть електрику. А людина, яка зазвичай відкрила б інтерфейс і виправила, може бути в укритті, без звʼязку, або і те, і те.
Bridge існує, щоб рутинна частина цієї роботи готувалась сама, а погодити її можна було з телефона одним дотиком - замість ноутбука, стабільного звʼязку й живої сесії в браузері. Він не замінює менеджера. Він прибирає вимогу, щоб менеджер фізично міг дістатися до компʼютера саме в ту хвилину, коли щось треба зробити.
Жодна зміна не потрапляє в кабінет клієнта без людського «так». На цьому тримається вся будова, і з цього випливають усі межі.
Забирає показники через SearchStream за розкладом і на вимогу.
Звіряє кабінет із правилами, які менеджер задав для цього клієнта - темп витрат, відхилені оголошення, пошукові запити, що витрачають без конверсій, групи, які перестали показуватись, - і готує конкретну зміну як пропозицію.
Пропозиція йде менеджеру разом із цифрами, на яких вона побудована. Він погоджує, править або відхиляє. Непогоджена пропозиція згорає; вона ніколи не застосовується «за замовчуванням» чи «після паузи».
У кабінет іде тільки погоджена зміна. Кожна записується: хто погодив, коли і яким було значення до того.
Немає режиму «застосовувати само», немає таймера, який погоджує мовчанням, немає правил, позначених як «довірені».
У кожного кабінета є максимальний денний бюджет і максимальна ставка. Пропозиція, що їх перевищує, не може навіть створитись.
Лише статуси, суми бюджету в межах діапазону й додавання мінус-слів. Нічого, що руйнує структуру чи креатив.