Help us improve
Share bugs, ideas, or general feedback.
From claude-ads
Guided first-run wizard that sets up an ad audit pipeline: captures business context, connects ad platforms via MCP/OAuth/direct API, and persists profile settings. Use when onboarding or reconfiguring connections.
npx claudepluginhub hainrixz/claude-ads --plugin claude-adsHow this skill is triggered — by the user, by Claude, or both
Slash command
/claude-ads:ads-start [reset | edit | status][reset | edit | status]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are running the first-run / re-entry wizard that produces and maintains
Audits and optimizes paid ad campaigns across Meta, Google, and TikTok with guided onboarding, scoring, and AI creative generation.
Manages Google Ads, Meta Ads (Facebook/Instagram), LinkedIn Ads, TikTok Ads campaigns via natural language. Automates keyword research, budget optimization, ROAS tracking, wasted spend analysis, ad creatives, targeting, and reporting.
Audits Meta (Facebook + Instagram) ad accounts by gathering business info, analyzing account health, and saving context for downstream Meta ads skills. Run first before other Meta operations.
Share bugs, ideas, or general feedback.
You are running the first-run / re-entry wizard that produces and maintains
~/.claude-ads/profile.json. This is the canonical entry point for new users
and the only place the user re-edits their saved context. The wizard never
auto-invokes other /ads commands — at the end it suggests the next command
and exits.
AskUserQuestion block with
2–4 options, then writes the answer to the profile via
python3 scripts/profile.py set <dot.path> <value> BEFORE asking the next
question. Partial completion must be recoverable.api_key_present: true/false, never the value.Read the user's argument (if any):
| Arg | Behavior |
|---|---|
| (none) | Phase A — detect first-run vs re-entry. |
status | Run python3 scripts/profile.py get, print a 5-line summary, exit. |
edit | Skip Phase A welcome, jump to the edit selector in Phase A.4. |
reset | Confirm with AskUserQuestion → call python3 scripts/profile.py reset --yes → restart from Phase A. |
A.1 Run python3 scripts/profile.py get and capture exit code.
2 (no profile) → first-run: print the welcome banner below, then go
to Phase B.0 (profile exists) → re-entry: print a 5-line summary (industry,
spend bracket, active platforms, last command) and go to A.4.A.2 First-run welcome (print verbatim, adapt to user's language):
Welcome to claude-ads. I'll walk you through 4 quick steps:
1. Tell me about your business (~1 min)
2. Connect Meta / Google / TikTok — one at a time, step by step (~2-10 min each)
3. Optional: Zernio for publishing creatives, Meta for Developers
4. Pick your first action
Nothing leaves your machine. Tokens go to env vars, not the profile.
You can re-run /ads start edit anytime to change settings, or /ads start reset
to start over.
A.3 First-run: run python3 scripts/profile.py init and continue to
Phase B.
A.4 Re-entry edit selector — AskUserQuestion:
"What do you want to change?"
Business context — re-run Phase B.Meta connection — re-run Phase C for Meta only.Google connection — re-run Phase C for Google only.TikTok connection — re-run Phase C for TikTok only.Zernio publishing — re-run Phase D Zernio block.(AskUserQuestion will add "Other" — treat it as cancel.)
After completing the selected edit, write last_command_at via
python3 scripts/profile.py set last_command_at $(date -u +%FT%TZ) and exit
with a one-line "Saved." confirmation.
edit context)Four sequential AskUserQuestion blocks. Save EACH answer immediately.
AskUserQuestion (single-select)Options: Ecommerce · Local service · Real estate · Healthcare ·
Finance · Agency / multiple clients · Other.
Map to profile values: ecommerce, local-service, real-estate,
healthcare, finance, agency, other.
Then: python3 scripts/profile.py set context.industry <value>.
AskUserQuestion (single-select)Options: Under $500/mo · $500–$2,000/mo · $2,000–$10,000/mo ·
$10,000+/mo. (User can pick "Other" and type an exact figure — coerce to a
number.)
Map bracket → midpoint USD: 250, 1250, 6000, 25000. If user gave an exact number, use it.
Then: python3 scripts/profile.py set context.monthly_spend_usd <number>.
AskUserQuestion (single-select)Options: Sales / revenue · Leads / signups · App installs ·
Phone calls · Brand awareness.
Map → sales, leads, app-installs, calls, brand.
Then: python3 scripts/profile.py set context.primary_goal <value>.
AskUserQuestion (multiSelect: true)"Which platforms do you actively run (or plan to run) ads on?"
Options: Meta (Facebook + Instagram) · Google Ads (incl. YouTube) ·
TikTok Ads.
Require ≥1. Map to ["meta","google","tiktok"] subset.
Then: python3 scripts/profile.py set context.active_platforms '<json>'.
For each platform in context.active_platforms (in order Meta → Google →
TikTok, only those selected in B.4), run the loop below.
AskUserQuestion (single-select)"How do you want to connect
<PLATFORM>?"
| Option | Save as connections.<p>.tier | Notes |
|---|---|---|
MCP server (recommended) | mcp_claude_ai for Meta · mcp_cohnen for Google · mcp_adsmcp for TikTok | Capa 1. Quickest. |
Direct API (free, OAuth once) | direct_api | Capa 2. Full control. |
Manual exports for now | manual | Capa 3. Always works, no setup. |
Skip — set this up later | skipped | Leave unconfigured. |
If manual or skipped: write the tier, write connected_at to now, skip
C.2-C.4, continue to the next platform.
Read the relevant reference file:
| Platform | Reference |
|---|---|
| Meta | ads/references/setup-meta.md |
ads/references/setup-google.md | |
| TikTok | ads/references/setup-tiktok.md |
Each file has Sections A (MCP), B (Direct API), C (Manual). Jump to the section that matches the user's tier choice. Within that section, walk the steps in order.
For each STEP in the chosen section:
AskUserQuestion → "Done with step N?" with options:
Done — next stepHit an errorCancel and skip this platformDone: continue to the next step.Hit an error: read the step's "On error" branch and ask the user to
describe what they saw. Suggest the most likely fix from the reference.
Retry the step. Cap at 3 attempts → offer to skip.Cancel: set connections.<p>.tier = "skipped" and continue to next
platform.After the LAST step, run the verification call:
| Platform | Tier A (MCP) verification | Tier B (Direct API) verification |
|---|---|---|
| Meta | Call mcp__claude_ai_Facebook__ads_get_ad_accounts | python3 scripts/api/meta_fetch.py --account-id <id> --what account |
Call mcp__cohnen_google_ads__list_customers (if available) — else ask user to paste customer_id | python3 scripts/api/google_fetch.py --customer-id <id> --what account | |
| TikTok | List advertiser via MCP tool — else ask user to paste advertiser_id | python3 scripts/api/tiktok_fetch.py --advertiser-id <id> --what account |
(If the MCP tool isn't present in this session — e.g., the user hasn't enabled
it on claude.ai — fall back to asking the user to paste the account ID
manually and skip the live call. Record last_verified_at: null so /ads next
knows to re-verify next time.)
On verification success:
python3 scripts/profile.py set connections.<platform>.ad_account_id "<id>"
python3 scripts/profile.py set connections.<platform>.connected_at "$(date -u +%FT%TZ)"
python3 scripts/profile.py set connections.<platform>.last_verified_at "$(date -u +%FT%TZ)"
Print ✓ confirmation with the account ID. Continue to next platform.
direct_api)AskUserQuestion:
"Do you already have a Meta for Developers account? (Required for the direct Meta API path.)"
Options: Yes — I have one · No — walk me through it · Skip.
On No: load ads/references/setup-meta-developers.md and run the
step-by-step loop (same pattern as C.3). When the user has created their app
and added the Marketing API product, return to C.3 step 1 of the Direct API
section in setup-meta.md.
AskUserQuestion:
"Do you want to enable
/ads publishfor posting generated creatives to 14+ social networks? Zernio's free tier covers 2 connected accounts forever (no credit card)."
Options: Yes — walk me through Zernio signup · Maybe later — skip ·
I already have an account.
Yes: load ads/references/setup-zernio.md, run step loop. On success
write zernio.signed_up = true. If user reports they saved the API key to
ZERNIO_API_KEY, also write zernio.api_key_present = true.I already have an account: just ask if ZERNIO_API_KEY is exported.
Write zernio.signed_up = true and zernio.api_key_present accordingly.Skip: leave defaults (false).Print a one-screen summary:
✓ Profile saved to ~/.claude-ads/profile.json
✓ Connected: <platform list with tier>
✓ Zernio: <on / off>
Then AskUserQuestion:
"You're set up. What would you like to run first?"
Options (filter to what the user actually configured):
/ads audit — full multi-platform audit (recommended if ≥2 platforms
connected with tier ≠ skipped)./ads <single-platform> — deep-dive on one platform (single-select the
platforms they connected)./ads plan <industry> — strategic plan from your industry template
(use their context.industry, falling back to generic).Just exit — I'll explore on my own.Print the EXACT next command to type (do not invoke it). Example:
Great — next, type:
/ads audit
Finalize: python3 scripts/profile.py set last_command "/ads start" && python3 scripts/profile.py set last_command_at "$(date -u +%FT%TZ)".
/ads start status)Run python3 scripts/profile.py get and print:
claude-ads profile
Industry: <context.industry or "—">
Monthly spend: ~$<context.monthly_spend_usd>/mo
Goal: <context.primary_goal>
Active platforms: <comma list>
Meta: <tier> · <ad_account_id or "—"> · last verified <relative time>
Google: <tier> · <ad_account_id or "—"> · last verified <relative time>
TikTok: <tier> · <ad_account_id or "—"> · last verified <relative time>
Zernio: <on/off> · API key <present/missing>
Last command: <last_command> (<relative time>)
Exit without further prompts.
python3 scripts/profile.py is not executable, run it as python3 scripts/profile.py … (already the default).~/.claude-ads/ is read-only, print the path and ask the user to fix
permissions before retrying.AskUserQuestion returns "Other" without useful text, treat as cancel
for that step.The wizard does NOT produce a report file. It only writes
~/.claude-ads/profile.json and emits user-facing prose. Other /ads commands
read the profile via python3 scripts/profile.py get.