Ad account monitors
Most of what goes wrong with a live ad account goes wrong quietly. A competitor raises their bids and your cost per click climbs through the afternoon. A budget change lands wrong and a campaign spends its month in a week, or stops spending altogether and nobody notices for days. A site change breaks the conversion tag and the platform keeps reporting numbers that are no longer true — which is worse than reporting nothing, because the bidding keeps optimizing against them. None of these announce themselves. You find them when you next open the account, which is usually after they have cost something. So Erdo watches for them without being asked. Connect a Google Ads or Meta Ads account and the CPC spike alert and budget pacing alert start running against it, alongside the traffic quality monitor that watches who the money is buying. Conversion tracking health uses first-party capture evidence; a Google Analytics connection is optional. The CPC, budget, traffic-quality and conversion-health monitors are read-only: they read, and they raise an item in your attention feed. None of them changes a bid, a budget, a keyword or a campaign’s status. Bidding Readiness can propose a conversion-bidding move, but only through an approval card; it never applies that move directly. The Google Ads Ad Assets monitor likewise sends every change through an approval card.Investigating a campaign
Ask for a paid-search diagnosis when delivery or leads fall. The diagnostic skill checks the connected account, campaign and ad-group status (including paused objects), ad eligibility, device-level delivery, mobile diagnostic coverage, rank and keyword quality, targeting, effective conversion goals, destination routing and the rendered form. It compares the timing of the drop with account changes and separates confirmed findings from missing evidence. The diagnosis reads configuration and reporting; it does not change campaigns or budgets.CPC spike alert
Runs every four hours between 08:00 and 21:00 in your timezone. Are your ads and campaign assets approved? It checks live policy status even when a campaign has no traffic yet or reporting is unavailable. A rejected ad raises an item with the affected campaign, ad and policy reason. A rejected Google Ads campaign asset, such as a sitelink or callout, raises a separate item: it can reduce your ad’s presentation without stopping the whole campaign. Logos and business names are handled by the daily monitor below. Pending review is reported as pending, not approved or disapproved. When Google’s API omits a policy field, Erdo reports what remains unknown. If Google gives only a generic rejection, the next step is to inspect the exact reason in Google Ads before repairing or appealing. This check covers campaign-level assets; it does not establish the status of account-level or ad-group assets. Are your ads still showing? It compares each campaign’s completed hours with its own serving history before the possible stop, using the ad account’s timezone. Three consecutive normally active hours without impressions trigger investigation. Erdo checks reporting freshness and campaign settings before calling this an outage; missing metrics alone do not prove that serving stopped. Scheduled quiet hours and campaigns without a reliable baseline are not guessed at. Has your cost per click risen materially? It compares the last seven completed days with the preceding 21 days, with at least 20 recent clicks. A finding needs a rise of at least 25%, at least $50 excess cost representing at least 10% of recent spend, and higher average daily spend. It reads recent changes and bidding strategy before raising the issue, rather than filing an alert for one expensive click. Confirmed policy findings stay under the same attention item while they persist. A fresh, complete read must establish recovery before the item clears; missing metrics or an unavailable policy read do not establish recovery. The monitor never pauses spend, appeals automatically or resubmits an unchanged rejected asset.Hourly serving check
For Google Ads campaigns that Erdo manages for you, a second check runs every hour. It uses no AI model. It reads three things for each campaign: Google’s status for the campaign, the impressions it recorded in each recent hour and device, and whether its ads are approved. It raises an urgent item in your attention feed when Google’s current reporting confirms a serving block:- Every enabled ad was explicitly disapproved. The campaign can still read as enabled. An unknown approval or an ad awaiting review does not establish a block. This is raised on the first hourly run that sees it.
- Google marks the campaign not eligible to serve. The item quotes Google’s reason. Three or more mature hours with no impressions, where those hours normally deliver at least six impressions, raise a possible delivery gap needing attention. The newest three completed hours are excluded because reporting can lag. Missing metrics, unknown status and budget limitations do not prove a billing hold or outage. Quiet hours, like the middle of the night, do not count. The item names the last reported hour and the next check. For example, an ad group whose ads use two different websites needs a new ad group on one website. When the campaign serves again, the next run closes the item on its own.
- does not load, because the page answers with an error, does not answer at all, or is an Erdo page that is private or deleted. This is urgent: every click on that ad is paid for and lost.
- is an Erdo page that belongs to another organization. The page works, but the leads it captures are recorded in that organization, so you never see them.
- redirects to a different website than the one the ad names.
Budget pacing alert
Runs once each morning. It reads your campaigns’ spend against their daily budgets and against where the month should be by now, and flags a campaign spending under half or over about a fifth above its expected pace. It also reads the last seven days one day at a time. A day that spent nothing, following days that spent normally, is reported as spend that stopped rather than as a pace, and it is named before any monthly figure. This matters because a month-to-date total is the sum of the days that did spend: it keeps looking healthy right through a day when nothing happened at all. If every one of your campaigns is at zero on the same day, the CPC spike alert has the hour it started and raises it; budget pacing points you there rather than raising a second alert about the same thing. The under-pacing half is the one people forget to want. A paused campaign, an exhausted budget, or a disapproval that took your ads out of the auction all show up here as spend that should have happened and did not.Conversion tracking health
Runs once each morning. It compares the conversions the ad platforms report against what your analytics actually recorded, checks that the events you expect are still firing, and flags an event volume that has dropped by more than about a fifth versus the same period last week. Its primary checks use the ad account, Erdo’s first-party page events and the leads dataset, so it appears with an ad account even when Google Analytics is not connected. When Google Analytics is connected, it also runs the secondary GA4 comparison; without that connection it says the comparison was skipped. It also checks the advertised pages’ form-action wiring and recent capture receipts. A successful HTTP response is insufficient if the storage write failed. Where identifiers are available, it checks conversion transaction IDs against committed captures and reports gaps it cannot verify. Advertising conversions, saved non-test enquiries and qualified leads remain separate measures; the monitor never changes campaign goals or adds another conversion emitter to reconcile totals. Connected is not the same as wired up, and the monitor checks which one it is looking at. Before it reports conversions missing, it confirms your analytics property is receiving anything at all from the pages your ads point at. If it never has, the two were never joined and there is nothing broken to fix — you will see that noted quietly rather than raised as an alert. Pages Erdo builds for you are a common reason: they report to Erdo’s own page analytics, so your separate Google Analytics property may legitimately never see them. If your property was receiving events from those pages and has stopped, that is the opposite situation, and Erdo treats it as the real failure it is and tells you when the last event arrived. The two look identical inside a single week of data, which is why Erdo looks back far enough to tell them apart before saying anything. Broken conversion tracking is expensive in a way that is easy to under-rate: automated bidding learns from the conversions it is told about, so a tag that silently stops firing does not just lose you reporting — it steers your bidding toward the wrong clicks for as long as it goes unnoticed.Google Ads Ad Assets
Every day, Google Ads Ad Assets checks that each of your live campaigns has at least eight sitelinks, six callouts, two structured snippets and 15 images, including at least six landscape and four square photos, plus your logo and business name. Search image assets use only square (1:1) and landscape (1.91:1) photos. Assets shared across your whole account count too, but only when the account runs your campaigns alone; in an account shared with other businesses only each campaign’s own assets count. This includes campaigns created outside the campaign setup flow. When something is missing, Erdo proposes adding it from one of your existing campaigns in the same language, using your own live pages and brand photos. Each change needs an approval card; an identical pending card is reused on the next check. Existing assets are kept. If there is no suitable source, Erdo tells you what is missing instead of inventing or translating copy. If Google says your account is not eligible for images, Erdo keeps that status visible and retries no more than weekly. Google shows your logo and business name at the top of a search ad only after the advertiser has completed advertiser verification in Google Ads, under Admin, then Policy, then Account. Until then it refuses them, and your ads show a globe icon and the web address instead. Verification is done by a person and can take days, and Google does not tell Erdo when it finishes. So every day Erdo checks your live Google Ads campaigns, and for any that is missing its logo or name it tries adding them again. It tracks the reason separately for each campaign, so a disapproved logo on one campaign does not prevent a verification-pending campaign in the same account from being retried. While it waits, it keeps an item in your attention feed saying what for. Each try is an approval card naming the logo and name it will add: the logo from your brand records, and a business name based on your website’s domain, which you approve on that card. If Google still refuses, nothing changes and the item says what is left to do. Trying again adds nothing new to your account: Google reuses the logo and name it already holds. Once the missing assets are linked and any reported identity disapproval has recovered, the corresponding finding clears; other outstanding findings stay open. The monitor continues checking identity policy status daily. It also tells you when Google disapproves a logo or business name, with the exact reason available. A verification refusal calls for completing verification; an asset-policy refusal calls for inspecting that reason and repairing or replacing the asset. Erdo checks official brand sources before asking for missing artwork. It retries verification-pending links, but never retries an unchanged asset that Google rejected on its merits. If an earlier finding is incomplete or cannot be read clearly for a campaign, Erdo leaves that campaign unmodified and keeps the evidence gap visible rather than guessing from another campaign’s finding. Linked assets under review remain pending, and missing policy fields never count as approval. This monitor never changes your budgets, targeting or existing ad copy.Bidding readiness
Runs once each morning for Google Ads organizations. It finds every enabled, owned campaign that is not on a conversion bidding strategy (Maximise Conversions, Maximise Conversion Value, Target CPA or Target ROAS). That covers Maximise Clicks (Google reports it asTARGET_SPEND), Manual CPC, Manual CPM
and any other strategy. MAXIMIZE_CLICKS is Erdo’s write enum, and Erdo’s
campaign tools refuse click bidding, so campaigns Erdo creates always launch on
conversion bidding — the ones this monitor finds are older campaigns and
campaigns set up outside Erdo. Campaigns with zero or low conversions are
reviewed too. It reads the campaign-owned lead goal, capture and attribution
evidence, provider status and delay, and existing holds before proposing
anything. Unknown or failed tracking becomes a deduplicated evidence review; it
never blindly switches bidding while tracking is uncertain.
When the evidence is complete and good, it proposes moving the campaign into
your organization’s portfolio MAXIMIZE_CONVERSIONS strategy. The proposal is
approval-gated, requires campaign goal scope to be verified first, makes no
target CPA or budget change, and is deduplicated per campaign. Bidding Readiness
owns these proposals; the optimizer does not create a second one.
Before proposing conversion bidding, it checks that the campaign optimises only
toward the right outcome: campaigns for the same development and outcome share
one goal containing all enabled owned actions for that outcome. A single-
development account may use account goals; shared accounts use the development’s
custom goal. It also compares sibling campaigns’ effective action sets, including
secondary custom-goal actions and inherited categories. If a check fails or its
proof is unknown, it does not propose bidding and does not repair goals. It raises
a human-reviewed item naming the affected owned campaigns, their observed sets,
and the missing evidence. The goal details come from a read limited to your own
campaigns, which works in an ad account shared with other businesses: if your
campaign also optimises toward conversion actions that are not yours, the item
says how many there are without naming them. Only a read that fails leaves the
goal scope unknown. Changing a running campaign’s goals is a decision for
its optimisation loop or a person. If the campaign is later paused, the item
stays open and says the campaign is not serving; the monitor never turns a
paused campaign back on.
After a person or the owning optimization workflow makes an approved goal
change, Bidding Readiness checks the isolation evidence again on its next run.
If Google returns no strategy for a campaign, or one Erdo does not recognise,
the monitor raises an item for that campaign; an unreadable strategy never
counts as a healthy check, and it never proposes a bidding change from it. If
you have a standing decision holding a campaign’s bidding, the monitor respects
it and proposes nothing, but keeps one item open showing that the campaign is
still off conversion bidding, so the hold stays visible without repeated
approval cards.

