Ads API
REST endpoints for ads in SKUFlow: 10 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.skuflow.ai/api. Every call needs Authorization: Bearer skf_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.
| Operation | Endpoint | Risk |
|---|---|---|
| Ad accounts and connections | GET /organizations/{organizationId}/ads/accounts | read |
| An ad account | GET /organizations/{organizationId}/ads/accounts/{adAccountId} | read |
| Start connecting an ad platform | POST /organizations/{organizationId}/ads/connect | sensitive |
| Choose the ad accounts SKUFlow reads | POST /organizations/{organizationId}/ads/accounts/choose | sensitive |
| Disconnect an ad platform | POST /organizations/{organizationId}/ads/disconnect | sensitive |
| Add SKUFlow tracking to campaigns | POST /organizations/{organizationId}/ads/accounts/{adAccountId}/tracking | sensitive |
| Sync an ad account now | POST /organizations/{organizationId}/ads/accounts/{adAccountId}/sync | write |
| List ad campaigns | GET /organizations/{organizationId}/ads/campaigns | read |
| An ad campaign | GET /organizations/{organizationId}/ads/campaigns/{adCampaignId} | read |
| What ads returned | GET /organizations/{organizationId}/ads/report | read |
Ad accounts and connections
GET /organizations/{organizationId}/ads/accounts
Whether Google Ads and Meta are connected (and usable on this server), the ad accounts each sign-in can use, and the business's ad accounts with their sync state. Start here before connecting, choosing accounts or reading the return. Read-only.
| Permission | ads.read (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | adAccounts_list (toolset ads) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/accounts" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
mode | enum | SKUFLOW_ADS on this server. One of fake, live, off. |
platforms | array of object | |
platforms[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
platforms[].mode | enum | fake: demo accounts (tests); live: the real platform; unconfigured: this server has no app credentials for it; off: ads are switched off here. One of fake, live, unconfigured, off. |
platforms[].connected | boolean | |
platforms[].status | string | |
platforms[].account | string or null | Who signed in at the platform. |
platforms[].connectedAt | string (date-time) or null | |
platforms[].lastError | string or null | |
platforms[].available | array of object | The ad accounts this sign-in can use; choose with POST /ads/accounts/choose. |
platforms[].available[].externalAccountId | string | |
platforms[].available[].name | string | |
platforms[].available[].currency | string | |
platforms[].available[].timeZone | string | |
platforms[].available[].chosen | boolean | SKUFlow reads this account. |
accounts | array of object | |
accounts[].id | string | |
accounts[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
accounts[].mode | enum | One of MANAGED, CONNECTED. |
accounts[].externalAccountId | string | The platform's id: a Google Ads customer id (digits) or a Meta ad account id. |
accounts[].loginCustomerId | string or null | |
accounts[].name | string | |
accounts[].currency | string | ISO 4217; spend is integer cents of it. |
accounts[].timeZone | string | The ad account's time zone: spend days are in it. |
accounts[].status | string | ACTIVE (synced hourly), DISCONNECTED (no longer read; history kept), and others. |
accounts[].backfilledAt | string (date-time) or null | When the first 90-day spend import finished. |
accounts[].trackingAddedAt | string (date-time) or null | |
accounts[].lastSyncAt | string (date-time) or null | |
accounts[].lastError | string or null | |
accounts[].createdAt | string (date-time) | |
accounts[].campaignCount | integer |
An ad account
GET /organizations/{organizationId}/ads/accounts/{adAccountId}
One ad account with its campaigns (imported from the platform). Read-only.
| Permission | ads.read (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | adAccounts_get (toolset ads) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
adAccountId | path | string | Yes |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/accounts/{adAccountId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
mode | enum | One of MANAGED, CONNECTED. |
externalAccountId | string | The platform's id: a Google Ads customer id (digits) or a Meta ad account id. |
loginCustomerId | string or null | |
name | string | |
currency | string | ISO 4217; spend is integer cents of it. |
timeZone | string | The ad account's time zone: spend days are in it. |
status | string | ACTIVE (synced hourly), DISCONNECTED (no longer read; history kept), and others. |
backfilledAt | string (date-time) or null | When the first 90-day spend import finished. |
trackingAddedAt | string (date-time) or null | |
lastSyncAt | string (date-time) or null | |
lastError | string or null | |
createdAt | string (date-time) | |
campaignCount | integer | |
campaigns | array of object | |
campaigns[].id | string | |
campaigns[].adAccountId | string | |
campaigns[].externalCampaignId | string or null | |
campaigns[].name | string | |
campaigns[].kind | string | SEARCH, PERFORMANCE_MAX, META_LEADS, META_TRAFFIC, LSA or OTHER (imported). |
campaigns[].goal | string or null | |
campaigns[].status | string | ACTIVE, PAUSED, ENDED, REJECTED (and DRAFT for SKUFlow drafts). |
campaigns[].platformStatus | string or null | |
campaigns[].origin | enum | Imported: read from a connected account; not editable in SKUFlow yet. One of SKUFLOW, IMPORTED. |
campaigns[].dailyBudgetCents | integer or null | |
campaigns[].utmCampaign | string or null | Our utm_campaign: a request whose visit carries it is credited to this campaign. |
campaigns[].trackingPhoneNumberId | string or null | |
campaigns[].landingPageId | string or null | |
campaigns[].businessUnitId | string or null | |
campaigns[].lastSyncAt | string (date-time) or null | |
campaigns[].createdAt | string (date-time) | |
campaigns[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
campaigns[].accountName | string | |
campaigns[].currency | string |
Start connecting an ad platform
POST /organizations/{organizationId}/ads/connect
Grants access: returns the platform's consent URL (Google: the adwords scope; Meta: ads_read, ads_management and the lead and Page permissions). The person signs in there; the platform then redirects to /integrations/ads/callback with code and state, finished with POST /ads/callback. 400 when this server has no credentials for the platform.
| Permission | ads.spend (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | adAccounts_connect (toolset ads) |
| Plan | Needs the Ads add-on. |
| Approval | Waits for your approval in SKUFlow when called with an API key or a connected app: the first call answers 428 APPROVAL_REQUIRED; once you approve it, repeat the call with the X-SKUFlow-Approval header. See Approvals. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
platform | enum | Yes | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/connect" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"GOOGLE_ADS"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
authorizeUrl | string | |
mode | enum | fake: demo accounts (tests); live: the real platform; unconfigured: this server has no app credentials for it; off: ads are switched off here. One of fake, live, unconfigured, off. |
platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
Choose the ad accounts SKUFlow reads
POST /organizations/{organizationId}/ads/accounts/choose
Grants access: the platform's ad accounts SKUFlow may read (ids from GET /ads/accounts → platforms[].available). The list replaces the previous one: an account left out stops syncing and keeps its history. Chosen accounts are synced now: campaigns imported and 90 days of spend. Spends nothing.
| Permission | ads.spend (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | adAccounts_chooseAccounts (toolset ads) |
| Plan | Needs the Ads add-on. |
| Approval | Waits for your approval in SKUFlow when called with an API key or a connected app: the first call answers 428 APPROVAL_REQUIRED; once you approve it, repeat the call with the X-SKUFlow-Approval header. See Approvals. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
platform | enum | Yes | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
externalAccountIds | array of string | Yes | The platform's ad account ids, as listed in available. Up to 50 items. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/accounts/choose" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"GOOGLE_ADS","externalAccountIds":["externalAccount_id"]}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
mode | enum | SKUFLOW_ADS on this server. One of fake, live, off. |
platforms | array of object | |
platforms[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
platforms[].mode | enum | fake: demo accounts (tests); live: the real platform; unconfigured: this server has no app credentials for it; off: ads are switched off here. One of fake, live, unconfigured, off. |
platforms[].connected | boolean | |
platforms[].status | string | |
platforms[].account | string or null | Who signed in at the platform. |
platforms[].connectedAt | string (date-time) or null | |
platforms[].lastError | string or null | |
platforms[].available | array of object | The ad accounts this sign-in can use; choose with POST /ads/accounts/choose. |
platforms[].available[].externalAccountId | string | |
platforms[].available[].name | string | |
platforms[].available[].currency | string | |
platforms[].available[].timeZone | string | |
platforms[].available[].chosen | boolean | SKUFlow reads this account. |
accounts | array of object | |
accounts[].id | string | |
accounts[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
accounts[].mode | enum | One of MANAGED, CONNECTED. |
accounts[].externalAccountId | string | The platform's id: a Google Ads customer id (digits) or a Meta ad account id. |
accounts[].loginCustomerId | string or null | |
accounts[].name | string | |
accounts[].currency | string | ISO 4217; spend is integer cents of it. |
accounts[].timeZone | string | The ad account's time zone: spend days are in it. |
accounts[].status | string | ACTIVE (synced hourly), DISCONNECTED (no longer read; history kept), and others. |
accounts[].backfilledAt | string (date-time) or null | When the first 90-day spend import finished. |
accounts[].trackingAddedAt | string (date-time) or null | |
accounts[].lastSyncAt | string (date-time) or null | |
accounts[].lastError | string or null | |
accounts[].createdAt | string (date-time) | |
accounts[].campaignCount | integer |
Disconnect an ad platform
POST /organizations/{organizationId}/ads/disconnect
Revokes access: revokes and forgets the platform's tokens and stops syncing its ad accounts. Campaigns, spend history and credited requests stay; connect again to resume. Campaigns keep running at the platform.
| Permission | ads.spend (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | adAccounts_disconnect (toolset ads) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
platform | enum | Yes | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/disconnect" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"GOOGLE_ADS"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
mode | enum | SKUFLOW_ADS on this server. One of fake, live, off. |
platforms | array of object | |
platforms[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
platforms[].mode | enum | fake: demo accounts (tests); live: the real platform; unconfigured: this server has no app credentials for it; off: ads are switched off here. One of fake, live, unconfigured, off. |
platforms[].connected | boolean | |
platforms[].status | string | |
platforms[].account | string or null | Who signed in at the platform. |
platforms[].connectedAt | string (date-time) or null | |
platforms[].lastError | string or null | |
platforms[].available | array of object | The ad accounts this sign-in can use; choose with POST /ads/accounts/choose. |
platforms[].available[].externalAccountId | string | |
platforms[].available[].name | string | |
platforms[].available[].currency | string | |
platforms[].available[].timeZone | string | |
platforms[].available[].chosen | boolean | SKUFlow reads this account. |
accounts | array of object | |
accounts[].id | string | |
accounts[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
accounts[].mode | enum | One of MANAGED, CONNECTED. |
accounts[].externalAccountId | string | The platform's id: a Google Ads customer id (digits) or a Meta ad account id. |
accounts[].loginCustomerId | string or null | |
accounts[].name | string | |
accounts[].currency | string | ISO 4217; spend is integer cents of it. |
accounts[].timeZone | string | The ad account's time zone: spend days are in it. |
accounts[].status | string | ACTIVE (synced hourly), DISCONNECTED (no longer read; history kept), and others. |
accounts[].backfilledAt | string (date-time) or null | When the first 90-day spend import finished. |
accounts[].trackingAddedAt | string (date-time) or null | |
accounts[].lastSyncAt | string (date-time) or null | |
accounts[].lastError | string or null | |
accounts[].createdAt | string (date-time) | |
accounts[].campaignCount | integer |
Add SKUFlow tracking to campaigns
POST /organizations/{organizationId}/ads/accounts/{adAccountId}/tracking
Changes live ads: asks the platform to add SKUFlow's UTM parameters (utm_source, utm_medium, utm_campaign) to every imported campaign's landing URLs, so requests from those ads are credited to their campaign. Google: set on each campaign (final URL suffix). Meta keeps URL parameters on each ad: manual lists what to paste in Ads Manager. Spends nothing; 409 when the account isn't connected.
| Permission | ads.manage (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | adAccounts_addTracking (toolset ads) |
| Plan | Needs the Ads add-on. |
| Approval | Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
adAccountId | path | string | Yes |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/accounts/{adAccountId}/tracking" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
campaigns | integer | |
applied | integer | Campaigns the platform now tags itself. |
manual | array of object | |
manual[].adCampaignId | string | |
manual[].name | string | |
manual[].urlParameters | string | |
failed | array of object | |
failed[].adCampaignId | string | |
failed[].name | string | |
failed[].error | string |
Sync an ad account now
POST /organizations/{organizationId}/ads/accounts/{adAccountId}/sync
Reads the account's campaigns and recent spend from the platform now (it also happens every hour; a day's spend is final three days after it), then credits recent requests whose ad click the platform can name. Rate-limited; 409 when the account isn't connected.
| Permission | ads.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | adAccounts_sync (toolset ads) |
| Plan | Needs the Ads add-on. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
adAccountId | path | string | Yes |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/accounts/{adAccountId}/sync" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
campaigns | integer | |
days | integer | Spend days written. |
resolvedClicks | integer | Requests credited by their click id. |
skipped | boolean | Another sync had just finished; nothing new. |
List ad campaigns
GET /organizations/{organizationId}/ads/campaigns
The business's ad campaigns (imported from connected accounts), filtered by adAccountId, platform or status. For what they returned, call GET /ads/report. Read-only.
| Permission | ads.read (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | adCampaigns_list (toolset ads) |
| Plan | Needs the Ads add-on. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
adAccountId | query | string | No | |
platform | query | enum | No | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
status | query | enum | No | One of DRAFT, PUBLISHING, ACTIVE, PAUSED, PAUSED_FUNDS, REJECTED, ENDED. |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/campaigns" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
An array of objects:
| Field | Type | Description |
|---|---|---|
id | string | |
adAccountId | string | |
externalCampaignId | string or null | |
name | string | |
kind | string | SEARCH, PERFORMANCE_MAX, META_LEADS, META_TRAFFIC, LSA or OTHER (imported). |
goal | string or null | |
status | string | ACTIVE, PAUSED, ENDED, REJECTED (and DRAFT for SKUFlow drafts). |
platformStatus | string or null | |
origin | enum | Imported: read from a connected account; not editable in SKUFlow yet. One of SKUFLOW, IMPORTED. |
dailyBudgetCents | integer or null | |
utmCampaign | string or null | Our utm_campaign: a request whose visit carries it is credited to this campaign. |
trackingPhoneNumberId | string or null | |
landingPageId | string or null | |
businessUnitId | string or null | |
lastSyncAt | string (date-time) or null | |
createdAt | string (date-time) | |
platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
accountName | string | |
currency | string |
An ad campaign
GET /organizations/{organizationId}/ads/campaigns/{adCampaignId}
One campaign with its last 30 spend days (impressions, clicks, spend, the platform's own conversions, and whether each day is final). Read-only.
| Permission | ads.read (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | adCampaigns_get (toolset ads) |
| Plan | Needs the Ads add-on. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
adCampaignId | path | string | Yes |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/campaigns/{adCampaignId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
adAccountId | string | |
externalCampaignId | string or null | |
name | string | |
kind | string | SEARCH, PERFORMANCE_MAX, META_LEADS, META_TRAFFIC, LSA or OTHER (imported). |
goal | string or null | |
status | string | ACTIVE, PAUSED, ENDED, REJECTED (and DRAFT for SKUFlow drafts). |
platformStatus | string or null | |
origin | enum | Imported: read from a connected account; not editable in SKUFlow yet. One of SKUFLOW, IMPORTED. |
dailyBudgetCents | integer or null | |
utmCampaign | string or null | Our utm_campaign: a request whose visit carries it is credited to this campaign. |
trackingPhoneNumberId | string or null | |
landingPageId | string or null | |
businessUnitId | string or null | |
lastSyncAt | string (date-time) or null | |
createdAt | string (date-time) | |
platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
accountName | string | |
currency | string | |
days | array of object | |
days[].date | string | |
days[].impressions | integer | |
days[].clicks | integer | |
days[].spendCents | integer | |
days[].platformConversions | number | |
days[].final | boolean | The platform no longer restates this day. |
What ads returned
GET /organizations/{organizationId}/ads/report
Per campaign, per platform and in total for a date range (default the last 30 days): spend, impressions, clicks, leads (requests credited to the campaign + calls on its tracking number), won quotes, revenue (paid on those quotes' invoices within windowDays of the lead, default 90), cost per lead and per sale, and return on spend; with SKUFlow's Ads fee beside it. Spend days are in each ad account's time zone; leads are counted on the business's days. Read-only.
| Permission | ads.read (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | adReports_summary (toolset ads) |
| Plan | Needs the Ads add-on. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
from | query | string | No | First day, YYYY-MM-DD (default 29 days before today). |
to | query | string | No | Last day, YYYY-MM-DD (default today). |
platform | query | enum | No | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
adAccountId | query | string | No | |
windowDays | query | integer | No | Days after a lead its paid invoices count (default 90). 1–365. |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/ads/report" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
range | object | |
range.from | string | |
range.to | string | |
range.timezone | string | |
windowDays | integer | |
currency | string | |
totals | object | |
totals.spendCents | number | Spend in cents of the account currency. |
totals.impressions | number | |
totals.clicks | number | |
totals.requests | integer | Requests credited to the campaign (adCampaignId). |
totals.calls | integer | Inbound calls on the campaign's tracking number. |
totals.leads | integer | requests + calls. |
totals.wonQuotes | integer | Quotes made from those requests that the customer approved. |
totals.revenueCents | number | Paid on those quotes' invoices within the attribution window. |
totals.costPerLeadCents | number or null | |
totals.costPerSaleCents | number or null | Spend ÷ won quotes, in cents. |
totals.returnOnSpend | number or null | Revenue ÷ spend (2.5 = $2.50 back per $1). |
byPlatform | array of object | |
byPlatform[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
byPlatform[].spendCents | number | Spend in cents of the account currency. |
byPlatform[].impressions | number | |
byPlatform[].clicks | number | |
byPlatform[].requests | integer | Requests credited to the campaign (adCampaignId). |
byPlatform[].calls | integer | Inbound calls on the campaign's tracking number. |
byPlatform[].leads | integer | requests + calls. |
byPlatform[].wonQuotes | integer | Quotes made from those requests that the customer approved. |
byPlatform[].revenueCents | number | Paid on those quotes' invoices within the attribution window. |
byPlatform[].costPerLeadCents | number or null | |
byPlatform[].costPerSaleCents | number or null | Spend ÷ won quotes, in cents. |
byPlatform[].returnOnSpend | number or null | Revenue ÷ spend (2.5 = $2.50 back per $1). |
byCampaign | array of object | |
byCampaign[].adCampaignId | string | |
byCampaign[].name | string | |
byCampaign[].platform | enum | The ad platform: GOOGLE_ADS (Google Ads) or META (Facebook and Instagram). One of GOOGLE_ADS, META. |
byCampaign[].kind | string | |
byCampaign[].status | string | |
byCampaign[].origin | string | |
byCampaign[].adAccountId | string | |
byCampaign[].accountName | string | |
byCampaign[].spendCents | number | Spend in cents of the account currency. |
byCampaign[].impressions | number | |
byCampaign[].clicks | number | |
byCampaign[].requests | integer | Requests credited to the campaign (adCampaignId). |
byCampaign[].calls | integer | Inbound calls on the campaign's tracking number. |
byCampaign[].leads | integer | requests + calls. |
byCampaign[].wonQuotes | integer | Quotes made from those requests that the customer approved. |
byCampaign[].revenueCents | number | Paid on those quotes' invoices within the attribution window. |
byCampaign[].costPerLeadCents | number or null | |
byCampaign[].costPerSaleCents | number or null | Spend ÷ won quotes, in cents. |
byCampaign[].returnOnSpend | number or null | Revenue ÷ spend (2.5 = $2.50 back per $1). |
addOn | object | SKUFlow's Ads fee, shown beside the return (ad spend passes through at cost). |
addOn.name | string | |
addOn.monthlyUsd | number | |
addOn.yearlyUsd | number |