MyDealList · Due diligence

Evaluating SaaS Revenue Quality: Deferred Revenue, Churn Timing, and Recognition Rules

Pre-close SaaS revenue quality masterclass: cash-basis vs accrual audit frameworks, annual prepay vs recognized MRR decomposition, deferred revenue liability normalization, and SDE/EBITDA adjustment formulas for digital acquirers.

40 min read

The seller's teaser says $12,400 MRR and $148k trailing revenue. Your bank reconciliation shows $19,200 in Stripe deposits last month— because forty-seven annual contracts renewed in Q4 and the founder booked everything as revenue on cash receipt. You are not buying MRR; you are buying a deferred revenue liability, a churn timing curve that has not hit the P&L yet, and recognition rules the seller never applied consistently. This is where saas revenue recognition diligence wins or loses micro-SaaS deals before LOI.

This guide is written for acquisition entrepreneurs conducting pre-close financial diligence on subscription businesses in the $1k–$50k MRR band. You will learn cash-basis vs accrual audit frameworks, how to deconstruct annual contract upfront cash collection vs monthly recognized MRR, how to normalize SDE and EBITDA for deferred revenue liabilities post-closing, how churn timing interacts with recognition reversals, and how to build a reproducible revenue quality score from raw billing exports—not seller dashboards.

Pair this article with our SaaS churn cohort analysis guide for retention math, micro-SaaS valuation fundamentals, pricing and billing restructuring math, and APA and escrow legal framework for purchase price adjustment language. This is intentionally a pre-close audit—not a post-acquisition accounting setup playbook.

Not legal, tax, or accounting advice. Revenue recognition rules vary by jurisdiction, entity type, and contract structure. Engage qualified CPA and M&A counsel before signing. Rebuild all metrics from raw exports; never rely on seller dashboards alone.

1. Why Revenue Quality Beats MRR Headlines in 2026

Marketplace listings optimize for headline MRR because it is simple, comparable, and flattering. Professional buyers optimize for revenue quality—the probability that reported recurring revenue converts to retained cash flow after close, net of refunds, recognition reversals, and deferred service obligations you inherit.

MRR tells you what the billing system thinks is active today. Revenue quality tells you what you will actually keep after churn timing, refund policy, and deferred revenue burn-through hit your first twelve months as owner.

In 2026 micro-SaaS deal flow, three structural forces make revenue quality diligence non-optional: annual prepay discounts to inflate cash before sale, founder-run books on cash basis without deferred revenue schedules, and churn events backdated to keep NRR slides clean. Each creates a gap between Stripe MRR exports and economic reality that only closes when you reconcile cash, accrual, and contract-level recognition month by month.

1.1 The revenue quality stack

LayerWhat it measuresPrimary data sourceBuyer risk if skipped
Billing MRRActive subscription ARR/12Stripe / Paddle exportOverstates if pauses misclassified
Recognized revenueEarned portion of contractsP&L / GL accrual scheduleUnderstates if cash-basis books
Cash collectedDeposits net of refundsBank + processor payoutsSpikes on annual renewals
Deferred revenueUnearned prepayment liabilityBalance sheet / billing ledgerPost-close service obligation
Normalized SDEOwner-adjusted economic earningsYour reconstruction modelMultiple applied to wrong base

1.2 Pre-close vs post-close revenue work

Post-close, you fix QuickBooks categories and hire a bookkeeper. Pre- close, you determine whether the ask multiple applies to inflated trailing revenue or to a normalized earnings base that accounts for deferred revenue you must service without additional cash collection. Different leverage, different outputs—same distinction as our pre-close cohort analysis vs post-acquisition retention playbooks.

2. Cash-Basis vs Accrual Revenue Audit Frameworks

Most micro-SaaS sellers under $15k MRR run cash-basis books: revenue hits the P&L when Stripe deposits land. Accrual accounting spreads subscription revenue across the service period and records a deferred revenue liability for the unearned portion. Your deferred revenue due diligence starts by identifying which regime the seller actually uses—and whether their teaser metrics pretend otherwise.

2.1 Three reporting layers you must reconcile

