Tracking & Attribution

How Do You Report MRR by Acquisition Channel?

Finance reports MRR, marketing reports revenue by channel, and the two never agree. How to stamp a channel on a subscription and keep it there.

Quick answer

Stamp one acquisition channel onto each customer at the moment they first arrive, freeze it, and group your billing system's normalised monthly recurring revenue by that stamp. The join key is the person, not the payment — a renewal has no click on it, so anything that re-attributes on each charge will drift your channel mix toward Direct every month. Normalise every plan to a monthly figure with one rule set (annual divided by twelve, one-time fees and tax excluded), then report two numbers per channel: the MRR you hold today and the MRR added this month.

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

You report MRR by acquisition channel by stamping one channel onto each customer the moment they first arrive, freezing it, and grouping your billing system’s normalised monthly recurring revenue by that stamp. MRR is monthly recurring revenue: the normalised monthly value of every active subscription. The join key is the person, not the payment.

That sounds obvious until the first renewal. A renewal is a machine event — no click, no session, no campaign near it. Any report that decides a channel at charge time moves your recurring revenue into Direct, one billing cycle at a time.


Why do finance and marketing report different recurring revenue numbers?

Because they are measuring two different things with the same word. Finance reports a run rate: what the active subscription base is worth per month, at a point in time. Marketing reports collected cash inside a window, credited to a touch. Same customers, two different arithmetic operations.

One annual plan shows the gap. A customer pays $1,200 in September for twelve months. Finance books $100 of MRR and carries it through August. Marketing books $1,200 of September revenue against September spend. Neither is wrong; nobody says which question they asked.

The second gap is ownership. Finance has a subscription table with a customer id on every row and no idea where those customers came from. Marketing has campaign data and no subscription table. The report everyone wants needs one field neither system holds.


What does “MRR by acquisition channel” actually measure?

It measures the normalised monthly value of every active subscription, grouped by the channel that acquired that customer. Not the channel that touched them last, or the one running when the card was charged: the channel that produced the original relationship, fixed at acquisition and never recalculated.

There are two reports hiding in that sentence, and you need both:

  • MRR held by channel — a stock. What your paid social, paid search, organic and referral cohorts are worth per month right now. It tells you how much of the business depends on a channel you might be about to cut.
  • New MRR by channel — a flow. What each channel added this month. This is what you rank acquisition on, because it is the only one that moves with this month’s spend.

Reporting the stock and calling it performance is the common mistake. A channel you stopped running in March still holds MRR in September, and keeps looking strong until those customers churn.


Which touch should own a subscription: the first click or the last?

First touch, frozen at acquisition. Last-touch attribution answers “what closed this sale” — a sensible question for a one-off purchase, a meaningless one for the fourteenth renewal of a subscription that has been billing itself since last year.

Watch what last touch does over time. Month one, the customer arrives from a Meta ad and the charge is credited to Meta Ads. Month two, the renewal fires at 03:00 with no session attached, so it lands in Direct. Month three, they click a billing receipt and it lands in Email. Eighteen months later your channel mix says the business runs on Direct traffic, and all that happened is that people kept paying.

So: one channel per customer, written once, when the relationship starts. Every renewal inherits it. If the same person buys a second product two years later, that is a new acquisition event worth recording separately — it does not rewrite the first.

Keep the last-touch view for the acquisition event itself. First versus last on the signup is a real comparison and it is where budget decisions live; read both models side by side when you read an attribution report, the same way you would for ecommerce revenue attributed back to the ad click. The mistake is letting last touch decide a recurring charge.

Diagram of a customer journey ribbon on a dark dashboard: a Meta Ads touch, a landing page, an amber Partial badge, a signup, then a first payment followed by three grey renewal pills, with the acquisition channel stamped once at the first touch and inherited by every renewal


How do you normalise MRR so the channel split is honest?

Convert every plan to a monthly figure with one written rule set, applied to all channels identically. The rules are boring on purpose:

  • Annual plans divided by twelve; quarterly by three; weekly multiplied by 52 and divided by 12.
  • One-time charges out — setup, implementation, onboarding, overage invoices. Revenue, not recurring revenue.
  • Tax out. Discounts counted at the amount actually billed, not at list price.
  • Currency converted on one stated rate and date, for every channel in the same report. Mixed-currency subscription bases are where two honest analysts produce two different MRR figures from one database.
  • Failed payments in dunning: pick in or out, write it down, never change it mid-quarter.
  • Trialing and paused subscriptions excluded until a successful payment lands — a trial-to-paid conversion arriving weeks later is its own problem.

The point is not accuracy in the abstract — it is that channel A and channel B get measured the same way. Two channels can hold an identical $10,000 MRR while one is annual-prepaid and the other monthly: different cash profiles, same run rate. If your normalisation favours one billing interval, your channel ranking is measuring contract shape rather than marketing.


