Revenue per source, without following anyone
Connect Stripe (incl. iDEAL) and see which sources, campaigns and landing pages lead to payments.
| Source | Revenue |
|---|---|
| €4,212 | |
| Direct | €2,405 |
| chatgpt.comAI assistant | €1,876 |
| Newsletter | €1,290 |
| instagram.com | €388 |
Stripe (incl. iDEAL), in test mode: live payments are switched on at launch.
How attribution works without a visitor ID
The script works out where the current visit came from: the referrer, UTM tags and the landing page. It keeps that in memory only, and nothing is written to the device. When your visitor checks out, your checkout code passes it along with the order:
// In the browser: the visit's source as wt_ keys
const metadata = window.wt.checkoutMetadata();
// → { wt_source: 'chatgpt.com', wt_medium: '', wt_campaign: '', wt_landing: '/shirts/linen', wt_ref: 'chatgpt.com' }
// On your server: pass it to Stripe Checkout
await stripe.checkout.sessions.create({
// ...your line items, mode, URLs
metadata,
payment_intent_data: { metadata }, // one-off payments: refunds keep the source
// subscription_data: { metadata }, // subscriptions: renewals keep the source
});
When the payment succeeds, the Stripe webhook brings that metadata back with the amount and currency. We check every webhook’s signature, and Stripe’s retries are counted once. Refunds, partial ones too, come in the same way and subtract. Renewals of a subscription keep the source of the visit that started it.
What it can’t do
- If the visitor leaves and pays days later in a new visit, the payment belongs to that new visit’s source. There’s no ID to connect the two, and that’s deliberate.
- Payments made outside your checkout, such as invoices, have no source unless you add one.
Count the visitors you’ve been missing.
30-day free trial, no card needed. Create an account with your work email and add your first site.