Exactly what you get
in the Space Ads OS package
Full command list, subagents, report templates and creative specs. This is a preview — the complete docs (markdown files: commands, agents, knowledge base) install with the package and are readable right inside Claude Code.
System release history (changelog) →Channels
What it reads, what it changes
Four channels, two auth models. Google Ads — your own developer token from your own MCC (a regular Google Ads account is not enough; you need a Manager Account, ~10 min to create). The rest run through our OAuth bridge with zero manual config.
| Channel | Read | Mutate | Auth | API |
|---|---|---|---|---|
| Google Ads | yes | yes | Your MCC developer token + your OAuth client | v24.1 |
| Meta Ads | yes | yes | OAuth via oauth.spaceads.agency (tokens encrypted client-side) | Marketing API v25.0 |
| TikTok Ads | yes | yes | OAuth via oauth.spaceads.agency (auto-refresh) | Business API v1.3 |
| GA4 | yes | n/a | OAuth or your service account JSON | Data API |
Google Ads
A full toolkit on the current v24.1 API
17+ mutation scripts plus diagnostics, attribution and multi-account monitoring on Google Ads API v24.1. Each with a clear job, each runnable with one command. v24.1 support includes iOS vs Android (segments.mobile_device_platform), frequency-of-reach (unique_users_*_plus), experiments with direct stats (point estimate, MoE, p-value) and gated PMAX_REPLACEMENT_SHOPPING mutations.
360° account audit
19 diagnostic sections in a single run: campaign structure, keywords, tracking, quality score, account settings, learning-phase alerts. Output includes a 0–100 health score.
google_ads.scripts.full_auditSearch terms & safe negatives
N-gram analysis (1/2/3-word) finds wasted-spend patterns at the statistical level, not query by query. Suggests negatives in PHRASE and EXACT — BROAD match is hard-blocked.
google_ads.scripts.search_terms_analyzerShopping + Merchant Center
Product-level ROAS split into Stars / Workers / Zombies / Draggers. Feed diagnostics (errors, missing fields, policy violations) via Merchant Center Content API v2.1.
google_ads.scripts.feed_optimizer + google_ads.merchant_centerPerformance Max — full visibility
SEARCH / CONTENT / YOUTUBE / DISCOVERY breakdown per asset group. Gender exclusions (v24), retail filter shared sets (v24), VTC toggle. iOS vs Android per campaign (v24.1, segments.mobile_device_platform). Things the panel itself does not surface.
google_ads.scripts.pmax_channel_performance + device_performanceBuild Performance Max campaigns from scratch
Not just analysis — the system builds a whole Performance Max campaign: budget, campaign (PAUSED, Maximize Conversion Value with a target ROAS) and a separate asset group per tier with an item_id listing filter. This is the engine behind /spaceads-bucketing: from feed segmentation (Platinum/Gold/Silver/Bronze) to a finished structure, fully under the 6 safety layers and dry-run by default.
google_ads.mutations.create_pmax_campaign + create_asset_group_with_listing_filterCart data — what they buy, what they add on
New view from Google Ads v24: lead_revenue (the SKU that earned the click) vs cross_sell_revenue (what landed in the cart on top). Critical for e-commerce with broad catalogs.
google_ads.scripts.cart_data_analysisBidding (tROAS / tCPA) with guardrails
Target ROAS changes within a 0.5×–20× range, max ±30% per change. The preview shows campaign ROAS history, the system blocks changes that would risk disrupting the learning phase.
google_ads.scripts.update_troasGeo, device, daypart
Performance per country (with HHI concentration index), per device, per hour of day. Surfaces wasted spend by region and time, suggests geo exclusions.
google_ads.scripts.geo_analysis + google_ads.scripts.device_performanceGA4 attribution gap
Confronts Google Ads clicks with GA4 sessions. Shows where the conversion path drifts (lost UTM parameters, tag issues, multi-domain) plus landing page health: bounce, engagement, session duration per campaign.
google_ads.ga4_helper + google_ads.scripts.landing_page_checkMonitoring & alerts
Daily alert check across the whole MCC: learning-limited, budget pacing off, ROAS drift, no spend, suspension risk. Email digest, JSONL audit trail, optional webhook integration.
google_ads.scripts.alert_check + google_ads.scripts.campaign_watchdogFrequency-of-reach (v24.1)
New view from Google Ads v24.1: unique_users_two_plus … ten_plus at customer scope. Shows how many unique users saw the ad 2×, 3×, 5×, 10×. Diagnostics flag thin frequency (<30% see it 2×), sweet-spot (avg 3–5, 5+ share 40–65%) and saturation (≥20% see it 10×). Closes the reach × frequency layer in the brand-awareness report.
google_ads.scripts.frequency_reachExperiments: direct stats + gated shipping (v24.1)
PMAX_REPLACEMENT_SHOPPING + 6 other new v24.1 experiment types. The experiment_stats script reads point estimate, margin of error and p-value for 7 metrics (ROAS change, conversions, cost, CPA, …) straight from the API. Gated mutations end_experiment (rollback) and graduate_experiment (ship) BLOCK before any API call when any of three gates fails: ≥14 days runtime, ROAS p ≤ 0.05, uplift ≥ +5%.
google_ads.experiments + scripts.experiment_stats + mutations.graduate_experiment
Meta Ads
Diagnostics, optimization and safe changes for Facebook + Instagram
5 mutation scripts plus diagnostics, recommendation engine and blended GA4 on Marketing API v25.0. You read, optimize and execute changes in one place — with a mandatory confirm wrapper that will not let anything happen without your sign-off.
Insights at three levels
Campaign / AdSet / Ad in one pass. Actions extracted from the actions[] array, CPA / ROAS / CTR computed precisely per conversion type (Purchase, Lead, custom).
insights.py + analysis.pyDiagnostics & alerts
Threshold rules on frequency cap, CPA, CTR, ROAS — at CRITICAL / WARNING / INFO severity. Catches campaigns stuck in learning, frequency ≥2.5× (warning) and ≥4× (critical), ROAS drifting below target.
diagnostics.pyRecommendation engine
Budget reallocation across adsets driven by median ROAS, frequency tuning suggestions, audiences flagged for testing. Every recommendation comes with numbers and a rationale.
optimization.pyBlended Meta + GA4
Joins Meta insights with GA4 by campaign name. Shows how many conversions Meta counts on its side vs how many GA4 actually sees on the store side — the real attribution gap, not a pixel argument.
blended.pySafe campaign changes
Pause / update budget / update ROAS target — with a mandatory .confirm() wrapper. Never delete (operation is blocked). Limits: budget max ±30% per change, 3–5 days between tunings.
campaigns.py + adsets.py + safety.pyWoW / MoM trends and anomalies
Week-over-week and month-over-month with statistical anomaly detection. Tells you whether a dip is seasonal, a weekend effect or a real campaign issue.
trends.py
TikTok Ads
Full integration with TikTok Business API v1.3
4 mutation scripts plus creative diagnostics, Smart+ migration and CAPI with EMQ on TikTok Business API v1.3. Mutations follow the same dry-run + .confirm() pattern as Meta.
Insights at four levels
Advertiser / Campaign / AdGroup / Ad — plus an hourly breakdown. Default 26 metrics: spend, conversions, total_purchase_value, video_watched_2s, video_views_p100, ROAS, CPA, CTR. All from a single /report/integrated/get/ endpoint.
insights.py + analysis.pyTikTok creative diagnostics
The metrics TikTok actually rewards: hook rate (30% threshold), completion rate (10% threshold), frequency fatigue (warning at 2.5×, critical at 3.5×), creative decay after 10 days. Severity-tagged alerts: CRITICAL / WARNING / INFO.
diagnostics.py + rules.pySmart+ migration by the rules
Checks whether a campaign meets Smart+ criteria: min 50 conversions/week, EMQ ≥ 6 on the Pixel, 6+ creative variants, ROAS within ±15%. If yes — produces a migration plan; if not — flags exactly what is missing.
optimization.pyPixel + Events API (CAPI)
Full server-side support: POST /event/track/ with SHA-256 hashing on email/phone/external_id, 5-minute dedup window, Event Match Quality validation (target ≥ 6, warning below 5). Smart+ and VBO require Pixel + CAPI together.
pixel.pySafe mutations + bulk
pause / resume / update_budget / update_bid — each via PendingAction with dry_run by default. Limits: budget ±30%, bid ±25%, min 3 days between learning-phase changes, delete blocked. For many campaigns at once: bulk_pause_campaigns().
campaigns.py + adgroups.py + safety.pyAsync reports + GA4 blended
Reports beyond 180 days / 10k rows go through an async flow (create → poll → download). Plus blended.py: merges TikTok insights with GA4 by campaign name — the actual attribution gap between "what TikTok says" and "what GA4 sees".
reports_async.py + blended.py
GA4 + multichannel attribution
One source of truth on the store side, not three pixel arguments
GA4 is read-only — the system joins it with Google Ads, Meta and TikTok by campaign name and shows who actually drove the conversions.
GA4 vs panel attribution gap
Shows the gap between what Meta counts on its side and what GA4 sees in your store. Pixel argument closed with numbers.
multichannel.attribution_compareLanding page health
Bounce, engagement, session duration per campaign. Catches LPs silently dragging CPA up.
ga4.scripts.landing_page_qualityCross-channel blended view
Google + Meta + TikTok + GA4 in one CSV/HTML — unified attribution in your weekly report at last.
multichannel.attribution_compare + multichannel.overview
23 slash commands
Full command reference
Every command with a one-line summary and a usage example.
/spaceads-check360° account audit — 19 diagnostic sections, health score 0–100, list of quick wins.
/spaceads-check google_ads --period=last_30d
/spaceads-overviewState of every channel for the active client on one screen.
/spaceads-overview --period=last_7d
/spaceads-monitorDaily alert check: learning limited, budget pacing off, ROAS drift, no spend, suspension risk.
/spaceads-monitor --severity=warning
/spaceads-changesAudit of mutations in the last N days (from per-channel JSONL audit logs).
/spaceads-changes --days=14
/spaceads-strategy30-day optimization plan with priorities and KPIs, anchored in the client brief.
/spaceads-strategy meta --goal=roas
/spaceads-keyword-researchN-gram + intent analysis on search terms, PHRASE/EXACT negative-keyword candidates.
/spaceads-keyword-research --topic="winter jackets"
/spaceads-geoPer-region performance (HHI), geo exclusions, spend concentration.
/spaceads-geo google_ads --period=last_90d
/spaceads-modifyChange with preview, mutation-reviewer (APPROVE/WARN/BLOCK) and confirmation.
/spaceads-modify "raise tROAS to 4.0 on Search Brand"
/spaceads-createNew campaign / ad set / negative list from a vertical playbook.
/spaceads-create campaign --vertical=dtc-ecommerce
/spaceads-reportHTML report in client branding — pick from 13 templates.
/spaceads-report 02_ecommerce_performance --period=last_30d
/spaceads-ga4GA4-vs-panel attribution gap, landing page health, custom definitions audit.
/spaceads-ga4 attribution --window=30d
/spaceads-whitelabelWhite-label report branding — operator-level or per-client logo, name, palette and footer.
/spaceads-whitelabel set --logo=logo.svg --name="Your Agency"
/spaceads-brandExtract logo, palette, fonts and voice from the client website into brief.yaml.brand_system.
/spaceads-brand extract --url=https://client.com
/spaceads-briefGenerate a creative brief for a campaign objective — hook angles, value props, proof points, CTA.
/spaceads-brief --campaign="Spring 2026" --objective=conversions
/spaceads-creativePer-format wireframe with safety zones + asset validator.
/spaceads-creative brief --platform=meta_stories
/spaceads-grow90-day strategic review — 4-phase Socratic (7 axes), ranked hypothesis backlog, 3/6/12-month roadmap.
/spaceads-grow --slug=acme-apparel
/spaceads-bucketingPMax: split the feed into 4 tiers (Platinum/Gold/Silver/Bronze) with separate budgets and tROAS per tier.
/spaceads-bucketing --customer-id=1234567890
/spaceads-seasonalSeasonal gaps — category in peak (sandals in summer, winter jackets in winter) but the account is not promoting it.
/spaceads-seasonal --client-slug=acme
/spaceads-cadenceWhat is overdue / due / scheduled today — every review task across clients and CIDs.
/spaceads-cadence overdue
/spaceads-intelWeekly industry digest — Reddit (PPC/GoogleAds), 10 top PPC blogs, Google Ads Developer Blog.
/spaceads-intel --since=7d
/spaceads-onboard5-minute conversational setup — operator profile + first client brief.
/spaceads-onboard --add-client
/spaceads-clientlist / switch / add — manage many clients in one CLI.
/spaceads-client switch acme-saas
/spaceads-agencyCross-client rollup of spend, ROAS and alerts for the agency weekly.
/spaceads-agency rollup --period=last_7d
5 AI subagents
Specialized Claude subagents
Each runs in its own context — main Claude orchestrates, agents execute.
mutation-reviewerIndependent review of every mutation before your "yes"
- Inputs
- Change plan, brief.yaml, campaign history, learning-phase status
- Outputs
- APPROVE / WARN / BLOCK + rationale + recommendation
- Model
- Claude Sonnet
report-builderGenerates HTML reports in client branding
- Inputs
- Selected template, period, channel data, brand_system from brief
- Outputs
- Responsive HTML, email-ready, opens in the browser
- Model
- Claude Sonnet
brand-extractorExtracts the brand system from the client website
- Inputs
- Client website URL
- Outputs
- logo, palette, fonts, voice samples, confidence score 0.0–1.0
- Model
- Claude Sonnet
creative-directorBrief + wireframe + safety-zone validation per platform
- Inputs
- Campaign objective, brand_system, ad_style, format/aspect ratio
- Outputs
- Markdown brief + HTML wireframe with safety overlay + asset validation
- Model
- Claude Sonnet
onboarding-coach5-minute conversational onboarding — operator + first client
- Inputs
- None (triggered by the SessionStart hook)
- Outputs
- .spaceads/operator.yaml + clients/<slug>/brief.yaml
- Model
- Claude Sonnet
13 report templates
Each template has its own audience
Generate via /spaceads-report <name> --period=<window>.
01_executive_summary- For whom:
- Decision-maker, C-level client
- Key sections:
- KPI cards, blended ROAS, channel split, top 3 recommendations
- Length:
- 2 screens, 3-min read
02_ecommerce_performance- For whom:
- Performance manager at a DTC store
- Key sections:
- ROAS per channel, top SKUs, RFM, day-N retention, GA4 attribution gap
- Length:
- 5 screens, 8-min read
03_leadgen_performance- For whom:
- B2B / lead-gen manager
- Key sections:
- CPL, MQL→SQL pipeline, source quality scoring, time-to-MQL, CAC/LTV
- Length:
- 4 screens, 6-min read
04_brand_awareness- For whom:
- Brand manager, TOFU campaigns
- Key sections:
- Reach × frequency, brand search lift, share of voice, view-through
- Length:
- 3 screens, 5-min read
05_social_engagement- For whom:
- Social media manager (TikTok/Instagram-first)
- Key sections:
- Hook rate, completion rate, top posts, time-of-day heatmap, sentiment
- Length:
- 4 screens, 6-min read
06_content_analysis- For whom:
- Creative team, content strategist
- Key sections:
- Performance per format, n-gram tables, hook patterns, sentiment
- Length:
- 4 screens, 7-min read
07_local_business- For whom:
- Multi-location, franchises
- Key sections:
- Location league, geo grid, calls heatmap, ratings, store visits
- Length:
- 5 screens, 8-min read
08_growth_roadmap- For whom:
- Strategic client + internal team
- Key sections:
- Snapshot KPIs (30d/prev/YoY), 7-axis decision grid, ranked hypothesis backlog, 12-week Gantt, 6/12-month milestones
- Length:
- 6 screens, 10-min read
09_bucketing_proposal- For whom:
- E-commerce client before launching a 4-tier PMax structure
- Key sections:
- Tier cards Platinum/Gold/Silver/Bronze, product-distribution treemap, budget doughnut, 6-step migration, risks + rollback
- Length:
- 5 screens, 7-min read
10_experiment_verdict- For whom:
- Client after a PMAX_REPLACEMENT_SHOPPING pilot (v24.1)
- Key sections:
- SHIP/HOLD/ROLL BACK verdict badge, 95% CI bars per metric, p-value table, gate checklist (≥14d, p ≤ 0.05, uplift ≥ +5%), challenger vs incumbent ROAS trend, ready-to-run graduate_experiment() snippet
- Length:
- 4 screens, 6-min read
11_competitive_landscape- For whom:
- Client interested in competitive positioning
- Key sections:
- 12-week SOV trend, competitor matrix (impression share, overlap, position-above, top-of-page, outranking), per-cluster bid posture, recommended bid moves
- Length:
- 4 screens, 6-min read
12_feed_health- For whom:
- E-commerce with a broad catalog / agency feed audit
- Key sections:
- STAR/MAGNET/DRIVER/NICHE halo matrix (v24 cart_data_sales_view), Stars/Workers/Zombies/Draggers scoreboard, disapprovals breakdown, field completion, top Magnet SKUs to Platinum
- Length:
- 5 screens, 7-min read
13_seasonal_calendar- For whom:
- Seasonal client / e-commerce with a category calendar
- Key sections:
- Category × week heatmap over 90 days (peak / shoulder / running / gap-peak / gap-shoulder), priority gap cards with revenue-at-risk + asset SLA, shoulder gaps, coverage doughnut, asset prep timeline
- Length:
- 4 screens, 6-min read
Creative specs
Safety zones per platform
The validator checks dimensions, safe-zone, contrast and text-on-image % before upload.
| Platform | Format | Dimensions | Safe zone |
|---|---|---|---|
| Meta | Stories / Reels | 1080×1920 (9:16) | top 250px, bottom 350px, side 60px |
| Meta | Feed 1:1 | 1080×1080 | text-on-image ≤ 20% (recommended) |
| Google Display | 5 aspect ratios | 1:1 / 4:5 / 1.91:1 / 9:16 / 16:9 | logo + headline within central 80% of the canvas |
| TikTok | In-feed 9:16 | 1080×1920 | top 130px (handle), bottom 484px (CTA + caption) |
| placeholder | — | full spec when the channel ships |
Full specs in the package: src/spaceads_os/knowledge/creative_specs/{meta,google_ads,tiktok,linkedin}.md.
Brand + creative pipeline
From the client website to a production-ready creative spec
Four steps, each driven by an agent or a command. No "send me the brand book PDF" and no 24h ban after review.
- 01
Brand extract
The brand-extractor agent pulls logo, palette, fonts and voice from the client URL and writes them into brief.yaml.brand_system. No manual briefing.
- 02
Brief
/spaceads-brief generates a creative brief for the campaign objective — hook angles, value props, proof points, CTA — in the brand voice, not corporate speak.
- 03
Wireframe
The creative-director agent assembles a wireframe per format (Meta Story 1080×1920, Reel, Feed 1:1, Google Display 5 ratios, TikTok in-feed 9:16) with safety zones and text-overlay slots.
- 04
Validator
Checks dimensions, safe-zone, contrast and text-on-image % against the platform policy. Anything that would fail review goes back to iteration immediately, not after a 24h ban.
6-layer safety
Every mutation passes through six layers
Five deterministic + one AI review (mutation-reviewer). Behaves the same on a Friday at 5pm and a Sunday at 3am.
- 01
Input validation
Types, ranges, account scope — before anything touches the API. Every `*.mutations.*` script has its own pydantic schema that validation must pass first.
- 02
LIMITS check
safety.LIMITS per channel: budget ±30%, target ROAS ±30% (Google/Meta), bid ±25% (TikTok), max 200 negatives per batch. Hard-blocked: REMOVE. Every LIMIT is a constant in code, not config.
- 03
Preview
Human-readable diff: which object, which field, before → after, expected impact on spend. Printed in the terminal before any API call.
- 04
mutation-reviewer agent
A Claude Sonnet subagent reads the plan in the context of campaign history and the playbook, returns APPROVE / WARN / BLOCK. WARN surfaces risk, BLOCK hard-stops execution. Runs before your 'yes', not instead of it.
- 05
Post-mutation verification
After the change, the system reads the entity back from the API. If the post-state does not match the expected one — status "incomplete" + alert.
- 06
Audit log (JSONL)
Every mutation → logs/<channel>_changes.jsonl. Append-only. Full audit trail per client.
Agency mode
Many clients, one CLI, isolated audit logs
Every client gets its own brief.yaml, its own voice.md, its own logs/changes.jsonl. /spaceads-agency adds a cross-client rollup — without mixing data.
- clients/registry.yaml — single source of truth for active clients
- Per-client brief.yaml: goals, ICP, voice, brand_system, vertical playbook
- Per-client credentials/ — your Google Ads token, Meta business, TikTok account stay isolated
- Per-client logs/changes.jsonl — full audit trail per client (GDPR-friendly)
- /spaceads-agency — cross-client rollup of spend, ROAS, alerts for the agency weekly
clients:
- id: acme-store
name: Acme Store
vertical: dtc-ecommerce
channels: [google, meta, ga4]
- id: acme-saas
name: Acme SaaS
vertical: b2b-saas
channels: [google, meta]
Vertical playbooks
Five verticals, five different rule sets
The system picks optimization patterns for your vertical — tROAS targets, conversion lag, bidding strategy presets, campaign structure.
DTC e-commerce
PMax + Shopping + Search brand. Stars/Workers/Zombies/Draggers segmentation. Cross-sell tracking. Conversion lag 3–7 days.
Lead generation B2C
Conversion ladder MQL→SQL, source quality scoring, lead value per stage. Conversion lag 7–14 days.
B2B / SaaS
Long sales cycle (14–30+ days), MQL→SQL→Opportunity tracking, brand search incrementality, LinkedIn as a placeholder.
Mobile app
Install→engage→retain funnel, AppsFlyer/Adjust integration, in-app event optimization, ARPU targets.
Local / multi-location
Per-location geo, store visit conversions, local Search, Google Business Profile signals.
Embedded know-how
It isn't generic AI — it's codified marketing knowledge
Space Ads OS injects its own knowledge base into Claude Code's context: ~30 maintained files across 6 categories — from per-channel integration through cross-cutting concepts to vertical playbooks. Recommendations sit on platform reality and the team's experience, not on the model guessing. You can read every file and adapt it to your business.
How much knowledge is that?
About the length of a short field manual — and all of it is loaded into Claude Code's context every session, instead of being guessed by the model.
Channels
Google Ads, Meta, TikTok — each file in 11 fixed sections: account structure, bidding, audiences, creative, measurement, reporting, deprecated features.
Analytics
GA4, Merchant Center, GTM — data model, event schema and tagging, store-side attribution.
Concepts
Learning phase, attribution windows, creative testing, Pixel + CAPI, blended ROAS, consent/ATT — cross-cutting, written once and linked from the channels.
Vertical playbooks
DTC e-commerce, lead-gen B2C, B2B/SaaS, mobile app, local — how the 4 channels and GA4 work together, with KPI benchmarks and a 6-month cadence.
Creative specs
Google, Meta, TikTok, LinkedIn — formats, dimensions and safe zones the creative-director agent enforces.
Operator reference
Glossary, client-brief template, quickstart, agency mode, agent catalog and the multichannel map.
tROAS ramp-up
How to push target ROAS up safely without killing the learning phase: max ±30% every 5–7 days, minimum 14-day monitoring window, expect a conversion dip in the first 3 days after the change.
Meta Andromeda — full-funnel optimization at the ad-set level
Andromeda optimizes at the ad-set level, not per ad. Spend distribution is intentionally uneven — one ad commonly takes 60–80% of the budget. You evaluate the ad-set portfolio, not individual ad CPA, and you don't pause based on single-ad metrics. Test 10+ conceptually distinct creatives, not minor variations of the same one.
Conversion lag awareness
E-commerce: 3–7 days from click to actual conversion. B2B / lead gen: 14–30 days. The system does not panic when "today's" ROAS looks low — it knows when to evaluate.
PMax vs Search ROAS comparison
How to compare Performance Max and Search fairly when PMax cannibalizes brand search: forced SEARCH-only breakdown, brand-traffic correction, real incremental ROAS.
Learning-phase respect
A learning campaign is sacred: ±30% is the absolute change limit, no creative edits, no audience changes, ad scheduling only in extreme cases.
That is the real edge over generic AI. The system does not improvise an answer from whatever the model once read on the open web — it runs on strategies our team has tested on live ad accounts, written down and loaded into the tool. Proven practice, not a confident guess.
Troubleshooting
Top issues and how to recover
Long version in the package: docs/troubleshooting.md.
I don't have a Manager Account in Google Ads — what now?
You need to create an MCC (free, ~10 min). Google does not issue developer tokens from regular Google Ads accounts. Steps: (1) ads.google.com/aw/accounts/managers/ → Create manager account; (2) pick "Manage my own accounts" if solo or "Manage other accounts" if agency; (3) link your existing Google Ads account to the MCC: Sub-account settings → Link existing account, enter the 10-digit Customer ID, accept the invitation from the regular account; (4) inside the MCC: TOOLS → API Center → apply for the developer token (1–2 business days). The CLI setup wizard (spaceads-setup) walks you through every step.
I get a 403 from Google Ads API
Most often: developer token at Test Account level instead of Basic, or missing login-customer-id in the config. Check ~/.config/google-ads/config.yaml — login_customer_id must match the MCC you are calling the API from.
Meta OAuth expires after 60 days
The oauth.spaceads.agency bridge auto-refreshes tokens as long as you do not revoke access in Meta Business Settings. If you see "token expired" — run spaceads-setup --reauth=meta.
GA4 returns empty sessions
Most common mix-up: the config has Measurement ID (G-XXXX) instead of Property ID (numeric). Check clients/<slug>/credentials/ga4.json — property_id must be a number, not a string starting with G-.
Smart+ migration is not going through
Smart+ requires: min 50 conversions/week, EMQ ≥ 6 on the Pixel, 6+ creative variants, ROAS within ±15%. /spaceads-modify migrate-smart-plus shows which conditions fail — most often EMQ or creative variants.
CLI says "subscription inactive"
Subscription expired or was canceled. Visit academy.spaceads.agency/account/subscription and reactivate. The CLI regains access within minutes of the next charge clearing.
Audit log timezone differs from the client
logs/changes.jsonl defaults to UTC. Set SPACEADS_TZ=Europe/Warsaw (or the client IANA timezone) so timestamps are stored in local time.
Time to turn the preview into the product
Monthly subscription, instant invoice, instant access after first payment. Cancel anytime.
Activate subscription