Run a scored audit of paid ad accounts across search and social from plain exports, with no live account connection required: tracking health, wasted spend patterns, account structure, creative fatigue signals, budget and auction checks, one unified score, and a fix list ordered by expected impact. Use when asked to audit Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, or Microsoft Advertising, find wasted ad spend, review an account before scaling, or produce a paid media health check.
./install.sh paid-media-auditname: paid_media_audit description: Run a scored audit of paid ad accounts across search and social from plain exports, with no live account connection required: tracking health, wasted spend patterns, account structure, creative fatigue signals, budget and auction checks, one unified score, and a fix list ordered by expected impact. Use when asked to audit Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, or Microsoft Advertising, find wasted ad spend, review an account before scaling, or produce a paid media health check.
One vendor neutral audit for a whole paid media account, run from exports the client or the platform already provides. Other audit approaches split the job by platform and ask for a live connection to each one. This one takes CSV or spreadsheet exports plus screenshots of the settings that exports cannot show, applies one scoring rubric to every platform, and hands back a single report with a unified score and a fix list ordered by expected impact.
Scope: Google Ads, Microsoft Advertising, Meta Ads, LinkedIn Ads, TikTok Ads, YouTube and Demand Gen, and Performance Max style campaigns. The audit judges the account as found. It does not change budgets, pause campaigns, or edit tracking. Fixes are recommendations with owners, not actions taken during the audit.
Collect before looking at any numbers:
references/worked-audit.md shows.State the frame at the top of the report. An audit with no stated window, conversion, and target cannot be checked by anyone after you.
Ask for, per platform, a campaign level export for the window with spend, impressions, clicks, conversions, and conversion value or revenue. Add frequency and period budget where the platform exposes them. Then pull the deeper exports the check sheets need: search terms for search platforms, ad or asset level rows for creative checks, and placement rows where they exist.
Normalise campaign rows to the header the tool expects:
platform,campaign,spend,impressions,clicks,conversions,revenue,frequency,budget
Blank is allowed for frequency and budget. Blank is never treated as zero. Settings that do not export (conversion definitions, deduplication status, attribution windows) get checked on screen or by screenshot, and the report says which method was used for each one.
Run:
python3 bin/audit.py campaigns <campaigns.csv> --target-cpa <target>
Run it once per objective when targets differ, filtering the export first, instead of forcing one target across everything. The tool prints per campaign ratios (CTR, CPC, cost per conversion, return on spend), zero-conversion spend and its share of total spend, spend concentration in the top 3 campaigns, budget use flags, and frequency flags.
Treat every flag as a candidate, not a conclusion. Zero-conversion spend is a review list: check the buying cycle and the search terms behind it before calling any of it waste. A frequency flag means look at the trend, not refresh the creative today.
Score this pillar before trusting anything else in the report:
If reconciliation fails by a wide margin, say so in the first paragraph of the report and mark every return figure as a platform claim until it is fixed.
Open references/check-sheets.md and run the shared checks, then the sheet for each platform family in the account: search, social feed, short video, and retail or Performance Max style. Sheets carry the platform specific facts the audit relies on, with their sources: Google Quality Score components and how Google says to use them, impression share split into budget and rank losses, Meta learning volume of about 50 optimisation events in 7 days, TikTok Smart Creative fatigue handling, and the IAB and MRC viewability thresholds for display and video.
Judge creative fatigue on trend, always: cost per result, CTR, and frequency across weeks, plus any fatigue label the platform itself shows. No platform publishes a universal safe frequency, so set the audit threshold from the account's own history, write the number you used in the report, and never present it as a platform rule.
Fill the check sheet in the format of assets/example_checklist.csv (pillar, item, status: pass, partial, fail, or na) and run:
python3 bin/audit.py score <checklist.csv>
Weights and grade bands live in references/scoring-rubric.md: Tracking 25, Waste 20, Structure 20, Creative 20, Budget and Auction 15. The rubric is this audit's own method, stated openly. It is not a platform standard and the report must not dress it up as one. Items that do not apply are marked na and leave the denominator.
Order every fix by expected impact: spend at stake, times confidence in the evidence, divided by effort. Write the reasoning in words next to each fix. Tracking fixes go first when tracking is broken, even when a waste fix looks bigger, because the waste figure itself cannot be trusted until the count is right. Give each fix an owner and a check-back metric: the number that should move, and the window to judge it in.
Use the Output Contract below. Keep platform conversion counts on their own terms: different attribution windows mean platforms overlap, so never add platform conversions into one grand total. Compare each platform against its own target, its own history, and the backend count. Those are the only comparisons that hold.
One markdown audit report containing:
bin/audit.py score, with any unscored pillar stated plainly.bin/audit.py campaigns output, so every figure in the report can be reproduced from the export.publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.