Cash_revenue(m) = Σ Deposits(m) − Refunds(m) − Chargebacks(m) Accrual_revenue(m) = Σ Contract_value × (Days_served(m) / Total_days) Billing_MRR(m) = Σ Active_subscriptions × Monthly_equivalent_rate Quality_gap(m) = Cash_revenue(m) − Accrual_revenue(m) Red flag: |Quality_gap| > 15% of MRR for 3+ consecutive months

When cash revenue systematically exceeds accrual revenue, the seller is collecting annual prepayments faster than recognizing them—or never recognizing them at all. When accrual exceeds cash, they may be recognizing revenue from deferred balances built in prior periods while new sales slow. Both patterns distort trailing twelve-month revenue used in SDE multiples.

2.2 Cash collection reconciliation procedure

  1. Export Stripe (or Paddle/Lemon Squeezy) balance transactions for 24 months—gross charges, refunds, fees, payouts.
  2. Match monthly net payouts to bank deposits; flag unexplained variances > 2%.
  3. Segment cash by billing interval: monthly vs annual vs one-time setup fees.
  4. Remove non-recurring items: implementation fees, custom dev, asset sale proceeds, founder loans repaid through the business account.
  5. Compare recurring cash collection trend to MRR trend—divergence signals prepay spikes or churn not yet reflected in active subs.

Cash vs MRR divergence matrix

PatternCash vs MRRLikely causeDiligence action
Prepay spikeCash >> MRRAnnual renewals / sale prepBuild deferred revenue schedule
Churn lagMRR > Cash (later)Failed renewals not yet canceledCross-check dunning logs
Refund cliffCash << MRR one monthAnnual refund batchReview refund policy + cohort
Usage true-upCash spikes quarterlyMetered billing cyclesReconcile usage meters to invoices
Fake MRRMRR flat, cash decliningPaused / comped accountsFilter non-paying actives

2.3 Accrual P&L vs billing system divergence

Request 24 months of P&L plus general ledger detail for revenue accounts. Map each GL line to a billing export category. Micro-SaaS sellers often misclassify: annual prepayments as “Sales,” Stripe fees as COGS vs OpEx, founder salary as distributions, or one-time consulting as recurring revenue.

Recurring_revenue_ratio = TTM_recurring_accrual / TTM_total_revenue Target for pure SaaS: > 85% Haircut multiple if < 70% without documented transition plan
If the seller cannot produce a month-by-month bridge from Stripe charges to P&L revenue lines within 48 hours, assume cash-basis reporting and rebuild accrual yourself from subscription events.

2.4 Cash-basis audit checklist

CheckPass criteriaFail action
Accounting method disclosedExplicit cash or accrual in data roomRebuild; do not trust teaser TTM
Deferred revenue schedule existsMonthly roll-forward 12+ moConstruct from invoice exports
Bank ↔ processor match± 2% monthly, 12 moHoldback + revenue reps
Refund rate stable< 3% of gross chargesInvestigate product / sales issue
Non-recurring strippedDocumented < 10% of revenueAdjust SDE base downward
Tax vs book alignmentNo unexplained 20%+ gapsCPA review before close

3. SaaS Revenue Recognition Rules Buyers Must Know

You do not need to become an auditor. You need enough saas revenue recognition literacy to spot when a seller's numbers violate basic subscription logic—and to estimate the post-close liability you inherit when recognition was never done correctly.

3.1 ASC 606 / IFRS 15 simplified for micro-SaaS DD

Under ASC 606 (US GAAP) and IFRS 15 (international), revenue is recognized when control of the promised service transfers to the customer. For standard SaaS subscriptions, that means ratably over the subscription term—daily or monthly straight-line recognition unless a distinct performance obligation justifies different timing.

Monthly_recognized_revenue(i) = Prepaid_amount(i) / Contract_months(i) Deferred_revenue_end(m) = Deferred_revenue_start(m) + Cash_collected_prepaid(m) − Revenue_recognized(m) − Refunds_of_unearned(m)

Setup fees, onboarding, and professional services may qualify as separate performance obligations recognized upfront or over a distinct period. Sellers sometimes bundle everything into subscription revenue to inflate recurring ratios—request contract templates and sample invoices for the top twenty accounts.

