How to see which channel brings paying customers
Last updated Nov 3, 2026
Traffic tells you who visited. This shows who signed up and who paid, next to the channel that brought them, so you know which post, ad or newsletter actually makes money.
Why visitors aren't enough
A Reddit post can bring 500 visitors and no customers, while a small newsletter brings 20 visitors and three paying customers. Counting visitors would send you back to Reddit. Counting customers sends you to the newsletter.
1. Install the script
If you haven't yet, add your app and paste the install prompt (see our guide on adding analytics to a Lovable or Bolt app).
2. Track signups
Paste this prompt into your builder. It tells VibeMetrics when someone creates an account, without sending their email or name.
Track successful signups for analytics.
1. Find where users sign up with Supabase (supabase.auth.signUp, and any Google/OAuth sign-in).
2. For email signups: pass the analytics visitor ID into the signup metadata like this:
options: { data: { vm_vid: window.vmVisitorId || null } }
Keep any existing options.data fields.
3. Only AFTER signUp returns with no error, call:
window.vm('track', 'signup');
window.vm('identify', data.user.id);
4. For Google/OAuth sign-in: after the user returns and is signed in for the first time
(user.created_at is within the last 2 minutes), call the same two lines once.
5. Never send the user's email or name to analytics.
Do not change how signup works for the user. When done, tell me which files you changed.3. Connect Stripe
On your dashboard, click "Connect Stripe". On the "See who pays" page, connect your Stripe account; Stripe asks you to approve the connection. We only read payment events; we never create charges or change anything in your Stripe account.
4. Pass the visitor to checkout
So each payment can be linked to the visit it came from, paste this prompt. It adds the visitor's ID to your Stripe checkout and changes nothing else:
Connect payments to analytics.
Find the code that creates the Stripe Checkout Session (usually a Supabase Edge Function or API route).
1. On the frontend, when calling that function, also send the analytics visitor ID:
vm_vid: window.vmVisitorId || null
2. In the function that creates the Checkout Session, add:
metadata: { vm_vid: <the vm_vid received>, user_id: <the signed-in user's id if available> }
client_reference_id: <the vm_vid received, if present>
If it's a subscription, also add the same metadata under subscription_data.metadata.
Keep any existing metadata fields.
3. Do not change prices, products or anything else about checkout.
When done, tell me which files you changed.If your app sells through Stripe Payment Links instead, use this one:
Connect Stripe Payment Links to analytics.
Find every link or button that opens a Stripe Payment Link (a URL starting with https://buy.stripe.com/).
1. When it's clicked, add the analytics visitor ID to the link before opening it:
const url = new URL(paymentLink);
if (window.vmVisitorId) url.searchParams.set('client_reference_id', window.vmVisitorId);
Then open url.toString() instead of the plain link.
2. Keep any query parameters the link already has.
3. Do not change prices, products or anything else about checkout.
When done, tell me which files you changed.5. Read "Where your customers come from"
On your dashboard, this table has a row per channel (or per source, one tap away) with visitors, signups, the signup rate, people who paid, revenue and revenue per visitor. Tap a column to sort by it; sort by revenue to see what makes money.
- First visit: Grouped by how people first found your app.
- Last visit: Grouped by where people last came from (not counting direct visits) before they signed up or paid.
Refunds are taken off the revenue. In the other tables (channels, sources, pages, countries), tap a row to filter the whole dashboard to it.
Tips
- Give it a few weeks. A handful of customers is a hint, not a verdict.
- Tag the links you share (see our UTM links guide), so each post and newsletter shows up as its own source.
- Payments from before you connected Stripe can't be linked to a visit.
See where your paying customers come from.
Start free