Revenue per source, without following anyone

Connect Stripe (incl. iDEAL) and see which sources, campaigns and landing pages lead to payments.

example-shop.nlExample dataLast 28 days
Revenue by source€10,171
SourcePaid withOrdersRevenue
GoogleStripe · iDEAL58€4,212
DirectStripe26€2,405
chatgpt.comAI assistantStripe21€1,876
NewsletterStripe · iDEAL17€1,290
instagram.comStripe · card6€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:

checkout.js
// 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.

Start 30-day trial