3.2 Performance obligations and subscription periods

ComponentTypical recognitionDD focus
Monthly subscriptionMonthly, matches billingLow complexity; verify active status
Annual subscription1/12 per month over 12 moDeferred revenue roll-forward required
Multi-year prepayRatable over full termLong-dated liability on balance sheet
Usage / overageAs consumed or billedMeter vs invoice reconciliation
Setup / implementationPoint-in-time or distinct periodStrip from recurring SDE if one-time
Credits / free monthsReduces transaction priceAdjust effective MRR per customer

3.3 When recognition timing creates valuation traps

Valuation traps appear when the metric used for multiples (TTM revenue, SDE, or MRR) is computed on a different basis than the economic obligation you inherit. The most common trap in micro-SaaS: paying 4× on $120k TTM cash-basis revenue when $38k of that TTM is unearned deferred revenue that will reverse into zero-margin service delivery over the next ten months—with no corresponding cash collection.

Economic_TTM_revenue = TTM_accrual_revenue Overpaid_multiple_impact = Purchase_price × (Cash_TTM − Accrual_TTM) / Cash_TTM Example: $400k price, $120k cash TTM, $82k accrual TTM Overpayment ≈ $400k × (120−82)/120 = $127k if multiple applied to cash

4. Deconstructing Annual Contract Upfront Cash vs Monthly Recognized MRR

Annual contracts are the single largest source of revenue quality distortion in micro-SaaS data rooms. Stripe reports them as active subscriptions contributing full MRR. Cash hits once. P&L on cash basis records 12× MRR in one month. Accrual recognizes 1/12 per month. Your job is to hold all three views simultaneously.

4.1 The annual prepay illusion

A customer paying $1,200/year on a $100/mo plan appears as $100 MRR in billing exports. Cash collection is $1,200 on day one. If the seller runs cash-basis books, January revenue spikes $1,200 while February– December show $0 from that customer—even though service continues. Trailing twelve-month revenue becomes a function of when renewals landed, not sustainable run-rate.

Annual prepay makes cash-basis TTM revenue a renewal-timing lottery. Never pay a revenue multiple on cash-basis TTM when annual contracts exceed 30% of the customer base without full accrual reconstruction.

4.2 Contract asset vs deferred revenue mechanics

On annual invoice paid Day 0: Cash +$1,200 Deferred_revenue (liability) +$1,200 Revenue recognized Month 1: +$100 Deferred_revenue Month 1 end: $1,100 MRR (billing) = $100 throughout Cash P&L Month 1 = $1,200 (cash basis — wrong for valuation) Accrual P&L Month 1 = $100 (correct run-rate contribution)

4.3 Monthly recognition waterfall

Build a recognition waterfall for every annual invoice in the trailing eighteen months. Each row: invoice_id, customer_id, gross_amount, start_date, end_date, monthly_recognition_amount, remaining_deferred. Sum remaining_deferred at close—that is the service obligation you inherit without new cash.

CustomerAnnual amountInvoice dateMonths servedRecognized to dateDeferred remainingMonthly MRR equiv.
Acct A$2,3882025-11-013$597$1,791$199
Acct B$9482026-01-151$79$869$79
Acct C$4,8002025-06-018$3,200$1,600$400
Acct D$1,1882025-09-205$495$693$99
Portfolio total$4,371$4,953$777 billing MRR

In this sample, $777 of reported MRR from annual accounts is backed by $4,953 of deferred revenue already collected—cash the buyer does not receive again. Pair this table with billing interval restructuring math if you plan to shift annual customers to monthly post-acquisition.

4.4 Annual vs monthly mix impact on multiples

Annual mix %Typical cash/accrual TTM gapRecommended multiple adjustmentExtra DD requirement
< 20%Low (< 5%)None if books are accrualStandard MRR verification
20–40%Moderate (5–15%)0.25–0.5× multiple haircutDeferred schedule required
40–60%High (15–30%)0.5–1.0× haircut or accrual repricingFull waterfall + churn by interval
> 60%Extreme (> 30%)Accrual SDE only; avoid cash TTMAnnual cohort triangle

5. Deferred Revenue Liability Deep Dive

