Data Discrepancies


This guide explains why GrowPanel's numbers might differ from your billing platform and how to investigate discrepancies.


Settings to check first

The most common cause of MRR discrepancies is a mismatch between your settings in GrowPanel and your billing platform. Check these first.

Churn recognition

GrowPanel and your billing platform may recognize churn at different times:

Immediate recognition:

  • Churn counted when the cancellation is processed by the billing platform
  • Matches when the customer decided to leave
  • May differ from when revenue actually stops

End-of-period recognition (GrowPanel default):

  • Churn counted when the subscription period ends
  • Matches when the revenue impact is felt
  • May differ from when the customer canceled

Why this matters: Stripe's dashboard uses immediate recognition by default. If a customer cancels on January 15th but their subscription runs until January 31st, Stripe shows the churn in January 15th's metrics, while GrowPanel (by default) shows it on January 31st.

Check your setting in Settings → Billing.

Auto-churn past-due customers

GrowPanel can automatically churn customers that stay past-due for longer than a configurable threshold.

Auto-churn is disabled by default. Most modern billing platforms (Stripe, Chargebee, etc.) already enforce a dunning lifecycle — they retry failed payments, escalate to the customer, and ultimately cancel the subscription if collection keeps failing. The cleanest source of truth in that case is the platform's own cancel signal, so GrowPanel waits for it rather than pre-empting it. If a payment fails and the platform doesn't cancel, GrowPanel keeps the customer as MRR until the platform does.

Auto-churn is more useful for billing setups that don't enforce a dunning lifecycle themselves (custom integrations, some legacy systems, manual invoicing). You can enable it in Settings → Billing with whatever past-due threshold matches your policy — separate values for credit card and manual invoices.

When auto-churn is enabled and a customer goes past your threshold, GrowPanel counts them as churned while your billing platform might still show them as active. Disabling auto-churn (the default) restores parity with the billing-platform-native view.

Stripe-specific: how unpaid subscriptions are handled

Stripe leaves a subscription in the unpaid status (rather than flipping it to canceled) when collection has failed. What that signal actually means depends on the subscription's collection_method:

collection_methodWhat unpaid meansGrowPanel treatment
charge_automaticallyStripe ran out of payment retries and stopped attempting to collect — terminal. The subscription will not bill again unless the merchant intervenes.Treated as churned. This is Stripe's "we've given up" signal even though the status isn't literally canceled.
send_invoiceThe invoice's due date passed without payment. Stripe never auto-charges these to begin with — the customer can still pay the invoice manually and the subscription returns to active.Kept as MRR (still alive), same as past_due. If you want a hard time-limit on manual past-due, enable the manual auto-churn threshold.

This split is automatic — you don't need to configure it. The subscription's collection_method is read directly from Stripe.

If you see GrowPanel showing 0 MRR for a customer that some Stripe-side report still credits with revenue, auto-charge unpaid is the most common cause. Stripe's reporting surfaces are more lenient than its own subscription model — they typically keep unpaid subs in MRR even though Stripe has stopped collecting from them.

One-time discounts in MRR

Billing platforms like Stripe have a setting to exclude one-time discounts (coupons with duration "once") from MRR calculations. GrowPanel has a matching setting: Subtract one-time discounts from MRR.

If this setting is off in Stripe but on in GrowPanel (or vice versa), you will see different MRR values for any customer with a one-time coupon applied.

Check your setting in Settings → Billing and compare it with your billing platform's setting.

Recurring (forever / repeating) discounts

GrowPanel applies recurring discounts to MRR — a customer paying $50/month with a 50% recurring coupon contributes $25 to MRR, not $50. This matches what the customer is actually paying you each month.

Some billing-platform reports show the list price for recurring discount types and ignore the discount. So you may see GrowPanel showing exactly half (or some other fraction) of what the platform reports for a discounted customer.

Both numbers are useful for different things — list-price MRR for "what we'd be billing without discounts" versus realised MRR for "what we're actually collecting" — but for revenue reporting and forecasting, GrowPanel's discount-adjusted figure is the operationally correct one.

MRR on unpaid subscriptions

In Stripe, you can configure MRR to include subscriptions where payments have never succeeded. GrowPanel does not support this — MRR is always calculated from paid invoices. If a customer creates a subscription but the first payment fails, Stripe may count it as MRR while GrowPanel will not.

This is a fundamental difference in how MRR is calculated and is one of the most common reasons GrowPanel shows less MRR than Stripe.


Other MRR differences

Pending invoices

GrowPanel counts MRR from paid invoices. A subscription might be active but if the invoice is unpaid or pending, it may not count in MRR yet.

"Billed-later" subscription items

When reconciling against your billing platform, you may see GrowPanel reporting more MRR for a customer than the platform does. The most common cause is what we call billed-later items: subscription items the customer is committed to that aren't on their most recent paid invoice.

