← All pieces
InsightOctober 27, 2026

CRM-Reported Revenue vs. Platform-Reported ROAS

Two systems are answering different questions

Google Ads or Meta Ads Manager may show a strong return while the bank account tells a weaker story. That does not automatically mean the platform is wrong. It usually means the platform and CRM are measuring different events.

A platform asks: How much conversion value can be attributed to an ad interaction under the selected settings? A CRM or booking system asks: How much revenue actually closed, remained valid, and can be tied to a customer?

For a local business, those figures can separate quickly. A lead may click ads on two platforms, submit twice, book by phone, reschedule, cancel, or purchase a different service from the one initially quoted.

The useful response is not to declare one system perfect. It is to build a reconciliation that explains the gap in dollars. That requires four exports for the same reporting period:

  • Ad spend and platform-attributed conversion value
  • Conversion actions, timestamps, and available click identifiers
  • CRM leads, opportunities, and closed jobs
  • Invoices, cancellations, refunds, and collected revenue

Keep the date basis consistent. Comparing click-date platform revenue with close-date CRM revenue can manufacture a discrepancy before the audit even begins. Our article Conversion Lag: ROAS Windows for Local Businesses explains why the comparison window matters.

Start with a clearly labeled reconciliation model

Illustrative model—not a benchmark or client result: Assume a local service company spends $12,000 during the analysis period. Its ad platforms report $72,000 in attributed revenue, producing a platform ROAS of 6.0.

The CRM reconciliation looks like this:

| Reconciliation item | Revenue adjustment | |---|---:| | Platform-reported revenue | $72,000 | | Remove duplicate conversions | -$9,000 | | Remove overlapping assisted-click claims | -$7,200 | | Add valid offline closes missing from platforms | +$4,800 | | Remove cancelled or refunded jobs | -$10,800 | | Correct value, timing, and identity mismatches | -$3,000 | | Reconciled closed revenue | $46,800 |

The resulting reconciled ROAS is 3.9: $46,800 divided by $12,000. In this model, relying only on platform reporting would overstate decision-grade revenue by $25,200 and ROAS by 2.1 points.

Every figure above is an illustrative assumption designed to demonstrate the math. Your adjustments should come from row-level records, not from applying these amounts or proportions to your account.

Gap 1: Duplicate conversions

Duplicates appear when one commercial outcome creates several tracked events. A customer might submit a form, call from the thank-you page, and trigger an imported CRM conversion after the sale. Poorly configured tags can also fire more than once.

In the model, duplicate records account for $9,000 of reported value. To verify that adjustment, group records using available identifiers such as:

  • CRM contact or opportunity ID
  • Phone number or normalized email
  • Click ID
  • Service address
  • Conversion timestamp and order ID

Do not simply delete every repeated customer. A returning customer can create legitimate additional revenue. The test is whether several conversion records represent one purchase or genuinely separate transactions.

Destination design can make this worse when forms, calls, chats, and booking tools all report success differently. See Which Paid Ad Destination Wastes the Most Budget? for a broader way to evaluate those paths.

Gap 2: Assisted clicks and overlapping claims

A customer can interact with multiple channels before booking. Google may assign value to a paid-search interaction while Meta assigns value to an earlier social interaction. Each platform evaluates the journey through its own attribution system, so adding their reported revenue together can count the same sale more than once.

The illustrative reconciliation removes $7,200 in overlapping assisted claims. This does not mean the earlier interaction had no influence. It means one $7,200 sale cannot become $14,400 of company revenue merely because two systems claim credit.

Create a sale-level ledger with one row per closed transaction. Add separate columns for Google involvement, Meta involvement, first touch, last eligible touch, and the internal budgeting rule. This preserves evidence of assistance without duplicating revenue.

Bidding reports should receive the same scrutiny. Portfolio vs. Campaign Bidding for Local Google Ads can help when deciding whether performance differences reflect actual economics or simply how campaigns share signals and targets.

Gaps 3 and 4: Missing offline closes and cancelled jobs

Offline closes create the opposite problem: the CRM contains valid revenue that the platform never received. Phone estimates, delayed approvals, financing decisions, and sales completed after follow-up may remain disconnected from the original click.

In the model, matching click IDs, customer details, and timestamps restores $4,800 of legitimate closed revenue. Importing qualified leads can help optimization, but revenue reporting should distinguish a qualified opportunity from a collected sale.

Cancelled jobs, refunds, and failed appointments inflate platform ROAS when the initial booking value remains recorded after the commercial outcome changes. The model removes $10,800 for work that did not survive to recognized revenue.

Use explicit CRM stages such as booked, completed, cancelled, partially refunded, and paid. Then decide which stage controls revenue reporting. For many local operators, completed or collected revenue is more useful for budget allocation than scheduled value. The correct rule depends on the business, but it must be consistent.

Gap 5: Value, timing, and identity mismatches

The remaining $3,000 illustrative adjustment combines errors that are individually small but operationally common:

  • A booking tool sends the quoted amount while the CRM stores the final invoice
  • Tax, tips, deposits, or financing amounts are treated inconsistently
  • One system reports on click date and another on close date
  • A call cannot be matched because its identifier was not retained
  • A rescheduled job lands in a different reporting period

Do not bury these records in an unexplained “other” bucket. Assign each mismatch a reason code and an owner. That turns reconciliation from a one-time spreadsheet exercise into a repeatable control.

Run the review by transaction, then summarize by campaign, service line, location, and month. Track three outputs: platform ROAS, reconciled closed-revenue ROAS, and collection-adjusted ROAS where payment data is available. Platforms can guide optimization, but reconciled revenue should govern budget decisions.

If your platform and CRM reports cannot be connected without guesswork, book a call with Nika Spark. We can help map the tracking chain and build a revenue view your team can actually audit.

See where your budget is actually going.

We run the full funnel and reallocate spend by data — a weekly revenue number, not a report of impressions.