Deferred revenue is not optional accounting trivia—it is a balance sheet liability representing services owed to customers who already paid. In asset purchases, working capital and liability schedules determine whether you receive a credit for excess deferred revenue or absorb the obligation silently at close.

5.1 Balance sheet anatomy for micro-SaaS

Total_deferred_revenue = Short_term_deferred + Long_term_deferred Short_term = obligations expected to be earned within 12 months Long_term = multi-year prepayments beyond 12 months Net_working_capital = Current_assets − Current_liabilities (Deferred revenue is typically a current liability)

Many solo founders have no formal balance sheet. Reconstruct deferred revenue from invoice exports: sum all prepaid amounts minus cumulative recognized revenue per contract. Compare your reconstruction to any seller-provided schedule—variances > 5% trigger holdback discussions documented in your APA working capital exhibits.

5.2 Deferred revenue turnover and quality ratios

Deferred_revenue_to_MRR = Total_deferred / Current_MRR Deferred_turnover = TTM_accrual_revenue / Avg_deferred_balance Cash_collection_coverage = TTM_recurring_cash / TTM_accrual_revenue Healthy micro-SaaS (monthly-heavy): Deferred/MRR < 1.5× Annual-heavy SaaS: Deferred/MRR 2–6× is normal — price on accrual SDE
RatioGreenYellowRed
Deferred / MRR< 2×2–4×> 4× without annual mix explanation
Cash collection coverage0.95–1.051.05–1.25> 1.25 (prepay stuffing)
MoM deferred growth vs MRR growthWithin 10 ptsDeferred >> MRRDeferred up, MRR flat (renewal push)
Refund rate on deferred base< 2%2–5%> 5% (product or sales issue)

5.3 Post-closing deferred revenue burn-through

After close, deferred revenue recognizes into P&L without new cash collection—it is not incremental SDE. Model monthly burn-through for twelve months post-close to forecast true cash generation. If $45k deferred exists at close on a $8k MRR business, expect ~$3.75k/mo of P&L revenue with $0 new cash until renewals hit—critical for seller note DSCR modeling covered in our valuation and financing guides.

6. Churn Timing and Revenue Recognition Interactions

Churn is not a single event in recognition math. Annual subscription churn analysis must specify: cancel request date, service end date, refund issued (if any), and how much deferred revenue reverses. Sellers optimize for billing MRR; buyers must optimize for economic exit.

6.1 Cancel date vs service end date

If cancel_at_period_end = true: MRR remains active until period_end Churn recognized in billing at period_end Accrual may continue recognizing until service stops Revenue_reversal_on_midterm_cancel = Unearned_deferred − Refund_paid Net_P&L_impact = −Remaining_unearned (if no refund policy)

Stripe's cancel_at_period_end flag keeps logos in active MRR while customers have already decided to leave. For diligence, build a “committed churn” queue: subscriptions with cancel scheduled but not yet effective. Add committed churn MRR to reported logo churn for forward forecasts.

6.2 Pro-rata refunds and revenue reversals

Refund policyRecognition impactCash impactDD note
No refundsRecognize through period endNone on cancelMRR drops at period end only
Pro-rata refundReverse unearned immediatelyOutflow on refundTrack refund rate by cohort
Prorated creditReduces future transaction priceDeferred, not immediateAdjust expansion math
ChargebackFull reversal + feeImmediate outflowExclude from recurring SDE

6.3 Annual renewal cliff and churn recognition

Annual contracts create renewal cliffs where churn concentrates at month 12, 24, etc.—not in billing MRR until the renewal fails. Segment cohort retention triangles by billing interval. An annual triangle showing 95% M1 but 62% M13 is telling you recognition looked healthy for eleven months while logos were already gone at renewal.

Annual_renewal_churn_rate = 1 − (Renewed_annual_logos / Up_for_renewal) Revenue_at_risk_next_90d = Σ Deferred_remaining on accounts up for renewal If renewal_churn > 2× monthly logo churn, apply renewal cliff haircut to forward MRR forecasts (typically 10–20%)

6.4 Involuntary churn, dunning, and recognition lag

