LKDM
Internal tool · Google Ads API

LKDM
Ads Bridge

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.

Human-approvedNo unattended changes
InternalTwo users, our team
BoundedHard spend ceilings
Not for saleNo fee, no access
Operating context

Why this tool exists at all.

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.

How it works

Prepare, approve, apply.

Nothing reaches a client's account without a person saying yes. That is the whole design, and every limit below follows from it.

01
Read

The tool pulls performance data through GoogleAdsService.SearchStream using GAQL queries, on a schedule and on demand.

02
Detect and prepare

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.

03
Human approval

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.

04
Apply and record

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.

What it reads

Every resource, and why.

All reading goes through GoogleAdsService.SearchStream using GAQL queries.

ResourceWhat we use it for
customerAccount name, currency and time zone, so figures are labelled correctly.
campaignCampaign performance: impressions, clicks, cost, conversions, conversion value, CTR, average CPC.
ad_groupAd group performance — which groups carry the account and which are not serving.
ad_group_adAd performance, ad strength and approval status, to catch disapprovals early.
keyword_viewKeyword performance, to find keywords that spend without converting.
search_term_viewActual search queries, to build negative keyword proposals.
landing_page_viewLanding page performance, to detect pages that get traffic and do not convert.
geographic_viewPerformance by location, for accounts targeting several regions.
age_range_view, gender_viewDemographic breakdown, to check delivery matches the agreed audience.
campaign_budgetConfigured daily budget, to compare against actual spend pace.
What it changes

A closed list of operations.

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.

OperationWhen it is proposedLimit
CampaignService — statusCampaign is pacing far above the agreed budget, or the client asked to pause.Pause and resume only. Never removes a campaign.
CampaignBudgetService — amountSpend 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 — statusAd group stopped serving or performs far below the rest of the account.Pause and resume only.
AdGroupAdService — statusAd was disapproved, or a creative variant is being rotated out.Pause and resume only. Never edits ad text.
AdGroupCriterionService — negative keywordsSearch terms that spend without converting.Adds negatives only. Does not remove existing ones.
AdGroupCriterionService — keyword status and bidsKeyword spends without converting, or a manual bid needs correcting.Within a bid range set per account. Bidding strategy itself is never changed.

Outside the tool, permanently

  • Does not create or remove campaigns, ad groups or ads
  • Does not write or edit ad text, headlines or descriptions
  • Does not change bidding strategy type
  • Does not create or modify audiences
  • Does not upload conversions, customer lists or offline data
  • Does not touch Customer Match or user list data
  • Does not read, request or store personally identifiable information
  • Does not act on any account the authenticated user was not granted access to
Guardrails

What stops it doing damage.

01

Approval is mandatory

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".

02

Spend ceilings

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.

03

Reversible by design

Operations are limited to status changes, budget amounts within a range, and additive negative keywords. Nothing the tool does destroys structure or creative.

04

Full audit trail

Every applied change is recorded with the previous value, the new value, the rule that proposed it and the person who approved it.

05

Rate limited

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.

06

Client can revoke instantly

Access exists only because the client granted it in the Google Ads interface. The moment they revoke it, the tool loses access with it.

Who uses it

Internal users only.

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.

01

No distribution

Not published, sold, licensed or offered to third parties.

02

No fee

Nobody is charged for access. Clients pay for management of their advertising.

03

Not our accounts

We do not own the client accounts and we do not handle their billing.

Architecture and data

Where it runs and what it keeps.

Runtime
Python 3.12 on a private Linux server operated by LKDM
Client library
Official google-ads Python client library
Authentication
OAuth 2.0, installed application flow, one named authorised user — the agency owner, who already has user access to each client account
Credential storage
Environment file on the server, file mode 600, excluded from version control
Read pattern
One scheduled pull per account per day, plus manual pulls
Write pattern
Only on approval. No scheduled or unattended mutates
Expected volume
Fewer than one hundred API requests per day across all accounts

Storage

Data 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.

Scope of use

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.

Внутрішній інструмент · Google Ads API

LKDM
Ads Bridge

Внутрішній інструмент, який читає рекламні кабінети наших клієнтів, готує зміни, що їх зазвичай вносить менеджер руками, і застосовує їх ПІСЛЯ погодження людиною. Це розширення можливостей наших фахівців, а не заміна їм. Працює лише з кабінетами, доступ до яких дали самі клієнти.

Тільки з дозволубез самовільних змін
Внутрішнійдвоє користувачів
З межамистеля витрат
Не продаєтьсядоступу назовні нема
Обставини роботи

Навіщо цей інструмент узагалі потрібен.

LKDM - маркетингова агенція в Україні. Ми ведемо платну рекламу, робимо креатив і сайти. Клієнти платять щомісячну винагороду за ведення реклами. Ми не перепродуємо ні покази, ні програмне забезпечення і не беремо грошей за доступ до цього інструмента.

Ми працюємо під обстрілами. Світло вимикають за графіком, а після влучань у мережу - і без графіка. Разом зі світлом зникає інтернет. Кампанія, яка о третій ночі починає витрачати вдвічі більше, або оголошення, відхилене у вихідні, не чекають, поки дадуть електрику. А людина, яка зазвичай відкрила б інтерфейс і виправила, може бути в укритті, без звʼязку, або і те, і те.

Bridge існує, щоб рутинна частина цієї роботи готувалась сама, а погодити її можна було з телефона одним дотиком - замість ноутбука, стабільного звʼязку й живої сесії в браузері. Він не замінює менеджера. Він прибирає вимогу, щоб менеджер фізично міг дістатися до компʼютера саме в ту хвилину, коли щось треба зробити.

Як це влаштовано

Підготувати, погодити, застосувати.

Жодна зміна не потрапляє в кабінет клієнта без людського «так». На цьому тримається вся будова, і з цього випливають усі межі.

01
Читає

Забирає показники через SearchStream за розкладом і на вимогу.

02
Помічає й готує

Звіряє кабінет із правилами, які менеджер задав для цього клієнта - темп витрат, відхилені оголошення, пошукові запити, що витрачають без конверсій, групи, які перестали показуватись, - і готує конкретну зміну як пропозицію.

03
Людина погоджує

Пропозиція йде менеджеру разом із цифрами, на яких вона побудована. Він погоджує, править або відхиляє. Непогоджена пропозиція згорає; вона ніколи не застосовується «за замовчуванням» чи «після паузи».

04
Вносить і записує

У кабінет іде тільки погоджена зміна. Кожна записується: хто погодив, коли і яким було значення до того.

Межі

Що зупиняє його від шкоди.

01

Погодження обовʼязкове

Немає режиму «застосовувати само», немає таймера, який погоджує мовчанням, немає правил, позначених як «довірені».

02

Стеля витрат

У кожного кабінета є максимальний денний бюджет і максимальна ставка. Пропозиція, що їх перевищує, не може навіть створитись.

03

Усе зворотне

Лише статуси, суми бюджету в межах діапазону й додавання мінус-слів. Нічого, що руйнує структуру чи креатив.

Чого інструмент не робить узагалі

  • Не створює й не видаляє кампанії, групи та оголошення
  • Не пише й не редагує тексти оголошень
  • Не змінює тип стратегії ставок
  • Не створює й не змінює аудиторії
  • Не вивантажує конверсії, списки клієнтів чи офлайн-дані
  • Не торкається Customer Match
  • Не читає й не зберігає персональних даних
  • Не діє в кабінеті, доступу до якого нам не давали