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
- Open Attribution settings → Ad spend import
- 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,usdUsing dollars instead of cents:
date,channel,campaign,spend,currency
2026-09-01,meta_ads,spring_prospecting,125.00,usdOptional 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:
| Platform | How to connect | Server env |
|---|---|---|
| Meta | OAuth or Marketing API token + ad account id | Optional META_ADS_APP_ID / META_ADS_APP_SECRET for OAuth |
| OAuth or access token + customer id (+ optional MCC login-customer-id) | GOOGLE_ADS_DEVELOPER_TOKEN required; GOOGLE_ADS_CLIENT_ID / SECRET for OAuth | |
| Microsoft | OAuth or access token + account id + customer id | MICROSOFT_ADS_DEVELOPER_TOKEN required; MICROSOFT_ADS_CLIENT_ID / SECRET for OAuth |
Settings → Ad spend:
- Click Connect with … OAuth when app credentials are configured, or paste tokens
- Confirm account / customer ids
- Sync 30d
APIs:
GET /api/v1/attribution/spend/sync— status + OAuth start pathsPUT /api/v1/attribution/spend/sync— save / disconnect credentialsPOST /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.