Examples of how a customer ends up with billed-later items:

  • A yearly add-on alongside a monthly subscription. The monthly invoice doesn't include the yearly item — but the customer is still subscribed to it and will be billed for it on the yearly cycle.
  • A subscription item on a different billing anchor than the rest of the subscription.
  • An item whose latest invoice is open or uncollectible (the platform is still trying to collect, the customer hasn't churned).

GrowPanel counts these as MRR. They represent revenue the customer has committed to and will pay for on their next invoice — so dropping them would understate recognised recurring revenue and create artificial dips and spikes around billing cycles.

Some billing-platform views don't. Their reports are typically anchored on what's been invoiced in the most recent paid cycle rather than on the full set of active subscription items.

Both views are internally consistent; they answer slightly different questions. We believe GrowPanel's view is the more accurate read of recurring revenue, because:

  • It matches what the customer is contractually paying for.
  • It avoids per-cycle wobble: a customer with a yearly add-on shouldn't drop in and out of MRR depending on whether their last invoice happened to include the yearly line.
  • It tracks total committed MRR (CMRR-style), which is what most SaaS reporting standards target.

If you reconcile against the billing platform and see a gap, the diff usually equals the sum of the customer's billed-later item MRRs to the cent.

Metered/usage billing

For metered pricing:

  • GrowPanel calculates MRR from historical invoices
  • Your billing platform might show expected/estimated usage
  • These can vary significantly

Trial subscriptions

GrowPanel counts MRR only when a customer is paying. Trials with $0 invoices don't contribute to MRR until they convert.

Your billing platform might show "potential MRR" or "trial MRR" separately.

Currency conversion

GrowPanel converts all currencies to your reporting currency using daily exchange rates from exchangerate-api.com. Your billing platform might:

  • Show original currencies separately
  • Use different exchange rates or rate sources
  • Not convert at all

Churn differences

Downgrade to free

If a customer downgrades to a free plan:

  • GrowPanel counts this as churn (MRR went to zero)
  • Your billing platform might call it a "downgrade" or keep them as "active"

Customer count differences

Status definitions

GrowPanel statusWhat it means
LeadCustomer record exists, no trial or subscription
TrialIn active trial period
ActiveHas an active subscription (including $0 plans)
Past DuePayment failed, awaiting payment or auto-churn
CanceledPreviously paid, now churned

Your billing platform may use different status names or definitions.

Multiple subscriptions

If a customer has multiple subscriptions:

  • GrowPanel counts them as one customer
  • MRR is summed across all subscriptions
  • Some platforms count each subscription separately

How to investigate

Step 1: Export comparable data

  1. Export customer-level data from GrowPanel
  2. Export customer-level data from your billing platform
  3. Use the same date range for both

Step 2: Reconcile totals

  1. Sum MRR from both exports
  2. Note the difference
  3. Calculate the percentage variance

A small variance (< 1%) is normal due to timing and rounding.

Step 3: Find specific differences

  1. Sort both lists by customer name or ID
  2. Compare MRR values side-by-side
  3. Identify customers with differences

Step 4: Investigate individual customers

For customers with different MRR:

  1. View their detail page in GrowPanel
  2. Check their subscription in your billing platform
  3. Look for:
    • Different subscription status
    • Currency conversion
    • Pending vs. paid invoices
    • Multiple subscriptions

Common explanations

"GrowPanel shows less MRR"

Usually because:

  • The billing platform includes MRR on subscriptions where no invoice has ever been paid (GrowPanel only counts MRR after a paid invoice).
  • Recurring discounts are applied in GrowPanel — the realised MRR is lower than the list-price MRR the platform reports.
  • One-time discounts are subtracted in GrowPanel but not in your billing platform.
  • Past-due customers were auto-churned (only relevant if you've enabled auto-churn — it's off by default).
  • Trials are excluded.
  • Pending invoices not counted.
  • Currency conversion at different rates.

"GrowPanel shows more MRR"

Usually because:

  • Billed-later subscription items are included in GrowPanel's MRR but excluded from your billing platform's report (yearly add-ons, items on alternate billing anchors, items waiting on uncollectible invoices). The diff typically equals the sum of those items' MRR to the cent.
  • Includes all currencies converted to one (your billing platform may show each currency separately).
  • One-time discounts are excluded in GrowPanel but subtracted in your billing platform.
  • Exchange rate differences (GrowPanel uses daily rates from exchangerate-api.com).
  • Historical customers included that may be filtered out in your billing platform.

"Customer counts don't match"

Usually because:

  • Different status definitions
  • GrowPanel may have older historical customers
  • Filters may be applied

Best practices

Accept small differences

A variance under 1% is normal and expected. Focus on trends rather than exact matches.

Use GrowPanel as source of truth

For consistent reporting, use GrowPanel's numbers for all internal and external reporting. This ensures everyone uses the same definitions.

Document your methodology

Record your settings and how you define metrics:

  • Churn recognition: immediate or end-of-period (default: end-of-period)
  • Auto-churn threshold: number of days past-due (default: disabled — wait for the billing platform's explicit cancel)
  • Subtract one-time discounts from MRR: on or off (default: off)
  • Reporting currency: USD/EUR/etc.

Reconcile periodically

Monthly or quarterly, do a quick reconciliation to ensure data is syncing correctly and no major issues have developed.


Send us a full Stripe export for a side-by-side comparison

If you've checked the settings above and your numbers still don't line up, the fastest way for us to help is to compare your full Stripe history against your GrowPanel data, customer by customer. We need a single CSV from Stripe — here's exactly how to export it:

  1. Open your Stripe Dashboard.
  2. Click Billing in the left sidebar, then Overview.
  3. Find the MRR growth card and click Open.
  4. Under Date range, select your entire history (from the day you started taking payments through today).
  5. Click Export, then choose Data results.
  6. Confirm the export. Stripe will email the CSV — typically within a few minutes.
  7. Reply to your support thread with the CSV attached. Don't send it through any other channel — only the support thread is access-controlled to your account.

Once we have it, we'll run a row-by-row comparison against your GrowPanel data and tell you exactly where the gaps are coming from. This is the most reliable way to resolve persistent discrepancies — much faster than back-and-forth on individual customers.


When to contact support

Use the support widget if you find:

  • Large unexplained discrepancies (> 5%)
  • Customers completely missing from GrowPanel
  • Data that was present but disappeared
  • Sync errors or failures in Data Sources

Include:

  • Examples of specific customer discrepancies
  • Screenshots from both platforms
  • Your account settings
  • For Stripe-based discrepancies, the Stripe MRR-growth Data Results CSV described in the section above — this lets us run a full side-by-side comparison and is the fastest path to a resolution.