How do you attach a channel to a subscription that started weeks after the click?

Store the first touch against the person as soon as you can identify them, on your server, and join the billing record back to that person later by email or customer id. Click identifiers expire, cookies get cleared, people switch devices — the email on the invoice is the one they typed on the landing page.

What to capture at the first pageview, before anyone has filled in anything:

  • utm_source, utm_medium, utm_campaign, utm_content, utm_term (UTM: the tagging parameters on a campaign link).
  • The referrer and the landing page URL — your fallback when a link was never tagged.
  • The platform click identifiers: gclid, gbraid and wbraid for Google, fbclid for Meta, msclkid for Microsoft, ttclid for TikTok, epik for Pinterest.
  • The timestamp, so first touch and last touch stay distinguishable.

Write that to the user record at signup, not to a cookie you hope survives. Then match each payment to the person rather than to a session: email first, then phone, then whatever platform customer id you hold. This is the same join that makes attributing Stripe payments to marketing campaigns work, and it is why the join still holds on renewal number eighteen.

If your subscriptions live in WooCommerce rather than a payments platform, the ingestion side comes first — tracking a WooCommerce subscriptions business end to end covers getting those records in.


What is the difference between new, expansion and churned MRR by channel?

They are the four movements that make up the change in your run rate, and splitting them by channel is where the report earns its keep. New MRR is a first payment from a new customer. Expansion is an upgrade or added seats. Contraction is a downgrade. Churn is a cancellation, or a payment that finally gave up in dunning.

Net new MRR per channel is new plus expansion, minus contraction, minus churn. Ranking on the first term alone is how teams buy churn at scale.

Two channels over one month, with round illustrative numbers: channel A adds $8,000 in new MRR and loses $3,100 to churn and downgrades, netting $4,900. Channel B adds $5,200 and loses $600, netting $4,600. On new MRR, A wins by more than 50%. On net they are within a rounding error — and if A’s churn concentrates in month three, next quarter reverses the order.

This is deciding which attribution channel to scale carried into recurring revenue: the single number flatters the channel with the loosest audience.


Why won’t your channel MRR ever match your ad platform’s numbers?

Because the platform reports cash it can claim, inside its own attribution window, using its own model, on the day the payment happened. Your MRR report shows a normalised run rate owned by a first touch that may be two years old. Those two things cannot agree. The mismatches worth knowing by name:

  • Interval. A $1,200 annual payment is one purchase in the platform’s September column and $100 a month in yours for a year.
  • Window. A renewal fourteen months after the click sits outside every click and view window in the industry, so no platform claims it — and your first-touch report still does.
  • Model. A platform credits its own touch; your report credits the first. Where a paid social click and a paid search click sit in one journey, both platforms may claim the customer. Reconcile cash to cash — matched payments against the platform’s reported revenue, same dates, same currency — and never a run rate against cash. What is left after that is real attribution disagreement, which is worth investigating.

How does PartialLeads report recurring revenue by acquisition channel?

It supplies the field your billing system is missing: one acquisition channel per person, resolved from the whole journey rather than from the session that happened to be open at checkout, with every payment matched back to that person.

How the stamp gets created. The tag captures UTMs, the referrer, the landing page and the click identifiers — gclid, gbraid, wbraid, fbclid, msclkid, ttclid, epik — on the first pageview, and the visitor id is set as a first-party cookie by the server rather than by script, so Safari’s cap on script-written cookies does not expire it. Field capture on input records the email and phone as they are typed, before submit, so a person becomes identifiable earlier than the signup form suggests.

How it survives to the payment. The identity layer unions a person’s sessions across six tiers — visitor id, email, phone, IP with user agent, device hash and click id — so a phone click in March and a laptop signup in April resolve to one person. Stripe, Shopify, WooCommerce, GoHighLevel and a universal inbound webhook feed purchases into one pipeline that normalises the identity, deduplicates idempotently on client, source, order id and status phase, matches to a session in confidence tiers (visitor-id echo first, then email, phone, IP), and writes both a first-touch and a last-touch attribution row for every matched payment. Refunds arrive as their own status-phase rows and net against revenue.

Because both rows are written per payment, a renewal keeps the acquisition channel on its first-touch row even though its last-touch row holds nothing useful. That is the stamp, for the life of the account.

Where you read it. The Attribution report carries a channels table with First Touch, Last Touch and PartialLeads Resolved side by side, each with its own purchase count and per-channel split, and columns for revenue, purchases, average order value, average lag, visitors, visitor-to-lead rate and return on ad spend. Paid channels expand into their campaigns. The Recovered Attribution panel itemises revenue a raw last-click view loses, including sessions with no utm_source that the classifier resolved to a real channel.

