Revenue
Revenue answers the question behind every visibility number: does it sell? Skoup reads the store’s orders (Shopify webhooks) and attributes each one, last touch, to an AI surface when its referrer, utm_source or ref points at one (ChatGPT, Claude, Gemini, Perplexity…). Five views share that data:
- Attribution — orders and revenue from AI vs the whole store, by surface and by product, with the change against the previous period.
- Orders — the AI-attributed orders themselves, one by one, without any customer data.
- Traffic — the AI referral visits and conversions measured by Skoup Analytics installed on the brand’s site, with the first AI touch of each conversion. It is the only view of a SaaS brand or a physical establishment, which has no store.
- Subscriptions (SaaS) — the new subscriptions and new MRR read in the brand’s Stripe (read-only restricted key), the part AI brought and, week by week, the new MRR against AI visibility.
- Correlation — AI visibility and AI revenue side by side, week by week, with the fixes published each week.
I want to…
| I want to… | Call |
|---|---|
| Know how much AI sold this quarter | GET /v1/brands/{brand}/attribution?market=FR&period=90d |
| List the orders ChatGPT brought | GET /v1/brands/{brand}/orders?surface=chatgpt |
| Read the AI traffic the script measured | GET /v1/brands/{brand}/traffic?market=FR |
| Know which share of the conversions began with an assistant | GET /v1/brands/{brand}/traffic?market=FR — read first_touch |
| Know which share of the orders began with an assistant (Shopify store, pixel) | GET /v1/brands/{brand}/attribution?market=FR — read first_touch |
| Know how many sign-ups or calls AI brings (SaaS, establishment) | GET /v1/brands/{brand}/traffic?market=FR — read ai.key_events and ai.conversion_rate |
| See whether visibility moves revenue | GET /v1/brands/{brand}/correlation?market=FR&category=Gravel |
| Know how many subscriptions and how much MRR AI brings (SaaS) | GET /v1/brands/{brand}/subscriptions?market=FR |
| Be told of each AI order | order.attributed |
Scope: revenue:read.
Scenario: post every AI sale to Slack
if (event.type === 'order.attributed') {
const order = event.data.object
await slack.post(`🛒 ${order.ai_surface} brought an order (${order.country})`)
}Pitfalls
- Attribution is last touch, read from the order itself: a shopper who asked ChatGPT then came back through Google is attributed to Google. The attribution’s
first_touchblock says the opposite, for the orders the Skoup Analytics pixel joined to their visit (Shopify store, see Skoup Analytics):orders= joined orders,ai_ordersthose whose buyer first came through an assistant. - No customer data, ever: orders carry a country, lines and amounts — no name, e-mail or address.
nullbefore data: attribution totals staynulluntil the first order, traffic blocks until the script measured a first visit (the current day is never counted), correlationweeksare empty until the first order.- Traffic and correlation need the Growth plan or above: on Starter they answer
403plan_feature_unavailable(test mode keys always reach them). Attribution and orders are open to every plan. - A conversion depends on the brand:
conversion_metricistransactions(the script’spurchaseevents) for a store andkey_events(named events the site sends: sign-up, demo, call, booking…) for a SaaS or an establishment. The counted events are chosen in the app (Settings › Integrations › Skoup Analytics › Key events), every named event by default. A site that never sends the metric returnsconversion_rate: null, never 0. first_touchis notai: the per-surface rows are last touch (the visit that converted);first_touchcounts the conversions whose visitor first came through an assistant within the lastwindow_daysdays, even if they came back through Google. The two never add up. Attribution, orders and correlation only exist for a store: elsewhere they answer403capability_unavailable.- A subscription is attributed to AI only if its provenance is in Stripe: Skoup reads the metadata of the subscription, then of the customer — keys
referrer,utm_sourceorlanding_url(prefixedskoup_if you want them apart). With Stripe Checkout, pass them insubscription_data[metadata]. Without them the subscription counts in the total but never in the AI share —tracked_sharetells how many carry one. MRR is the monthly list price, before discounts and taxes; a tiered or metered price has no MRR. SaaS brands only (403capability_unavailableotherwise);weeksis empty without the Growth plan. - Test orders are excluded.
order.attributedis sent once, at creation — a replayed Shopify webhook never sends it again.
Last updated on