Failed payments create a gap between economic churn and recognized revenue. Customers in dunning may remain “active” in Stripe for 2–4 weeks while invoices retry. Request dunning event logs and map:

  • first_payment_failure — start of involuntary churn clock
  • subscription_past_due — MRR still counted in some exports
  • subscription_canceled — billing churn recognized
  • recovery_success — reactivation; verify not counted as expansion
Involuntary churn above 25% of total logo churn signals billing hygiene problems that will depress cash collection post-close—not a free optimization opportunity on day one.

7. Normalizing SDE/EBITDA for Deferred Revenue Liabilities Post-Closing

Sellers market SDE. Buyers need normalized SDE on an accrual basis that reflects deferred revenue obligations and strips one-time cash spikes. This is the earnings base your multiple should attach to—not cash-basis TTM inflated by a pre-sale annual renewal push.

7.1 Why trailing SDE overstates quality

Standard SDE add-backs include owner salary, personal expenses, and non-recurring costs. They rarely subtract: unearned revenue already collected, prepaid annual renewals driven by sale process, or founder comped accounts. On cash-basis books, SDE can spike 40–80% in the quarter before listing when the founder pushes annual upgrades.

Reported_SDE = Net_income + Owner_comp + Discretionary + One_time_addbacks Normalized_accrual_SDE = Reported_SDE − Cash_revenue_timing_benefit (annual prepay overhang) + Accrual_revenue_timing_adjustment − Comped_account_value − Non_recurring_revenue (setup, consulting) ± Deferred_revenue_wc_adjustment (if liability not in WC peg)

7.2 EBITDA add-back traps specific to SaaS

Seller add-back claimAccept?Buyer treatment
“One-time annual renewals”PartialNormalize to accrual; no add-back
Owner salary below marketYesAdd market replacement cost
Stripe fee spike (annual volume)NoNormalize fees as % of revenue
Deferred revenue as “asset”NoIt is a liability; WC credit needed
Development cap-exCase-by-caseSeparate growth vs maintenance spend
Churned customer refundsNoRecurring cost of revenue quality

7.3 Worked normalization example

Target: B2B workflow tool, $9,200 MRR, 52% annual contracts, cash-basis books. Seller claims $118k TTM revenue and $94k SDE (0.80 margin). Your reconstruction:

Line itemSeller reportedBuyer normalizedAdjustment
TTM revenue (cash)$118,000
TTM revenue (accrual)Not provided$89,400−$28,600 timing
Deferred revenue at closeUnknown$31,200Liability inherited
Comped accounts (4 logos)In MRR base$480/mo removed−$5,760 TTM
Setup feesIn revenue$6,200 strippedNon-recurring
Owner salary add-back$0+$72,000 market CEOStandard SDE
Normalized SDE (accrual)$94,000~$61,000−35% vs seller claim

At a 4× ask on seller SDE ($376k), the accrual-normalized equivalent is 6.2× normalized SDE—a material repricing lever. See valuation multiple tables for how to map normalized SDE to defensible offer ranges.

7.4 Post-closing liability transfer and working capital

In asset deals, specify whether deferred revenue transfers with the business and how working capital peg treats it. Three common structures:

  1. Deferred as liability credit — buyer receives purchase price reduction or WC credit equal to unearned balance at close.
  2. Deferred neutral in WC peg — peg includes deferred; buyer and seller split timing benefit—document carefully in APA schedules.
  3. Seller keeps prepaid cash, buyer gets contracts — rare and dangerous; avoid unless price reflects zero cash at close for prepaid base.

8. TypeScript Revenue Normalization Model

Reproducibility beats spreadsheet heroics. The model below ingests invoice-level exports and outputs accrual revenue, deferred balance, and normalized SDE adjustments per month—paste into your diligence repo and wire to Stripe CSV parsers.

// Revenue normalization engine for SaaS due diligence
// Input: invoice exports + subscription events + P&L add-backs

type BillingInterval = 'month' | 'year' | 'quarter';

interface SubscriptionInvoice {
  invoiceId: string;
  customerId: string;
  grossAmountCents: number;
  refundAmountCents: number;
  interval: BillingInterval;
  intervalCount: number;
  periodStart: string; // ISO date
  periodEnd: string;
  paidAt: string | null;
  status: 'paid' | 'open' | 'void' | 'uncollectible';
}