The honest constraints. PartialLeads reports matched payments and their attribution, not subscription state: no plan object, no normalised MRR figure, no movement split, no cohort report. The normalisation above is arithmetic you run in your billing system or a spreadsheet. What it removes is the hard half — knowing which channel each paying customer came from, and keeping that answer stable across devices, months and renewals. The second constraint is matching: a payment from someone whose sessions were never seen has nothing to join to, so it lands as unmatched revenue rather than being assigned to a channel by guesswork. That unmatched share is visible, and it is a better number to track than a padded channel total.

Attribution report mockup on a dark dashboard showing a first touch, last touch and resolved model toggle above a channels table, with rows for Meta Ads, Google Ads, Organic and Direct carrying revenue, purchases, average order value, average lag and return on ad spend, and KPI tiles for attributed revenue, attributed purchases and match rate

What breaks The mechanism Where you see it in the dashboard
Renewals drift into Direct because no click precedes them First-touch and last-touch rows written for every matched payment Attribution report, First Touch model
The payment arrives with no campaign data on it Purchase sources matched to a session in confidence tiers: visitor id, email, phone, IP Purchases ledger, Revenue column
Clicked on a phone, signed up on a laptop, paid weeks later Six-tier identity cluster unions the sessions into one person first Journey ribbon on the Leads list
The link was never tagged, so the channel reads as Direct Session classification plus referrer and landing-page fallback Attribution report, Recovered Attribution
Two models disagree and nobody knows which to believe First Touch, Last Touch and Resolved side by side, each with its own purchase count Attribution report, model comparison
A refund inflates a channel’s revenue Refund rows carry their own status phase and net against the paid row Purchases ledger

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

Sources

  1. Meta for Developers — Conversions API overview: https://developers.facebook.com/docs/marketing-api/conversions-api
  2. Meta for Developers — Customer information parameters: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters
  3. Meta for Developers — Deduplicate Pixel and Conversions API events: https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events

Frequently asked questions

QShould MRR be attributed on first touch or last touch?
First touch, fixed at acquisition. A renewal has no click attached, so a last-touch rule credits whatever session happened to precede the charge — usually nothing, which reads as Direct. Over a year of renewals that silently migrates your recurring revenue into channels that did no acquisition work. Keep last touch for the signup event itself, where the comparison is genuinely informative.
QHow do you handle annual plans in an MRR-by-channel report?
Divide the annual amount by twelve and count it as monthly recurring revenue for each month the subscription is active, exactly as you would a monthly plan. Report the cash separately if finance needs it. Mixing the two — annual as a lump, monthly as a run rate — makes channels that sell annual contracts look like they produced a dozen times more revenue in one month.
QWhat do you do with customers who came from more than one channel?
Record the whole path, credit acquisition to the first touch, and keep the other touches visible as assists. A customer who saw a paid social ad, searched your brand a week later and signed up from the search click was acquired by paid social; the search click was navigation. Reporting the last one as the acquisition channel is how brand search ends up looking like your best performing campaign.
QDoes churned MRR get subtracted from the channel that acquired the customer?
Yes. Churn belongs to the channel that brought the customer in, because it is that channel's audience quality being measured. Subtracting churn from the channel that happened to be running when the cancellation landed makes no sense — nobody acquires a cancellation. Report new, expansion, contraction and churn per acquisition channel and read the net.
QWhy doesn't my MRR by channel match what Meta or Google reports?
Because they are different measurements, not because something is broken. The platforms report cash they can claim inside their own attribution windows on the day the payment happened; your MRR report shows a normalised monthly run rate owned by a first touch that may be years old. Reconcile matched payments against platform revenue over the same dates, and never reconcile a run rate against cash.
QCan you report MRR by channel without a tracking tool?
Yes, if you have a place to store the first touch and a reliable join key. Capture the UTMs and click identifiers on the landing page, write them to the user record at signup, and group your billing export by that field. It breaks when the signup happens days after the click, on another device, or through an embedded form that loses the referrer — which is exactly what identity resolution exists to repair.
QWhat counts as an acquisition channel for organic and referral traffic?
Whatever the session classifier can resolve from the referrer and landing page when there are no UTM parameters — organic search, a named referring site, email, or Direct when nothing is knowable. Be strict about Direct: treat it as "we could not tell," not as a channel with a budget. A large Direct share in a subscription business is usually a tagging problem rather than a customer behaviour finding.
QHow long does a channel keep credit for a customer's MRR?
For as long as that subscription bills, in a first-touch report — that is the point of the model. If that feels generous, run a second view with a cutoff (credit acquisition for the first twelve months, then move the revenue into a retained cohort) and publish both. What matters is that the rule is written down and applied to every channel equally, not which cutoff you pick.

Find the qualified leads your forms are currently throwing away.

Install PartialLeads on one landing page, send traffic, and compare what your CRM captured against what PartialLeads recovered and qualified.