MRR movement types
Every change to a customer's MRR is classified as a specific movement type. Understanding these types—and their subtypes—helps you interpret your reports, build accurate dashboards, and explain your metrics to stakeholders.
This article covers the five main movement types, the subtypes that add context, how segment movements work for plan-level analysis, and edge cases you might encounter.
The five main movement types
| Type | When it happens | Customer count effect |
|---|---|---|
| New | First payment from a customer | +1 customer |
| Expansion | Existing customer's MRR increases | No change |
| Contraction | Existing customer's MRR decreases (but stays >$0) | No change |
| Churn | Customer's MRR goes to $0 with no active subscriptions | -1 customer |
| Reactivation | Previously churned customer starts paying again | +1 customer |
New
A "New" movement occurs when a customer makes their first payment and has no prior payment history.
What triggers it:
- First paid invoice after signup
- Trial converting to paid
- Lead purchasing a subscription
What doesn't count as New:
- A customer who churned and comes back (that's Reactivation)
- Adding a second subscription to an existing account (that's Expansion)
Expansion
An "Expansion" movement occurs when an existing paying customer's MRR increases.
Common causes:
- Upgrading to a higher plan
- Adding more seats or licenses
- Adding a second subscription
- Discount expiring (price goes up)
- Switching from annual to monthly (if monthly is more expensive per month)
Contraction
A "Contraction" movement occurs when an existing customer's MRR decreases but remains above $0.
Common causes:
- Downgrading to a lower plan
- Removing seats or licenses
- Applying a discount
- Switching from monthly to annual (usually cheaper per month)
- Canceling one of multiple subscriptions
Important: Contraction means the customer is still paying—they haven't churned.
Churn
A "Churn" movement occurs when a customer's MRR goes to $0 and they have no remaining active subscriptions.
Common causes:
- Canceling their subscription
- Subscription expiring without renewal
- Payment failing beyond the grace period (involuntary churn)
What doesn't count as Churn:
- Downgrading to a free plan (if they still have an active subscription record)
- Removing one of multiple paid subscriptions (that's Contraction)
Reactivation
A "Reactivation" movement occurs when a previously churned customer starts paying again.
Requirements:
- Customer must have paid before (has payment history)
- Customer must have been churned ($0 MRR, no active subscriptions)
- Customer starts a new paid subscription
Movement subtypes
Subtypes provide additional context about what caused the movement. They're visible in detailed views and exports.
| Subtype | Applies to | What it means |
|---|---|---|
quantity_change | Expansion, Contraction | Customer added or removed seats/licenses |
discount_change | Expansion, Contraction | A discount was added, removed, or modified |
price_change | Expansion, Contraction | The plan price changed (same plan, new price) |
plan_change | Expansion, Contraction | Customer switched to a different product/plan |
frequency_change | Expansion, Contraction | Billing interval changed (monthly↔annual) |
add_on | Expansion | Customer added a second subscription |
voluntary | Churn | Customer chose to cancel |
delinquent | Churn | Cancellation due to failed payments |
Quantity changes
When a customer changes the number of seats or licenses:
Example:
- Customer has 10 seats at $10/seat = $100 MRR
- Customer adds 5 seats
- New MRR: $150
- Movement: Expansion (+$50), subtype:
quantity_change
Discount changes
When a discount is added, removed, or expires:
Discount applied:
- Customer pays $100/month, gets 20% discount
- New MRR: $80
- Movement: Contraction (-$20), subtype:
discount_change
Discount expires:
- Customer was paying $80 (with 20% discount)
- Discount expires, full price resumes
- New MRR: $100
- Movement: Expansion (+$20), subtype:
discount_change
Price changes
When the plan price changes but the customer stays on the same plan:
Example:
- You increase prices from $99 to $129
- Existing customer renews at new price
- Movement: Expansion (+$30), subtype:
price_change
Plan changes
When a customer switches to a different product:
Example:
- Customer switches from "Starter" ($50) to "Pro" ($150)
- Movement: Expansion (+$100), subtype:
plan_change
Frequency changes
When the billing interval changes. This is where it gets interesting.
Monthly to annual (usually contraction):
- Customer pays $100/month = $100 MRR
- Customer switches to $960/year = $80 MRR
- Movement: Contraction (-$20), subtype:
frequency_change
Annual to monthly (usually expansion):
- Customer pays $960/year = $80 MRR
- Customer switches to $100/month = $100 MRR
- Movement: Expansion (+$20), subtype:
frequency_change
This often surprises people: switching to annual billing frequently shows as contraction because annual plans are typically discounted. The customer committed to a longer term, which is positive, but their normalized monthly revenue is lower.
Segment movements
When filtering MRR by plan (or other dimensions), you need to understand how customers moving between plans affect the numbers.
Segment entry and segment exit
These are internal movement types used for plan-level reporting:
| Type | What it means |
|---|---|
| Segment entry | Customer joined this plan/segment |
| Segment exit | Customer left this plan/segment |
How plan switches are recorded
When a customer switches from Plan A to Plan B, GrowPanel records:
- Segment exit from Plan A (negative MRR)
- Segment entry to Plan B (positive MRR, equal to what exited)
- Expansion or Contraction on Plan B (the MRR difference)
Example: Customer upgrades from Starter ($50) to Pro ($150)
| Movement | Plan | MRR change | Type |
|---|---|---|---|
| 1 | Starter | -$50 | Segment exit |
| 2 | Pro | +$50 | Segment entry |
| 3 | Pro | +$100 | Expansion |
What this means for reporting:
- Company-level MRR report: Shows +$100 Expansion
- Starter plan report: Shows -$50 (segment exit)
- Pro plan report: Shows +$150 (segment entry + expansion)
Why this matters
If you filter the MRR report to show only "Pro" plan:
- You'll see customers entering from other plans (segment entry)
- You'll see customers leaving to other plans (segment exit)
- You'll see organic expansion/contraction within the plan
Without segment movements, plan-level reports would only show customers who started fresh on that plan, missing the full picture.
Movement grouping
When multiple changes happen in quick succession, GrowPanel can group them into a single movement.
The problem grouping solves
Without grouping, a customer who signs up and immediately upgrades shows:
- 10:00 AM — New: $50 (signed up for Starter)
- 10:02 AM — Expansion: $100 (upgraded to Pro)
This inflates your "New" count with the wrong plan and creates an artificial expansion.
How grouping works
With grouping enabled (default: 24 hours), these become:
- 10:00 AM — New: $150 (on Pro)
The final state is what matters, not the intermediate steps.
Configuring the grouping window
Settings → Reporting → Group MRR movements
| Setting | Effect |
|---|---|
| 0 hours | No grouping (every change is separate) |
| 24 hours (default) | Same-day changes are grouped |
| 48+ hours | Changes over multiple days are grouped |
When to adjust grouping
Increase the window if:
- Your sales process involves multiple subscription changes during onboarding
- Customers frequently adjust seats immediately after purchase
Decrease the window if:
- You need precise timing of each change
- You're auditing specific transactions
Self-serve vs. enterprise differences
Movement patterns differ significantly between self-serve SaaS and enterprise sales.
Self-serve SaaS patterns
Typical characteristics:
- High volume of small New movements
- Frequent small expansions (adding seats one at a time)
- Higher churn velocity (but often lower revenue impact)
- Many monthly billing customers
- Plan changes are common (upgrade paths)
What to watch:
- Trial-to-paid conversion rate
- Quick ratio (expansion + new vs. contraction + churn)
- Churn by customer age (early churn vs. mature churn)
Enterprise sales patterns
Typical characteristics:
- Low volume of large New movements
- Expansions often happen at renewal (annual upsells)
- Lower churn velocity but higher revenue impact per churn
- Most customers on annual contracts
- Plan changes are less common (custom deals)
What to watch:
- Net revenue retention (NRR)
- Expansion timing (end of year vs. throughout)
- Multi-year contract value
Hybrid models
Many companies have both:
- Self-serve for SMB customers
- Sales-assisted for enterprise
Use plan filters or custom variables to analyze each segment separately.
Edge cases
Customer has multiple subscriptions
When a customer has multiple active subscriptions:
- Churn requires all subscriptions to end
- Canceling one subscription is Contraction, not Churn
- Each subscription is tracked independently
Example:
| Action | MRR | Movement |
|---|---|---|
| Subscribe to Plan A | $100 | New (+$100) |
| Add Plan B | $150 | Expansion (+$50) |
| Cancel Plan A | $50 | Contraction (-$100) |
| Cancel Plan B | $0 | Churn (-$50) |
Free plans and $0 subscriptions
Customers can have active subscriptions with $0 MRR:
- Free tier subscriptions
- 100% discounted plans
- Trial-like "free forever" plans
These customers are:
- Counted as "active" (not churned)
- Show $0 MRR
- Only churn if the subscription is actually cancelled
Upgrading from free:
- If they never paid before: New
- If they paid before, churned, went to free, now upgrading: Reactivation
Involuntary vs. voluntary churn
GrowPanel tracks why churn happened:
| Subtype | Cause | What it means |
|---|---|---|
voluntary | Customer cancelled | They chose to leave |
delinquent | Payment failed | They didn't choose to leave |
Involuntary churn (delinquent) is often recoverable—these customers may just need a payment method update.
Immediate upgrade during trial
If a trial customer upgrades to paid immediately:
- The trial doesn't create any movement (no MRR)
- The paid subscription creates a New movement
- No "trial conversion" movement exists (it's just New)
Downgrade to free = Churn?
Depends on your setup:
If free tier has an active subscription record:
- Downgrading is Contraction (to $0 MRR)
- Customer remains "active"
- Later canceling the free subscription is Churn (but $0 impact)
If free tier has no subscription (just an account):
- Downgrading is Churn (subscription ends)
- Customer becomes "churned"
- Later subscribing again is Reactivation
Reading movement data in reports
MRR report breakdown table
The breakdown table shows movements aggregated by type and period:
| Column | What it shows |
|---|---|
| New | Sum of all New movements |
| Expansion | Sum of all Expansion movements |
| Reactivation | Sum of all Reactivation movements |
| Contraction | Sum of all Contraction movements (negative) |
| Churn | Sum of all Churn movements (negative) |
Click any cell to see the individual movements.
MRR movements report
The dedicated movements report shows every individual movement:
- Date and time
- Customer name
- Type and subtype
- Plan name
- MRR change
- Description
Use filters to focus on specific movement types, plans, or time periods.
Exports
Exported data includes:
- Movement type
- Subtype
- Segment entry/exit flags
- Group ID (for related movements)
Summary
Main types classify what happened to the customer relationship:
- New, Expansion, Contraction, Churn, Reactivation
Subtypes explain why it happened:
- Quantity, discount, price, plan, or frequency change
Segment movements enable plan-level analysis:
- Segment entry/exit tracks customers moving between plans
Grouping consolidates rapid changes:
- Prevents artificial intermediate states from appearing
Understanding these classifications helps you:
- Interpret reports accurately
- Build meaningful dashboards
- Explain metrics to stakeholders
- Identify specific areas for improvement
Related pages
- From invoices to MRR — How billing data becomes movements
- MRR report — Using the MRR report
- MRR movements report — Viewing all movements
- Breakdown reports — Segmenting by plan and other dimensions