Twelve ad platforms use one evidence contract
Claude Ads covers Google, Meta, YouTube, LinkedIn, TikTok, Microsoft, Reddit, Snapchat, X, Apple, Amazon, and Pinterest advertising. Commands set up account rules, audit platforms, plan campaigns, create briefs and assets, monitor delivery, design experiments, and render reports. A central conductor splits work among bounded workers and collects versioned JSON. Markdown, HTML, and optional PDF are generated from that same validated bundle.
The shared model is useful for an agency that otherwise maintains 12 platform checklists. Each platform has its own skill, audit worker, capability declaration, and control reference. A failed required worker makes the overall run partial rather than complete. That rule is more valuable than a broad platform logo grid because it prevents one unavailable account from disappearing inside a portfolio score.
Scores separate account health from missing evidence
Controls return pass, fail, unknown, or not applicable. Evidence coverage of 80% or more receives a grade, 60% to 79% is provisional, and anything below 60% is insufficient. Unknown controls lower coverage without changing the health calculated from known controls. Disabled, premium, beta, unavailable, and ineligible features remain outside the score.
This separation reduces a common reporting error. Missing access can make an account look artificially clean if absent checks are treated as passes, or unfairly bad if they become failures. Claude Ads keeps those concepts apart and refuses a health score when the platform profile is disabled or unapproved. Teams still need to inspect the underlying controls because a neat percentage cannot repair stale exports or the wrong account scope.
What happened when we ran it
Our sandbox installed 60 Python packages in 33 seconds and used 341 MB. The build completed in 10 seconds. Tests completed successfully in 56 seconds, with pytest reporting 506 passed, 0 failed, and 23 skipped of 506. Pip-audit found 3 known vulnerabilities in the installed dependency set.
We ran commit 669c760 in an unprivileged Debian container with 3 CPUs, 8 GB of RAM, Python 3.12, and no secrets. The checkout contained 339 files, about 21,586 lines of source, occupied 5.4 MB, included a tests directory and 2 CI workflow files, and had no Dockerfile. We did not connect an ad account, fetch a landing page, generate media, or apply a remote change.
Read-only defaults put seven gates before a write
All adapters begin in read-only mode. An account mutation requires an implemented and tested capability, exact account and object IDs, a readable before-and-after diff, owner approval within defined ceilings, an idempotency key, an audit destination, rollback, and a verification window. Remote state must still match the expected precondition. Missing ceilings stop the write, and permanent deletion is unsupported in v2.
That is the right bias for advertising accounts where a duplicated budget or disabled campaign can spend money or stop revenue. It also means /ads launch --draft and /ads optimize --draft should be read literally: the primary output is a proposed plan. Organizations must wire each enabled platform operation, credential, approval role, and audit location before claiming operational automation.
Landing-page failures can look like genuine audit findings
Issue 61 documents a dangerous failure mode in the landing-page analyzer on Windows with Python 3.12. A blocked browser request returned empty measurements, printed fail grades for relevance, schema, call to action, and mobile behavior, then exited with status 0. The actual fetch error appeared only in an error field after the plausible report.
The report gives a direct consequence: a wrapper or agent checking only the process code can treat a failed fetch as a successful audit of a bad page. Until the exact installed version proves otherwise, consumers should reject any landing-page result carrying an error, missing title, absent timing values, or zero words. A successful exit code is insufficient evidence that browser capture occurred.
Claude Code is canonical while other hosts vary
The native installation path adds a Claude Code marketplace and installs the plugin. Standalone skill files can target Codex, Gemini, Cursor, Windsurf, Goose, and compatible hosts where their runtime supports the contract. Managed dependencies support CPython 3.11 and 3.12 on the declared operating-system wheel matrix. Unsupported interpreters fail before changing the destination.
Optional paths add system work. Browser capture needs an operator-installed Playwright browser payload. PDF rendering needs WeasyPrint and Pango libraries. Credentials belong in environment variables, a keychain, or an approved secret manager and must not enter profiles, reports, logs, prompts, or Git history. A skill-only install can omit managed Python dependencies, but then those helpers are unavailable until the operator provides them.
July release code still has active August review work
GitHub reported 8,515 stars, 38 combined issues and pull requests, and a last repository push on July 13, 2026. Release v2.0.1 arrived the same day as a public-mirror documentation patch. Open issues and pull requests were still active in August, including landing-page error handling, installer behavior, and an optional image-provider adapter. Health therefore looks active even though the main branch push date is older than the latest discussion.
Claude Ads is a control system for disciplined operators, not a substitute for media judgment. Its 506 passing tests and explicit partial-run rules make it more credible than a folder of prompts. The 3 audit findings and false-success report keep human review mandatory. Start with exports and read-only audits, compare findings with the platform UI, and enable one reversible write capability only after its verification path works end to end.