interface MonthlyRecognition {
  month: string; // YYYY-MM
  cashCollected: number;
  revenueRecognized: number;
  deferredBalanceEnd: number;
  billingMrr: number;
  committedChurnMrr: number;
}

interface SdeNormalizationInput {
  reportedSde: number;
  ownerCompAddback: number;
  discretionaryAddbacks: number;
  marketSalaryReplacement: number;
  compedAccountMrr: number;
  nonRecurringRevenueTtm: number;
  cashTimingBenefitTtm: number; // annual prepay overhang on cash books
}

interface SdeNormalizationResult {
  reportedSde: number;
  normalizedAccrualSde: number;
  adjustmentPct: number;
  flags: string[];
}

const MS_PER_DAY = 86_400_000;

function daysBetween(start: string, end: string): number {
  const a = new Date(start).getTime();
  const b = new Date(end).getTime();
  return Math.max(1, Math.round((b - a) / MS_PER_DAY));
}

function monthKey(d: string): string {
  return d.slice(0, 7);
}

function monthlyRecognizedAmount(inv: SubscriptionInvoice): number {
  const net = (inv.grossAmountCents - inv.refundAmountCents) / 100;
  const totalDays = daysBetween(inv.periodStart, inv.periodEnd);
  // Ratiable recognition over service period (ASC 606 default for SaaS)
  return net / (totalDays / 30.437); // avg days per month
}

function buildRecognitionSchedule(
  invoices: SubscriptionInvoice[],
  months: string[],
): MonthlyRecognition[] {
  const deferredByInvoice = new Map<string, number>();

  return months.map((month) => {
    let cashCollected = 0;
    let revenueRecognized = 0;
    let billingMrr = 0;

    for (const inv of invoices) {
      if (inv.paidAt && monthKey(inv.paidAt) === month && inv.status === 'paid') {
        cashCollected +=
          (inv.grossAmountCents - inv.refundAmountCents) / 100;
      }

      const overlaps =
        inv.periodStart.slice(0, 7) <= month &&
        inv.periodEnd.slice(0, 7) >= month &&
        inv.status === 'paid';

      if (overlaps) {
        const net = (inv.grossAmountCents - inv.refundAmountCents) / 100;
        const totalDays = daysBetween(inv.periodStart, inv.periodEnd);
        const monthStart = new Date(`${month}-01`);
        const monthEnd = new Date(monthStart);
        monthEnd.setMonth(monthEnd.getMonth() + 1);
        const overlapStart = Math.max(
          new Date(inv.periodStart).getTime(),
          monthStart.getTime(),
        );
        const overlapEnd = Math.min(
          new Date(inv.periodEnd).getTime(),
          monthEnd.getTime(),
        );
        const overlapDays = Math.max(
          0,
          Math.round((overlapEnd - overlapStart) / MS_PER_DAY),
        );
        revenueRecognized += net * (overlapDays / totalDays);

        // Billing MRR equivalent (snapshot — simplify for DD)
        if (inv.interval === 'month') billingMrr += net / inv.intervalCount;
        if (inv.interval === 'year') billingMrr += net / 12 / inv.intervalCount;
      }
    }

    // Roll forward deferred (simplified portfolio view)
    let deferredBalanceEnd = 0;
    for (const inv of invoices) {
      if (inv.status !== 'paid') continue;
      const net = (inv.grossAmountCents - inv.refundAmountCents) / 100;
      const totalDays = daysBetween(inv.periodStart, inv.periodEnd);
      const monthEnd = new Date(`${month}-01`);
      monthEnd.setMonth(monthEnd.getMonth() + 1);
      const earnedThroughMonthEnd = Math.min(
        totalDays,
        Math.max(
          0,
          Math.round(
            (monthEnd.getTime() - new Date(inv.periodStart).getTime()) /
              MS_PER_DAY,
          ),
        ),
      );
      const remaining = net * (1 - earnedThroughMonthEnd / totalDays);
      deferredBalanceEnd += Math.max(0, remaining);
    }

    return {
      month,
      cashCollected,
      revenueRecognized,
      deferredBalanceEnd,
      billingMrr,
      committedChurnMrr: 0, // populate from cancel_at_period_end events
    };
  });
}

