Documentation

Ad spend & ROAS

Import daily spend, unlock campaign ROAS, and read pipeline vs spend.

Attributed revenue alone cannot answer “what did I get for what I spent?” Import daily ad spend into Intently to unlock campaign ROAS and pipeline vs spend.

Import spend

  1. Open Attribution settingsAd spend import
  2. Upload a CSV (or POST JSON to /api/v1/attribution/spend)

CSV format

Required columns: date, channel, and either spend_cents or spend (dollars).

date,channel,campaign,spend_cents,currency
2026-09-01,meta_ads,spring_prospecting,12500,usd
2026-09-01,google_ads,competitor,9800,usd

Using dollars instead of cents:

date,channel,campaign,spend,currency
2026-09-01,meta_ads,spring_prospecting,125.00,usd

Optional columns: impressions, clicks, platform.

Channel keys

Use the same canonical keys as attribution (examples): meta_ads, google_ads, microsoft_ads, tiktok_ads, linkedin_ads. Rows upsert on account + date + channel + campaign + currency.

What unlocks on /attribution

  • Campaign breakdown — attributed revenue by channel/campaign with ROAS (revenue ÷ spend) and ROI
  • Pipeline vs ad spend — daily attributed revenue vs daily spend
  • Readiness item Ad spend (for ROAS) completes when spend rows exist in the last 30 days

Without spend, those panels still load; ROAS shows as empty and the UI points you back to import.

Platform sync

CSV import remains fully supported. Live connectors write to the same attribution_ad_spend table:

PlatformHow to connectServer env
MetaOAuth or Marketing API token + ad account idOptional META_ADS_APP_ID / META_ADS_APP_SECRET for OAuth
GoogleOAuth or access token + customer id (+ optional MCC login-customer-id)GOOGLE_ADS_DEVELOPER_TOKEN required; GOOGLE_ADS_CLIENT_ID / SECRET for OAuth
MicrosoftOAuth or access token + account id + customer idMICROSOFT_ADS_DEVELOPER_TOKEN required; MICROSOFT_ADS_CLIENT_ID / SECRET for OAuth

Settings → Ad spend:

  1. Click Connect with … OAuth when app credentials are configured, or paste tokens
  2. Confirm account / customer ids
  3. Sync 30d

APIs:

  • GET /api/v1/attribution/spend/sync — status + OAuth start paths
  • PUT /api/v1/attribution/spend/sync — save / disconnect credentials
  • POST /api/v1/attribution/spend/sync{ "platform": "meta"|"google"|"microsoft" }
  • GET /api/v1/attribution/spend/oauth/{platform}/start — browser OAuth

Pause / scale write-back

On /attribution, ROAS recommendations can Apply pause or +20% budget for Meta campaigns when spend sync has stored campaign ids. API: POST /api/v1/attribution/actions with confirm: true.

Next