Skip to main content
20% off 3 months · code LAUNCH20 · until 31 October

See which launch channel produced paying customers

A thousand signups from a launch post and zero customers is a story; twenty signups from one forum thread and five customers is a plan. Most analytics stop at the signup. This starts there.

How do I know which launch channel (Hacker News, Product Hunt, Twitter) actually produced paying customers?

Every waitlist signup carries its first-touch source: the referring site and UTM values, read once from the form page, with no cookie. Connect your Stripe account read-only, and GET /v1/attribution joins signups to customers by email: per source, signups, confirmed, invited, paying, MRR and revenue. Record what a channel cost and it adds cost per customer and return on spend.

01Sources are recorded already

The hosted waitlist page and the widget record the referrer hostname and any utm_source, utm_medium and utm_campaign on each signup, on every plan, from the day the list exists. A form of your own passes a source object with the signup. Tag your launch links: ?utm_source=hn, ?utm_source=producthunt.

02Connect Stripe, read-only

Under Dashboard → Revenue, paste a restricted Stripe key with read permissions. Launch syncs customers, subscriptions and invoices hourly and matches them to signups on email. The key is encrypted, never returned, and there is no API route or MCP tool that takes one.

03Read the report

By referring site on Indie; by UTM source, campaign or referral code on Builder.

curl "https://api.nordva.dev/v1/attribution?group_by=utm_source&period_days=90" \
  -H "Authorization: Bearer nv_live_…"
# rows: [{ source: "hn", signups: 412, confirmed: 380, invited: 200, paying: 9,
#          signup_to_paying: 0.022, money: [{ currency: "usd", mrr_minor: 26100, revenue_minor: 54000 }] }, …]

04Add what it cost

POST /v1/attribution/costs with a source, an amount and a period: a sponsorship, an ad budget, a launch-day promotion. The row then shows cost per signup, cost per paying customer and return on spend, in the same currency only. The Growth page in the dashboard draws the funnel per source.

05Ask instead of querying

“Which channel brought paying customers last quarter, and what did they ask for?” The agent calls get_attribution_report, then list_contacts with paying=true and list_feedback, and answers in one message.

Questions

Is this cookie-free?

Yes. The source is read from document.referrer and the page URL when the form loads and sent with the signup. Nothing is stored in the browser and no visitor identifier exists, so there is no consent banner to add.

What about people who never joined the waitlist?

They are not in the report. Attribution covers people who signed up through a Launch form, page or widget. It is not web analytics, on purpose; page views per source can be switched on as an anonymous count if you want the top of the funnel next to it.

Can it write anything to my Stripe account?

No. The connection accepts only restricted keys and the sync issues only GET requests. Disconnecting deletes the key and every synced row.