Public docs preview

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.

ChannelReadMutateAuthAPI
Google AdsyesyesYour MCC developer token + your OAuth clientv24.1
Meta AdsyesyesOAuth via oauth.spaceads.agency (tokens encrypted client-side)Marketing API v25.0
TikTok AdsyesyesOAuth via oauth.spaceads.agency (auto-refresh)Business API v1.3
GA4yesn/aOAuth or your service account JSONData 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_audit
  • Search 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_analyzer
  • Shopping + 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_center
  • Performance 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_performance
  • Build 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_filter
  • Cart 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_analysis
  • Bidding (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_troas
  • Geo, 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_performance
  • GA4 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_check
  • Monitoring & 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_watchdog
  • Frequency-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_reach
  • Experiments: 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.py
  • Diagnostics & 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.py
  • Recommendation 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.py
  • Blended 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.py
  • Safe 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.py
  • WoW / 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.py
  • TikTok 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.py
  • Smart+ 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.py
  • Pixel + 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.py
  • Safe 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.py
  • Async 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_compare
  • Landing page health

    Bounce, engagement, session duration per campaign. Catches LPs silently dragging CPA up.

    ga4.scripts.landing_page_quality
  • Cross-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-check

    360° account audit — 19 diagnostic sections, health score 0–100, list of quick wins.

    /spaceads-check google_ads --period=last_30d
  • /spaceads-overview

    State of every channel for the active client on one screen.

    /spaceads-overview --period=last_7d
  • /spaceads-monitor

    Daily alert check: learning limited, budget pacing off, ROAS drift, no spend, suspension risk.

    /spaceads-monitor --severity=warning
  • /spaceads-changes

    Audit of mutations in the last N days (from per-channel JSONL audit logs).

    /spaceads-changes --days=14
  • /spaceads-strategy

    30-day optimization plan with priorities and KPIs, anchored in the client brief.

    /spaceads-strategy meta --goal=roas
  • /spaceads-keyword-research

    N-gram + intent analysis on search terms, PHRASE/EXACT negative-keyword candidates.

    /spaceads-keyword-research --topic="winter jackets"
  • /spaceads-geo

    Per-region performance (HHI), geo exclusions, spend concentration.

    /spaceads-geo google_ads --period=last_90d
  • /spaceads-modify

    Change with preview, mutation-reviewer (APPROVE/WARN/BLOCK) and confirmation.

    /spaceads-modify "raise tROAS to 4.0 on Search Brand"
  • /spaceads-create

    New campaign / ad set / negative list from a vertical playbook.

    /spaceads-create campaign --vertical=dtc-ecommerce
  • /spaceads-report

    HTML report in client branding — pick from 13 templates.

    /spaceads-report 02_ecommerce_performance --period=last_30d
  • /spaceads-ga4

    GA4-vs-panel attribution gap, landing page health, custom definitions audit.

    /spaceads-ga4 attribution --window=30d
  • /spaceads-whitelabel

    White-label report branding — operator-level or per-client logo, name, palette and footer.

    /spaceads-whitelabel set --logo=logo.svg --name="Your Agency"
  • /spaceads-brand

    Extract logo, palette, fonts and voice from the client website into brief.yaml.brand_system.

    /spaceads-brand extract --url=https://client.com
  • /spaceads-brief

    Generate a creative brief for a campaign objective — hook angles, value props, proof points, CTA.

    /spaceads-brief --campaign="Spring 2026" --objective=conversions
  • /spaceads-creative

    Per-format wireframe with safety zones + asset validator.

    /spaceads-creative brief --platform=meta_stories
  • /spaceads-grow

    90-day strategic review — 4-phase Socratic (7 axes), ranked hypothesis backlog, 3/6/12-month roadmap.

    /spaceads-grow --slug=acme-apparel
  • /spaceads-bucketing

    PMax: split the feed into 4 tiers (Platinum/Gold/Silver/Bronze) with separate budgets and tROAS per tier.

    /spaceads-bucketing --customer-id=1234567890
  • /spaceads-seasonal

    Seasonal gaps — category in peak (sandals in summer, winter jackets in winter) but the account is not promoting it.

    /spaceads-seasonal --client-slug=acme
  • /spaceads-cadence

    What is overdue / due / scheduled today — every review task across clients and CIDs.

    /spaceads-cadence overdue
  • /spaceads-intel

    Weekly industry digest — Reddit (PPC/GoogleAds), 10 top PPC blogs, Google Ads Developer Blog.

    /spaceads-intel --since=7d
  • /spaceads-onboard

    5-minute conversational setup — operator profile + first client brief.

    /spaceads-onboard --add-client
  • /spaceads-client

    list / switch / add — manage many clients in one CLI.

    /spaceads-client switch acme-saas
  • /spaceads-agency

    Cross-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-reviewer

    Independent 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-builder

    Generates 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-extractor

    Extracts 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-director

    Brief + 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-coach

    5-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.

PlatformFormatDimensionsSafe zone
MetaStories / Reels1080×1920 (9:16)top 250px, bottom 350px, side 60px
MetaFeed 1:11080×1080text-on-image ≤ 20% (recommended)
Google Display5 aspect ratios1:1 / 4:5 / 1.91:1 / 9:16 / 16:9logo + headline within central 80% of the canvas
TikTokIn-feed 9:161080×1920top 130px (handle), bottom 484px (CTA + caption)
LinkedInplaceholderfull 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  1. 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.

  2. 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.

  3. 03

    Preview

    Human-readable diff: which object, which field, before → after, expected impact on spend. Printed in the terminal before any API call.

  4. 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.

  5. 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.

  6. 06

    Audit log (JSONL)

    Every mutation → logs/<channel>_changes.jsonl. Append-only. Full audit trail per client.

Every mutation logs as a JSONL row with: timestamp, actor, account, object_type, object_id, field, before, after, reason, reviewer_verdict. Audit log = full rollback in one command.

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/registry.yaml
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?

60+
A4 pages of dense expertise
33,000+
words of codified practice
~30
files across 6 categories

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
Space Ads OS docs — commands, subagents, reports