function normalizeSde(input: SdeNormalizationInput): SdeNormalizationResult {
  const flags: string[] = [];
  if (input.cashTimingBenefitTtm > input.reportedSde * 0.15) {
    flags.push('CASH_TIMING_BENEFIT_GT_15PCT_SDE');
  }
  if (input.compedAccountMrr * 12 > input.reportedSde * 0.05) {
    flags.push('COMPED_MRR_MATERIAL');
  }

  const normalizedAccrualSde =
    input.reportedSde +
    input.ownerCompAddback +
    input.discretionaryAddbacks +
    input.marketSalaryReplacement -
    input.compedAccountMrr * 12 -
    input.nonRecurringRevenueTtm -
    input.cashTimingBenefitTtm;

  const adjustmentPct =
    input.reportedSde === 0
      ? 0
      : (normalizedAccrualSde - input.reportedSde) / input.reportedSde;

  return {
    reportedSde: input.reportedSde,
    normalizedAccrualSde,
    adjustmentPct,
    flags,
  };
}

// Example diligence output
const result = normalizeSde({
  reportedSde: 94_000,
  ownerCompAddback: 0,
  discretionaryAddbacks: 2_400,
  marketSalaryReplacement: 72_000,
  compedAccountMrr: 480,
  nonRecurringRevenueTtm: 6_200,
  cashTimingBenefitTtm: 28_600,
});
// result.normalizedAccrualSde ≈ 61,000; flags include CASH_TIMING_BENEFIT_GT_15PCT_SDE

Extend the model with committedChurnMrr from Stripe cancellation events and cross-validate billingMrr against the seller's dashboard. Any month where cashCollected / revenueRecognized exceeds 1.25× for three consecutive months triggers manual review.

9. Multi-Source Reconciliation Matrix

Run this matrix before LOI. Unexplained variance in any cell is a holdback or price adjustment conversation—not a footnote.

Source ASource BCompareToleranceIf fail
Stripe MRR exportYour recognition model MRRCurrent month snapshot± 2%Filter pauses / comped
Stripe charges TTMSeller P&L revenueMonthly series 12 mo± 3% accrual; ± 8% cashRebuild accrual schedule
Model deferred balanceSeller balance sheetClose date± 5%WC adjustment in APA
Bank depositsStripe net payoutsMonthly 6 mo± 2%Hidden accounts / personal mix
Annual cohort M13 retentionSeller NRR slideSame vintage window± 5 ptsChurn timing investigation
Normalized accrual SDEAsk price / multipleImplied multipleWithin band for GRR tierReprice or walk

10. Red Flags in Data Rooms: Revenue Quality Edition

  1. No deferred revenue schedule on a business with > 25% annual billing—assume cash-basis inflation.
  2. TTM revenue spike in listing quarter without MRR growth—annual renewal push before sale.
  3. MRR flat, deferred balance up 40%+ — collecting cash without retaining logos.
  4. Refund rate doubled YoY — product failure or aggressive sales promises catching up.
  5. Recognition policy undocumented — seller cannot explain ASC 606 treatment in writing.
  6. Personal and business Stripe mixed — revenue base un-auditable without forensic separation.
  7. Earnout tied to cash revenue on annual-heavy base—you pay twice for prepay timing. Tie earnouts to accrual MRR or GRR per billing metric definitions.

11. Purchase Price Adjustment Frameworks

Translate revenue quality findings into deal terms—not just spreadsheet notes. Three levers: price reduction, working capital/deferred credit, and earnout/holdback structure.

11.1 Price reduction formula

Quality_adjusted_price = Ask × (Normalized_accrual_SDE / Reported_SDE) Alternative MRR-based: Adjusted_price = Ask × (Verified_MRR / Claimed_MRR) Apply only after comped/pause filtering and interval segmentation

11.2 Holdback triggers tied to revenue quality

