Clycyo
Attribution & Revenue9 min read

Revenue Attribution for SaaS: Connect Marketing to MRR

Pageviews do not pay invoices. How first-touch UTM capture, identify calls, and webhook revenue events join into one record that tells you which channel drives MRR.

Every SaaS dashboard answers 'how many visitors?'. Almost none answer the question that decides next quarter's budget: which channel produces paying customers? That gap is revenue attribution, and the reason it stays unsolved at most startups is not conceptual — it is plumbing. The traffic data lives in an analytics tool, the identity data lives in your database, and the money lives in Stripe. Three systems, no shared key.

The three-event model

Revenue attribution reduces to capturing three moments against the same visitor record:

  1. First touch. The very first pageview, with its UTM parameters, referrer, country, and device. This is where the channel credit lives.
  2. Identification. The signup, where an anonymous visitor becomes a known user — and their pre-signup history merges into one journey.
  3. Revenue. The payment, fired server-side from your billing webhook, carrying amount, currency, and plan.

If your stack can join those three on one key, attribution is a query. If it cannot, attribution is a quarterly spreadsheet project that everyone quietly distrusts.

Step 1: capture first touch automatically

This must be automatic, because nobody remembers to instrument it later. A tracker that stores the first-touch UTM set and referrer on the visitor record — not just on the session — preserves channel credit even when the user returns 'direct' three weeks later to buy. Tag every campaign link with consistent UTMs (see our UTM guide) and the data takes care of itself.

Step 2: identify on signup

// In your post-signup handler
window.webanalytics.identify(user.email, {
  name: user.name,
  plan: 'trial',
});

One line. From this moment, the anonymous pageviews from before the signup and everything after share a single record. This solves the classic attribution killer: the visitor who researched on mobile via your newsletter, then signed up on desktop via 'direct'.

Step 3: fire revenue from the billing webhook

// In your Stripe webhook handler (invoice.paid)
window.webanalytics.track('subscription_paid', {
  revenue: invoice.amount_paid / 100,
  currency: invoice.currency.toUpperCase(),
  plan: subscription.plan.nickname,
  order_id: invoice.id,
});

Server-side, because client-side purchase events get lost to closed tabs and ad blockers exactly when money is involved. Include order_id so retries do not double-count. The step-by-step Stripe walkthrough is here.

Reading the result

With the three events joined, the report your board actually wants becomes trivial: revenue grouped by first-touch source. Newsletter: €4,800 from 12 customers. Organic: €2,300 from 7. Hacker News: €590 from 2 — and they churned in a month. Suddenly 'double the newsletter budget' is a data-backed sentence.

First-touch vs multi-touch: don't over-engineer

Multi-touch models are intellectually satisfying and operationally premature for most startups. Until you run many overlapping paid channels, first-touch (who deserves credit for discovery?) plus a glance at the full journey timeline answers 95% of real decisions with 10% of the complexity. Graduate to weighted models when you have a marketing team arguing over credit — not before.

Privacy is not the enemy here

Notice what this model never needed: third-party cookies, cross-site tracking, or fingerprinting. First-party events, voluntary identification at signup, and your own billing data. That is why cookieless analytics and revenue attribution are not in tension — Clycyo does both on the same 1.1 KB tracker, with the journey timeline to prove it. See a real one at /open.