Sign in

Blog · How-to guides

Closed-loop marketing analytics: link leads to revenue

Reconcile campaign leads, won deals, and recorded revenue from prepared lead and finance exports. Follow the spreadsheet checks that preserve unique deals and keep unmatched revenue visible.

The short answerClosed loop marketing analytics reconciles campaign leads with won deals and recorded customer revenue. Use prepared exports with stable lead, opportunity, and customer identifiers, a documented campaign assignment, and a common cutoff. Count each lead and deal once, aggregate finance rows before matching, and show unmatched revenue separately so campaign totals can be checked against the approved finance extract.

Closed loop marketing analytics links campaign leads to won deals and recorded revenue, then proves that the totals agree with the prepared source exports. The loop closes when sales and finance outcomes can be reconciled back to the campaign population. A lead marked won is a sales outcome; its full contract value is not automatically current-period revenue.

Define the population and the matching rule

Choose a lead cohort and an outcome cutoff before calculating rates. A September lead cohort observed through October 31 differs from all deals won in October. Label both the lead period and the outcome date so a later refresh remains comparable.

Use three prepared exports: a deduplicated lead register, an opportunity register, and a finance extract. Retain lead ID, opportunity ID, customer ID, campaign ID, relevant dates, deal status, booking amount, and recorded revenue. Names and email text are weak substitutes for stable identifiers.

For a single-credit comparison, agree on one campaign assignment per opportunity. This is a reporting convention, not proof that the campaign caused the sale. Google's attribution overview defines attribution as assigning credit across touchpoints; the detailed choice belongs in marketing attribution models.

If multiple leads belong to the same opportunity, preserve the lead count but count the opportunity only once. Ask sales operations for a prepared mapping when those relationships are ambiguous.

Aggregate finance rows before matching

An opportunity can have several invoices, revenue entries, or credits. Sum the approved finance rows to opportunity level before putting the result beside bookings. Otherwise, repeating the booking value on every finance row inflates the sales total.

Suppose the Finance sheet has opportunity ID in A, recognition date in B, and signed revenue amount in C. Credits are negative. On a DealSummary sheet, A2 holds a unique opportunity ID, H1 holds the first included revenue date, and H2 holds the first excluded date. Recorded revenue is:

=SUMIFS(Finance!$C$2:$C$5000,Finance!$A$2:$A$5000,$A2,Finance!$B$2:$B$5000,">="&$H$1,Finance!$B$2:$B$5000,"<"&$H$2)

The SUMIFS documentation explains that all specified criteria must match for a value to enter the sum. Keep the criteria ranges aligned, use real date values, and extend the range if the export contains more rows.

Covirage is not affiliated with Google or Microsoft.

Build a campaign comparison from the prepared rows

A US business reviews the same lead cohort and cutoff across two campaigns. Its prepared registers produce these totals; recorded revenue includes only finance-approved amounts linked to the cohort's won opportunities.

Campaign Unique leads Unique won deals Bookings (USD) Recorded revenue (USD) Campaign spend (USD)
Industry webinar 100 10 120,000 60,000 10,000
Product workshop 80 8 80,000 48,000 8,000
Total 180 18 200,000 108,000 18,000

In a Summary sheet, put those columns in A through F. In G2, calculate won deals per lead and fill down:

=IF(B2=0,"",C2/B2)

In H2, calculate recorded revenue per lead and fill down:

=IF(B2=0,"",E2/B2)

Both campaigns have 10.0% won deals per lead: 10 / 100 and 8 / 80. Both record $600 of revenue per lead: $60,000 / 100 and $48,000 / 80. Rates are shown to one decimal place; these dollar ratios are exact.

The total checks are 18 / 180 = 10.0% and $108,000 / 180 = $600. Do not average campaign rates when lead volumes differ. This particular example happens to have equal rates, but dividing the totals is still the correct method.

Use marketing analytics for the wider comparison of spend and outcomes. Use customer acquisition cost for the distinct question of cost per acquired customer; neither leads nor opportunities automatically equal new customers.

Reconcile recorded revenue and explain the gap

The approved finance population for this review contains the following amounts:

Revenue matching status Recorded revenue (USD)
Matched to industry webinar cohort 60,000
Matched to product workshop cohort 48,000
Not matched to either campaign cohort 12,000
Approved finance population 120,000

The proof is $60,000 + $48,000 + $12,000 = $120,000. Campaign-matched revenue coverage is $108,000 / $120,000 = 90.0%. The unmatched amount stays visible; assigning it to the strongest campaign would manufacture a result.

Bookings exceed recorded revenue by $200,000 minus $108,000 = $92,000. That is a comparison of two differently timed measures, not an automatic receivable, backlog, or lost-revenue balance. Finance should explain the underlying delivery periods, credits, contract changes, and recognition scope before giving the gap another label.

Where it goes wrong

  • A lead cohort mixed with all current wins. The numerator includes deals whose leads sit outside the denominator. Preserve the cohort mapping.
  • Won deals multiplied by contact rows. Count unique opportunity IDs after resolving multiple leads or contacts.
  • Bookings labeled revenue. Keep the sales-defined booking amount and finance-defined revenue in separate columns.
  • Unmatched revenue silently excluded. Show the finance population and match coverage alongside campaign totals.

Marketing owns campaign scope, sales operations owns the lead-to-deal mapping, and finance owns the revenue definition and reconciliation. Review missing matches before changing campaign budgets. For a separate margin-based spending assessment, use marketing ROI versus ROAS.

Reconcile your campaign exports in Covirage

Bring your prepared lead, opportunity, and finance export, or a Google Sheet containing the matched rows, to Covirage; it maps the columns, and its tools compute and check campaign comparisons and revenue reconciliations. The external AI model explains the results with every figure traced to its rows. Create a free Covirage account and bring a sample of your own data; account creation takes about a minute.

See sales insights for the business context of connecting campaign activity with recorded outcomes.

Questions people ask

Does closed-loop reporting require revenue to equal bookings?

No. Bookings reflect the agreed value under your company's sales definition; recorded revenue follows finance's recognition policy and cutoff. Reconcile each measure to its own source. Explain timing and scope differences rather than forcing current revenue to equal the value of won deals.

How do you prevent duplicate revenue across campaigns?

Document one campaign assignment per opportunity for a single-credit report, or use explicit allocation weights that sum to the whole opportunity. Aggregate finance lines to the appropriate matching level before attaching totals. Check that the campaign sum never exceeds the finance population it represents.

What should happen to unmatched leads or finance rows?

Keep them in a separate review population with the reason for the missing match. Sales operations can review identifiers and mappings while finance checks source coverage. Report match coverage alongside campaign outcomes so readers can judge how much of the business the comparison actually explains.