TriggerHoldback %Release condition
Deferred schedule variance > 10%5–10%CPA reconciliation at 90 days
MRR misstatement > 5%10–15%90-day MRR within tolerance
Undisclosed comped accountsPer-logo value × 12Immediate offset at close
Annual renewal cliff in 90 days15–20% of at-risk ARRRenewal rate ≥ diligence model

12. Billing System Export Requirements

Request these exports in your initial data room ask—before LOI expires. Missing exports are themselves a red flag.

ExportFields requiredHistory
Invoicesid, customer, amount, period_start, period_end, status, paid_at24 mo
Subscriptionsid, customer, plan, interval, mrr, cancel_at, canceled_atEvent log 24 mo
Refunds / credit notesamount, reason, linked invoice24 mo
Balance transactionsgross, fee, net, type, created24 mo
P&L + GL detailRevenue accounts monthly24 mo

13. Revenue Quality Scorecard Template

Assign 0–2 points per dimension (0 = fail, 1 = partial, 2 = pass). Score below 18/24 suggests walk or deep discount.

Dimension0 pts1 pt2 pts
Accounting method clarityUnknown / mixedCash, documentedAccrual with schedule
Deferred revenue scheduleMissingReconstructed by buyerSeller-provided, verified
Cash ↔ accrual gap> 25%10–25%< 10%
Annual churn visibilityBlended onlyAnnual segment partialFull interval cohorts
Refund discipline> 5% gross3–5%< 3%
Bank reconciliationUnexplained gapsMinor variancesClean match
SDE normalization delta> 30% down15–30% down< 15% down

14. Frequently Asked Questions

Can I use MRR multiples if books are cash-basis?

Yes—but only on verified billing MRR after removing comped accounts, pauses, and founder-owned logos—not on cash TTM revenue. Apply a 0.25–1.0× multiple haircut when annual contracts exceed 40% of the base until you complete accrual reconstruction. See valuation fundamentals for multiple bands by GRR tier.

How does deferred revenue affect seller note DSCR?

Post-close, a portion of P&L revenue generates no new cash until renewals. Model monthly cash as: new collections + renewal collections − opex − debt service. Deferred burn-through inflates accrual earnings but not cash—stress-test DSCR at 1.3× minimum using cash collections, not recognized revenue.

What if the seller has never tracked deferred revenue?

Rebuild from invoice exports using the TypeScript model in Section 8 or a spreadsheet waterfall. Treat missing schedules as a representation and warranty issue in the APA—not a reason to skip the work.

How is this different from cohort churn analysis?

Cohort analysis answers who leaves and when. Revenue recognition diligence answers what you earned vs what you collected and what liabilities remain. Run both—our cohort analysis guide covers retention triangles; this guide covers the P&L and balance sheet truth beneath them.

Should earnouts use cash or accrual revenue?

Accrual MRR or GRR—never cash TTM on annual-heavy bases. Cash metrics reward prepay spikes you already paid for at close. Define metrics in the APA with the same formulas you used in diligence, per our billing metric definitions.

What tools do I need beyond Excel?

Stripe CSV exports + the normalization model above are sufficient for most micro-deals. Optional: Baremetrics/ChartMogul as cross-check only— always validate against raw invoice events. Browse verified listings that disclose billing interval mix when available.

Comments from Pro members

Selected feedback from verified Pro subscribers. Timestamps update while you read.

  • Jordan K.

    Switched to Pro mainly for the extra analyses and Reddit/X coverage. This workflow section matches how I screen listings now—saves me hours every week.

    Pro

  • Priya S.

    The cross-marketplace point is huge. I used to miss duplicates across sites. Premium paid for itself after one decent lead I would have skipped.

    Pro

  • Marcus T.

    As a Pro user I appreciate the emphasis on red flags before diligence. If you are still on Free, at least read the checklist twice before you wire funds.

    Pro

  • Elena R.

    I send founders here when they ask how I find sub-$10k deals. The internal link to pricing is honest—you really do need Premium or Pro if you are serious.

    Pro

  • Chris V.

    MyDealList + a simple spreadsheet is my stack for 2026. Dynamic feed + alerts beats refreshing five marketplaces manually. Worth upgrading from Premium to Pro if you scale volume.

    Pro

Leave a Reply

Your email address will not be published.

Live activity

Team in Chicago found a gem with AI