# GrowPanel Documentation

> Product documentation: features, metrics, configuration, and how-tos.
> Built 2026-04-19T17:45:51.122Z · source: https://growpanel.io/docs/

---

## Account
<!-- url: https://growpanel.io/docs/account-and-billing/account -->

The **Account** page lets you manage your GrowPanel account settings, including renaming your account and deleting your account and data.

---

## Accessing account settings

Navigate to **Account → Account** to manage your account.



---

## Account name

The account name appears in:

- The GrowPanel header
- Scheduled email reports
- Team invitations

### Rename your account

To change your account name:

1. Go to **Account → Account**
2. Edit the **Account name** field
3. Click **Save**

The change takes effect immediately across all areas of GrowPanel.

---

## Delete account

Deleting your account permanently removes all your data from GrowPanel. This action cannot be undone.

### How to delete your account

1. Go to **Account → Account**
2. Scroll to the **Danger Zone** section
3. Click **Delete Account**
4. Type your account name to confirm
5. Click **Delete** to proceed

Only the account owner can delete the account.

### What happens when you delete

When you delete your account:

| What's deleted | When |
|----------------|------|
| Account and user data | Immediately |
| Customer and subscription data | Within 24 hours |
| Backups | Within 30 days |

After deletion:

- All team members lose access immediately
- GrowPanel API keys stop working
- Scheduled reports stop sending
- Webhook endpoints stop responding

**Important:** Deleting your GrowPanel account does not automatically revoke access to your billing platforms. You should manually revoke access:

- **Stripe**: Uninstall the GrowPanel app in your Stripe Dashboard under **Settings → Installed apps**
- **Chargebee/Recurly**: Delete or revoke the API key you created for GrowPanel

---

## Data retention and GDPR

### Active accounts

While your account is active:

- All imported data is retained indefinitely
- Historical data is preserved for reporting
- You can request specific data deletion at any time

### After cancellation

If you cancel your subscription (but don't delete the account):

- Data is preserved for 30 days
- You can resubscribe to restore full access
- After 30 days, the account and data are deleted

### After deletion

When you delete your account:

- Data is removed from production systems within 24 hours
- Backups are purged within 30 days
- Data cannot be recovered after this period

### GDPR compliance

GrowPanel complies with GDPR requirements:

- **Right to access**: Export your data anytime via CSV or API
- **Right to erasure**: Delete your account to remove all data
- **Right to portability**: Download your data before deletion
- **Data minimization**: We only store data necessary for the service

For a Data Processing Agreement (DPA) or questions about data handling, use the support widget or email hello@growpanel.io.

### Data export before deletion

Before deleting your account, you may want to export your data:

1. **Reports**: Use the CSV export on any report page
2. **Customer data**: Export via **Customers → Export**
3. **API**: Use the [REST API](/developers/rest-api/) for bulk exports

---

## Frequently asked questions

### Can I recover a deleted account?

No. Account deletion is permanent and cannot be undone. Make sure to export any data you need before deleting.

### What if I just want to pause my account?

Instead of deleting, you can:

1. Cancel your subscription (data preserved for 30 days)
2. Downgrade to the free plan (if under $200k ARR)

### How long until my data is fully purged?

- Production data: Within 24 hours
- All backups: Within 30 days

### Who can delete the account?

Only the account owner can delete the account. Admins and read-only users cannot delete accounts.

### What about connected services?

Deleting your GrowPanel account does **not** automatically revoke access to your billing platforms. To fully disconnect:

- **Stripe**: Uninstall the GrowPanel app in your Stripe Dashboard under **Settings → Installed apps**
- **Chargebee/Recurly**: Delete or revoke the API key you created for GrowPanel
- **HubSpot**: Disconnect GrowPanel in your HubSpot integrations settings

Your data in those external services is not affected by deleting your GrowPanel account.

---

## Related pages

- [Billing](/docs/account-and-billing/billing/) - Manage your subscription
- [Team](/docs/account-and-billing/team/) - Manage team members
- [Security](/security/) - Data handling and compliance

---

## API Keys
<!-- url: https://growpanel.io/docs/account-and-billing/api-keys -->

**API Keys** provide programmatic access to GrowPanel's REST API. Use API keys to integrate GrowPanel with your own systems, automate data exports, or build custom dashboards.

---

## Accessing API keys

Navigate to **Account → API Keys** to manage your keys.

---

## API key list

The page displays all API keys for your account:

| Column | Description |
|--------|-------------|
| **Name** | The descriptive name you gave the key |
| **Created** | When the key was created |
| **Last used** | When the key was last used for an API call |
| **Actions** | Copy, regenerate, or delete the key |

---

## Creating an API key

### Step 1: Click Create

Click the **Create API Key** button.

### Step 2: Enter a name

Give your key a descriptive name that identifies its purpose:

- "Production integration"
- "Google Sheets extension"
- "Internal dashboard"
- "Zapier automation"

<!-- IMAGE PLACEHOLDER: Screenshot of the Create API Key dialog with a name input field -->

### Step 3: Copy your key

After creation, your API key is displayed **once**:

1. Copy the key immediately
2. Store it securely (password manager, secrets vault)
3. Click **Done**

**Important:** You cannot retrieve the full key after this dialog closes. If you lose it, you'll need to regenerate or create a new key.

---

## Using API keys

### Authentication

Include your API key in the `Authorization` header:

```bash
curl https://api.growpanel.io/v1/reports/mrr \
  -H "Authorization: Bearer YOUR_API_KEY"
```

### What you can do with the API

API keys provide access to:

- **Reports** - Fetch MRR, ARR, churn, and other metrics
- **Customers** - List and retrieve customer data
- **Data** - Push data via Custom API integration
- **Account** - Read account information

See the [REST API documentation](/developers/) for complete endpoint reference.

---

## Managing API keys

### Copy a key

If you need to use a key again:

1. Click the **Copy** button next to the key
2. A partial key is copied (enough to identify it)
3. If you need the full key, you must regenerate

Note: For security, full keys are not stored and cannot be retrieved.

### Regenerate a key

To get a new key value while keeping the same name:

1. Click **Regenerate** next to the key
2. Confirm the action
3. Copy the new key immediately
4. Update your integrations with the new key

**Warning:** The old key stops working immediately. Regenerate only when necessary.

### Delete a key

To permanently remove an API key:

1. Click **Delete** next to the key
2. Confirm the deletion

The key stops working immediately and cannot be recovered.

---

## Best practices

### Use descriptive names

Name keys by their purpose or the system using them:

- Good: "Production Slack integration"
- Bad: "API key 1"

This helps you identify which keys are in use and where.

### One key per integration

Create separate keys for each integration:

- If one key is compromised, you only need to rotate one
- Easier to track usage per integration
- Simpler to decommission old integrations

### Rotate keys periodically

For security, rotate API keys every 90 days:

1. Create a new key with the same name + "(new)"
2. Update your integration to use the new key
3. Verify the integration works
4. Delete the old key

### Monitor usage

Check the "Last used" column to identify:

- Keys that are actively in use
- Keys that haven't been used (may be safe to delete)
- Unexpected usage patterns

### Secure storage

Never store API keys in:

- Source code repositories
- Unencrypted configuration files
- Email or chat messages
- Shared documents

Instead, use:

- Environment variables
- Secrets managers (AWS Secrets Manager, HashiCorp Vault)
- Password managers
- Encrypted configuration

---

## Security

### Key exposure

If you suspect a key has been exposed:

1. Regenerate or delete the key immediately
2. Review API logs for unauthorized access
3. Check for unexpected data changes
4. Create a new key for legitimate uses

### Rate limiting

API keys are subject to rate limits:

- Requests are limited per minute and per day
- Exceeding limits returns a 429 error
- See [Rate limiting](/developers/rest-api/rate-limiting/) for details

### IP restrictions

Currently, API keys work from any IP address. Contact support if you need IP allowlisting for enterprise security requirements.

---

## Who can manage API keys

| Role | Can create keys | Can view keys | Can delete keys |
|------|:---------------:|:-------------:|:---------------:|
| Owner | Yes | Yes | Yes |
| Admin | Yes | Yes | Yes |
| Read-only | No | No | No |

---

## Related pages

- [REST API documentation](/developers/) - Complete API reference
- [Custom API integration](/docs/data-sources/custom-api/) - Push data via API
- [Google Sheets integration](/docs/data-sources/google-sheets/) - Uses API keys
- [Team](/docs/account-and-billing/team/) - Role permissions

---

## Billing
<!-- url: https://growpanel.io/docs/account-and-billing/billing -->

The **Billing** page lets you manage your GrowPanel subscription, update payment methods, and access invoices. Only the account owner can access billing settings.

---

## Accessing billing

Navigate to **Account → Billing** to manage your subscription.



---

## Current plan

The billing page shows your current subscription status:

| Field | Description |
|-------|-------------|
| **Plan** | Your current plan name |
| **Status** | Active, Trial, Past Due, or Canceled |
| **Billing period** | Monthly or Annual |
| **Next renewal** | When your subscription renews |
| **Price** | Amount charged each period |

---

## Free trial

New GrowPanel accounts start with a 14-day free trial:

- Full access to all features
- No credit card required to start
- Add payment method before trial ends to continue

### Trial status

During your trial, you'll see:

- Days remaining in your trial
- Option to add payment method
- Plan selection for immediate upgrade

### After trial ends

If you haven't added a payment method:

- We will notify you that your trial is up
- Historical data is preserved, and we will keep sync'ing your latest data
- Select a free (available as long as you're below $200k in ARR) or paid plan to continue.

---

## Managing your subscription

### Upgrade or change plan

To change your plan:

1. Click **Select your plan**
   
2. Enter your company address and VAT number, if applicable
   
3. Review the price summary
   
4. Confirm the upgrade

Plan changes take effect immediately. For upgrades, you're charged a prorated amount for the remainder of the current period. For downgrades, you stay on your current plan until the end of the paid period.

### Switch billing period

To change between monthly and annual billing:

1. Click **Change Plan**
2. Select the same plan with different billing period
3. Review the new price
4. Confirm the change

Annual billing offers a discount compared to monthly.

### Cancel subscription

To cancel your GrowPanel subscription:

1. Click **Cancel Subscription**
2. Optionally provide feedback on why you're leaving
3. Confirm the cancellation

After cancellation:

- Access continues until the end of your paid period
- Data is preserved for 30 days after expiration
- You can resubscribe at any time to restore access

---

## Payment methods

### View current payment method

The billing page shows your saved payment method:

- Card type and last 4 digits
- Expiration date
- Billing address

### Update payment method

To change your payment method:

1. Click **Update Payment Method**
2. Enter new card details
3. Click **Save**

The new payment method will be used for future charges.

### Failed payments

If a payment fails:

- You'll receive an email notification
- A banner appears in GrowPanel
- Access continues for a grace period
- Update your payment method to resolve

---

## Invoices

### View invoices

All past invoices are listed on the billing page:

| Column | Description |
|--------|-------------|
| **Date** | Invoice date |
| **Amount** | Charged amount |
| **Status** | Paid, Pending, or Failed |
| **Actions** | View or download PDF |

### Download invoices

Click **Download** next to any invoice to get a PDF for your records or expense reporting.

### Invoice details

Each invoice includes:

- GrowPanel billing details
- Your billing address
- Line items and amounts
- Tax information (if applicable)
- Payment method used

---

## Billing FAQ

### When am I charged?

You're charged at the start of each billing period:

- **Monthly**: Same date each month
- **Annual**: Same date each year

### Can I get a refund?

GrowPanel offers a 14-day trial, and both monthly and yearly payments. We don't refund paid periods once they have begun. 

### Do you offer discounts?

- Annual billing includes a discount over monthly
- Contact sales for volume or startup discounts

### What payment methods do you accept?

- All major credit cards (Visa, Mastercard, Amex)
- Debit cards
- Contact us for invoice/wire transfer (annual, enterprise plans only)

### How do I update my billing address?

1. Click **Billing Address** on the billing page
2. Update your address details
3. Click **Save**

Changes apply to future invoices.

---

## Related pages

- [Team](/docs/account-and-billing/team/) - Manage team members
- [API Keys](/docs/account-and-billing/api-keys/) - Programmatic access

---

## Account & Billing
<!-- url: https://growpanel.io/docs/account-and-billing/ -->

The **Account & Billing** section lets you manage your GrowPanel account, team members, subscription plan, and API access. These settings apply to your entire organization.

---

## Account areas

| Section | Description |
|---------|-------------|
| [Account](/docs/account-and-billing/account/) | Rename or delete your account |
| [Team](/docs/account-and-billing/team/) | Invite team members and manage roles |
| [Billing](/docs/account-and-billing/billing/) | Manage your GrowPanel subscription |
| [API Keys](/docs/account-and-billing/api-keys/) | Create and manage API access tokens |
| [Profile](/docs/account-and-billing/profile/) | Update your personal account settings |
| [Manage Accounts](/docs/account-and-billing/manage-accounts/) | View and reorder multiple accounts |

---

## Accessing account settings

To access your account settings:

1. Click your profile icon or name in the top-right corner
2. Select **Account** from the dropdown menu

Or click directly on the specific section in the sidebar.

<!-- IMAGE PLACEHOLDER: Screenshot showing the account menu dropdown with options for Team, Billing, API Keys, and Profile -->

---

## Account roles

GrowPanel has three user roles:

| Role | Capabilities |
|------|--------------|
| **Owner** | Full access, including billing and account deletion |
| **Admin** | Full access except account deletion and ownership transfer |
| **Read-only** | View reports and dashboards only |

See [Team management](/docs/account-and-billing/team/) for details on roles and permissions.

---

## Manage Accounts
<!-- url: https://growpanel.io/docs/account-and-billing/manage-accounts -->

The **Manage Accounts** page gives you an overview of all the accounts you have access to. You can view MRR trends, reorder accounts, and quickly switch between them.

---

## Accessing Manage Accounts

If you have access to multiple accounts, click the **account selector** in the sidebar and select **Manage accounts**.

The Manage Accounts page displays all your accounts as cards in a responsive grid layout.

---

## Account cards

Each account card shows:

| Element | Description |
|---------|-------------|
| **Account name** | The name of the account with its favicon |
| **MRR chart** | A mini chart showing MRR trends for the selected date range |
| **Current MRR** | The account's current Monthly Recurring Revenue |
| **30-day change** | Percentage change in MRR compared to 30 days ago |
| **Role badge** | Your access level (Owner, Admin, or Read-only) |
| **Status badge** | Account status if relevant (e.g., "Payment overdue") |

### Current account indicator

The account you're currently logged into is highlighted with a green border.

---

## Switching accounts

Click any account card to switch to that account. You'll be redirected to the dashboard of the selected account.

---

## Reordering accounts

You can customize the order in which your accounts appear throughout GrowPanel, including in the account selector dropdown.

### How to reorder

1. Hover over an account card
2. Click and hold the **drag handle** icon (six dots) in the top-right corner
3. Drag the card to your preferred position
4. Release to drop the card in its new position

The new order is saved automatically and reflected immediately in the account selector dropdown.

### Order persistence

Your custom account order is personal to you and persists across sessions. New accounts you create or are invited to will appear at the end of your list.

---

## Account settings

For accounts where you have Owner or Admin access, a **settings icon** appears when hovering over the card. Click it to go directly to that account's settings page, where you can:

- Rename the account
- Manage team members
- Configure billing
- Delete the account (Owner only)

---

## Date range and currency

Use the **date picker** and **currency selector** at the top of the page to adjust the MRR charts and values displayed on all cards.

---

## When is Manage Accounts available?

The **Manage accounts** option only appears in the account selector if you have access to two or more accounts. If you only have one account, this option won't be shown.

---

## Related pages

- [Account](/docs/account-and-billing/account/) - Manage individual account settings
- [Team](/docs/account-and-billing/team/) - Invite team members
- [Profile](/docs/account-and-billing/profile/) - Update your personal settings

---

## Profile
<!-- url: https://growpanel.io/docs/account-and-billing/profile -->

The **Profile** page lets you update your personal account settings, including your name, email, and password.

---

## Accessing your profile

Navigate to **Account → Profile** or click your avatar in the top-right corner and select **Profile**.



---

## Personal information

### Update your name

1. Edit the **First name** and **Last name** fields
2. Click **Save**

Your name appears in team member lists and is shown to other users on your account.

## Update your theme and locale

To change the theme (dark or light mode) of your app, select wither Light or Dark mode, or Auto (which follows the OS mode).

Locale is what controls how you see numbers, currencies and dates displayed throughout the GrowPanel app. It's in the format xx-XX where the first part is the language and the second part the region/country. Examples: `en-US`, `da-DK` and `de-DE`.

Click Save after changing the theme and/or locale.

### Update your email

Changing your email is only possible if you're using email/password to authenticate.

1. Edit the **Email** field
2. Click **Save**
3. Verify your new email by clicking the link sent to it

Your email is used for:

- Signing in (unless using Google/Microsoft)
- Receiving notifications and scheduled reports

**Note:** You must verify your new email before it takes effect.

---

## Password

### Change your password

If you sign in with email/password:

1. Click **Change Password**
2. Enter your current password
3. Enter your new password
4. Confirm your new password
5. Click **Save**

Password requirements:

- Minimum 8 characters
- At least one uppercase letter
- At least one number

### Reset forgotten password

If you've forgotten your password:

1. Go to the sign-in page
2. Click **Forgot password?**
3. Enter your email address
4. Click the reset link in your email
5. Set a new password

---

## Sign-in methods

### Email and password

The default sign-in method. You can update your email and password on this page.

### Google account

If you signed up with Google:

- You sign in using your Google account
- No separate GrowPanel password is needed
- Update your email by connecting a different Google account

### Microsoft account

If you signed up with Microsoft:

- You sign in using your Microsoft account
- No separate GrowPanel password is needed
- Update your email by connecting a different Microsoft account

---

## Avatar

Your avatar appears throughout GrowPanel:

- Top navigation bar
- Team member lists
- Activity logs

### Update your avatar

If you use Google or Microsoft sign-in, your avatar is pulled from that account automatically.

---

## Adding two-factor authentication

If you want to add another layer of security to your account, you can enable two-factor authentication:

1. Download or open an authenticator app on your phone, such as Google Authenticator.
2. Click *Enable two-factor authentication*
3. A modal is shown with a QR code. Use the authenticator app to add it.
4. Enter the 6-digit code shown on your authenticator app.

You can disable the two-factor again if you want. If you use Google or Microsoft to authenticate, you probably already have two-factor authentication.
---

## Delete your account

If you need to delete your personal account:

1. Contact the account owner to remove you from the team
2. Your personal login is removed

If you're the account owner and want to delete the entire GrowPanel account:

1. Navigate to **Account → Billing**
2. Scroll to **Danger Zone**
3. Click **Delete Account**
4. Confirm by typing your account name
5. Click **Permanently Delete**

**Warning:** Deleting an account removes all data permanently and cannot be undone.

---

## Related pages

- [Team](/docs/account-and-billing/team/) - Manage team members
- [Notifications](/docs/settings/notifications/) - Configure your alerts

---

## Team Management
<!-- url: https://growpanel.io/docs/account-and-billing/team -->

The **Team** settings let you invite colleagues to your GrowPanel account and manage their access levels. Collaborate with your team while controlling who can view, edit, or administer your subscription data.

---

## Accessing team settings

Navigate to **Account → Team** to manage your team members.



---

## Team member list

The team page displays all members of your account:

| Column | Description |
|--------|-------------|
| **Name** | Team member's display name |
| **Email** | Email address used to sign in |
| **Role** | Owner, Admin, or Read-only |
| **Status** | Active or Pending (invitation sent) |
| **Actions** | Edit or remove team member |

---

## User roles

GrowPanel offers three roles with different permission levels:

### Owner

The account owner has complete control:

- Access all features and reports
- Manage team members and roles
- Access billing and subscription settings
- Transfer ownership to another user
- Delete the account

There can be multiple account owners.

### Admin

Admins have full access to GrowPanel features:

- Access all features and reports
- Manage team members: invite, remove, change roles (only with same of lower access level)
- Configure settings (reporting, data sources, notifications)
- Manage plan groups and filters
- Create and manage API keys
- Access billing and subscription settings

Admins **cannot**:
- Transfer ownership
- Edit Owner users
- Delete the account

### Read-only

Read-only users can view but not modify:

- View all reports and dashboards
- View customer lists and details
- Export data to CSV
- View settings (but not change them)
- Change notifications and scheduled reports.

Read-only users **cannot**:
- Change any settings (except the ones only affecting the user such as notifications and scheduled reports)
- Manage team members
- Create or modify API keys
- Connect or disconnect data sources

---

## Inviting team members

### Step 1: Click Invite

Click the **Invite Team Member** button on the Team page.



### Step 2: Enter details

Fill in the invitation form:

| Field | Description |
|-------|-------------|
| **Email** | The email address to send the invitation to |
| **Role** | Select Owner, Admin, or Read-only |

You can click *Add another* if you want to add multiple team members.

> Pro tip: If you want to invite a list of email addresses, simply paste in the list, with line breaks between them. You can change the roles after pasting.

### Step 3: Send invitation

Click **Send invites**. The invitee(s) will receive an email with a link to join your account.

### Pending invitations

Pending invitations appear in the team list with a "Pending" status:

- **Resend** - Send the invitation email again
- **Cancel** - Remove the pending invitation

Invitations expire after 7 days. Resend if the invitee hasn't accepted.

---

## Managing team members

### Change a member's role

1. Find the team member in the list
2. Click the Edit button
3. Select the new role
4. Confirm the change

**Note:** You cannot change the owner's role. To transfer ownership, see below.

### Remove a team member

1. Find the team member in the list
2. Click the **Remove** button (trash icon)
3. Confirm the removal

Removed members immediately lose access. They can be re-invited later if needed.

### Transfer ownership

To transfer account ownership:

1. Navigate to **Account → Team**
2. Invite the new owner (select Owner role)
3. When the new owner has accepted the invite, click the Remove icon on your own user.
4. Confirm the removal of your user.

**Important:**
- This action cannot be undone without the new owner's cooperation

> You can have multiple owners in one account. Each owner will have the option to remove the other and delete the account.

---

## Role comparison

| Capability | Owner | Admin | Read-only |
|------------|:-----:|:-----:|:---------:|
| View reports and dashboards | Yes | Yes | Yes |
| Export data | Yes | Yes | Yes |
| View customer details | Yes | Yes | Yes |
| Change settings | Yes | Yes | No |
| Manage data sources | Yes | Yes | No |
| Manage plan groups | Yes | Yes | No |
| Configure notifications | Yes | Yes | No |
| Invite team members | Yes | Yes | No |
| Remove team members | Yes | Yes | No |
| Change member roles | Yes | Yes | No |
| Create API keys | Yes | Yes | No |
| Access billing | Yes | Yes | No |
| Transfer ownership | Yes | No | No |
| Delete account | Yes | No | No |

---

## Best practices

### Limit admin access

Only give Admin access to people who need to configure GrowPanel. Most team members only need to view reports and can use Read-only access.

### Use descriptive roles

- **Executives/leadership** - Read-only (view metrics without accidentally changing settings)
- **Operations/finance** - Admin (may need to configure reports or exports)
- **Customer success** - Read-only (view customer details)
- **Engineering** - Admin (may need API keys for integrations)

### Audit regularly

Review your team list periodically:

- Remove members who have left the company
- Downgrade roles for people who no longer need admin access
- Check for pending invitations that should be canceled

---

## Single sign-on (SSO)

Team members can sign in using:

- Email and password
- Google account
- Microsoft account

Each team member chooses their preferred sign-in method when accepting the invitation.

---

## Related pages

- [API Keys](/docs/account-and-billing/api-keys/) - Manage programmatic access
- [Billing](/docs/account-and-billing/billing/) - Manage your subscription
- [Notifications](/docs/settings/notifications/) - Configure who receives alerts

---

## AI agent reference
<!-- url: https://growpanel.io/docs/ai-reference/ -->

If you're feeding GrowPanel documentation into your own AI assistant — whether that's Claude, ChatGPT, Cursor, a custom agent, or anything else — this page is for you.

We publish our full documentation corpus as plain markdown, one file per section, refreshed on every deploy. Point your tool at whichever of these URLs is relevant:

* **[growpanel.io/docs.md](/docs.md)** — product documentation (features, metrics, configuration, how-tos)
* **[growpanel.io/academy.md](/academy.md)** — SaaS Metrics Academy (educational guides, independent of GrowPanel)
* **[growpanel.io/developers.md](/developers.md)** — REST API reference, CLI, MCP server, integration guides

There's also a short index at **[growpanel.io/llms.txt](/llms.txt)** following the [llms.txt convention](https://llmstxt.org/), useful for agents that auto-discover AI-friendly content.

---

## What's in each file

Each file is a single markdown document containing every page from that section of the site. Pages are separated by horizontal rules and each includes a URL comment pointing back to its canonical page, like this:

```markdown
## Connecting Stripe
<!-- url: https://growpanel.io/docs/data-sources/stripe/ -->

Stripe is a payment processor that lets you collect payments from customers...
```

That means your AI can cite the source URL back to your users.

---

## How we use it internally

[GrowPanel AI](/docs/growpanel-ai/), the in-product assistant, fetches `docs.md` and `developers.md` from this same place. When you ask it *"how do I connect Chargebee?"* or *"what's the API endpoint for segments?"*, it's searching these exact files. The academy feed is available on request for broader SaaS-concept questions.

There's no separate "AI-only" API — we just publish the docs as plain markdown, and anything downstream reads them the same way a human curl would.

---

## Keeping it fresh

The files are regenerated automatically on every deploy of [growpanel.io](https://growpanel.io). They always reflect the current state of our documentation.

Edge cache TTL is 10 minutes with stale-while-revalidate, so updates propagate within minutes, and your agent never has to wait on the origin for a slow fetch.

---

## Questions, corrections, suggestions

If something in our docs is wrong, out of date, or unhelpful for your AI use case — [let us know](mailto:hello@growpanel.io). We read every piece of feedback.

---

## Customer Detail
<!-- url: https://growpanel.io/docs/customers/customer-detail -->

The **Customer Detail page** provides a complete view of an individual customer's journey with your business. Access it by clicking any customer in the [Customers list](/docs/customers/) or from links in reports like the [MRR detail table](/docs/reports-and-metrics/mrr/).

---

## Overview



<!-- IMAGE PLACEHOLDER: Screenshot of a Customer detail page showing the customer header with name, email and status, key metrics, MRR timeline chart, and the movements table below -->

The Customer Detail page includes:

1. **Customer header** - Name, email, status, and key identifiers
2. **Summary metrics** - Current MRR, lifetime value, and tenure
3. **MRR timeline** - Visual history of this customer's MRR over time
4. **MRR movements** - List of all revenue changes for this customer
5. **Transactions** - Invoice and payment history
6. **Metadata** - Custom fields imported from your billing source

---

## Customer header

The header displays essential customer information:

| Field | Description |
|-------|-------------|
| **Name** | Customer name or company name |
| **Email** | Primary email address |
| **Status** | Current status: Lead, Trial, Active, Past Due, or Canceled |
| **Customer ID** | The unique identifier from your billing source |
| **Created** | When the customer was first created |
| **Country** | Geographic location (if available) |

<!-- IMAGE PLACEHOLDER: Screenshot of the customer header section showing name, email, status badge, and key metadata -->

---

## Summary metrics

Key metrics for this customer are displayed prominently:

| Metric | Description |
|--------|-------------|
| **Current MRR** | Monthly recurring revenue from this customer right now |
| **Total Paid** | Total amount paid by this customer to date |
| **Lifetime Revenue** | Total revenue received from this customer |
| **LTV** | Calculated lifetime value based on revenue and tenure |
| **Tenure** | How long this customer has been paying |
| **First Payment** | Date of their first successful payment |
| **Last Payment** | Date of their most recent payment |

---

## MRR timeline

The timeline chart shows how this customer's MRR has changed over time:



<!-- IMAGE PLACEHOLDER: Screenshot of a line chart showing MRR over time for a single customer, with step changes indicating upgrades, downgrades, etc. -->

- **X-axis** - Time from first revenue to present
- **Y-axis** - MRR value
- **Step changes** - Each change in the line represents an MRR movement

Hover over the chart to see exact MRR values at any point in time. The chart helps you quickly visualize:

- When upgrades or downgrades occurred
- Periods of stable revenue
- Trial to paid conversion
- When churn happened (if applicable)

---

## MRR movements

The MRR movements table lists every change in this customer's recurring revenue:

| Column | Description |
|--------|-------------|
| **Date** | When the movement occurred |
| **Type** | New, Expansion, Contraction, Reactivation, or Churn |
| **Description** | Details about what changed (plan names, quantities) |
| **MRR Change** | The dollar amount of the change |
| **New MRR** | The customer's MRR after this movement |

<!-- IMAGE PLACEHOLDER: Screenshot of the MRR movements table showing several rows with dates, types, and amounts -->

### Movement types

| Type | Meaning |
|------|---------|
| **New** | First recurring revenue from this customer |
| **Expansion** | Increase in MRR (upgrade, add seats, etc.) |
| **Contraction** | Decrease in MRR (downgrade, remove seats, etc.) |
| **Reactivation** | Customer returned after previously churning |
| **Churn** | All recurring revenue from this customer ended |

---

## Transactions

The transactions section shows invoice and payment history:



<!-- IMAGE PLACEHOLDER: Screenshot of the transactions table showing invoices with dates, amounts, statuses, and payment information -->

| Column | Description |
|--------|-------------|
| **Date** | Invoice or payment date |
| **Type** | Invoice, Payment, Refund, or Credit |
| **Description** | Line items or payment details |
| **Amount** | Transaction amount |
| **Status** | Paid, Pending, Failed, or Refunded |
| **Invoice ID** | Link to the invoice in your billing source |

This section helps you:

- Verify payment history
- Investigate billing issues
- Understand what the customer was charged for

---

## Metadata

Custom fields imported from your billing source appear in the Metadata section:

| Example Fields | Description |
|----------------|-------------|
| **Subscription ID** | The subscription identifier |
| **Plan** | Current plan name |
| **Billing Interval** | Monthly, annual, etc. |
| **Payment Method** | Card type, ACH, etc. |
| **Custom Fields** | Any metadata you store on the customer |

This data can include:

- Industry or company size (if captured)
- Account manager or sales rep
- Tags or segments you've applied
- Any other custom attributes

---

## Navigating to related data

From the Customer Detail page, you can:

- **Click movement rows** - See the underlying invoice that caused the change
- **Click transaction IDs** - Open the invoice in your billing source (if supported)
- **Use breadcrumbs** - Navigate back to the Customers list or previous report

---

## Use cases

### Understanding a high-value customer

Review the MRR timeline and movements to see:

- What plan they started on
- When and why they upgraded
- How their value has grown over time

### Investigating a churn

For a churned customer:

- Look at movements before the churn for warning signs (contractions)
- Check transactions for payment failures
- Review tenure to understand how long they stayed

### Preparing for a customer call

Before speaking with a customer:

- Review their current MRR and plan
- Check their recent transactions for any issues
- Note their tenure and lifetime value

### Troubleshooting billing issues

If a customer reports a problem:

- Check their transaction history for recent charges
- Verify their current subscription status
- Look for failed payments or refunds

---

## Related pages

- [Customers list](/docs/customers/) - Browse all customers
- [MRR report](/docs/reports-and-metrics/mrr/) - Aggregate MRR analysis
- [MRR Movements](/docs/reports-and-metrics/mrr-movements/) - All movement types explained

---

## Customers
<!-- url: https://growpanel.io/docs/customers/ -->

The **Customers** section provides a complete view of your customer base, from leads and trials to active subscribers and past customers. Use this section to explore individual customer records, understand customer journeys, and investigate specific accounts.

---

## Customer list

The main Customers page shows all customers imported from your connected data sources:



<!-- IMAGE PLACEHOLDER: Screenshot of the Customers list page showing a table with columns for Name, Email, Status, Created, Payment Date, and MRR, with filter tabs at the top -->

### Status tabs

Filter customers by their current status using the tabs at the top:

| Status | Description |
|--------|-------------|
| **All** | All customers regardless of status |
| **Leads** | Customers who signed up but haven't started a trial or subscription |
| **Trials** | Customers currently in a trial period |
| **Active** | Customers with an active paid subscription |
| **Past Due** | Customers with failed or overdue payments |
| **Canceled** | Customers who previously subscribed but have since churned |

### Customer table

The table displays key information for each customer:

| Column | Description |
|--------|-------------|
| **Name** | Customer name or company name |
| **Email** | Primary email address |
| **Status** | Current subscription status |
| **Created** | When the customer record was first created |
| **Payment Date** | Date of most recent payment |
| **MRR** | Current monthly recurring revenue |
| **Total Paid** | Total amount paid by this customer to date |

Click any column header to sort by that column. Click again to reverse the sort order.

---

## Searching and filtering

### Search

Use the search box to find customers by:

- Name
- Email address
- Customer ID

The search updates results as you type.

<!-- IMAGE PLACEHOLDER: Screenshot showing the search box with a partial name typed and filtered results below -->

### Filters

Apply additional filters to narrow down the customer list:

- **Plan** - Filter to customers on specific plans
- **MRR range** - Show customers within an MRR range
- **Country** - Filter by geographic location
- **Created date** - Filter by when they became customers
- **Data source** - Filter by connected billing platform
- **Custom variables** - Filter by any metadata fields

Multiple filters can be combined for precise segmentation.

---

## Viewing customer details

Click any customer row to open their [Customer detail page](/docs/customers/customer-detail/), where you can see:

- Complete subscription history
- All MRR movements
- Transaction history
- Customer metadata

---

## Use cases

### Finding high-value customers

1. Sort by **MRR** (descending) to see your highest-paying customers
2. Click through to understand their subscription journey
3. Identify patterns that led to their current value

### Investigating churn

1. Click the **Canceled** tab to see churned customers
2. Sort by **Payment Date** (descending) to see recent churns
3. Click through to understand their history and what may have caused churn

### Monitoring trials

1. Click the **Trials** tab to see customers in trial
2. Sort by **Created** to see oldest trials that may need attention
3. Filter by plan to focus on specific products

### Following up on past-due accounts

1. Click the **Past Due** tab to see customers with payment issues
2. Export the list for your support or billing team
3. Monitor this list to catch payment failures early

---

## Related pages

- [Customer detail](/docs/customers/customer-detail/) - Deep dive into individual customers
- [Trials report](/docs/reports-and-metrics/trials/) - Aggregate trial metrics
- [Subscribers report](/docs/reports-and-metrics/subscribers/) - Aggregate subscriber metrics

---

## Chargebee
<!-- url: https://growpanel.io/docs/data-sources/chargebee -->

## Overview

GrowPanel's Chargebee integration allows you to import **historical** subscription, billing, and customer data from your Chargebee site – and keep it up-to-date **in real time** by listening to Chargebee webhooks. Once connected, GrowPanel builds a full picture of your subscription business: trials, MRR movements, invoices, coupons, and more.

This guide walks you through:

1. How to connect Chargebee to GrowPanel  
2. How to configure Chargebee (in its UI)  
3. What data GrowPanel imports  
4. What to expect in the GrowPanel UI after import  
5. Best practices, tips, and common pitfalls  

---

## How to connect Chargebee to GrowPanel

Here is a step-by-step process for setting up your Chargebee integration.

### Step 1: Open GrowPanel
In your GrowPanel app, navigate to **Integrations → Data sources → Add data source → Chargebee**.



### Step 2: Enter a friendly name
Give the data source a name that helps you identify it in GrowPanel (for example, "Chargebee - Production" or "Chargebee Sandbox").



### Step 3: Enter your Chargebee subdomain
You need to provide your Chargebee *site subdomain*.  
   - If your Chargebee dashboard URL is `mycompany.chargebee.com`, then your subdomain is `mycompany`.  
   - Enter just that part (not the full URL) into the form in GrowPanel.



### Step 4: Create a read-only API key in Chargebee
Next, you need a read-only API key from Chargebee, so GrowPanel can fetch your data securely.  

In Chargebee:  
   - Log into your Chargebee account with an admin-level role.  
   - Go to **Settings → Configure Chargebee → API Keys & Webhooks**. 

     

   - Scroll down to the **API Keys and Events** section, and click "API keys".

     

   - Click **Add API Key**.

     

   - Choose **Read-only**, and choose "All". This gives the key full read-only access to the Chargebee account.
   - Give the key a meaningful name (for your reference), for instance "GrowPanel key".  

     

   - Click **Create Key**.  
   - Once generated, copy the key and **store it safely**; you'll paste it into GrowPanel in the next step.

### Step 5: Paste the API key into GrowPanel
Go back to the GrowPanel integration form, and paste the API key you just generated.



### Step 6: Copy the Webhook URL from GrowPanel
Under the "Webhook URL" field in GrowPanel, your webhook URL is displayed. Click the Copy icon to save it to your clipboard. It needs to be pasted into Chargebee - see next step.

### Step 7: Set up a Webhook in Chargebee
Now you need to configure webhooks in Chargebee so that real-time events are sent to GrowPanel.  

In Chargebee:  
- Go back to **Settings → Configure Chargebee → API Keys and Events.  
- Click **Webhooks**. 
- Click **Add Webhook**.  

    

- In the "Webhook Name" field, enter something descriptive (e.g. "GrowPanel webhook").  
- Paste the **GrowPanel webhook URL** into the "Webhook URL" field.  
- Don't enable the "Protect webhook URL with bacis authentication"
- Make sure API version 2 is selected
- Events to Send: We recommend selecting **All Events**.

    
- Click "Create".

### Step 8: Verify the connection from GrowPanel
Return to GrowPanel, and click "Save". We now automatically check if the API works. If everything works, your Chargebee source begins its initial import.

### Step 9: Monitor the import progress
In GrowPanel, you will see an import status screen, showing you the import progress. Depending on how much data you have in Chargebee, this initial import could take minutes to hours.

### Done: Live sync
After import, GrowPanel will keep listening to Chargebee events using the webhook. Future changes - new subscriptions, upgrades, cancellations, payments - will be captured in (near) real time (typically only with a few minutes delay)

---

## What data GrowPanel imports from Chargebee

When you set up Chargebee with GrowPanel, here's the full set of data that GrowPanel will import and maintain. This gives you a rich, analytics-ready model of your subscription business.

1. **Customers / Accounts**  
   - All customer records (including trialing, active, canceled)  
   - Custom fields stored on customer records in Chargebee. They will be exposed as custom variables in GrowPanel.
   - Lead / trial creation dates (if Chargebee tracks when a customer was created and possibly associated with a trial)  

2. **Subscriptions**  
   - Subscription objects, including status (active, canceled, non-renewing, paused, etc.)  
   - Subscription start, end, cancellation dates  
   - Subscription plan data, including add-ons, addons quantity, tiered pricing, etc.  
   - Plan catalog information (plans, add-ons, prices)  
   - Plan groups, if you use grouping in your billing setup  

3. **MRR movements / Subscription lifecycle**  
   - Upgrades and downgrades (changing plan)  
   - Renewals  
   - Cancellations and reactivations  
   - Trial starts and trial-to-paid transitions  
   - Prorations, if Chargebee emits prorated invoice line items  

4. **Invoices and Transactions**  
   - Invoice creation events  
   - Invoice line items (subscription lines, add-ons, usage, one-time charges)  
   - Payments (when invoices are paid)  
   - Refunds and credit notes  
   - Taxes if Chargebee tracks them separately (metadata)  

5. **Discounts / Coupons**
   - Coupons or discount codes applied to subscriptions
   - Coupon usage history
   - Credit note adjustments that may come from coupon credits

6. **Multi-currency support**
   - All currencies configured in your Chargebee account
   - Amounts stored in original currency with on-demand conversion
   - Zero-decimal currencies (JPY, KRW, VND, etc.) handled automatically

### Zero-decimal currencies

GrowPanel correctly handles zero-decimal currencies—currencies like Japanese Yen (JPY), Korean Won (KRW), and Vietnamese Dong (VND) that don't use fractional units (cents). Amounts are imported, stored, and displayed correctly without any configuration needed.

---

## What to expect in GrowPanel after import

Once the import has run and GrowPanel is in sync, here is what your GrowPanel UI will show and how you can interact with the data:

1. **Dashboard & Key Metrics**  
   - Monthly Recurring Revenue (MRR), broken down by plan, cohort, or segment  
   - Number of active customers, churned customers, reactivated customers  
   - Trial-to-paid conversion rate  
   - Revenue movements over time (expansion, contraction, churn)
   - All subscription reports such as ARR, ARPA, ASP, LTV, churn, etc.

2. **Customer Analytics**  
   - A full list of customers imported from Chargebee  
   - Each customer's subscription history: when they joined, what plan(s) they had, upgrades or downgrades, cancellations  
   - MRR history for individual customers  
   - Metadata on customers, such as custom attributes from Chargebee  

3. **Subscription / Plan Growth**  
   - Performance of different plans and plan groups  
   - Add-on usage trends  
   - Growth or contraction in each plan category  

4. **Transaction & Cash Flow Data**  
   - Invoice volume and value over time  
   - Refunds / credit notes volume  
   - Payment success rates

5. **MRR Movements Table**  
   - Detailed log of MRR-adjusting events: upgrades, downgrades, churn, reactivations, trials  
   - Ability to filter or segment based on movement type or plan  

---

## Best practices & tips

Here are a few recommendations and things to watch out for when using the Chargebee integration with GrowPanel.

- **Use a dedicated API key for GrowPanel.**  
  Don't reuse an API key intended for other systems. Create one just for GrowPanel, so you can rotate or revoke it safely without impacting other integrations.

- **Monitor import progress.**  
  If your Chargebee account has a lot of historical data (many customers, invoices, credit notes), the import will take longer. Use the GrowPanel UI to monitor it.

- **Plan for API key rotation.**  
  Periodically rotate your API key (every 3–6 months is a good practice), and update GrowPanel with the new key before deactivating the old one.

- **Organize your plan groups**  
  GrowPanel imports your product catalogue automatically, and uses the plans as "Plan groups" and the prices inside each plan as "plans". This means that we don't import the Product families automatically. For this reason it's a good idea to navigate to Settings > Plan groups in GrowPanel and organize the plans and products in a way that makes most sense for your reporting.

---

## Common pitfalls & troubleshooting

Here are some issues you might run into, and how to address them.

| Problem | What might be wrong | How to fix it |
|---|---|---|
| Webhook test fails | Wrong URL, blocked by firewall, or incorrect API version | Double-check the webhook URL in GrowPanel. Ensure Chargebee is set to send Version 2. Test network connectivity. |
| API key rejected / invalid | Key type or permissions are wrong | Make sure the API key you created is **read-only** and has the required scopes. Re-generate if needed. |
| Missing historical data | Some resources weren't accessible by the API key | Verify that the API key has access to all required endpoints: customers, subscriptions, invoices, credit notes, plan catalog. |
| Duplicate or incorrect MRR events | Webhook misconfiguration, duplicate events, or missing pruning | Review which events you selected in Chargebee. Confirm you are not sending duplicate webhook endpoints or multiple versions. |
| Sync stopped working | API key was disabled, or webhook URL changed | Check in Chargebee if your API key is still active. Ensure the webhook endpoint in Chargebee matches the one in GrowPanel. Regenerate if needed. |
| Key security concern | API key exposed or shared too broadly | Rotate the API key, restrict its permissions, and store it securely (e.g. in secrets manager or encrypted vault). |

---

## Summary

By connecting Chargebee to GrowPanel, you gain deep visibility into your subscription business: customers, subscriptions, invoice history, MRR movements, and more. The integration uses a **read-only API key** and a **webhook**, so your data is imported securely and kept current in real time.  

Once set up, GrowPanel surfaces key metrics across customers, subscription plans, revenue flows, and lifecycle events – giving you the insights you need to understand growth, churn, and expansion.

If you run into issues or need help interpreting your data in GrowPanel, our support team is ready to assist.

---

## Custom API
<!-- url: https://growpanel.io/docs/data-sources/custom-api -->

## Overview

GrowPanel's Custom API integration allows you to connect any billing system or data source using our REST API. This is ideal for businesses with custom-built billing systems, proprietary platforms, or unique data requirements that aren't covered by our native integrations.

The Custom API integration supports two modes:

- **Push mode**: Your system sends data to GrowPanel's REST API endpoints
- **Pull mode**: GrowPanel fetches data from your API endpoint on demand

This guide covers:

1. How to create a Custom API data source
2. How to push data to GrowPanel (Push mode)
3. How to configure GrowPanel to pull from your API (Pull mode)
4. Data formats and endpoints
5. Best practices and troubleshooting

---

## Creating a Custom API data source

### Step 1: Add a new data source

1. In GrowPanel, navigate to **Settings → Data sources**.
2. Click **Add data source** and select **Custom API**.
3. Enter a name for the data source (e.g., "Custom Billing System").

<!-- IMAGE PLACEHOLDER: Screenshot of the Add data source modal with Custom API selected -->

### Step 2: Configure the data source

Depending on your needs, configure one or both modes:

**For Push mode:**
- No additional configuration needed. Your API key will be used to authenticate requests.

**For Pull mode:**
- Enter your **API endpoint URL** where GrowPanel should fetch data.
- Optionally configure authentication headers if your endpoint requires them.
- Select the data types to fetch (customers, plans, invoices).

<!-- IMAGE PLACEHOLDER: Screenshot of the Custom API configuration form showing the endpoint URL field and authentication options -->

### Step 3: Save and get credentials

1. Click **Save** to create the data source.
2. Note the **Data Source ID** - you'll need this when pushing data.
3. Go to **Account → API Keys** to get or create an API key for authentication.

---

## Push mode: Sending data to GrowPanel

In Push mode, your system sends data to GrowPanel's REST API. This is useful when you want real-time updates as events happen in your billing system.

### Authentication

All API requests must include your API key in the header:

```
Authorization: Bearer YOUR_API_KEY
```

### Endpoints

Push data to these endpoints under `https://api.growpanel.io/v1/`:

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/data-sources/{id}/customers` | POST | Create or update customers |
| `/data-sources/{id}/plans` | POST | Create or update plans |
| `/data-sources/{id}/invoices` | POST | Create or update invoices |

Replace `{id}` with your Data Source ID.

### Customer object

```json
{
  "id": "cust_123",
  "name": "Acme Inc",
  "email": "billing@acme.com",
  "created": "2024-01-15T00:00:00Z",
  "country": "US",
  "trial_started": "2024-01-10T00:00:00Z",
  "metadata": {
    "industry": "Technology",
    "company_size": "50-100"
  }
}
```

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| id | string | Yes | Unique customer identifier |
| name | string | Yes | Customer name or company name |
| email | string | No | Customer email address |
| created | datetime | No | When the customer was created (ISO 8601) |
| country | string | No | Two-letter country code |
| trial_started | datetime | No | When the trial started (ISO 8601) |
| metadata | object | No | Custom key-value pairs for filtering |

### Plan object

```json
{
  "id": "plan_pro_monthly",
  "name": "Pro Monthly",
  "interval": "month",
  "interval_count": 1,
  "currency": "USD",
  "plan_group": "Pro"
}
```

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| id | string | Yes | Unique plan identifier |
| name | string | Yes | Display name of the plan |
| interval | string | Yes | Billing interval: day, week, month, year |
| interval_count | integer | Yes | Number of intervals per billing cycle |
| currency | string | Yes | Three-letter currency code |
| plan_group | string | No | Group name for organizing plans |

### Invoice object

```json
{
  "id": "inv_456",
  "customer_id": "cust_123",
  "type": "subscription",
  "invoice_date": "2024-02-01T00:00:00Z",
  "amount": 9900,
  "currency": "USD",
  "plan_id": "plan_pro_monthly",
  "subscription_id": "sub_789",
  "period_start": "2024-02-01T00:00:00Z",
  "period_end": "2024-03-01T00:00:00Z",
  "proration": false,
  "quantity": 1,
  "discount": 0
}
```

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| id | string | Yes | Unique invoice identifier |
| customer_id | string | Yes | Must match an existing customer ID |
| type | string | Yes | One of: subscription, one-time, refund, cancellation |
| invoice_date | datetime | Yes | When the invoice was created (ISO 8601) |
| amount | integer | Yes | Amount in cents (e.g., 9900 for $99.00) |
| currency | string | Yes | Three-letter currency code |
| plan_id | string | Conditional | Required for subscription invoices |
| subscription_id | string | No | Groups invoices into a subscription |
| period_start | datetime | No | Subscription period start |
| period_end | datetime | No | Subscription period end |
| proration | boolean | No | Whether this is a prorated invoice |
| quantity | integer | No | Number of units/seats |
| discount | integer | No | Discount amount in cents |

### Batch requests

You can send multiple objects in a single request:

```json
{
  "customers": [
    { "id": "cust_1", "name": "Customer One", "email": "one@example.com" },
    { "id": "cust_2", "name": "Customer Two", "email": "two@example.com" }
  ]
}
```

### Example: Push a new subscription

Here's a complete example of pushing data for a new customer subscription:

```bash
# 1. Create the customer
curl -X POST https://api.growpanel.io/v1/data-sources/ds_abc123/customers \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "cust_123",
    "name": "Acme Inc",
    "email": "billing@acme.com",
    "country": "US"
  }'

# 2. Create the plan (if not already created)
curl -X POST https://api.growpanel.io/v1/data-sources/ds_abc123/plans \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "plan_pro",
    "name": "Pro Plan",
    "interval": "month",
    "interval_count": 1,
    "currency": "USD"
  }'

# 3. Create the invoice
curl -X POST https://api.growpanel.io/v1/data-sources/ds_abc123/invoices \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "inv_001",
    "customer_id": "cust_123",
    "type": "subscription",
    "invoice_date": "2024-02-01T00:00:00Z",
    "amount": 9900,
    "currency": "USD",
    "plan_id": "plan_pro",
    "subscription_id": "sub_001",
    "period_start": "2024-02-01T00:00:00Z",
    "period_end": "2024-03-01T00:00:00Z"
  }'
```

---

## Pull mode: GrowPanel fetches from your API

In Pull mode, GrowPanel fetches data from an endpoint you provide. This is useful when you have an existing API that exposes your billing data and you want to trigger syncs on demand.

### Configuring your endpoint

When creating the Custom API data source, enter your API endpoint URL. GrowPanel will make GET requests to:

- `{your-endpoint}/customers`
- `{your-endpoint}/plans`
- `{your-endpoint}/invoices`

Your endpoint should return JSON arrays in the same format as the Push mode objects described above.

### Authentication for your endpoint

If your endpoint requires authentication, configure it in the data source settings:

- **API Key header**: Add a custom header with your API key
- **Bearer token**: Use standard Bearer token authentication
- **Basic auth**: Provide username and password

<!-- IMAGE PLACEHOLDER: Screenshot of the authentication configuration options in the Custom API data source settings -->

### Expected response format

Your endpoints should return JSON arrays:

```json
{
  "data": [
    { "id": "cust_1", "name": "Customer One", "email": "one@example.com" },
    { "id": "cust_2", "name": "Customer Two", "email": "two@example.com" }
  ],
  "has_more": false
}
```

For large datasets, GrowPanel supports pagination. Include `has_more: true` and GrowPanel will make subsequent requests with `?page=2`, `?page=3`, etc.

### Triggering a sync

To fetch data from your endpoint:

1. Go to **Settings → Data sources**.
2. Find your Custom API data source.
3. Click **Sync now**.

<!-- IMAGE PLACEHOLDER: Screenshot of the data source list showing the Sync now button -->

GrowPanel will fetch from your endpoints and update the data. You can monitor progress on the data source detail page.

---

## How GrowPanel processes your data

After receiving data (via Push or Pull), GrowPanel:

1. **Validates the data** - Checks required fields and relationships
2. **Creates or updates records** - Uses your IDs for deduplication
3. **Calculates MRR movements** - Processes invoices to determine new, expansion, contraction, churn, and reactivation events
4. **Updates metrics** - Refreshes dashboards and reports

MRR is calculated from invoice data:

- **Subscription invoices** create recurring revenue based on the plan interval
- **Refund invoices** reduce MRR
- **Cancellation invoices** (with amount 0) mark the end of a subscription

---

## Invoice types explained

| Type | Description | Effect on MRR |
|------|-------------|---------------|
| subscription | Regular recurring invoice | Adds MRR based on plan interval |
| one-time | One-time charge (setup fee, etc.) | No MRR impact |
| refund | Partial or full refund | Reduces MRR |
| cancellation | Marks subscription end | Churns remaining MRR |

### Modeling MRR movements

To model different MRR movement types:

**New subscription:**
```json
{
  "type": "subscription",
  "customer_id": "new_customer",
  "amount": 9900
}
```

**Upgrade (expansion):**
```json
{
  "type": "subscription",
  "customer_id": "existing_customer",
  "amount": 19900,
  "plan_id": "higher_plan"
}
```

**Downgrade (contraction):**
```json
{
  "type": "subscription",
  "customer_id": "existing_customer",
  "amount": 4900,
  "plan_id": "lower_plan"
}
```

**Cancellation (churn):**
```json
{
  "type": "cancellation",
  "customer_id": "churning_customer",
  "amount": 0
}
```

---

## Best practices

### Data consistency

- **Use stable IDs** - Your customer, plan, and invoice IDs should be stable and unique
- **Send data in order** - Create customers and plans before referencing them in invoices
- **Include all historical data** - For accurate reporting, include all past invoices, not just current subscriptions

### Real-time updates

- **Push on events** - Send data to GrowPanel when events happen (new subscription, upgrade, cancellation)
- **Use webhooks** - If your billing system supports webhooks, use them to trigger pushes to GrowPanel
- **Batch for efficiency** - Send multiple objects in one request when possible

### Data quality

- **Validate before sending** - Check required fields before making API calls
- **Use correct amounts** - Always use cents (integer), not dollars (decimal)
- **Use ISO 8601 dates** - Format all dates as `YYYY-MM-DDTHH:MM:SSZ`

---

## Troubleshooting

| Problem | Possible cause | Solution |
|---------|---------------|----------|
| 401 Unauthorized | Invalid or missing API key | Check your API key in Account → API Keys |
| 400 Bad Request | Invalid data format | Check the error response for field-specific errors |
| Invoice not affecting MRR | Missing plan_id or wrong type | Ensure subscription invoices have a valid plan_id |
| Customer not found | Invoice references unknown customer | Push customer data before invoice data |
| Duplicate data | Same ID pushed multiple times | This is fine - GrowPanel updates existing records |
| Pull mode not fetching | Endpoint URL incorrect or not accessible | Verify URL is reachable and returns expected format |
| MRR calculations seem wrong | Missing period dates or incorrect amounts | Include period_start and period_end; use cents |

---

## API reference

For complete API documentation, including error codes, rate limits, and all available endpoints, see the [REST API reference](/developers/).

---

## Summary

The Custom API integration gives you complete flexibility to connect any billing system to GrowPanel. Use Push mode to send real-time updates as events happen, or Pull mode to sync on demand from your existing API. GrowPanel processes your raw billing data into MRR movements, giving you the same powerful analytics available with native integrations.

If you need help implementing the Custom API integration, contact our support team or refer to the [REST API documentation](/developers/).

---

## Google Sheets
<!-- url: https://growpanel.io/docs/data-sources/google-sheets -->

## Overview

GrowPanel's Google Sheets integration allows you to import subscription data directly from a spreadsheet. This is ideal for businesses that don't use a supported billing platform, want to import historical data, or need to supplement their existing data source with manual entries.

The integration works through a **Google Sheets Extension** that connects to your GrowPanel account. You can export customers, plans, and invoices from your spreadsheet to GrowPanel, or import existing data from GrowPanel into a sheet for review or modification.

This guide covers:

1. How to install the GrowPanel extension
2. How to connect the extension to your GrowPanel account
3. How to structure your data
4. How to export data to GrowPanel
5. How to import data from GrowPanel
6. Best practices and troubleshooting

---

## Prerequisites

Before you begin, ensure you have:

- A GrowPanel account 
- A Google account with access to Google Sheets

---

## How to install the GrowPanel extension

### Step 1: Create a Google Sheets data source in GrowPanel

Before using the extension, you need to create a data source in GrowPanel.

In GrowPanel, navigate to **Settings → Data sources → Add data source → Google Sheets**.



Give the data source a name (e.g., "Google Sheets - Historical Data"), and hit Next



When this is done, you'll see the generated API key. **Important**: Store the key somewhere safe. You won't be able to see it again.



Click Install Sheets add-on

### Step 2: Install the Sheets add-on

Select Admin install in the Google Workspace Marketplace install screen.



The next screen asks you to confirm that you'll install the add-on/app for the entire Google Workspace organization. Click Continue.



In the next screen, you are presented with the permissions you are granting GrowPanel. The permissions are these:

1. *View and manage spreadsheets that this application has been installed in*: This means that the extension is able to read and write spreadsheets that you open the extension on. It's a necessary permission for the add-on to be able to work.
2. *See, edit, create, and delete only the specific Google Drive files you use with this app*: This is related to #1, meaning that the extension can alter the data in the spreadsheet that you open the add-on with.
3. *Connect to an external service*: This is needed to communicate with GrowPanel's API.
4. *Display and run third-party web content in prompts and sidebars inside Google applications*: This is needed in order to display the sidebar where the add-on lives.
5. *See your personal info, including any personal info you've made publicly available*: We may use your name and email to verify your identity, but this information is not stored in our platform, unless you also use Google to sign in to your GrowPanel account.

Click either "Everyone at your organization" (Recommended) or "Certain groups or organizational units" (if you want to limit use)

If you agree with this, select "I agree to the application's Terms of Service, Privacy Policy, and Google Workdpsace Marketplace's Terms of Service.



The add-on is now being installed, and can be used in Google Sheets by selecting the Extensions menu, and looking for GrowPanel.



### Step 3: Open the GrowPanel extension

After installation:

1. Open a new Google Sheet
2. Go to **Extensions → GrowPanel** in the menu bar.
2. Click Open app to open the add-on. A sidebar will appear on the right side of your sheet.



### Step 4: Enter your API key

In the GrowPanel sidebar:

1. You'll see an **Add your GrowPanel API key** field.
2. Copy your API key and paste it into the sidebar.
4. Click **Save**.

### Step 5: Select your data source



Once connected:

1. A dropdown will appear showing your available data sources.
2. Select the Google Sheets data source you created earlier.
3. Click Select

You will now see the default state of the sidebar, showing three tabs - Customers, Plans and Invoices. And each of these tabs have the same three buttons: Export to GrowPanel, Import from GrowPanel and Create Template



---

## Data structure and templates

The extension uses specific column structures for each data type. You can use the **Create Template** button to generate a sheet with the correct columns.

### Customers

| Column | Description | Required |
|--------|-------------|----------|
| Customer ID | Unique identifier for the customer | Yes |
| Name | Customer's full name or company name | Yes |
| Email | Customer's email address | No |
| Created | Date the customer was created (YYYY-MM-DD) | No |
| Country | Two-letter country code (e.g., US, GB, DE) | No |
| Trial Started | Date the trial started (YYYY-MM-DD) | No |
| Export Status | Automatically populated after export | No |

### Plans

| Column | Description | Required |
|--------|-------------|----------|
| Plan ID | Unique identifier for the plan | Yes |
| Name | Display name of the plan | Yes |
| Interval | Billing interval: day, week, month, or year | Yes |
| Interval Count | Number of intervals (e.g., 1 for monthly, 3 for quarterly) | Yes |
| Currency | Three-letter currency code (e.g., USD, EUR) | Yes |
| Plan Group | Group name for organizing plans | No |
| Export Status | Automatically populated after export | No |

### Invoices

| Column | Description | Required |
|--------|-------------|----------|
| Invoice ID | Unique identifier for the invoice | Yes |
| Customer ID | Must match a Customer ID | Yes |
| Type | One of: subscription, one-time, refund, cancellation | Yes |
| Invoice Date | Date of the invoice (YYYY-MM-DD) | Yes |
| Amount | Amount in cents (e.g., 9900 for $99.00) | Yes |
| Currency | Three-letter currency code | Yes |
| Plan ID | Must match a Plan ID (for subscription invoices) | Conditional |
| Subscription ID | Unique identifier for the subscription | No |
| Start Date | Subscription period start (YYYY-MM-DD) | No |
| End Date | Subscription period end (YYYY-MM-DD) | No |
| Proration | TRUE or FALSE | No |
| Quantity | Number of units/seats | No |
| Discount | Discount amount in cents | No |
| Export Status | Automatically populated after export | No |

---

## Exporting data to GrowPanel

To send data from your spreadsheet to GrowPanel:

1. Ensure your sheet has data in the correct column format (or use **Create Template** first).
2. In the sidebar, select the data type you want to export: **Customers**, **Plans**, or **Invoices**.
3. Click **Export to GrowPanel**.
4. The extension will process each row and update the **Export Status** column.

<!-- IMAGE PLACEHOLDER: Screenshot showing a spreadsheet with customer data and the Export to GrowPanel button in the sidebar -->

### Export order

When setting up a new data source, export in this order:

1. **Plans** first - these define your pricing structure
2. **Customers** second - these create customer records
3. **Invoices** last - these reference both plans and customers

### Understanding export status

After export, each row will show one of these statuses:

- **Success** - The row was exported successfully
- **Error: [message]** - The export failed with a specific reason
- **Skipped** - The row was empty or already exported

---

## Importing data from GrowPanel

You can also pull existing data from GrowPanel into a spreadsheet:

1. Open a new sheet tab or use an empty sheet.
2. In the sidebar, select the data type: **Customers**, **Plans**, or **Invoices**.
3. Click **Import from GrowPanel**.
4. A new tab will open with the imported data in the correct column format.

This is useful for:

- Reviewing your current data
- Making bulk edits before re-exporting
- Creating a backup of your GrowPanel data
- Migrating data between data sources

<!-- IMAGE PLACEHOLDER: Screenshot showing the Import from GrowPanel button and a newly created tab with imported customer data -->

---

## Best practices

### Data quality

- **Use consistent Customer IDs** - If a customer appears in multiple invoices, use the exact same Customer ID.
- **Use consistent Plan IDs** - Reference the same Plan ID in invoices that you defined in your Plans sheet.
- **Format dates correctly** - Use YYYY-MM-DD format (e.g., 2024-01-15) for all date fields.
- **Use cents for amounts** - Enter 9900, not 99.00, for a $99 invoice.

### Managing updates

- **Re-export to update** - If you change data in your sheet, you can re-export. Rows with matching IDs will be updated.
- **Use the Import function to verify** - After exporting, import the data back to confirm it was received correctly.
- **Keep a backup** - Before making major changes, duplicate your sheet as a backup.

### Working with multiple sheets

- You can organize your data across multiple sheets within the same spreadsheet.
- Select the correct sheet tab before clicking Export or Import.
- Each sheet should contain only one data type (don't mix customers and invoices).

---

## Troubleshooting

| Problem | Possible cause | Solution |
|---------|---------------|----------|
| "Invalid API key" error | API key is incorrect or expired | Generate a new API key in GrowPanel and re-enter it |
| "Data source not found" | Wrong data source selected | Verify you selected the correct Google Sheets data source |
| Export shows "Error: Customer not found" | Customer ID doesn't exist | Export your Customers sheet before exporting Invoices |
| Export shows "Error: Plan not found" | Plan ID doesn't exist | Export your Plans sheet before exporting Invoices |
| Amounts look wrong in GrowPanel | Entered dollars instead of cents | Update amounts to cents (multiply by 100) and re-export |
| Dates not recognized | Wrong date format | Use YYYY-MM-DD format for all dates |
| Extension not appearing | Installation incomplete | Reinstall from Extensions → Add-ons → Get add-ons |

---

## What happens after import

Once your data is exported to GrowPanel:

1. GrowPanel processes the invoices to calculate MRR movements.
2. Your dashboard will populate with metrics based on the imported data.
3. Reports like MRR, ARR, churn, and cohorts become available.
4. You can filter reports by this data source using the Data Source filter.

Since Google Sheets is a manual data source, you'll need to re-export whenever you have new data. For real-time sync, consider connecting a billing platform like [Stripe](/docs/data-sources/stripe/), [Chargebee](/docs/data-sources/chargebee/), or [Recurly](/docs/data-sources/recurly/).

---

## Summary

The Google Sheets integration provides a flexible way to import subscription data into GrowPanel without requiring a billing platform integration. Use the GrowPanel extension to export customers, plans, and invoices from your spreadsheet, and GrowPanel will calculate your MRR, churn, and other subscription metrics automatically.

If you need help structuring your data or troubleshooting imports, contact our support team.

---

## Data sources
<!-- url: https://growpanel.io/docs/data-sources/ -->

This section describes how to connect GrowPanel to your billing or subscription platform and keep your data in sync in real time.

GrowPanel supports the following data sources:

- **[Stripe](/docs/data-sources/stripe/)** – OAuth connection for seamless setup
- **[Chargebee](/docs/data-sources/chargebee/)** – API key and webhook integration
- **[Recurly](/docs/data-sources/recurly/)** – API key and webhook integration
- **[Google Sheets](/docs/data-sources/google-sheets/)** – Import data from spreadsheets
- **[Custom API](/docs/data-sources/custom-api/)** – Connect any billing system via REST API

Choose your platform below to get started – each guide walks through connecting, importing historical data, and setting up real-time sync so that future events flow into GrowPanel automatically.

---

## Recurly
<!-- url: https://growpanel.io/docs/data-sources/recurly -->

## Overview

Integrating Recurly with GrowPanel gives you a complete and reliable view of your subscription business. Once connected, GrowPanel imports your full historical Recurly data and keeps everything in sync in real time using webhooks. This ensures that your MRR metrics, financial reporting, customer timelines, and dashboards always reflect the current state of your business.

This guide walks you through each step of the integration, explains what data GrowPanel imports, and shows how that data appears inside your dashboard. Even if you are not familiar with Recurly's admin pages or API settings, you will be able to follow this guide without difficulty.

The overall integration flow looks like this:

1. Create a Recurly data source in GrowPanel  
2. Enter your Recurly subdomain and region  
3. Create a read only API key in Recurly  
4. Copy the webhook URL (already shown in GrowPanel after naming your data source)  
5. Create a webhook in Recurly  
6. Click Create in GrowPanel to verify the connection and begin import  

Once everything is set up, GrowPanel starts importing your entire Recurly history, including customers, subscriptions, plans, transactions, and more.

---

## Before you begin

To complete the integration, you will need:

* Access to your Recurly admin panel 
* Permission to create API keys  
* Permission to configure webhooks  
* Your Recurly subdomain (format explained below)  
* Knowledge of whether your Recurly site is hosted in the US or EU region  

No engineering work or code is required. Everything is configured through the UI.

---

### Step 1: Open GrowPanel
In your GrowPanel app, navigate to **Integrations → Data sources → Add data source → Recurly**.



### Step 2: Enter a friendly name
Give the data source a name that helps you identify it in GrowPanel (for example, "Recurly - Production" or "Recurly source").



### Step 3: Enter your data center location (US or EU)
You need to provide your *Recurly data center location*. 
   - If your Recurly dashboard URL is `mycompany.eu.recurly.com`, then your data center is locaed in EU. If not, it's in US.



### Step 4: Create a read-only API key in Recurly  
Next, you need a read-only API key from Recurly, so GrowPanel can fetch your data securely.  

In Recurly:  
   - Log into your Recurly account with an admin-level role.  
   - Go to **Integrations → API credentials**. 

     

   - Click **Add Private API Key**.

     

   - Give the key a meaningful name (for your reference), for instance "GrowPanel key".  
   - Choose **Read-only**. This gives the key full read-only access to the Recurly account.
   - Under "Will this key be used with a third-party application", you can choose Other... and write "GrowPanel", although this is optional.
   
     

   - Click **Save Changes**.  
   - Once generated, copy the key and **store it safely**; you'll paste it into GrowPanel in the next step.

### Step 5: Paste the API key into GrowPanel
Go back to the GrowPanel integration form, and paste the API key you just generated.



### Step 6: Copy the Webhook URL from GrowPanel
Under the "Webhook URL" field in GrowPanel, your webhook URL is displayed. Click the Copy icon to save it to your clipboard. It needs to be pasted into Recurly - see next step.

### Step 7: Set up a Webhook in Recurly
Now you need to configure webhooks in Recurly so that real-time events are sent to GrowPanel.  
   
In Recurly:  
   - Go to **Integrations → Webhooks**.
     
   - Click **New Endpoint**. 
     
   - In the **Endpoint Name** field, enter something descriptive (e.g. "GrowPanel webhook"). 
   - Paste the **GrowPanel webhook URL** into the "Endpoint URL" field.  
     
   - Don't write anything in the HTTP Auth fields.
   - Make sure the format is JSON
   - Notifications: We recommend clicking "Select All Notifications".

   - Click "Create".

### Step 8: Verify the connection from GrowPanel
Return to GrowPanel, and click "Save". We now automatically check if the API works. If everything works, your Recurly source begins its initial import.

### Step 9: Monitor the import progress 
In GrowPanel, you will see an import status screen, showing you the import progress. Depending on how much data you have in Recurly, this initial import could take minutes to hours.

### Done: Live sync
After import, GrowPanel will keep listening to Recurly events using the webhook. Future changes - new subscriptions, upgrades, cancellations, payments - will be captured in (near) real time (typically only with a few minutes delay)

---

## What data GrowPanel imports from Recurly

When you set up Recurly with GrowPanel, here's the full set of data that GrowPanel will import and maintain. This gives you a rich, analytics-ready model of your subscription business.

1. **Customers / Accounts**  
   - All customer records (including trialing, active, canceled)  
   - Custom fields stored on customer records in Recurly. They will be exposed as custom variables in GrowPanel.
   - Lead / trial creation dates (if Recurly tracks when a customer was created and possibly associated with a trial)  

2. **Subscriptions**  
   - Subscription objects, including status (active, canceled, non-renewing, paused, etc.)  
   - Subscription start, end, cancellation dates  
   - Subscription plan data, including add-ons, addons quantity, tiered pricing, etc.  
   - Plan catalog information (plans, add-ons, prices)  
   - Plan groups, if you use grouping in your billing setup  

3. **MRR movements / Subscription lifecycle**  
   - Upgrades and downgrades (changing plan)  
   - Renewals  
   - Cancellations and reactivations  
   - Trial starts and trial-to-paid transitions  
   - Prorations, if Recurly emits prorated invoice line items  

4. **Invoices and Transactions**  
   - Invoice creation events  
   - Invoice line items (subscription lines, add-ons, usage, one-time charges)  
   - Payments (when invoices are paid)  
   - Refunds and credit notes  
   - Taxes if Recurly tracks them separately (metadata)  

5. **Discounts / Coupons**
   - Coupons or discount codes applied to subscriptions
   - Coupon usage history
   - Credit note adjustments that may come from coupon credits

6. **Multi-currency support**
   - All currencies configured in your Recurly account
   - Amounts stored in original currency with on-demand conversion
   - Zero-decimal currencies (JPY, KRW, VND, etc.) handled automatically

### Zero-decimal currencies

GrowPanel correctly handles zero-decimal currencies—currencies like Japanese Yen (JPY), Korean Won (KRW), and Vietnamese Dong (VND) that don't use fractional units (cents). Amounts are imported, stored, and displayed correctly without any configuration needed.

---

## What to expect in GrowPanel after import

Once the import has run and GrowPanel is in sync, here is what your GrowPanel UI will show and how you can interact with the data:

1. **Dashboard & Key Metrics**  
   - Monthly Recurring Revenue (MRR), broken down by plan, cohort, or segment  
   - Number of active customers, churned customers, reactivated customers  
   - Trial-to-paid conversion rate  
   - Revenue movements over time (expansion, contraction, churn)
   - All subscription reports such as ARR, ARPA, ASP, LTV, churn, etc.

2. **Customer Analytics**  
   - A full list of customers imported from Recurly  
   - Each customer's subscription history: when they joined, what plan(s) they had, upgrades or downgrades, cancellations  
   - MRR history for individual customers  
   - Metadata on customers, such as custom attributes from Recurly  

3. **Subscription / Plan Growth**  
   - Performance of different plans and plan groups  
   - Add-on usage trends  
   - Growth or contraction in each plan category  

4. **Transaction & Cash Flow Data**  
   - Invoice volume and value over time  
   - Refunds / credit notes volume  
   - Payment success rates

5. **MRR Movements Table**  
   - Detailed log of MRR-adjusting events: upgrades, downgrades, churn, reactivations, trials  
   - Ability to filter or segment based on movement type or plan  

---

## Best practices & tips

Here are a few recommendations and things to watch out for when using the Recurly integration with GrowPanel.

- **Use a dedicated API key for GrowPanel.**  
  Don't reuse an API key intended for other systems. Create one just for GrowPanel, so you can rotate or revoke it safely without impacting other integrations.

- **Monitor import progress.**  
  If your Recurly account has a lot of historical data (many customers, invoices, credit notes), the import will take longer. Use the GrowPanel UI to monitor it.

- **Plan for API key rotation.**  
  Periodically rotate your API key (every 3–6 months is a good practice), and update GrowPanel with the new key before deactivating the old one.

- **Organize your plan groups**  
  GrowPanel imports your product catalogue automatically, and uses the plans as "Plan groups" and the prices inside each plan as "plans". This means that we don't import the Product families automatically. For this reason it's a good idea to navigate to Settings > Plan groups in GrowPanel and organize the plans and products in a way that makes most sense for your reporting.

---

## Common pitfalls & troubleshooting

Here are some issues you might run into, and how to address them.

| Problem | What might be wrong | How to fix it |
|---|---|---|
| Webhook test fails | Wrong URL, blocked by firewall, or incorrect API version | Double-check the webhook URL in GrowPanel. Ensure Recurly is set to send Version 2. Test network connectivity. |
| API key rejected / invalid | Key type or permissions are wrong | Make sure the API key you created is **read-only** and has the required scopes. Re-generate if needed. |
| Missing historical data | Some resources weren't accessible by the API key | Verify that the API key has access to all required endpoints: customers, subscriptions, invoices, credit notes, plan catalog. |
| Duplicate or incorrect MRR events | Webhook misconfiguration, duplicate events, or missing pruning | Review which events you selected in Recurly. Confirm you are not sending duplicate webhook endpoints or multiple versions. |
| Sync stopped working | API key was disabled, or webhook URL changed | Check in Recurly if your API key is still active. Ensure the webhook endpoint in Recurly matches the one in GrowPanel. Regenerate if needed. |
| Key security concern | API key exposed or shared too broadly | Rotate the API key, restrict its permissions, and store it securely (e.g. in secrets manager or encrypted vault). |

---

## Summary

By connecting Recurly to GrowPanel, you gain deep visibility into your subscription business: customers, subscriptions, invoice history, MRR movements, and more. The integration uses a **read-only API key** and a **webhook**, so your data is imported securely and kept current in real time.  

Once set up, GrowPanel surfaces key metrics across customers, subscription plans, revenue flows, and lifecycle events – giving you the insights you need to understand growth, churn, and expansion.

If you run into issues or need help interpreting your data in GrowPanel, our support team is ready to assist.

---

## Stripe
<!-- url: https://growpanel.io/docs/data-sources/stripe -->

The Stripe integration is the most powerful and complete way to use GrowPanel. Because Stripe is a flexible billing platform with a deep data model, GrowPanel imports far more than just customers and subscriptions. It reconstructs your entire billing history, calculates accurate MRR and CMRR, handles complex pricing cases, and updates your analytics in real time as Stripe events occur.

Connecting Stripe takes only a few clicks. There are no API keys to copy, no webhooks to configure manually, and no server settings to adjust. You simply choose a data source name, click Connect, approve the read only permissions in Stripe, and GrowPanel begins importing your data immediately.

This guide covers every step of the setup and explains exactly what GrowPanel imports from your Stripe account. It also explains how GrowPanel handles advanced cases like multi-currency billing, discounts, tiered pricing, metered usage, scheduled cancellations, free trials, billing proration, and more.

---

## Before you begin

To integrate Stripe with GrowPanel you need:

* Access to your Stripe dashboard  
* Permission to authorize OAuth apps  
* If you manage multiple Stripe accounts, the ability to choose which one to connect  

You do not need to find or manage API keys. The entire setup uses OAuth.

---

## Step 1: Start a new Stripe data source in GrowPanel

From inside GrowPanel, go to **Settings > Integrations > Add new data source** and choose **Stripe**.



If you are connecting Stripe during the onboarding flow, GrowPanel will automatically use your Stripe account name as the data source name. If you are connecting later, you will be asked to provide a name yourself. You can call it something descriptive such as:

* Stripe Production  
* Stripe EU  
* Stripe Main Account  
* Stripe App Revenue  

This name is for your internal use only. Once you enter it, click **Next**.



---

## Step 2: Approve the Stripe OAuth permissions

After clicking Connect, you will be redirected to Stripe. Stripe shows a standard OAuth screen that explains exactly which permissions GrowPanel needs. All of these are read only and safe to grant. GrowPanel cannot modify subscriptions, charge customers, or create invoices. It can only read data.



The read-only permissions typically include:

- Account and user information
- Accounts
- Payouts
- Plans
- Products
- Invoices
- Events
- Disputes
- Customers
- Credit Notes
- Charges
- Balances
- Subscriptions
- Tax Rates

Stripe clearly indicates that GrowPanel will not be able to perform write actions.

Select the account you wish to connect (if you manage multiple). Then click **Continue**.


When you complete this step, Stripe redirects you back to GrowPanel, where the import begins automatically.

---

## Step 3: GrowPanel verifies your account and starts importing

There is nothing else you need to configure. As soon as you return to GrowPanel, you will see the integration status switch to connected. GrowPanel immediately begins the initial import of your Stripe data.

You will see a progress screen that first needs to discover your customers in Stripe, and then process them. Stripe has a rate-limited API so this can take anywhere from a few minutes to hours, depending on the size of your data.

The import runs in the background so you can navigate elsewhere in GrowPanel or close your browser. The process will continue until your full history is imported, and you'll get and email once it's fully imported.

---

## What GrowPanel imports from Stripe

Stripe is highly flexible and supports many billing models. GrowPanel takes advantage of this by building a complete view of your subscription business. Below is an in depth overview of what GrowPanel imports and how each type of data is used.

### Products and prices

In Stripe, the product object identifies what you sell, while the price object defines how that product is billed.

GrowPanel imports:

* All products (active and archived)  
* All prices (recurring and one time)  
* Currency per price  
* Billing interval (monthly, yearly, weekly, custom)  
* Recurring type (licensed, metered, tiered, graduated, volume)  
* Tier definitions  
* Legacy prices and archived items  

GrowPanel uses this information to understand how each subscription is structured and how MRR should be calculated. For example:

* A price with a monthly billing interval creates standard MRR  
* A metered price uses usage records to determine actual monthly revenue  
* A tiered price needs special calculation rules since the unit cost changes with usage  
* Multi currency prices are converted correctly for global reporting  

If you change pricing or launch a new plan, GrowPanel automatically reflects those changes in your analytics.

### Customers

GrowPanel imports all customers from Stripe, including:

* Email  
* Name  
* Billing country  
* Stripe customer ID  
* Metadata (all custom metadata fields you have created)  
* Date of creation

Metadata is particularly valuable for filtering and segmentation. For example, many businesses store custom fields like:

* Account manager  
* Sales region  
* Internal customer type  
* Hubspot or Salesforce IDs  
* Feature flags  
* Plan category  

GrowPanel includes all metadata fields in customer profiles so you can filter and group your analytics in flexible ways.

### Invoices

GrowPanel imports:

* Invoice amounts  
* Line items
* Prorations  
* Discounts  
* Taxes  
* Currency
* Invoice status (paid, uncollectible, void, draft)  
* Automatic tax and inclusive tax fields  
* Credits applied  
* Invoice creation and payment dates  

Invoices are used as the main data to build MRR movements and transactions in GrowPanel.

---

### Charges

GrowPanel imports charges, which represent actual attempts to collect money. This helps show:

* Cash collection  
* Failed payments  
* Refunds  
* Disputes  
* Charge outcomes  
* Payment methods  

Charges are used to build the transactions reports, and show successful and failed payments.

### Subscriptions

GrowPanel imports:

* Subscription status (active, trialing, canceled, incomplete, paused, past due, unpaid)  
* Start and end dates  
* Trial periods  
* Cancellation dates  
* Scheduled cancellation (cancel at period end)  
* The reason for cancellation (if provided via Stripe's cancel reasons feature)  
* Quantity  
* All attached prices  
* Discounts applied to the subscription  
* Pause and resume events  
* Incomplete or pending invoice states  
* Subscriptions upgraded or downgraded mid cycle  
* Automatic prorations  

Most historical subscription data is already imported via the invoices, but we also import the subscriptions directly because they are needed to know if a subscription is cancelled or changed since last invoice.

---

### Discounts, coupons, and promotional pricing

GrowPanel imports all discount related data including:

* Coupon codes  
* Percentage and amount discounts  
* Free periods  
* Time limited discounts  
* Discounts attached to subscriptions  
* Discounts applied to invoices  
* Duration based discounts (once, repeating, forever)  

GrowPanel uses discounts when calculating CMRR. For example:

* If a customer has a discount that expires next month, GrowPanel forecasts the revenue increase in CMRR.  
* Discounts that permanently reduce price are treated differently from promotional discounts that phase out.  

This is vital for accurate future revenue forecasting.

---

### Trials and free trial conversions

GrowPanel imports:

* Trial start and end dates  
* Trial length  
* Trial to paid conversion events  
* Customers who churn during a trial  
* Conversions from free to paid at different intervals  

These appear in trial conversion reports and help you optimize your onboarding funnel.

---

### Prorations

When a customer upgrades or downgrades mid cycle, Stripe generates proration adjustments. GrowPanel imports all proration line items to provide accurate MRR movement calculations.

For example:

* Upgrades mid cycle can create a one time increase  
* Downgrades can result in credits  
* Switching from annual to monthly creates adjustments  
* Adding add ons mid period generates proration charges  

GrowPanel uses these to reconstruct accurate customer revenue histories.

---

### Metered and usage based billing

Stripe supports usage based pricing using usage records. GrowPanel imports usage data for all metered prices.

This allows GrowPanel to:

* Calculate MRR accurately for usage based models  
* Show monthly usage revenue  
* Rebuild historical usage patterns  
* Handle graduated or tiered metered plans  

This is especially important for API based or consumption based products.

---

### Currency support

GrowPanel fully supports multi currency Stripe setups. GrowPanel imports currency for every price, charge, line item, and invoice.

Depending on your settings, prices may be:

* Displayed in their original currency
* Normalized into a single reporting currency

This gives you accurate global reporting across currencies like USD, EUR, GBP, AUD, and dozens more.

#### Zero-decimal currencies

GrowPanel correctly handles Stripe's zero-decimal currencies—currencies like Japanese Yen (JPY), Korean Won (KRW), and Vietnamese Dong (VND) that don't use fractional units.

While most currencies store amounts in cents (100 = $1.00), zero-decimal currencies store amounts in whole units (100 = ¥100). GrowPanel automatically detects and processes these currencies correctly, so a ¥10,000 subscription displays as "¥10,000" rather than being incorrectly divided.

The complete list of supported zero-decimal currencies: BIF, CLP, DJF, GNF, JPY, KMF, KRW, MGA, PYG, RWF, UGX, VND, VUV, XAF, XOF, XPF.

---

## Voluntary churn, delinquent churn, and scheduled churn

GrowPanel distinguishes between:

### Voluntary churn  
When a customer intentionally cancels a subscription.

### Delinquent churn  
When a subscription cancels due to failed payments or unpaid invoices. GrowPanel identifies these automatically from Stripe's invoice and charge history.

### Scheduled churn  
When users click "Cancel at period end" inside your product or customer portal. GrowPanel imports:

* Cancel at period end flags  
* Effective cancellation dates  

Scheduled churn appears in your CMRR reports so you can see revenue that is expected to churn next month.

GrowPanel also imports Stripe cancellation reasons (if enabled). These are displayed in customer timelines and churn summaries.

---

## Real time updates using Stripe webhooks

Using webhooks, GrowPanel receives Stripe events automatically and updates the reports within a few minutes. You do not need to configure any webhooks manually.

GrowPanel subscribes to events such as:

* customer.updated  
* subscription.created, updated, deleted  
* invoice.created, finalized, paid, payment_failed  
* charge.succeeded, charge.failed, charge.refunded  
* coupon.updated  
* price.updated  
* product.updated  

This keeps your dashboard fully synced in real time.

---

## What to expect in GrowPanel after integrating Stripe

Once the initial import finishes, your GrowPanel dashboard is fully populated with near complete metrics and reports.

### Subscription metrics

* Total MRR  
* New, Expansion, Contraction, Churn, Reactivation  
* Cohorts  
* Retention curves  
* CMRR (forecasted revenue considering discounts ending and scheduled churn)  
* Plan performance  

### Financial reporting

* Cash collected  
* Charges and refunds  
* Failed payments  
* Invoice level reporting  
* ARPU and LTV  
* Multi currency support  

### Advanced billing insights

* Usage based revenue analytics  
* Trial conversion reports  
* Discount lifespan insights  
* Proration tracking  
* Scheduled churn outlook  

### Customer timeline

Every customer includes:

* Subscription events  
* All MRR movements  
* Payment history  
* Discount history  
* Metadata  
* Cancellation reasons  
* Account notes  

This gives you a complete narrative of each customer's revenue journey.

---

## Frequently Asked Questions
<!-- url: https://growpanel.io/docs/faq -->

Quick answers to common questions about GrowPanel. Click the links for detailed guides.

---

## Data & accuracy

### Why is my MRR different from Stripe/Chargebee/Recurly?

GrowPanel and your billing platform often show different numbers for legitimate reasons:

- **Trials excluded**: GrowPanel only counts paying customers in MRR
- **Currency conversion**: GrowPanel converts all currencies to your reporting currency using daily exchange rates
- **Pending invoices**: GrowPanel counts paid invoices, not pending charges
- **Annual normalization**: Annual plans are divided by 12 to get monthly MRR
- **Churn timing**: Your "recognize churn" setting affects when churned MRR appears

A small variance (under 1%) is normal. For larger discrepancies, see [Data Discrepancies](/docs/troubleshooting/data-discrepancies/) for a detailed investigation guide.

**Quick fix**: Check **Settings → Reporting** to ensure your churn recognition setting matches your billing platform.

---

### Why does my churn timing differ from Stripe?

Stripe shows churn when a customer cancels. GrowPanel defaults to showing churn when the subscription actually ends.

Example: A customer cancels on January 15th, but their subscription runs until January 31st.
- **Stripe**: Shows churn on January 15th
- **GrowPanel (default)**: Shows churn on January 31st

This "end-of-period" approach reflects when the revenue impact is actually felt. You can switch to immediate recognition in **Settings → Reporting** if you prefer Stripe's approach.

---

### How often does GrowPanel sync data?

GrowPanel syncs with Stripe, Chargebee, and Recurly in near-real-time via webhooks. New invoices, subscription changes, and cancellations typically appear within minutes.

The initial historical import may take longer depending on your data volume, but after that, updates are continuous.

---

### Why is my data not updating?

If new transactions aren't appearing in GrowPanel:

1. **Check sync status**: Go to **Settings → Data Sources** and check "Last sync" time
2. **Webhook issues**: For Chargebee/Recurly, verify the webhook URL is correct
3. **API key revoked**: Generate a new key if the old one was revoked
4. **Rate limiting**: Large imports may be throttled - wait an hour and check again

See [Troubleshooting - Data not syncing](/docs/troubleshooting/#data-not-syncing) for detailed steps.

---

### Why are some customers missing?

Common reasons:

- **Import still running**: Check progress in **Settings → Data Sources**
- **Filter applied**: Look for a "Filtered" badge and clear filters
- **Different date range**: Adjust the report date range
- **Trial customers**: Trials appear under "Trial" status, not "Active"

See [Troubleshooting - Missing data](/docs/troubleshooting/#missing-data).

---

### Why does a customer show the wrong MRR?

Check the customer detail page for:

- **Multiple subscriptions**: GrowPanel sums MRR across all subscriptions
- **Currency conversion**: The amount is converted to your reporting currency
- **Discounts**: Some billing platforms report pre-discount amounts differently
- **Pending changes**: Scheduled upgrades/downgrades may not be reflected yet

Click into the customer to see their full MRR history and subscription details.

---

### My import is taking a long time. Is this normal?

Yes, for accounts with lots of historical data:

| Account size | Estimated time |
|--------------|----------------|
| < 1,000 customers | Minutes |
| 1,000-10,000 customers | 1-2 hours |
| 10,000-100,000 customers | 2-8 hours |
| > 100,000 customers | 8+ hours |

Billing platforms have rate limits that slow down large imports. You'll receive an email when import is complete. You can start using GrowPanel with partial data while the import continues.

**If it seems stuck**: You can cancel an ongoing import in **Settings → Data Sources**. If it's been running much longer than expected, cancel and try again. If that doesn't help, reach out via the support widget.

See [Initial Data Import](/docs/getting-started/initial-data-import/).

---

## Notifications & reports

### How do I get notified when customers churn?

Set up MRR movement alerts:

1. Go to **Settings → Notifications**
2. Click **Add Alert**
3. Select "Churn" as the movement type
4. Set a threshold (e.g., $0 for all churn, or $500 for significant churn only)
5. Choose your channel (Email, Slack, Teams, or Webhook)

See [Notifications](/docs/settings/notifications/) for detailed setup.

---

### How do I turn off notification emails?

To disable or adjust MRR movement notifications:

1. Go to **Settings → Notifications**
2. Find the alert you want to modify
3. Toggle it off, adjust the threshold, or delete it

For scheduled reports (daily/weekly/monthly):

1. Go to **Settings → Notifications → Scheduled Reports**
2. Remove yourself from the recipient list or delete the report

---

### Why am I getting notifications that seem wrong?

If MRR movement notifications seem inaccurate:

- **Churn timing**: Check your "recognize churn" setting in **Settings → Reporting**
- **Currency conversion**: Amounts are shown in your reporting currency
- **Discounts ending**: A discount expiring can show as "expansion"
- **Plan changes**: Switching plans may show as contraction + new, not as a single change

Click the customer link in the notification to see the full movement details.

---

## Integrations & data sources

### Can I connect multiple Stripe accounts?

Yes! Go to **Settings → Data Sources** and click **Add Data Source** for each Stripe account. GrowPanel will combine all data in your reports.

Use the "Data Source" filter in reports to view accounts separately or together.

---

### Do you integrate with HubSpot?

HubSpot integration is available for syncing customer data from GrowPanel to HubSpot. This allows you to see MRR data on your HubSpot contacts/companies.

Note: HubSpot is not supported as a billing source (we don't pull revenue data from HubSpot).

See [Data Sources](/docs/data-sources/) for all supported integrations.

---

### How do I remove a connected Stripe/Chargebee account?

In GrowPanel:

1. Go to **Settings → Data Sources**
2. Click on the data source you want to remove
3. Click **Disconnect** or **Remove**

To fully revoke access, also disconnect in your billing platform:

- **Stripe**: Uninstall the GrowPanel app under **Settings → Installed apps**
- **Chargebee/Recurly**: Delete the API key you created for GrowPanel

Historical data from that source will be preserved in GrowPanel unless you specifically request deletion.

---

### Do you support [billing platform]?

Currently supported:
- Stripe
- Chargebee
- Recurly
- Google Sheets (manual import)
- Custom API

For other platforms, use our [REST API](/developers/rest-api/) to push data programmatically.

Use the support widget to request new integrations.

---

## Account & billing

### Where do I manage my account settings?

Go to **Account → Account** to:

- **Rename your account**: Change the display name shown in reports and emails
- **Delete your account**: Close your GrowPanel account entirely

This is separate from billing (subscription management) which is under **Account → Billing**.

See [Account](/docs/account-and-billing/account/) for details.

---

### How do I cancel my GrowPanel subscription?

1. Go to **Account → Billing**
2. Click **Cancel Subscription**
3. Optionally provide feedback
4. Confirm the cancellation

Your access continues until the end of your paid period. Data is preserved for 30 days after expiration.

See [Billing](/docs/account-and-billing/billing/#cancel-subscription).

---

### What happens to my data if I cancel?

After you cancel your subscription:

- Your data is preserved for **30 days** in case you change your mind
- After 30 days, all data is permanently deleted in compliance with GDPR
- This includes customer records, MRR history, and any connected data sources

Export your data before deletion using CSV exports or the API. See [Account](/docs/account-and-billing/account/) for details on data retention and GDPR.

---

### What happens when my trial ends?

After your 14-day trial:

- You'll be notified that your trial is up
- Historical data is preserved
- We continue syncing your latest data
- Choose the free plan (available under $200k ARR) or a paid plan to continue

No credit card is required to start, and you won't be charged automatically.

---

### Can I get a refund?

GrowPanel offers a 14-day free trial to evaluate the product. We don't refund paid periods once they've begun.

If you're having issues, reach out via the support widget - we're happy to help resolve problems or extend your trial.

---

## Features & reports

### How do I group plans together?

Use Plan Groups to combine related plans for reporting:

1. Go to **Settings → Plan Groups**
2. Click **Create Group**
3. Name the group and select which plans to include
4. Save the group

You can then filter and break down reports by plan group.

See [Plan Groups](/docs/settings/plan-groups/).

---

### Can I filter by US state or other custom fields?

Yes! GrowPanel supports:

- **Built-in filters**: Country, currency, plan, customer age, billing frequency, and more
- **Custom variables**: Add your own fields like US state, industry, or sales rep

Set up custom variables via the API or Google Sheets import, then use them in filters.

See [Filters](/docs/reports-and-metrics/filters/).

---

### How is churn calculated?

GrowPanel offers two churn recognition methods (configurable in **Settings → Reporting**):

- **Immediate**: Churn is counted when the cancellation is submitted
- **End of period**: Churn is counted when the subscription actually ends

Churn rate = (Churned customers or MRR) / (Starting customers or MRR) × 100

See [Churn Reports](/docs/reports-and-metrics/churn/) for detailed explanations.

---

## Troubleshooting

### Something looks broken in the UI

If you encounter a display issue or bug:

1. Try refreshing the page
2. Clear your browser cache
3. Try a different browser

If the issue persists, use the support widget and include:
- A screenshot of the issue
- The URL where it occurs
- Your browser and device type
- Steps to reproduce

---

### I need help with something not listed here

Use the support widget in the bottom-right corner of the app, or email hello@growpanel.io. We typically respond within 24 hours on business days.

Include your account email and any relevant screenshots. We're a small team and personally respond to every message.

---

## Related pages

- [Troubleshooting](/docs/troubleshooting/) - Detailed troubleshooting guides
- [Data Discrepancies](/docs/troubleshooting/data-discrepancies/) - Why numbers differ
- [Notifications](/docs/settings/notifications/) - Set up alerts and reports
- [Getting Started](/docs/getting-started/) - New user guides

---

## Connecting a billing source
<!-- url: https://growpanel.io/docs/getting-started/connecting-a-billing-source -->

Once you have created your GrowPanel account, the next step is to connect a billing source. GrowPanel supports **Stripe**, **Chargebee**, **Recurly**, **Google Sheets**, and custom sources via the REST API.

1. After creating your account, click **Connect billing source** in the welcome modal, or go to **Settings > Sources** at any time.
2. Click **Add data source** and choose your billing provider.
3. Give your data source a name and follow the setup instructions for your provider:
   - **Stripe** — You'll be redirected to Stripe to install the GrowPanel app and grant read-only access.
   - **Chargebee** — Enter your Chargebee subdomain and API key, and configure the webhook URL.
   - **Recurly** — Select your datacenter, enter your private API key, and configure the webhook URL.
   - **Google Sheets** — You'll receive an API key to use with the GrowPanel Sheets add-on.
   - **Custom source** — Create an API key under your profile to push data via the REST API.
4. Once connected, GrowPanel begins importing your data automatically.

You can connect multiple billing sources to the same account, giving you a unified view across all your subscription data.

---

## Creating an account
<!-- url: https://growpanel.io/docs/getting-started/creating-an-account -->

Getting started with GrowPanel is simple. You can create an account using your Google account, Microsoft account, or a traditional email and password combination.

All new accounts start with a **14-day full trial**, giving you access to all features without restrictions. After the trial ends, you can continue using GrowPanel on the **free plan**, as long as your subscription business remains under **$200k in Annual Recurring Revenue ([ARR](/academy/arr/))**.

No credit card is required to start, so you can explore, connect your data sources, and start monitoring your subscriptions immediately.

[Sign up here](https://app.growpanel.io/auth/signup)

---

## How GrowPanel works
<!-- url: https://growpanel.io/docs/getting-started/how-growpanel-works -->

GrowPanel is a subscription analytics platform designed to transform your raw billing data into comprehensive, actionable insights. Whether your data originates from Stripe, Chargebee, Recurly, custom spreadsheets or other billing systems, GrowPanel processes and consolidates this information to provide a unified view of your subscription metrics.

## Data Integration

GrowPanel supports integration with various data sources:

* **Stripe/Chargebee/Recurly***: Seamlessly connect your account to import subscription data, including customer information, billing history, and payment details.

* **Custom Spreadsheets**: Upload CSV or Excel files, or use our Google Sheets integration, containing your billing data for processing.

* **Other Billing Systems**: Utilize APIs or manual data uploads to integrate data from other subscription platforms.

Once connected, GrowPanel automatically imports and normalizes your data, ensuring consistency and accuracy across all metrics.

*) We are continuously adding integrations. If you want to recommend a billing source, let us know.

## Data Processing and Normalization

GrowPanel employs advanced algorithms to clean and normalize your data. This process includes:

* **Data Cleaning**: Identifying and rectifying inconsistencies or errors in the data.

* **Normalization**: Standardizing data formats to ensure uniformity across different sources.

* **Data Enrichment**: Enhancing data with additional information, such as customer segmentation or geographic details.

This meticulous processing enables accurate tracking of key metrics like Monthly Recurring Revenue (MRR), churn rate, and customer lifetime value (LTV).

## Analytics and Reporting

After processing, GrowPanel provides a suite of analytics tools:

* **Dashboards**: Visualize your key metrics in real-time with customizable dashboards.

* **Reports**: Generate detailed reports to analyze trends and performance over specific periods.

* **Forecasting**: Utilize predictive analytics to forecast future trends and make informed decisions.

These tools help you understand your business performance and identify areas for improvement.

## Automation and Notifications

GrowPanel offers automation features to keep you informed:

* **Scheduled Reports**: Set up automated email reports to receive regular updates on your metrics.

* **Notifications**: Receive alerts for significant changes in your data, such as spikes in churn or revenue drops.

These features ensure that you stay updated without having to manually check your data.

## AI-powered features

GrowPanel leverages artificial intelligence to help you gain insights from your subscription data more efficiently:

* **Chat with your data**: Ask questions directly in an AI-powered chat interface and get instant answers about your metrics, trends, and customer behavior.

* **Smart report summaries**: Scheduled reports include AI-generated summaries that highlight the most important changes, trends, and anomalies in your data, saving you time on analysis.

## Getting Started

To begin using GrowPanel, sign up for a free trial at [app.growpanel.io](https://app.growpanel.io). No credit card is required, and you can start exploring your subscription metrics immediately.

---

## Getting started
<!-- url: https://growpanel.io/docs/getting-started/ -->

Getting started with a new analytics tool can feel like a lot, so we've put together this guide to help you set up GrowPanel quickly and confidently.

We'll walk you through the basics: creating your account, connecting your billing source, importing your data, and navigating the dashboard. From there, you'll be ready to explore detailed reports, customer insights, and automated notifications.

This section is your foundation for understanding how GrowPanel works. Once you're comfortable, you can dive deeper into reports, filters, and advanced features at your own pace. And if you need help, our support team is always just a click away.

---

## Initial data import
<!-- url: https://growpanel.io/docs/getting-started/initial-data-import -->

After connecting a billing source, GrowPanel begins the **initial data import** automatically. This process retrieves your historical billing data, including subscriptions, invoices, and payments, and prepares it for analysis.

The import is designed to run seamlessly in the background. Once complete, your dashboard will be populated with key metrics, cohort reports, and historical trends. You can immediately start exploring your data through reports, scheduled emails, notifications, and AI-driven insights.

The initial import ensures that your historical data is fully integrated, giving you a complete view of your business from day one.

---

## Using GrowPanel on mobile
<!-- url: https://growpanel.io/docs/getting-started/mobile-app -->

GrowPanel works great on mobile devices. You can add it to your home screen for quick access, just like a native app. This gives you an app icon, full-screen experience, and faster loading times.

## Installing on iPhone or iPad

1. Open **Safari** and go to [app.growpanel.io](https://app.growpanel.io)
2. Sign in to your account
3. Tap the **Share** button (the square with an arrow pointing up)
4. Scroll down and tap **Add to Home Screen**
5. Give it a name (or keep "GrowPanel") and tap **Add**

The GrowPanel icon will now appear on your home screen. Tap it to open the app in full-screen mode.

**Note**: You must use Safari for this to work. Other browsers like Chrome on iOS don't support adding apps to the home screen.

---

## Installing on Android

1. Open **Chrome** and go to [app.growpanel.io](https://app.growpanel.io)
2. Sign in to your account
3. Tap the **menu** button (three dots in the top-right corner)
4. Tap **Add to Home screen** or **Install app**
5. Confirm by tapping **Add** or **Install**

The GrowPanel icon will appear on your home screen. Tap it to open the app.

**Tip**: On some Android devices, you may see an "Install" banner at the bottom of the screen. Tap it for a quicker installation.

---

## Features on mobile

Once installed, you get the full GrowPanel experience:

- **Dashboard**: View your MRR, subscriber counts, and key metrics at a glance
- **Reports**: Access all reports including MRR movements, churn, retention, and cohorts
- **Customers**: Browse customer records and subscription history
- **Notifications**: Receive push notifications for important events (if enabled)

The interface automatically adapts to your screen size, so charts, tables, and navigation are optimized for touch.

---

## Staying signed in

When you add GrowPanel to your home screen, your login session is preserved. You won't need to sign in every time you open the app.

If you do get signed out, simply sign in again using your Google account, Microsoft account, or email and password.

---

## Related pages

- [Creating an account](/docs/getting-started/creating-an-account/)
- [Navigating the dashboard](/docs/getting-started/navigating-the-dashboard/)

---

## Navigating the dashboard
<!-- url: https://growpanel.io/docs/getting-started/navigating-the-dashboard -->

Once you've imported your data, the GrowPanel dashboard provides a comprehensive view of your business performance. The interface is designed to make key metrics and insights easily accessible.

## Account selector

At the top of the sidebar, the **account selector** shows your current account. Click it to:

- **Switch accounts**: If you have access to multiple accounts, select one to switch to it
- **Manage accounts**: View all your accounts in a grid with MRR charts and reorder them (available when you have 2+ accounts)
- **Add new account**: Create a new GrowPanel account
- **Demo account**: Access the GrowPanel demo with sample data

Your custom account order is preserved across sessions.

---

## Main menu

* **Dashboard**: The main overview page displays a collection of charts and metrics, including:

  * Monthly Recurring Revenue (MRR)
  * MRR movements (new, expansion, contraction, churn)
  * Subscriber counts
  * A world map highlighting customer distribution
  * Cashflow bar charts
  * Key financial and operational metrics

* **Reports**: Access all reporting functionality in one place. Submenus include:

  * MRR, ARR
  * Leads, Trials
  * Churn, LTV (Lifetime Value)
  * ARPA, ASP, Quick Ratio
  * Cohorts
  * Map and Cashflow

* **Customers**: View individual customer records, their MRR, subscription history, and MRR movements. This section provides detailed insights into each customer's contribution to your business.

* **Settings**: Manage your GrowPanel configuration, including:

  * Data sources
  * Notifications
  * Plan groups
  * Custom fields

## Profile menu

In the upper-right corner, the profile menu gives you access to:

* Profile settings
* Account and billing information
* Team management
* API keys
* Sign out

By familiarizing yourself with these sections, you can quickly navigate GrowPanel, access the reports you need, and manage your account efficiently.

---

## What is GrowPanel?
<!-- url: https://growpanel.io/docs/getting-started/what-is-growpanel -->

GrowPanel is a subscription analytics platform designed to help SaaS and other subscription based companies gain real-time insights into their business performance. By integrating directly with billing sources such as Stripe, Chargebee and Recurly, GrowPanel provides a comprehensive view of key metrics such as Monthly Recurring Revenue (MRR), churn, cash flow, and customer behavior. This empowers founders, CFOs, and RevOps teams to make data-driven decisions that drive growth and improve retention.

---

## Key Features

### Subscription Analytics

Track essential metrics like MRR, ARR, expansion revenue, and churn in real time. Gain actionable insights to optimize your subscription model and fuel smarter growth. 

### Trial Insights

Analyze trial user behavior to identify conversion patterns and effectively turn more users into paying customers.

### Cash Flow Reporting

Monitor all aspects of your revenue, including refunds, fees, discounts, foreign exchange, and taxes, ensuring nothing slips through the cracks.

### AI & Forecasting Analytics

Utilize AI-driven insights to uncover trends and receive predictive analytics, enabling better business decisions.

---

## Designed For

* **Founders & CEOs**: Get a clear view of MRR, churn, and growth trends to make confident, high-impact business decisions fast.

* **CFOs**: Track MRR growth, run accurate projections, and manage revenue, cash flow, taxes, and FX confidently.

* **RevOps Teams**: Monitor trials, subscriptions, expansions, and churn in real time to optimize conversions and revenue efficiently.

* **Investors / VCs**: Quickly switch between portfolio companies, monitor KPIs, and spot growth trends without digging through spreadsheets.

---

## Seamless Integration

GrowPanel integrates effortlessly with your existing Stripe/Chargebee/Recurly accounts (we also support other billing sources), providing instant access to your subscription data. The platform offers a clean, intuitive dashboard that loads quickly on both desktop and mobile devices, ensuring you can access your metrics anytime, anywhere.

---

## Why Choose GrowPanel?

Unlike traditional analytics tools, GrowPanel is built specifically for SaaS and other subscription based businesses, offering tailored features that address the unique challenges of subscription-based models. With its real-time analytics, predictive insights, and user-friendly interface, GrowPanel empowers you to make informed decisions that drive growth and improve customer retention.

---

## Getting Started

Ready to take control of your subscription analytics? [Start your free trial](https://app.growpanel.io) today and experience the power of GrowPanel firsthand.

---

## Glossary
<!-- url: https://growpanel.io/docs/glossary -->

Quick reference for SaaS metrics and GrowPanel terminology. For in-depth explanations of each metric, see the [SaaS Metrics Academy](/academy/).

---

## Quick reference

| Term | Definition | Learn more |
|------|------------|------------|
| **ARR** | Annual Recurring Revenue (MRR × 12) | [ARR guide](/academy/arr/) |
| **ARPA** | Average Revenue Per Account | [ARPA guide](/academy/arpa/) |
| **ASP** | Average Selling Price of new subscriptions | [ASP guide](/academy/asp/) |
| **Churn** | When a customer's subscription ends | [Customer churn](/academy/customer-churn-rate/), [MRR churn](/academy/mrr-churn-rate/) |
| **CMRR** | Committed MRR (includes scheduled changes) | [CMRR guide](/academy/cmrr/) |
| **Cohort** | Group of customers who started in the same period | [Cohort analysis](/academy/cohort-analysis/) |
| **Contraction** | When an existing customer's MRR decreases | [Contraction MRR](/academy/contraction-mrr/) |
| **Expansion** | When an existing customer's MRR increases | [Expansion MRR](/academy/expansion-mrr/) |
| **GRR** | Gross Revenue Retention | [GRR guide](/academy/grr/) |
| **Logo churn** | Percentage of customers lost | [Logo churn](/academy/logo-churn/) |
| **LTV** | Customer Lifetime Value | [LTV guide](/academy/ltv/) |
| **MRR** | Monthly Recurring Revenue | [MRR guide](/academy/mrr/) |
| **Net MRR churn** | MRR churn minus expansion | [Net MRR churn](/academy/net-mrr-churn-rate/) |
| **NRR** | Net Revenue Retention | [NRR guide](/academy/nrr/) |
| **Reactivation** | Previously churned customer returning | [Reactivation MRR](/academy/reactivation-mrr/) |

---

## GrowPanel-specific terms

| Term | Definition |
|------|------------|
| **Data source** | A connection to your billing platform (Stripe, Chargebee, etc.) |
| **Fix FX** | Feature to freeze exchange rates for consistent reporting |
| **FX Impact** | MRR change due to exchange rate fluctuations |
| **Movement** | A change in a customer's MRR (New, Expansion, Contraction, Churn, Reactivation) |
| **Movement subtype** | Additional context (quantity_change, plan_change, discount_change, etc.) |
| **Plan group** | Collection of related plans grouped for reporting |
| **Reporting currency** | Currency used to display values in reports |
| **Scheduled churn** | Subscriptions set to cancel at end of billing period |
| **Segment entry/exit** | Internal movement types for plan-level filtering |

---

## Related resources

- [SaaS Metrics Academy](/academy/) - In-depth guides for every metric
- [Understanding your data](/docs/understanding-your-data/) - How GrowPanel calculates metrics
- [Reports and metrics](/docs/reports-and-metrics/) - Using GrowPanel reports

---

## GrowPanel AI
<!-- url: https://growpanel.io/docs/growpanel-ai/ -->

**GrowPanel AI** is a built-in assistant that can answer questions about your business, help you use the product, investigate numbers that look off, and make changes on your behalf — always with your approval. Think of it as a junior analyst, a product guide, and a support teammate rolled into one, sitting next to every page in GrowPanel.

It's available on every page via the **sparkle button in the bottom-right corner**, or with the keyboard shortcut **⌘I / Ctrl+I**.

---

## What you can ask

### Understand your metrics

Ask any question in plain English and GrowPanel AI will check your real data before answering. It won't hallucinate numbers — if it says your MRR dipped 4% in March, it's because it looked at your March MRR.

Good questions to start with:

* *"Why is my MRR down this month?"*
* *"Which customers are most at risk of churning?"*
* *"What's my best acquisition month this year?"*
* *"Compare annual and monthly plans on LTV and retention."*
* *"How is involuntary churn trending?"*

When you ask *why* something moved, GrowPanel AI doesn't just show you the headline number — it breaks it down by market, currency, plan, and cohort until it finds the actual driver. You'll see small chips like "Checking your MRR data", "Breaking down by market", "Looking at cohort retention" as it works, so you can follow the reasoning.

### Debug a specific customer

If a single customer's MRR looks wrong, the AI can pull up their full movement timeline, compare it to their subscription state, and walk you through what's going on.

* *"Why does customer X have weird MRR?"*
* *"Find customers who churned in the last 90 days with more than $500 MRR."*
* *"Show me the movement history for this customer."*

### Learn how the product works

GrowPanel AI knows our full documentation and can answer "how do I…" questions without sending you on a hunt.

* *"How do I connect Chargebee?"*
* *"What does CMRR mean?"*
* *"How do cohorts work here?"*
* *"What's the difference between logo churn and MRR churn?"*

When it answers from docs, it links back to the source page so you can read the full article if you want.

### Make changes — with your approval

GrowPanel AI can propose changes on your behalf. You always see exactly what it wants to do, with a **before / after preview**, and choose whether to **Accept** or **Reject**.

Things it can propose:

* **Save or update a segment** — *"Save my current filters as 'Power Users'"*
* **Create or edit plan groups** — *"Create a plan group called 'Enterprise' with these plans"*
* **Navigate** — *"Take me to the cohort report for EU enterprise plans last quarter"*
* **Change the date range, currency, breakdown, or filters** on the page you're looking at
* **Update settings** — notifications, Slack/Teams integrations, webhooks, Stripe/HubSpot configuration
* **Resync a customer** from your billing provider
* **Export customers or MRR movements as CSV**
* **Ask the AI to suggest plan groups** for your messy plan list

Nothing changes until you click Accept.

### Get help, or talk to a human

If you have a question our team should see — a refund, a billing discrepancy, a data question you want human eyes on — GrowPanel AI will hand you off cleanly. It routes to our support inbox with the full transcript and context attached, so you don't have to re-explain.

You can also click **Talk to a human** in the chat header at any time to escalate yourself.

---

## A few concrete examples

### "Why is MRR down in March?"

The AI looks at your overall MRR, breaks it down by market, then by plan, then by cohort, and reports back with something like:

> *Your March MRR is down **€1,840** (roughly 3.1%). The bulk of it — **€1,620** — is contraction on the Starter plan, concentrated in **Germany** and **Austria** customers who downgraded after the annual invoice cycle in February. Your other markets are flat or slightly up.*

It tells you what happened, where it happened, and why it's likely — all grounded in your actual numbers.

### "Save this view as 'EU annual enterprise'"

You've set up filters: `plan = Enterprise`, `region = Europe`, `billing frequency = yearly`. You say the line above, and a proposed-change card appears:

> **Proposed: create_segment**
> Before: nothing
> After: *name* "EU annual enterprise", *filters* "plan=Enterprise,region=Europe,billing_freq=yearly"
> [ Reject ] [ Accept ]

Click Accept and the segment is saved and immediately usable on every report.

### "How do I connect Chargebee?"

You get a concise, grounded answer with a link to our [Chargebee data source guide](/docs/data-sources/chargebee/) — no more hunting through menus.

### "I was double-charged in March — please help"

GrowPanel AI recognises this as a billing question that a human should handle. It builds a short summary of the issue, attaches your account context and the transcript, and opens a support conversation prefilled for our team. You don't have to re-describe the problem.

---

## What GrowPanel AI will not do

Some things always require a human — either because the stakes are high, or because it wouldn't be appropriate for an AI to do them on your behalf. When you ask about these, the AI will route you to support instead of trying to do it itself:

* **Billing changes** on your GrowPanel subscription — plan changes, cancellations, refunds, VAT, card management
* **Team management** — inviting users, changing roles, removing users
* **API key management** — creating, rotating, or deleting API keys
* **Deleting your account** or **deleting a data source entirely**

You can still do all of these yourself from the usual settings pages — GrowPanel AI just won't be the one to do them.

---

## Roles and permissions

GrowPanel AI respects the same role system as the rest of the product:

| Role | What the AI can do |
|------|-------------------|
| **Read-only** | Answer questions, investigate data, explain features. Cannot propose changes. |
| **Admin** | Everything above + propose segments, plan groups, settings, data source resyncs, filter/navigation changes. |
| **Owner** | Same as Admin. |

Whatever you can't do yourself in GrowPanel, the AI can't do for you either.

---

## Your data and privacy

A few privacy guarantees worth knowing:

* **Customer names, email addresses, phone numbers, and billing addresses never leave GrowPanel.** When GrowPanel AI looks up a customer to answer your question, those personal fields are replaced with opaque references before anything is sent to the AI model. You still see real names in the chat — the un-shielding happens on your device, not on the AI's side.
* **Conversations are stored in your GrowPanel account** so you can come back to them later. Everything is scoped to your account and your user — no one outside your team can see your conversations.
* **Support handoffs** are the one case where real names travel to our support system — because our team needs to help you and they already have access to your data anyway.
* **The AI has no access to the GrowPanel source code.** It can only call a fixed list of GrowPanel features and read our public documentation.

---

## Coming back to a past conversation

Click the **history icon** in the chat header to see your recent conversations. Click any one to open it and continue where you left off. Conversations persist across browser sessions and devices.

---

## Tips for getting the best answers

* **Be specific about the timeframe** — "last quarter", "March 2026", "the last 90 days". Vague questions get vague defaults.
* **Ask follow-up questions** — the AI keeps context across the conversation. "Break that down by plan" after a churn question is much faster than starting from scratch.
* **Use it while looking at a report** — the AI knows what page you're on, what date range and filters you have active, and will ground its answer in your current view. "Why is this number down?" just works.
* **Let it run multiple tool calls** — when you ask a big question, you'll see several step chips appear. That's the AI digging in; the answer it gives you at the end is worth the extra few seconds.
* **Review proposed changes carefully** — if the before/after looks wrong, reject. The AI won't hold it against you, and you can clarify what you actually wanted.

---

## Known limitations

* **It's not faster than you at things you already know how to do.** For routine lookups you do every day, the existing reports and filters are still quicker. The AI shines when you're debugging, exploring, or asking a multi-step question.
* **It won't make things up, but it can still be wrong.** If it misreads your question or picks the wrong metric, tell it — "No, I meant net MRR churn rate, not gross" — and it will correct itself.
* **History conversations show opaque customer references** when you re-open them later. New questions in a resumed conversation work normally; only the older messages are affected.

---

## Availability

GrowPanel AI is available on every page of the product for Admin, Owner, and Read-only users. It's included in all GrowPanel plans at no extra cost.

If you don't see the sparkle button in the bottom-right corner, try hard-refreshing the page. If it's still missing, reach out to our support team.

---

## Documentation hub
<!-- url: https://growpanel.io/docs/ -->

## Welcome to the GrowPanel Documentation Hub

Welcome to the GrowPanel documentation hub - your go-to resource for mastering subscription analytics and revenue tracking. Whether you're just getting started or looking to dive deep into advanced metrics, you'll find everything you need right here.

> **Feeding GrowPanel's docs into your own AI tool?** The full documentation is available as a single markdown file at **[growpanel.io/docs.md](/docs.md)** — point Claude, ChatGPT, Cursor, or any other AI assistant at it. See [AI agent reference](/docs/ai-reference/) for details.

---

## Documentation sections

### [Getting Started](/docs/getting-started/)
New to GrowPanel? Start here to create your account, connect your billing source, and navigate the dashboard.

### [Data sources](/docs/data-sources/)
Connect GrowPanel to Stripe, Chargebee, Recurly, Google Sheets, or your own custom billing system.

### [Understanding your data](/docs/understanding-your-data/)
In-depth explanations of how GrowPanel works—from billing data to MRR, and how multi-currency is handled.

### [Reports and Metrics](/docs/reports-and-metrics/)
Learn how to use GrowPanel's reports: MRR, ARR, churn, retention, cohorts, world map, breakdowns, and more.

### [Customers](/docs/customers/)
Browse your customer list, view customer details, and understand the customer journey.

### [Settings](/docs/settings/)
Configure reporting preferences, manage data sources, organize plan groups, and set up notifications.

### [Account and Billing](/docs/account-and-billing/)
Manage your team, subscription, API keys, and profile settings.

### [Glossary](/docs/glossary/)
Definitions of SaaS metrics, GrowPanel terminology, and subscription analytics concepts.

### [Troubleshooting](/docs/troubleshooting/)
Solutions for common issues, data discrepancies, and connection problems.

---

## Developer resources

Looking for API documentation? Visit the [Developer resources](/developers/) section for REST API reference, authentication guides, and integration documentation.

---

> Need help? Reach out to our support team anytime via the chat icon in the bottom right.

---

## ARPA
<!-- url: https://growpanel.io/docs/reports-and-metrics/arpa -->

The **ARPA (Average Revenue Per Account) report** tracks the average monthly revenue generated from each active customer. It is a critical metric in GrowPanel for understanding the value of your customer base, analyzing pricing strategy effectiveness, and identifying trends in customer spending.

**ARPA is calculated as MRR (Monthly Recurring Revenue) divided by the number of active subscribers.**



For an in-depth explanation of ARPA as a metric, see the [ARPA guide in the SaaS Metrics Academy](/academy/arpa/).

---

## Overview



The ARPA report includes a timeline chart and a breakdown table. Unlike the MRR and Subscribers reports, the breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart shows your ARPA over the selected period. If you hover the chart, you'll see a tooltip displaying the MRR, the number of active subscribers, and the calculated ARPA for that specific period. The currently ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, currency picker, interval selector and a wealth of filters, explained in the Filters section underneath.

Note that the numbers for a given period shows how those numbers looked at the *end of the period*.

### Breakdown table

The table underneath the chart displays the three core components used to calculate ARPA for each period: MRR, the count of active customers, and the resulting ARPA.

  * **MRR (Monthly Recurring Revenue)**
    
    The total recurring revenue at the end of the period.

  * **Customers**
    
    The total number of active, paying subscribers at the end of the period.

  * **ARPA (Average Revenue Per Account)**
    
    The calculated ARPA for the period (MRR / Customers).

The table allows for a quick comparison of the three metrics across different time intervals, helping you understand whether changes in MRR are driven by changes in customer volume or changes in the revenue generated per customer.

---

## Filters

The report supports a wide range of filters to help you focus on specific segments of your business. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how ARPA is aggregated: daily, weekly, monthly, quarterly, or yearly

* **Currency** Select your reporting currency. When switching reporting currency, the underlying MRR component is recalculated using daily historical exchange rates. If you want to **fix/freeze** FX rates in your reports, you can tick a checkbox, and all FX rates are fixed at the start date of the report. Example: if you see "Year to date", all FX rates will be fixed at the 1st of january. 

* **Additional filters** – plan, region/country, billing frequency, payment method, customer age, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Monitor ARPA** alongside Subscribers and MRR. If MRR is growing but ARPA is declining, it suggests your growth is driven by acquiring lower-value customers.
* Use the **interval** selector to spot rapid changes. A sharp increase in daily ARPA might indicate a successful, high-value upsell campaign.
* **Fixing the currency** is essential when analyzing historical ARPA across multiple currencies, as it prevents exchange rate fluctuations from distorting the true average value of your customers.
* Combine multiple **filters** to identify the ARPA of different cohorts (e.g., customers by region or plan type) to optimize pricing.

---

## ARR
<!-- url: https://growpanel.io/docs/reports-and-metrics/arr -->

The **ARR (Annual Run Rate or Annual Recurring Revenue) report** provides a detailed view of your annualized subscription revenue over time. It is a central tool in GrowPanel for tracking long-term growth, understanding revenue trends, and identifying customer behavior patterns on an annual scale.

**ARR is calculated as Monthly Recurring Revenue (MRR) multiplied by 12.**

For an in-depth explanation of ARR as a metric, see the [ARR guide in the SaaS Metrics Academy](/academy/arr/).

---

## Overview



The ARR report includes a chart, a breakdown table, and optionally a detail table. Each is described here:

### Timeline chart

The timeline chart shows your ARR over the selected period. If you hover the chart, you'll see a tooltip with the ARR movements broken down in types (explained under the Breakdown table), and you'll see the corresponding period marked in the table underneath. The currenly ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, currency picker, interval selector and a wealth of filters, explained in the Filters section underneath.

Note that the numbers for a given period shows how those numbers looked at the *end of the period*. 

### Breakdown table

The table underneath the chart shows the ARR, broken down into ARR movement types: New, expansion, reactivation, contraction, churn. It also shows Net ARR movements and currency fluctuations (FX impact). The table scrolls horizontally and if you hover the columns, you'll see a line in the chart showing the corresponding period. Each type is explained here:

  * **New**
    
    Annual recurring revenue from newly acquired customers (calculated as New MRR x 12).

  * **Expansion**
    
    Annual recurring revenue growth from existing customers due to upgrades, discount changes or billing frequency updates. A change from yearly to monthly payment can also contribute to expansion if the monthly plan results in a higher annual revenue.

  * **Reactivation** 
  
    Annual recurring revenue recovered from returning customers that previously churned (calculated as Reactivation MRR x 12).

  * **Contractions**
    
    Reductions in annual recurring revenue from downgrades, discount changes, prices changes or billing frequency changes. A change from monthly to yearly payment can also contribute to contraction if the annual plan is cheaper on an annual basis.

  * **Churn** 
  
    Annual recurring revenue lost from cancellations. A cancellation is classified as a churn when the customer does not have any other active subscriptions, and the ARR is zero.

  * **ARR change**
  
    Net ARR change from real ARR movements (doesn't include currency fluctuations).
  
  * **FX impact**
    
    Changes due to currency exchange rate fluctuations. This line is only shown if customers pay in a currency that's different that the reporting currency.

  * **ARR**
    
    The ARR at the end of the period, including both ARR movements and FX impact.

Each cell of the table shows two numbers - an amount and a number. The amount shows the sum of the ARR movement type in the given period. Negative amounts are typically marked with a minus in front, depending on your locale. The number next to the amount shows the number of unique customers that contributed to this number. If a customer has multiple movements during the period, it's still only counted as one unique customer. Red numbers mean that the customers contributed with negative ARR, and green numbers mean positive ARR movements.

If you click a cell, a detail table under the breakdown table is revealed, showing all ARR movements in the selected period and type.

### Detail table



This table is shown when you click a cell in the breakdown table. The table shows each ARR movement in the selected period and type. You see the date, customer name/email, the description of the ARR movement, the type (New/Expansion/Reactivation/Contraction/Churn) and the ARR change. If the ARR change is in a different currency than the reporting currency, you see the converted amount as well as the original amount in parantheses.

Clicking the customer sends you to that customer's detail page.

---

## Filters

The report supports a wide range of filters to help you focus on specific segments of your business. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how ARR is aggregated: daily, weekly, monthly, quarterly, or yearly

* **Currency** 

  Select your reporting currency. When switching reporting currency, the reports are calculated on the fly using daily historical exchange rates. If you want to **fix/freeze** FX rates in your reports, you can tick a checkbox, and all FX rates are fixed at the start date of the report. Example: if you see "Year to date", all FX rates will be fixed at the 1st of january. 

* **Additional filters** – plan, region/country, billing frequency, payment method, customer age, etc. ([see all filters](../filters/))

  Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* Use the **interval** selector to understand trends at different granularities. Monthly intervals are useful for spotting short-term fluctuations in the annual run-rate, while quarterly or yearly intervals give a longer-term view.
* Use "All time" in the date picker to show you the numbers from when your first customer signed up.
* **Fixing the currency** is recommended when analyzing historical performance across multiple currencies, as it removes FX volatility from the analysis.
* Combine multiple **filters** to isolate specific customer segments or product lines, enabling precise revenue insights.

---

## ASP
<!-- url: https://growpanel.io/docs/reports-and-metrics/asp -->

The **ASP (Average Sales Price) report** tracks the average Monthly Recurring Revenue (MRR) brought in by each **new** customer during a specific period. It is a key metric in GrowPanel for evaluating the effectiveness of your initial pricing and sales strategies, especially for new acquisitions.

**ASP is calculated by dividing the New MRR generated in a period by the number of New Subscribers acquired in that same period.**



For an in-depth explanation of ASP as a metric, see the [ASP guide in the SaaS Metrics Academy](/academy/asp/).

---

## Overview



The ASP report includes a timeline chart and a breakdown table. This report focuses specifically on the revenue quality of *new* customer acquisition. The breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart shows your ASP over the selected period. If you hover the chart, you'll see a tooltip displaying the New MRR, the number of New Subscribers, and the calculated ASP for that specific period. The currently ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, currency picker, interval selector and a wealth of filters, explained in the Filters section underneath.

Note that the numbers for a given period shows how those numbers looked at the *end of the period*.

### Breakdown table

The table underneath the chart displays the three core components used to calculate ASP for each period: New MRR, the count of New Subscribers, and the resulting ASP.

  * **New MRR**
    
    The total recurring revenue added by newly acquired customers during the period.

  * **New Subscribers**
    
    The total number of unique, newly acquired paying customers during the period.

  * **ASP (Average Sales Price)**
    
    The calculated ASP for the period (New MRR / New Subscribers).

The table allows you to quickly see if fluctuations in New MRR are caused by acquiring a higher volume of new customers or by increasing the average value of those initial sales.

---

## Filters

The report supports a wide range of filters to help you focus on specific segments of your newly acquired business. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how ASP is aggregated: daily, weekly, monthly, quarterly, or yearly

* **Currency** Select your reporting currency. When switching reporting currency, the underlying New MRR component is recalculated using daily historical exchange rates. If you want to **fix/freeze** FX rates in your reports, you can tick a checkbox, and all FX rates are fixed at the start date of the report. Example: if you see "Year to date", all FX rates will be fixed at the 1st of january. 

* **Additional filters** – plan, region/country, billing frequency, payment method, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Segmentation is Key:** Use **Additional filters** to compare the ASP achieved through different acquisition channels, regions, or payment methods. This helps prioritize your most valuable acquisition sources.
* **Track Pricing Changes:** Look at the chart after a pricing change to see the immediate impact on your average initial sale.
* **Distinction from ARPA:** Remember, ARPA measures the average revenue of *all* active customers, while ASP measures the average revenue of *only new* customers. A rising ASP without a corresponding rise in ARPA might indicate an issue with existing customer upselling (Expansion MRR).

---

## Breakdown Reports
<!-- url: https://growpanel.io/docs/reports-and-metrics/breakdowns -->

**Breakdown Reports** let you segment your metrics by different dimensions to uncover trends and patterns that aren't visible in aggregate data. Instead of seeing just your overall churn rate, you can see churn rate by plan, by market, or by any other dimension - revealing which segments are performing well and which need attention.

---

## Overview



<!-- IMAGE PLACEHOLDER: Screenshot of a Breakdown report showing multiple line charts (one per segment), with a legend showing different plans in different colors, and a table below with segment details -->

The Breakdown Reports section provides segmented views of your key metrics:

1. **Segmented charts** - Each dimension value gets its own line or bar in the chart
2. **Comparison table** - Side-by-side comparison of all segments
3. **Trend analysis** - See how segments perform over time relative to each other

---

## Available metrics

You can create breakdowns for most of GrowPanel's core metrics:

| Metric | What the breakdown shows |
|--------|-------------------------|
| **MRR** | Revenue distribution and growth by segment |
| **ARR** | Annualized revenue by segment |
| **Subscribers** | Customer count by segment |
| **Logo Churn** | Customer churn rate by segment |
| **MRR Churn** | Revenue churn rate by segment |
| **Net MRR Churn** | Net churn (including expansion) by segment |
| **ARPA** | Average revenue per account by segment |
| **ASP** | Average selling price by segment |
| **LTV** | Customer lifetime value by segment |
| **NRR** | Net revenue retention by segment |
| **GRR** | Gross revenue retention by segment |

---

## Breakdown dimensions

Select a dimension to segment your data:

| Dimension | Description | Example insights |
|-----------|-------------|------------------|
| **Plan** | Subscription plan or product tier | Which plans have the highest churn? |
| **Plan Group** | Groups of related plans | How do product lines compare? |
| **Currency** | Billing currency | How does revenue distribute across currencies? |
| **Billing Interval** | Monthly, quarterly, annual | Do annual customers churn less? |
| **Market** | Country or region | Which markets are growing fastest? |
| **Payment Method** | Card, ACH, PayPal, etc. | Does payment method affect retention? |
| **Data Source** | Stripe, Chargebee, etc. | Compare metrics across billing platforms |
| **Customer Age** | Time since first revenue | How does behavior change over customer lifetime? |
| **Pricing Model** | Licensed or metered | How do pricing models affect LTV? |
| **Custom Variables** | Your metadata fields | Segment by any custom attribute |

---

## Using breakdown reports

### Step 1: Select a metric

Navigate to the **Breakdowns** section and choose the metric you want to analyze:

<!-- IMAGE PLACEHOLDER: Screenshot of the Breakdowns menu showing the metric selector with options like MRR, Churn, ARPA, etc. -->

### Step 2: Choose a dimension

Select how you want to segment the data:

<!-- IMAGE PLACEHOLDER: Screenshot of the dimension dropdown showing options like Plan, Market, Billing Interval, etc. -->

### Step 3: Analyze the results

The report shows:

- **Chart** - Each segment as a separate line (for trends) or bar (for comparisons)
- **Table** - Detailed values for each segment across the selected time period
- **Summary** - Key statistics like highest/lowest performing segments

<!-- IMAGE PLACEHOLDER: Screenshot of a complete breakdown showing churn rate by market, with multiple countries as different colored lines -->

---

## Charts

### Line chart (trends)

The line chart shows how each segment performs over time. Use this to:

- Spot segments trending upward or downward
- Identify seasonal patterns in specific segments
- See when segments diverged in performance

Each segment is shown as a separate line with its own color. Hover over the chart to see exact values for each segment at any point in time.

### Stacked area chart

For metrics like MRR, you can switch to a stacked view to see:

- How segments contribute to the total
- Relative proportion of each segment
- Changes in segment mix over time

---

## Table

The table below the chart shows:

| Column | Description |
|--------|-------------|
| Segment | The dimension value (e.g., plan name, country) |
| Current Value | The metric value for the most recent period |
| Change | Absolute change from the previous period |
| % Change | Percentage change from the previous period |
| % of Total | This segment's share of the total |
| Sparkline | Mini trend chart for quick visual reference |

Click column headers to sort by different columns. Click a segment row to drill down into that specific segment.

---

## Filters

Breakdown reports support the same filters as standard reports:

- **Date range** - Analyze a specific time period
- **Interval** - Daily, weekly, monthly, quarterly, or yearly
- **Currency** - Normalize to a reporting currency
- **Additional filters** - Plan, market, payment method, etc.

Filters apply to the entire breakdown. For example, filtering by "United States" while breaking down by "Plan" shows how different plans perform specifically in the US market.

---

## Common use cases

### Churn rate by plan

**Question:** Which plans have the highest customer churn?

1. Select **Logo Churn** as the metric
2. Break down by **Plan**
3. Look for plans with consistently higher churn lines

High churn on specific plans may indicate:
- Poor product-market fit for that tier
- Pricing issues
- Missing features that customers expect

### MRR growth by market

**Question:** Which geographic markets are growing fastest?

1. Select **MRR** as the metric
2. Break down by **Market**
3. Compare the slope of each line

Fast-growing markets may deserve:
- Additional sales resources
- Localization investment
- Dedicated support coverage

### Retention by billing interval

**Question:** Do annual customers retain better than monthly?

1. Select **NRR** (Net Revenue Retention) as the metric
2. Break down by **Billing Interval**
3. Compare annual vs. monthly retention curves

If annual customers retain significantly better:
- Consider incentives for annual upgrades
- Analyze what makes annual customers more committed
- Adjust pricing to encourage annual billing

### ASP by payment method

**Question:** Do payment methods correlate with deal size?

1. Select **ASP** (Average Selling Price) as the metric
2. Break down by **Payment Method**
3. Compare average values across methods

Card vs. ACH vs. invoice may show:
- Enterprise customers prefer invoicing
- Higher-value deals use bank transfers
- Self-serve customers use cards

### LTV by custom variable

**Question:** How does industry affect customer lifetime value?

1. Select **LTV** as the metric
2. Break down by your **Industry** custom variable
3. Compare lifetime values across industries

If certain industries have higher LTV:
- Focus acquisition efforts there
- Develop industry-specific features
- Create targeted case studies

---

## Export

Click the **Export** icon to download the breakdown data as a CSV file. The export includes:

- All segments
- Values for each period in the date range
- Summary statistics

---

## Tips

- **Start broad, then filter** - Begin with an overall breakdown, then apply filters to investigate specific segments
- **Compare like with like** - When comparing segments, ensure you have enough data in each segment for meaningful comparison
- **Watch for small sample sizes** - A segment with few customers may show volatile metrics that aren't statistically significant
- **Combine dimensions** - Use filters and breakdowns together (e.g., break down by plan, filter by US market)
- **Track over time** - Check breakdowns regularly to spot emerging trends before they become problems

---

## Related reports

- [Filters](/docs/reports-and-metrics/filters/) - Learn about all available filter options
- [World Map](/docs/reports-and-metrics/world-map/) - Geographic visualization of metrics
- [Cohorts](/docs/reports-and-metrics/cohorts/) - Analyze customer behavior by signup date
- [MRR](/docs/reports-and-metrics/mrr/) - Core MRR report with movement breakdown

---

## Cashflow
<!-- url: https://growpanel.io/docs/reports-and-metrics/cashflow -->

The **Cashflow report** provides a comprehensive view of all the money flowing through your subscription business. Unlike MRR which tracks recognized recurring revenue, the Cashflow report shows actual cash movements including one-time payments, refunds, fees, taxes, and currency exchange impacts.

This report is essential for CFOs and finance teams who need to understand the real financial position of the business, beyond just the recurring revenue metrics.

---

## Overview



The Cashflow report includes a timeline chart showing your net cashflow over time, and a detailed breakdown table showing all cash components.

### Timeline chart

The timeline chart displays your net cashflow over the selected period. Positive cashflow is shown in green, while negative cashflow (more money going out than coming in) is shown in red.

Hover over any point to see the detailed breakdown of cash components for that period.

### Breakdown table

The breakdown table shows all cash movement categories:

| Category | Description |
| :--- | :--- |
| **Recurring Revenue** | Cash received from subscription payments |
| **One-time Payments** | Non-recurring charges like setup fees or add-ons |
| **Refunds** | Money returned to customers |
| **Discounts** | Revenue reduction from applied discounts |
| **Processing Fees** | Payment processor fees (Stripe, etc.) |
| **Taxes** | VAT, sales tax, and other taxes collected |
| **FX Adjustments** | Gains or losses from currency exchange |
| **Net Cashflow** | Total cash position after all adjustments |

Click any row to see the individual transactions that make up that category.

---

## Filters

The Cashflow report supports comprehensive filtering:

* **Date range** - Select custom ranges or preset periods
* **Interval** - View by day, week, month, quarter, or year
* **Currency** - Choose your reporting currency. FX adjustments are calculated automatically using daily exchange rates.
* **Additional filters** - Filter by plan, region, customer segment, etc. ([see all filters](../filters/))

---

## Exporting the data

Export the cashflow data as CSV for use in accounting software or financial models by clicking the "Export" icon.

---

## Practical tips

* **Reconciliation**: Use the Cashflow report to reconcile your subscription revenue with your bank statements and accounting records.
* **FX Impact**: If you operate in multiple currencies, pay close attention to the FX Adjustments line to understand how currency fluctuations affect your bottom line.
* **Fee Analysis**: Monitor Processing Fees as a percentage of revenue. If fees are growing faster than revenue, it may be time to negotiate better rates with your payment processor.

---

## Churn Reasons
<!-- url: https://growpanel.io/docs/reports-and-metrics/churn-reasons -->

The **Churn Reasons report** shows a timeline of why customers cancelled their subscriptions, broken down by the specific reason recorded at cancellation. This helps you identify the most common drivers of churn and prioritize retention strategies accordingly.

---

## Overview

<!-- image placeholder -->

The Churn Reasons report is part of the **Churn** tab group, alongside [Logo Churn](/docs/reports-and-metrics/churn/logo-churn/), [MRR Churn](/docs/reports-and-metrics/churn/mrr-churn/), [Net MRR Churn](/docs/reports-and-metrics/churn/net-mrr-churn/), and [Scheduled Churn](/docs/reports-and-metrics/scheduled-churn/).

The report includes four main sections:

1. **Timeline chart** - MRR lost per reason over time
2. **Pie chart** - Proportional breakdown of churn reasons
3. **Breakdown table** - Period-by-period detail per reason
4. **Movement detail table** - Individual customer churn records

---

## Timeline chart

<!-- image placeholder -->

The timeline chart shows **MRR lost to churn**, broken down by cancellation reason as stacked lines. Each reason is assigned a consistent color across the report.

- **Y-axis** - MRR lost (in your base currency)
- **X-axis** - Time periods (based on interval selection)
- **Lines** - Each line represents a specific churn reason

This helps you spot trends, such as a spike in "Too expensive" cancellations after a price increase, or a rise in "Missing features" that signals a product gap.

---

## Pie chart

<!-- image placeholder -->

The pie chart shows the **proportional share** of each churn reason across the selected period. It displays the top 5 reasons, grouping the rest under "Other".

Use this chart for a quick visual answer to: "What's the #1 reason customers leave?"

---

## Breakdown table

<!-- image placeholder -->

The breakdown table shows MRR lost per reason for each period, with customer counts displayed as superscript numbers.

| Column | Description |
|--------|-------------|
| Reason | The cancellation reason label |
| Period columns | MRR lost and customer count for each period |

Click any cell to reveal the movement detail table showing the individual customers who churned for that reason in that period.

Hovering over a row highlights the corresponding line in the timeline chart.

---

## Movement detail table

<!-- image placeholder -->

When you click a cell in the breakdown table, the detail table appears showing individual churn events:

| Column | Description |
|--------|-------------|
| Date | When the churn occurred |
| Customer | Customer name and email (click to view detail page) |
| Reason | The cancellation reason |
| MRR lost | Amount of MRR lost from this customer |

The table is sorted by date (newest first) by default. Click any customer to view their [detail page](/docs/customers/customer-detail/) with full subscription history.

---

## Supported churn reasons

GrowPanel recognizes the following cancellation reasons:

| Reason | Description |
|--------|-------------|
| **Too expensive** | Customer cited price or cost concerns |
| **Too complex** | Product was too difficult to use or learn |
| **Switched service** | Customer moved to a competitor |
| **Unused** | Customer was not using the product |
| **Missing features** | Product lacked required functionality |
| **Low quality** | Customer was unsatisfied with product quality |
| **Customer service** | Issues with support or service |
| **Payment failed** | Automatically assigned when cancellation is due to failed payments |
| **Payment disputed** | Cancellation due to a payment dispute or chargeback |
| **Other** | Unspecified or custom reasons |

---

## Setup requirements

To populate churn reasons data, your billing source must capture cancellation reasons:

- **Stripe** - Enable Stripe's built-in [cancellation reason collection](https://docs.stripe.com/billing/subscriptions/cancel#collect-a-cancellation-reason). When a customer cancels through Stripe's portal or API with a reason, GrowPanel automatically imports it.
- **Chargebee / Recurly** - Cancellation reasons from these providers are imported when available.

The **"Payment failed"** reason is special: GrowPanel automatically assigns it when a subscription is cancelled due to failed payment recovery, regardless of the billing source. This helps you distinguish voluntary churn from involuntary churn.

> **Note:** If your billing source does not capture cancellation reasons, this report will show all churn under "Other" or with no reason specified.

---

## Filters

The Churn Reasons report supports all standard filters:

* **Date range** - Select a custom range or preset period
* **Interval** - Aggregate by day, week, month, quarter, or year
* **Churn reason** - Filter to specific reasons (e.g., only show "Too expensive" and "Missing features")
* **Additional filters** - Plan, region, currency, billing frequency, payment method, pricing model, industry, customer age, size, channel, data source ([see all filters](/docs/reports-and-metrics/filters/))

Filters apply to all sections (chart, pie, table, detail) simultaneously.

---

## Exporting the data

Click the **Export** icon next to the date picker to download the data as a CSV file.

---

## Practical tips

* **Prioritize the top reason.** Focus retention efforts on the most common reason first. If "Too expensive" is #1, consider introducing a lower-cost tier or offering discounts to at-risk customers.
* **Track reasons over time.** A sudden increase in a specific reason often correlates with a recent change: pricing updates, feature removals, or support quality shifts.
* **Separate voluntary from involuntary.** Use the "Payment failed" reason to understand how much of your churn is involuntary. Involuntary churn can be reduced with [dunning and payment recovery](/docs/reports-and-metrics/failed-payments/) rather than product changes.
* **Combine with segments.** Filter by plan or customer size to see if churn reasons differ across segments. Enterprise customers may churn for "Missing features" while small accounts churn for "Too expensive".
* **Use for product roadmap input.** If "Missing features" is a top reason, dig into the detail table to identify which customer segments are affected and reach out to understand what's missing.

---

## Related reports

- [Logo Churn](/docs/reports-and-metrics/churn/logo-churn/) - Customer churn rate over time
- [MRR Churn](/docs/reports-and-metrics/churn/mrr-churn/) - Revenue churn rate
- [Scheduled Churn](/docs/reports-and-metrics/scheduled-churn/) - Upcoming cancellations
- [Failed Payments](/docs/reports-and-metrics/failed-payments/) - Payment failure and recovery tracking
- [Customer Concentration](/docs/reports-and-metrics/customer-concentration/) - Revenue risk from top customers

---

## Churn
<!-- url: https://growpanel.io/docs/reports-and-metrics/churn/ -->

## The foundation of revenue analysis

Churn, the loss of customers and their associated revenue, is arguably the most critical metric for the long-term health and valuation of any subscription business. It represents the primary obstacle to sustainable growth, making its deep analysis non-negotiable for ambitious SaaS teams. Managing churn directly impacts customer lifetime value and overall revenue stability.

In this section, we break down churn into three distinct, yet interconnected, measures. By tracking each one, you gain a complete, actionable understanding of customer value, financial stability, and your business's overall momentum:

* **Logo Churn:** Tracks the raw count of lost customers (accounts).
* **MRR Churn:** Tracks the gross revenue lost from those customers.
* **Net MRR Churn:** Tracks the net revenue loss or gain after accounting for expansion, contraction, and churn, serving as the inverse of Net Revenue Retention (NRR).

---

## Logo Churn
<!-- url: https://growpanel.io/docs/reports-and-metrics/churn/logo-churn -->

The **Logo Churn Rate report** (also commonly referred to as Customer Churn Rate) tracks the percentage of active, paying customer accounts (or "logos") that were lost during a specific period. It is a fundamental indicator of customer retention health, directly influencing key long-term metrics like Customer Lifetime Value (LTV).

**Logo Churn Rate is calculated by dividing the number of customers who churned during a period by the number of active customers at the start of that period.**



For an in-depth explanation of logo churn as a metric, see the [Logo churn guide in the SaaS Metrics Academy](/academy/logo-churn/).

---

## Overview



The Logo Churn Rate report includes a timeline chart and a breakdown table. This report is crucial for understanding the stability of your customer base. The breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart displays two lines:

1.  **Logo Churn Rate (Red Line):** 
 
    This is the primary metric, showing the calculated churn rate for the selected period.

2.  **Average 6 Months (Grey Line):** 

    This line represents the rolling average of the Logo Churn Rate over the previous six months. Churn data can be notoriously noisy (e.g., a single large customer churn in one month can spike the rate), making the 6-month average a valuable tool for identifying the underlying long-term trend, rather than short-term volatility. This smoothed rate is typically used in predictive models, such as the calculation for Customer Lifetime Value ([LTV report](./ltv)).

The report employs a specific time-window convention to ensure meaningful data, especially at daily or weekly intervals:

* **Monthly Aggregation:** 

  If you select an **Interval** of daily, weekly, or monthly, the churn calculation is performed on a **month-to-month** basis. This means the churned customers for the preceding month are compared against the active customers at the start of that month, reducing noise and providing a standardized rate that is comparable across your entire history.

* **Quarterly/Yearly Aggregation:** 

   If you select quarterly or yearly, the churn is calculated on a quarter-over-quarter or year-over-year basis, respectively.

The currently ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, interval selector, and filters.

### Breakdown table

The table underneath the chart displays the core data points for each period.

| Metric | Description |
| :--- | :--- |
| **Subscribers** | The total number of active, paying customers at the end of the period. |
| **Churn** | The number of customers who canceled all paid subscriptions during the period. |
| **Logo Churn Rate** (Red) | The calculated Logo Churn Rate for the period (displayed as a percentage). |
| **Avg. 6 Months** (Red) | The Logo Churn Rate averaged over the preceding six monthly periods (displayed as a percentage). |

The Logo Churn Rate and the 6-Month Average are typically shown in red to visually emphasize the loss of customers.

---

## Filters

The report supports a wide range of filters to help you analyze churn within specific segments. These include:

* **Date range**

    Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**

    Choose how the rate is displayed: daily, weekly, monthly, quarterly, or yearly. *Note the monthly calculation convention explained above.*

* **Additional filters** – plan, region/country, billing frequency, customer age (time since signup), etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Focus on the Grey Line:** For strategic planning (like LTV analysis, hiring, or capacity planning), rely on the **Average 6 Months (Grey Line)** to smooth out noise and understand the true long-term trend of customer retention.
* **Investigate Spikes:** Use the **Red Line** to spot anomalies. If the Logo Churn Rate significantly spikes above the 6-month average, investigate the customers in that period immediately, as it may signal a product bug, pricing change, or unexpected competitor action.
* **Isolate Problem Areas:** Use **Additional filters** to segment churn by the reason for cancellation (if collected) or the initial plan type to prioritize efforts to plug the largest retention leaks.

---

## MRR Churn Rate
<!-- url: https://growpanel.io/docs/reports-and-metrics/churn/mrr-churn -->

The **MRR Churn Rate report** (also commonly referred to as Revenue Churn Rate or Gross Revenue Churn) tracks the percentage of **Monthly Recurring Revenue (MRR)** lost from customers who cancelled their paid subscriptions during a specific period. It is a critical metric for assessing the stability and quality of your revenue streams.

MRR Churn Rate is the direct opposite of Gross Revenue Retention (GRR).

**MRR Churn Rate is calculated by dividing the MRR lost from churned customers during a period by the total MRR at the start of that period.**

For an in-depth explanation of MRR churn as a metric, see the [MRR churn guide in the SaaS Metrics Academy](/academy/mrr-churn-rate/).

---

## Overview



The MRR Churn Rate report includes a timeline chart and a breakdown table. This report is crucial for understanding the financial stability of your business, especially since losing a few large customers has a far greater impact here than on Logo Churn. The breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart displays a single line:

1.  **MRR Churn Rate (Blue line):** This is the primary metric, showing the calculated MRR churn rate for the selected period.

The report employs a specific time-window convention to ensure meaningful data, especially at daily or weekly intervals:

* **Monthly Aggregation:** If you select an **Interval** of daily, weekly, or monthly, the churn calculation is performed on a **month-to-month** basis. This means the Churn MRR for the preceding month is compared against the Starting MRR at the start of that month, reducing noise and providing a standardized rate that is comparable across your entire history.

* **Quarterly/Yearly Aggregation:** If you select quarterly or yearly, the churn is calculated on a quarter-over-quarter or year-over-year basis, respectively.

The currently ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, interval selector, and filters.

### Breakdown table

The table underneath the chart displays the core data points for each period.

| Metric | Description |
| :--- | :--- |
| **MRR** | The total MRR at the end of the period. |
| **Contraction** | The MRR lost from existing customers downgrading their subscriptions during the period. |
| **Churned MRR** | The total amount of MRR lost from customers who canceled all paid subscriptions during the period. |
| **MRR Churn Rate** | The calculated MRR Churn Rate for the period (displayed as a percentage). |

The MRR Churn Rate is typically shown in red to visually emphasize the financial loss.

---

## Filters

The report supports a wide range of filters to help you analyze revenue churn within specific segments. These include:

* **Date range**

    Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**

    Choose how the rate is displayed: daily, weekly, monthly, quarterly, or yearly. *Note the monthly calculation convention explained above.*

* **Additional filters** – plan, region/country, billing frequency, customer age (time since signup), etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Prioritize High-Value Churn:** Unlike Logo Churn, MRR Churn weights customers by their revenue. If your MRR Churn spikes, investigate the specific high-MRR customers lost immediately.
* **The Benchmark is Low:** The goal for MRR Churn Rate is to keep it as close to 0% as possible. A healthy, profitable SaaS business typically maintains a very low single-digit MRR Churn Rate.
* **Understand Gross Loss:** Note that this metric only captures MRR lost due to cancellations, not total loss from contractions. For the full picture of gross revenue loss, you would need to combine **Contraction** and **Churned MRR**.

---

## Net MRR Churn
<!-- url: https://growpanel.io/docs/reports-and-metrics/churn/net-mrr-churn -->

The **Net MRR Churn Rate report** tracks the total percentage of Monthly Recurring Revenue (MRR) lost or gained from an existing customer cohort. This metric is the net result of all forms of MRR change among existing customers: **Expansion**, **Reactivation**, **Contraction**, and **Churn**.

This metric is the inverse of Net Revenue Retention (NRR). While MRR Churn Rate focuses only on losses, Net MRR Churn Rate provides a comprehensive view of whether an existing customer base is growing or shrinking financially.

**Net MRR Churn Rate is calculated by dividing the net change in MRR (Contraction + Churned MRR - Expansion - Reactivation) during a period by the total MRR at the start of that period.**

For an in-depth explanation of net MRR churn as a metric, see the [Net MRR churn guide in the SaaS Metrics Academy](/academy/net-mrr-churn-rate/).

---

## Overview



The Net MRR Churn Rate report includes a timeline chart and a breakdown table. This report is critical because it determines whether expansion revenue is successfully offsetting revenue leakage. The breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart displays the Net MRR churn rate over time.

The report employs the same month-to-month calculation convention as other MRR reports to ensure consistent data over time.

### Breakdown table

The table underneath the chart displays the core data points for each period.

| Metric | Description |
| :--- | :--- |
| **MRR** | The total MRR at the end of the period (Starting MRR + New + Expansion + Reactivation - Contraction - Churned). This is the closing MRR. |
| **Expansion** | The MRR gained from existing customers upgrading or adding more seats/products during the period. |
| **Reactivation** | The MRR gained from former, churned customers who started a new paid subscription during the period. |
| **Contraction** | The MRR lost from downgrades (e.g., switching to a cheaper plan or fewer seats) by existing customers during the period. |
| **Churned MRR** | The MRR lost from customers who canceled all paid subscriptions during the period. |
| **Net MRR Churn Rate** | The final calculated net churn rate, displayed as a percentage. This value can be negative (e.g., -5% indicates Negative Churn). |

---

## Filters

The report supports a wide range of filters to help you analyze where revenue is being retained or lost. These include:

* **Date range**
* **Interval** (Daily, weekly, monthly, quarterly, or yearly)
* **Additional filters** – plan, region/country, billing frequency, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Aim for Negative Churn:** The ultimate goal is to keep the Net MRR Churn Rate in **negative territory** (e.g., -5% or -10%). This is the equivalent of an NRR rate of 105% or 110%, respectively.
* **Identify Drivers:** If the Net MRR Churn Rate is positive (in the red), use the **Breakdown table** to quickly determine the cause: Is the issue primarily **Churned MRR** (lost customers) or is **Contraction MRR** (downgrades) the main problem?
* **Expansion Effectiveness:** Segmenting this report by product plan or feature usage can show which customer segments are providing the most powerful **Expansion MRR** to offset losses.

---

## CMRR
<!-- url: https://growpanel.io/docs/reports-and-metrics/cmrr -->

The **CMRR (Committed Monthly Recurring Revenue) report** provides a forward-looking view of your subscription revenue, incorporating all known future changes such as scheduled churn, planned upgrades/downgrades, and expiring discounts. Some may also refer to this metric as "Contracted MRR." 

It is a vital forecasting tool in GrowPanel for assessing revenue predictability and future cash flow.

For an in-depth explanation of CMRR as a metric, see the [CMRR guide in the SaaS Metrics Academy](/academy/cmrr/).

---

## Overview

 

The CMRR report includes a chart showing the current MRR and a projection into the future, a breakdown table of committed movements, and optionally a detail table. Each is described here:

### Timeline chart

The timeline chart shows your current MRR and the projected CMRR for a selected future period, typically the next 12 months. This projection includes all future contractual changes. If you hover the chart, a tooltip will appear, detailing the committed MRR movements (explained under the Breakdown table), and the corresponding future period will be highlighted in the table underneath. The current period is marked with a dashed line. You can adjust the chart data using the date picker, currency picker, interval selector, and the wealth of filters, explained in the Filters section underneath.

Note that the numbers for a given future period show the projected MRR at the *end of that period*.

### Breakdown table

The table underneath the chart shows the *future* MRR movements that are already known and committed, broken down into movement types: Scheduled Expansion, Scheduled Contraction, and Scheduled Churn. It also shows the Net Committed Movements and the projected CMRR. The table scrolls horizontally and if you hover the columns, you'll see a line in the chart showing the corresponding period. Each type is explained here:

* **Scheduled Expansion**
Known future recurring revenue growth from existing customers due to pre-scheduled events like planned plan upgrades or the expiration of a time-limited discount.
* **Scheduled Contraction**
Known future reductions in recurring revenue due to pre-scheduled events like a planned plan downgrade or the application of a future, pre-agreed discount.
* **Scheduled Churn** Known future recurring revenue loss from customers who have already scheduled their cancellation (e.g., end-of-contract date).
* **Net Committed Movements**
The net change in MRR from all scheduled/committed movements for the given period.
* **CMRR**
The projected MRR at the end of the period, based on the current MRR plus all cumulative committed movements up to that point.

Each cell of the table shows two numbers - an amount and a number. The amount shows the sum of the committed MRR movement type in the given period. Negative amounts are typically marked with a minus in front, depending on your locale. The number next to the amount shows the number of unique customers contributing to this future movement. If a customer has multiple committed movements during the period, it's still only counted as one unique customer. Red numbers indicate customers contributing negative committed MRR, and green numbers indicate positive committed MRR movements.

If you click a cell, a detail table under the breakdown table is revealed, showing all committed MRR movements in the selected period and type.

### Detail table



This table is shown when you click a cell in the breakdown table. The table shows each *committed* MRR movement in the selected future period and type. You see the date of the scheduled event, customer name/email, the description of the committed MRR movement, the type (Scheduled Expansion/Scheduled Contraction/Scheduled Churn), and the MRR change.

Clicking the customer sends you to that customer's detail page.

---

## Filters

The report supports a wide range of filters to help you focus on specific segments of your committed revenue. These include:

* **Projection period**
Select how far into the future you want to project CMRR (e.g., next 3, 6, 12 months).
* **Interval**
Choose how CMRR movements are aggregated: monthly, quarterly, or yearly.
* **Currency** Select your reporting currency. All committed movements are converted using the current exchange rate, as future FX movements cannot be reliably committed.
* **Additional filters** – plan, region/country, billing frequency, payment method, customer age, etc. ([see all filters](https://www.google.com/search?q=../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* Use the **Projection period** to align your CMRR view with your business planning cycles (e.g., quarterly budgets).
* A high level of **Scheduled Churn** in the near future signals an urgent need for customer success intervention and proactive retention efforts.
* Analyze **Scheduled Expansion** to identify future upsell opportunities that are already in the pipeline, which helps in planning capacity.
* Combine multiple **filters** (e.g., by 'Plan' or 'Region') to assess the predictability of revenue streams from specific products or markets.

## ❓ Frequently Asked Questions

### How is CMRR different from MRR?

**MRR (Monthly Recurring Revenue)** is a snapshot of your currently active, normalized, recurring revenue. It tells you what your business is earning *right now*.

**CMRR (Committed Monthly Recurring Revenue)** is a **forward-looking projection** of your MRR. It starts with your current MRR and then adds or subtracts all future, known revenue changes that are already contractually agreed upon (e.g., scheduled downgrades, pre-booked cancellations, or expiring discounts). CMRR shows you what your MRR is *guaranteed* to be in the future, assuming no new sales or non-scheduled events occur.

### Does CMRR include New Sales or new Upsells?

No. CMRR only includes revenue movements that are already **contractually committed** based on your existing customer base. It does *not* include:

* **New Sales:** Revenue from brand new customers that you expect to acquire.
* **Future Upsells/Expansion:** Revenue from upgrades you *hope* existing customers will make, but haven't yet signed a contract for.

CMRR is a **guarantee**, not a sales forecast.

### Why does my CMRR sometimes drop significantly in a future month?

A significant drop in a future month's CMRR is often due to a "renewal cliff," specifically a large amount of **Scheduled Churn** that is known to occur at that time. This usually happens when:

* A large cohort of customers is on contracts that all expire in the same month and have already signaled they will not renew.
* A major, temporary discount for many customers is scheduled to expire, leading to a large amount of **Scheduled Contraction** if the customer has a contractual right to the reduced price (less common).

This drop is a critical warning sign that your business needs to focus on retention for that cohort *before* that month arrives.

### Is high CMRR always a good thing?

A high and stable CMRR projection is excellent, as it indicates revenue predictability. However, you should inspect the *composition* of the committed movements. If a high CMRR is being maintained primarily by large amounts of **Scheduled Expansion** being offset by equally large **Scheduled Contraction** and **Scheduled Churn** (a high volume of scheduled change), it suggests high churn risk and complex contract management, even if the net number looks stable. Aim for high CMRR with minimal negative committed movements.

### If a customer's discount expires, is that Scheduled Expansion or Contraction?

If a customer is currently paying a lower rate due to a limited-time discount and their contract states the price will revert to the full price on a specific future date:

* This is an increase in revenue on that date.
* It is counted as **Scheduled Expansion** because the MRR from that customer is scheduled to grow.

---

## Customer Concentration
<!-- url: https://growpanel.io/docs/reports-and-metrics/customer-concentration -->

The **Customer Concentration report** measures how much of your recurring revenue depends on your largest customers. High concentration means a few customers account for a significant portion of your MRR, which creates dependency risk. Low concentration indicates a more diversified and resilient customer base.

This report helps you identify revenue risk, understand your customer distribution, and plan for healthier business diversification.

For an in-depth explanation of Customer Concentration Risk, see the [Customer Concentration Risk article](/academy/customer-concentration/).

---

## Overview



The Customer Concentration report includes three main sections:

1. **Concentration metrics** – Three summary widgets showing your Top 1, Top 5, and Top 10 customer concentration
2. **Pareto chart and pie chart** – Visual representations of cumulative MRR distribution
3. **Top 50 customers table** – A detailed list of your highest-revenue customers

### Concentration metrics

At the top of the report, three metric widgets display the percentage of total MRR that comes from your top customers:

| Metric | Description | Color coding |
| :--- | :--- | :--- |
| **Top 1 Customer** | Percentage of total MRR from your single largest customer | Green: <15%, Yellow: 15-30%, Red: >30% |
| **Top 5 Customers** | Cumulative percentage of total MRR from your top 5 customers | Green: <30%, Yellow: 30-50%, Red: >50% |
| **Top 10 Customers** | Cumulative percentage of total MRR from your top 10 customers | Green: <40%, Yellow: 40-60%, Red: >60% |

The color-coded indicators provide an at-a-glance health check:
- **Green** indicates healthy diversification
- **Yellow** suggests moderate concentration worth monitoring
- **Red** signals high dependency risk that may require attention

### Pareto chart

The Pareto chart (also known as a cumulative distribution chart) shows how your MRR accumulates across customer ranks. Each bar represents the cumulative MRR up to that customer rank:

- **Individual bars (#1 through #10)** – Your top 10 customers shown individually
- **Grouped bars (11-20, 21-50, 51-100, 101+)** – Remaining customers grouped by rank ranges

This visualization helps you quickly see how much of your revenue is generated by your top customers versus the long tail of smaller accounts.

### Pie chart

The pie chart provides a visual breakdown of MRR distribution across customer segments:

- **Top 1** – Your single largest customer
- **Top 5** – Cumulative from your top 5 customers
- **Top 10** – Cumulative from your top 10 customers
- **Top 100** – Cumulative from your top 100 customers
- **Rest** – All remaining customers

Hover over any segment or legend item to highlight that portion and see the exact percentage in the center of the chart.

### Top 50 customers table



The table lists your top 50 customers ranked by MRR, showing:

| Column | Description |
| :--- | :--- |
| **#** | Customer rank by MRR |
| **Customer** | Customer name or email (clickable link to customer detail page) |
| **MRR** | Monthly recurring revenue from this customer |
| **% of Total** | This customer's share of your total MRR |
| **Country** | Customer's country (with flag) |
| **Status** | Subscription status (Active, Trialing, etc.) |

Click any customer name to navigate to their detailed customer page.

---

## Filters

The report supports filters to help you analyze concentration within specific segments:

* **Currency** – Select your reporting currency. MRR values are converted using daily historical exchange rates.

* **Additional filters** – region/country, main currency, industry, customer age, company size, acquisition channel, data source, and custom variables ([see all filters](../filters/))

Filters are applied to all sections of the report simultaneously, allowing you to see concentration metrics for specific customer segments.

> **Note:** Unlike most other reports, Customer Concentration does not include a date range filter. This is because concentration is calculated based on **current** MRR values, representing a snapshot of your business today rather than a historical trend.

---

## Exporting the data

You can **export the top 50 customers table** as a CSV file for offline analysis by clicking the download icon in the header. The export includes:

- Rank
- Customer name and email
- MRR amount
- Percentage of total
- Country
- Status

---

## Understanding concentration risk

Customer concentration is a key indicator of business health and risk:

### Why concentration matters

- **Revenue stability** – If a top customer churns, high concentration means a significant revenue impact
- **Negotiation power** – Large customers may demand discounts or special treatment
- **Investor concerns** – VCs and acquirers often scrutinize customer concentration as a risk factor
- **Growth sustainability** – Healthy businesses typically have diversified revenue streams

### Industry benchmarks

While ideal concentration varies by business model and stage, general guidelines suggest:

| Metric | Healthy | Moderate Risk | High Risk |
| :--- | :--- | :--- | :--- |
| Top 1 customer | <10% | 10-25% | >25% |
| Top 5 customers | <25% | 25-40% | >40% |
| Top 10 customers | <35% | 35-50% | >50% |

Early-stage companies often have higher concentration that decreases as they scale and diversify their customer base.

---

## Practical tips

* **Monitor trends over time:** While this report shows current concentration, track these metrics monthly to see if you're becoming more or less concentrated as you grow.

* **Segment your analysis:** Use filters to check concentration within specific regions or industries. You may find healthy overall concentration but dangerous concentration in a specific segment.

* **Plan for whale risk:** If your Top 1 customer represents >20% of MRR, develop a proactive retention strategy for that account and work to diversify by acquiring more mid-market customers.

* **Use for pricing strategy:** High concentration often indicates opportunity to move upmarket. Consider whether your pricing supports acquiring more enterprise customers while maintaining a healthy SMB base.

* **Investor preparation:** If preparing for fundraising or acquisition, aim to reduce Top 10 concentration below 40%. Investors view high concentration as execution risk.

---

## Customer Lifetime
<!-- url: https://growpanel.io/docs/reports-and-metrics/customer-lifetime -->

The **Customer Lifetime report** shows the average number of months a customer stays subscribed before churning. It provides a time-based perspective on customer retention, complementing the revenue-focused LTV report.

**Customer Lifetime is calculated by taking the inverse of the Logo Churn Rate averaged over the past six periods, normalized to a monthly rate.**



For example, if your average monthly churn rate is 5%, your customer lifetime is 20 months (1 ÷ 0.05 = 20).

> **Relationship to LTV:** Customer Lifetime and LTV are closely related. LTV = ARPA × Customer Lifetime. This report focuses on the duration component, making it easier to understand retention in terms of time rather than revenue.

---

## Overview

The Customer Lifetime report is the second tab under the LTV section. It includes a timeline chart showing customer lifetime in months and a breakdown table displaying the underlying churn rate.

### Timeline chart

The timeline chart shows your calculated Customer Lifetime over the selected period. The Y-axis displays months, making it easy to understand how long customers typically stay.

A rising trend indicates improving retention (lower churn), while a falling trend suggests customers are leaving sooner.

### Breakdown table

The table underneath the chart displays two key metrics for each period:

| Metric | Description |
| :--- | :--- |
| **Churn (avg 6m)** | The Logo Churn Rate averaged over the preceding six periods. This smoothed figure reduces volatility in the calculation. |
| **Customer Lifetime** | The calculated lifetime in months (1 ÷ Average Monthly Churn Rate). |

---

## Filters

The report supports a wide range of filters to help you analyze Customer Lifetime within specific segments of your business. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**

  Choose how Customer Lifetime is aggregated: daily, weekly, monthly, quarterly, or yearly.

* **Group by**

  Break down Customer Lifetime by plan, region, acquisition channel, or other dimensions to see which segments retain customers longest.

* **Additional filters** – plan, region/country, acquisition channel, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Benchmark by Segment:** Use the **Group by** feature to compare Customer Lifetime across different plans or acquisition channels. This reveals which customer segments have the best retention.
* **Set Retention Goals:** Customer Lifetime provides a tangible target. For example, "increase average customer lifetime from 18 to 24 months" is a concrete goal that the team can work toward.
* **Monitor Trends:** A declining Customer Lifetime is an early warning sign of retention issues. Investigate the underlying causes before they impact LTV and revenue.
* **Compare to Payback Period:** If your CAC payback period is 12 months but your Customer Lifetime is only 15 months, you have limited time to generate profit from each customer. Aim for a Customer Lifetime that is at least 3× your payback period.

---

## FAQ

### Why does Customer Lifetime differ between intervals?

Customer Lifetime is calculated from a **6-period rolling average** of churn rates, normalized to a monthly rate. Several factors cause differences between intervals:

**1. Different averaging windows**

Each interval averages 6 periods, covering different time spans:

| Interval  | Averages          |
| :-------- | :---------------- |
| Monthly   | 6 monthly rates   |
| Quarterly | 6 quarterly rates |
| Yearly    | 6 yearly rates    |

If your churn has improved over time, monthly intervals reflect recent performance, while yearly intervals include older data when churn was higher.

**2. Early periods with small customer counts**

When your business was new, churn rates can be extreme. For example, starting with 5 customers and losing 2 produces a 40% churn rate. These early periods heavily influence longer-interval averages.

**3. How churn rate is calculated**

Churn rate = churned customers ÷ customers **at the start** of the period.

New customers who join and churn within the same period count as churns, but aren't in the starting denominator. This can produce churn rates exceeding 100% in high-growth periods with short customer lifespans.

### Can churn rate exceed 100%?

Yes. If you start a year with 10 customers, acquire 50 new customers, and 15 churn (including some new ones), your annual churn rate is 15 ÷ 10 = 150%. This is most common in early-stage companies with rapid growth and high early churn.

---

## Exporting data
<!-- url: https://growpanel.io/docs/reports-and-metrics/exporting-data -->

GrowPanel allows you to export data from reports and from the dedicated **Settings → Exports** page. This guide covers all the export options available, the file formats, and how to use exported data for analysis, reporting, or integration with other tools.

---

## Export options overview

| What you can export | Where to find it | Format |
|--------------------|--------------------|--------|
| All customers | Settings → Exports | CSV |
| All MRR movements | Settings → Exports | CSV |
| Filtered customer list | Customers page | CSV |
| Report data | Any report page | CSV |
| Chart data | Chart views | CSV |

---

## Full data exports

The **Settings → Exports** page provides two bulk export options that download your complete dataset:

- **All customers** - Every customer with their status, MRR, country, payment totals, and custom metadata
- **All MRR movements** - Every individual MRR movement event (new, expansion, contraction, churn, reactivation) with details

These exports include your full history, not just the current view. See the [Exports settings](/docs/settings/exports/) page for the complete list of columns included in each export.

---

## Exporting from reports

Most reports include an export button in the top-right area of the page.

### How to export

1. Navigate to any report (MRR, ARR, Churn, etc.)
2. Apply any filters you want (date range, plan, currency, etc.)
3. Click the **Export** button
4. Choose the export format (CSV)
5. Your browser downloads the file

### What's included in the export

The exported file includes:

- **All data matching your current filters** - If you've filtered by date range, plan, or other criteria, only that subset is exported
- **All columns visible in the report** - The same data you see on screen
- **Time series data** - Each row represents one period (day, week, or month depending on your view)

### Export with different time granularities

If a report supports different time views (daily, weekly, monthly), your export will match your current selection:

| View selected | Export contains |
|---------------|-----------------|
| Daily | One row per day |
| Weekly | One row per week |
| Monthly | One row per month |

---

## Exporting chart data

When viewing charts, you can export the underlying data:

1. Click on any chart to expand it (if applicable)
2. Look for an export or download icon near the chart
3. Click to download the chart data as CSV

Chart exports include:

- The x-axis values (dates/periods)
- The y-axis values (metric values)
- Any series shown in the chart (e.g., New, Expansion, Churn for MRR bar charts)

---

## Exporting from the Customers page

You can also export a filtered customer list directly from the **Customers** page:

1. Go to **Customers** in the main menu
2. Apply any filters (status, plan, date range, custom variables, etc.)
3. Click the **Export** button

This exports only the customers matching your current filters, which is useful when you need a specific subset rather than the full customer list.

---

## Export file format

All exports use **CSV (Comma-Separated Values)** format:

- Compatible with Excel, Google Sheets, and most data tools
- UTF-8 encoding for international characters
- First row contains column headers
- Dates formatted as YYYY-MM-DD
- Currency amounts in the reporting currency (unless exporting original currencies)

### Opening exports in Excel

1. Download the CSV file
2. Open Excel
3. Go to **File → Open** and select the CSV
4. Excel automatically parses the columns

### Opening exports in Google Sheets

1. Download the CSV file
2. Open Google Sheets
3. Go to **File → Import**
4. Upload the CSV file
5. Choose "Replace spreadsheet" or "Insert new sheet"

---

## Currency in exports

Exports include currency information based on your settings:

### Single currency exports

If you have one currency or use a single reporting currency:

- All amounts are in your reporting currency
- No separate currency column needed

### Multi-currency exports

If you have multiple currencies:

- **Reporting currency column** - Amounts converted to your reporting currency
- **Original currency column** - The currency the customer pays in
- **Original amount column** - The amount in the original currency

### Fix FX in exports

If you've enabled "Fix FX" (fixed exchange rates) in a report:

- Exports use the same fixed rates
- This ensures consistency between what you see and what you export

---

## Scheduled exports

GrowPanel supports scheduled email reports that automatically send exports on a recurring basis.

### Setting up scheduled exports

1. Go to **Settings → Notifications**
2. Click **Add scheduled report**
3. Choose the report type
4. Select the frequency (daily, weekly, monthly)
5. Choose recipients
6. Save the schedule

### What scheduled exports include

- The same data as manual exports
- Matching the configured filters and date range
- Attached as a CSV file to the email

See [Notifications](/docs/settings/notifications/) for detailed setup instructions.

---

## API access for exports

For programmatic access to your data, use the REST API instead of manual exports.

### Benefits of API access

- **Automation** - Schedule data pulls without manual downloads
- **Integration** - Feed data directly into your systems
- **Real-time** - Access current data without waiting for exports
- **Customization** - Query exactly the data you need

See the [REST API documentation](/developers/) for endpoint details.

---

## Tips for working with exports

### Combining exports

For comprehensive analysis, export both customers and MRR movements from **Settings → Exports**, then join them on Customer ID in your spreadsheet or data tool.

---

## Troubleshooting exports

| Problem | Solution |
|---------|----------|
| Export button not visible | Check that you have appropriate permissions (Admin or Owner) |
| Export takes too long | Apply date filters to reduce data volume |
| File won't open | Ensure UTF-8 encoding is selected when opening |
| Numbers formatted as text | Use Excel's Text to Columns feature to fix number formatting |
| Dates incorrect | Check your system's regional date settings |

---

## Related pages

- [Exports settings](/docs/settings/exports/) - Download all customers and MRR movements
- [Filters](/docs/reports-and-metrics/filters/) - Filtering data before export
- [Notifications](/docs/settings/notifications/) - Scheduled email reports
- [REST API](/developers/) - Programmatic data access

---

## Failed Payments
<!-- url: https://growpanel.io/docs/reports-and-metrics/failed-payments -->

The **Failed Payments report** tracks payment failures and their outcomes, helping you understand how much revenue is at risk from failed charges and how effectively your recovery processes are working.

This report is accessible from the Cashflow tab group under "Failed payments".

---

## Overview

Failed payments are a normal part of running a subscription business. Cards expire, bank accounts have insufficient funds, and technical issues occur. What matters is how these failures are resolved: either the payment is **recovered** (eventually succeeds), the customer **churns** (involuntary churn due to non-payment), or it remains **at risk** (pending resolution).

### Timeline chart

The timeline chart displays a stacked bar for each period showing how failed payments were resolved:

| Segment | Color | Description |
| :--- | :--- | :--- |
| **Recovered** | Green (bottom) | Failed payments that eventually succeeded |
| **At Risk** | Orange (middle) | Failed payments still pending resolution |
| **Churned** | Red (top) | Failed payments where the customer churned |

The total bar height represents the total amount of failed invoices in that period. Older periods typically show less "At Risk" (orange) as payments have had more time to either recover or result in churn.

### Movement table

The movement table shows detailed metrics across time periods:

| Row | Description |
| :--- | :--- |
| **Total failed** | Total amount of failed invoices in each period |
| **Recovered** | Amount that eventually recovered (click to see details) |
| **At risk** | Amount still pending resolution (click to see details) |
| **Churned** | Amount lost to customer churn (click to see details) |
| **Failed %** | Percentage of invoices that had at least one failure |
| **Recovery rate** | Percentage of failed invoices that recovered |
| **Affected customers** | Number of unique customers with payment failures |

### Detail table

Click on any Recovered, At Risk, or Churned cell to see the individual invoices in that status. The detail table shows:

* **Date** - First failure date for the invoice
* **Customer** - Who the invoice belongs to (links to customer profile)
* **Description** - Invoice reference or description
* **Status** - Current status (Recovered, At Risk, or Churned)
* **Attempts** - Number of payment attempts made
* **Amount** - The invoice amount

---

## How recovery is determined

GrowPanel tracks the **latest transaction status** for each invoice to determine recovery:

* **Recovered**: The most recent transaction for the invoice has `status = success`
* **At Risk**: The most recent transaction is `failed` AND the customer is still active
* **Churned**: The most recent transaction is `failed` AND the customer has churned

This approach ensures that retry attempts and eventual successes are properly tracked, even if there were multiple failed attempts before success.

---

## Summary metrics

The summary section shows key metrics:

* **Revenue at risk (MTD)** - Month-to-date unrecovered failed payment amount
* **Recovery rate (MTD)** - Percentage of failed invoices recovered, month-to-date
* **Revenue at risk (YTD)** - Year-to-date unrecovered failed payment amount
* **Recovery rate (YTD)** - Percentage of failed invoices recovered, year-to-date

Arrows indicate improvement (green) or deterioration (red) compared to the prior period.

---

## Filters

The Failed Payments report supports comprehensive filtering:

* **Date range** - Select custom ranges or preset periods
* **Interval** - View by day, week, month, quarter, or year
* **Currency** - Choose your reporting currency
* **Payment method** - Filter by card, ACH, SEPA, etc.
* **Additional filters** - Filter by plan, region, customer segment, etc. ([see all filters](../filters/))

---

## What's excluded

The Failed Payments report excludes:

* **Refunds** - Negative amounts (refunds) are filtered out to show only failed charge attempts
* **Duplicate retries** - Invoices are grouped by invoice reference, showing only one entry per invoice regardless of retry attempts

---

## Exporting the data

Export the failed payments data as CSV by clicking the download icon.

---

## Practical tips

* **Recovery optimization**: If your recovery rate is below 50%, consider implementing dunning workflows, smart retry logic, or card updater services.
* **Payment method analysis**: Use the payment method filter to identify if certain payment methods have higher failure rates.
* **Churn prevention**: Failed payments that result in churn represent involuntary churn. Reducing this through better recovery can significantly improve your retention.
* **Monitoring**: Set up alerts for unusual spikes in failed payments which could indicate technical issues with your payment processor.

---

## Failure Rate
<!-- url: https://growpanel.io/docs/reports-and-metrics/failure-rate -->

The **Failure Rate report** tracks the percentage of invoices that experience at least one payment failure over time. While the [Failed Payments report](../failed-payments/) shows absolute amounts, this report focuses on the failure rate trend.

This report is accessible from the Cashflow tab group.

---

## Overview

The failure rate measures what percentage of your invoices had at least one failed payment attempt. A lower rate means a healthier payment system.

### Timeline chart

The timeline chart displays the failure rate as a line over time. Hover over any point to see the exact value for that period.

### Movement table

The movement table shows detailed data across time periods:

| Row | Description |
| :--- | :--- |
| **Failed %** | Percentage of invoices that had at least one failure |
| **Failed invoices** | Count of invoices with failures |
| **Total invoices** | Total invoice count for the period |

Color coding indicates health:
* Green if ≤ 5%
* Red if > 5%

---

## Summary metrics

The summary section shows:

* **Failed % (MTD)** - Month-to-date failure percentage with change from prior month
* **Failed % (YTD)** - Year-to-date failure percentage with change from prior year

Changes are shown in percentage points (pp). For example, "+2pp" means the metric increased by 2 percentage points.

A negative change (green) means fewer failures — which is good.

---

## Calculating the metric

```
Failed % = (Invoices with ≥1 failure) / (Total invoices) × 100
```

An invoice is counted as "failed" if it had at least one failed payment attempt, regardless of how many retries occurred.

---

## Filters

The Failure Rate report supports comprehensive filtering:

* **Date range** - Select custom ranges or preset periods
* **Interval** - View by day, week, month, quarter, or year
* **Currency** - Choose your reporting currency
* **Payment method** - Filter by card, ACH, SEPA, etc.
* **Additional filters** - Filter by plan, region, customer segment, etc. ([see all filters](../filters/))

---

## Benchmarks

Typical benchmarks for SaaS businesses:

| Healthy | Needs Attention | Critical |
| :--- | :--- | :--- |
| < 3% | 3-8% | > 8% |

These benchmarks vary by industry, payment method mix, and customer type. B2C businesses with credit card payments often see higher failure rates than B2B businesses.

---

## Exporting the data

Export the failure rate data as CSV by clicking the download icon.

---

## Practical tips

* **Track trends**: Small changes in failure rates compound over time. A 1% increase in failed % directly impacts your revenue and churn.
* **Payment method comparison**: Use filters to compare failure rates across different payment methods. Some methods (like ACH) have different failure patterns than credit cards.
* **Seasonal patterns**: Some months naturally have higher failure rates (e.g., January after annual renewals). Understanding your patterns helps set realistic targets.

---

## Related pages

* [Recovery Rate](../recovery-rate/) - Track how well you recover failed payments
* [Failed Payments](../failed-payments/) - See failed payment amounts and details
* [Filters](../filters/) - All available filter options

---

## Filters
<!-- url: https://growpanel.io/docs/reports-and-metrics/filters -->

GrowPanel reports provide a rich set of filters that allow you to focus on specific segments of your customer base or subscription metrics. Filters are applied across most reports, including MRR, ARPA, churn, cohorts, and cashflow, and can be combined to create highly targeted analyses.

For a visual reference, filters are typically accessible at the top of a report page, above charts and tables.

---

## Standard filters

These filters are available by default for most reports:

* **Plan** – filter by subscription plan or product tier.
* **Region / Country** – select one or multiple countries or larger regions.
* **Currency** – filter by billing currency. You can also fix the reporting currency in some reports to normalize FX impact.
* **Payment method** – filter by credit card, ACH, PayPal, or other payment methods.
* **Pricing model** – filter by licensed (most used) or metered (only for Stripe data sources)
* **Customer age** – filter based on the length of time since the customer's first registered recurring revenue.
* **Industry** – filter customers by industry or business sector.
* **Company size** – filter by employee count, revenue, or other company size metrics.
* **Channel** – filter by acquisition source or marketing channel.
* **Data source** – filter based on whether the customer data came from Stripe, manual import, or other connected data sources.

---

## Customer-specific variables

In addition to standard filters, GrowPanel supports **custom customer variables**, which include:

* **Default fields**: name, email, currency, country, trial start date, paid start date, and status.
* **Stripe metadata or custom fields**: any additional information imported from Stripe or uploaded via CSV. Examples include subscription ID, tags, account manager, or any custom metadata that you define.

These variables can be used as filters across reports, allowing for granular segmentation. For instance, you could filter MRR for customers tagged with "enterprise" in your Stripe metadata, or view churn only for users in a specific industry.

---

## Reports and metrics
<!-- url: https://growpanel.io/docs/reports-and-metrics/ -->

GrowPanel provides a comprehensive suite of reports and metrics that help you understand your business performance, track growth, and make data-driven decisions. In this section, you'll find detailed explanations of each report, the metrics they include, and guidance on how to use filters, export data, and interpret the results.

Each report allows you to slice and dice your data using common filters such as:

* **Date range** – view historical or custom periods
* **Plan or subscription tier** – focus on specific product or service tiers
* **Region or country** – analyze your business geographically
* **Billing frequency** – monthly, annual, or other subscription types
* **Payment type** – credit card, ACH, or other payment methods

Reports are organized to provide insights on different aspects of your business, including revenue, customer behavior, trial conversions, churn, and cohort performance. Most reports also allow CSV exports for offline analysis or integration with other tools.

Use this section to learn how each report works, what each metric means, and how to get the most out of GrowPanel's analytics capabilities.

For deep-dive explanations of SaaS metrics (independent of GrowPanel), visit the [SaaS Metrics Academy](/academy/).

---

## Leads
<!-- url: https://growpanel.io/docs/reports-and-metrics/leads -->

The **Leads report** provides a foundational view of your sales funnel, tracking the volume of new customer records (leads) created within a specific period and measuring their conversion efficiency. This report focuses on the earliest stage of the customer lifecycle.

---

## Overview



The Leads report includes a timeline chart, a breakdown table, and a detail table for in-depth analysis of customer records.

### Timeline chart

The timeline chart is a **bar chart** showing the number of new leads created over the selected period. Hovering over a bar displays a tooltip with the total number of **Leads** for that period.

The bar corresponding to the currently ongoing period includes a crucial feature:
* **Projected End-of-Period Number:** The striped part of the final bar represents the predicted lead volume by the end of the period, based on current trends. This projection makes it easy to assess, mid-period, whether your current performance is on track or exceeding historical acquisition rates.

### Breakdown table

The table underneath the chart tracks the flow of leads through the top of your sales funnel, all tied back to the lead's initial creation date.

| Metric | Description |
| :--- | :--- |
| **Leads** | The total number of customer records created during the period. |
| **Trials** | The number of leads (customers created during this period) who have *had* a trial subscription at any point. |
| **Converted** | The number of leads (customers created during this period) who have *later* started a paid subscription. |
| **Lead-to-trial rate** | The conversion rate from leads to trials (Trials / Leads). |
| **Lead-to-paid rate** | The conversion rate from leads to paid customers (Converted / Leads). |
| **Trial-to-paid rate** | The conversion rate from trials to paid customers (Converted / Trials). |

> **Note on date logic:** All conversion rates in this table are based on the *customer creation date*. The actual start dates for the trial and paid subscriptions may occur *after* the period shown in the table. This historical view helps measure the long-term effectiveness of leads generated in a specific month.

If you click a number in the **Leads**, **Trials**, or **Converted** columns, a detail table under the breakdown table is revealed, showing the individual customer records that contributed to that number.

The last column in the table includes the projected numbers for Leads and Trials.

### Detail table



This table is shown when you click a count cell in the breakdown table. Unlike MRR reports, this table displays customer record attributes related to the lead lifecycle:

* **Created:** The date the customer record (lead) was created.
* **Customer name:** The name of the customer.
* **Email:** The customer's email address.
* **Trial started:** The date the trial subscription began (can be empty).
* **Paid started:** The date the first paid subscription began (can be empty).
* **Cancel date:** The date the customer last canceled their paid subscription (can be empty).
* **Status:** The current status of the customer record: `Lead`, `Trialing`, `Trial ended`, `Active`, `Cancelled`, or `Past due`.

Clicking any row sends you to the customer's detail page.

---

## Filters

The report supports the same filters as the customer list. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how lead generation is aggregated: daily, weekly, monthly, quarterly, or yearly.

* **Additional filters** – region/country, main currency, data source, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Monitor the projected bar:** Use the striped projection on the final chart bar to make mid-period adjustments to marketing spend or acquisition focus if you are falling short of your lead goal.
* **Isolate high-converting channels:** Use **additional filters** to view conversion rates (e.g., Lead-to-paid) by acquisition source. Focus resources on channels that consistently deliver high-quality leads, even if the total lead volume is lower.
* **Conversion lag:** Be aware of the lag between creation date and conversion date. For long sales cycles, look at older periods (e.g., last quarter) to get the most accurate, fully realized Lead-to-paid rates.

---

## LTV
<!-- url: https://growpanel.io/docs/reports-and-metrics/ltv -->

The **LTV (customer lifetime value) report** estimates the total revenue a typical customer will generate over their entire lifespan as a paying subscriber. It is one of the most important high-level SaaS metrics in GrowPanel, as it is the foundation for calculating the critical LTV:CAC (Lifetime Value to Customer Acquisition Cost) ratio.

**LTV is calculated by taking the Average Revenue Per Account (ARPA) and dividing it by the Logo Churn Rate (LCR) averaged over the past six months.**



> **Note on Simplification:** This formula represents a simplified, common industry convention. It assumes a flat churn rate for all customers, regardless of their plan or tenure. In reality, long-time customers often have lower churn rates than new ones. While simplified, this LTV calculation remains a powerful and consistent benchmark for tracking the value of your average customer over time.

For an in-depth explanation of LTV as a metric, see the [LTV guide in the SaaS Metrics Academy](/academy/ltv/).

---

## Overview



The LTV report includes a timeline chart and a breakdown table. Since LTV is derived from two other calculated metrics (ARPA and Logo Churn Rate), the table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart shows your calculated LTV over the selected period. If you hover the chart, you'll see a tooltip displaying the underlying components: the ARPA and the Average 6-Month Logo Churn Rate used in the calculation for that specific period. The currently ongoing period is marked as a dashed line.

The LTV line helps you track the strategic impact of changes to your pricing (which affects ARPA) and your retention efforts (which affects Churn Rate).

### Breakdown table

The table underneath the chart displays the three core components used to calculate LTV for each period.

| Metric | Description |
| :--- | :--- |
| **Churn (avg 6m)** (Red) | The Logo Churn Rate averaged over the preceding six monthly periods. This smoothed figure is used in the LTV formula to reduce volatility. |
| **ARPA** | The Average Revenue Per Account (MRR / Subscribers) for the period. |
| **LTV** | The calculated Customer Lifetime Value (ARPA / Avg. 6-Month Churn Rate). |

The churn rate is typically shown in red as it represents customer loss, while LTV is an important financial output, displayed as an amount.

---

## Filters

The report supports a wide range of filters to help you analyze LTV within specific segments of your business. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how LTV is aggregated: daily, weekly, monthly, quarterly, or yearly.

* **Currency** Select your reporting currency. This affects the ARPA and the resulting LTV. When switching reporting currency, the reports are calculated on the fly using daily historical exchange rates. If you want to **fix/freeze** FX rates in your reports, you can tick a checkbox, and all FX rates are fixed at the start date of the report.

* **Additional filters** – plan, region/country, acquisition channel, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Segmentation is Essential:** Use **Additional filters** to calculate LTV based on the customer's **acquisition channel** or **initial product plan**. This allows you to allocate marketing budget effectively toward channels that bring in the highest value customers.
* **The LTV:CAC Ratio:** Use the LTV data here to determine your **LTV:CAC ratio**. A ratio of 3:1 or higher is often considered healthy for a SaaS business, meaning the customer brings in three times the revenue it cost to acquire them.
* **Impact of Changes:** Look for upward trends in LTV. An increase is typically the result of either increasing prices (higher ARPA) or improving retention (lower Churn Rate).

---

## World Map
<!-- url: https://growpanel.io/docs/reports-and-metrics/map -->

The **World Map report** provides a geographic visualization of your customer distribution and revenue across different countries and regions. This report helps you understand where your customers are located and identify high-potential markets for expansion.

---

## Overview



The World Map report displays an interactive map where countries are color-coded based on the selected metric (MRR, customer count, or ARPA). Darker shades indicate higher values.

### Interactive map

* **Hover** over any country to see detailed metrics for that location
* **Click** a country to filter all reports by that geographic region
* **Zoom** in and out to explore specific regions in more detail

### Metrics table

Below the map, a table ranks all countries by the selected metric:

| Column | Description |
| :--- | :--- |
| **Country** | The country name and flag |
| **MRR** | Monthly Recurring Revenue from customers in that country |
| **Customers** | Number of active paying customers |
| **ARPA** | Average Revenue Per Account for that country |
| **% of Total** | Percentage of your total MRR from that country |

Click any country row to see the individual customers from that location.

---

## Visualization modes

Switch between different visualization modes:

* **MRR** - Color countries by total monthly recurring revenue
* **Customers** - Color countries by number of paying customers
* **ARPA** - Color countries by average revenue per account (useful for identifying high-value markets)
* **Trials** - Color countries by number of active trials (to spot emerging markets)

---

## Filters

The World Map report supports:

* **Date range** - View data as of a specific date or track changes over time
* **Currency** - Display values in your preferred reporting currency
* **Additional filters** - Filter by plan, acquisition channel, customer age, etc. ([see all filters](../filters/))

---

## Exporting the data

Export the country breakdown as CSV by clicking the "Export" icon. The export includes all metrics for each country.

---

## Practical tips

* **Market Expansion**: Use the map to identify countries with high ARPA but low customer counts - these may be underserved markets with expansion potential.
* **Localization Priority**: Countries with many customers but below-average ARPA might benefit from localized pricing or features.
* **Trial Conversion**: Compare the Trials view with the Customers view to see which countries have the best trial-to-paid conversion rates.
* **Currency Strategy**: If you see high MRR from countries with volatile currencies, consider offering local currency pricing to reduce churn from FX fluctuations.

---

## MRR
<!-- url: https://growpanel.io/docs/reports-and-metrics/mrr -->

The **MRR (Monthly Recurring Revenue) report** provides a detailed view of your subscription revenue over time. It is a central tool in GrowPanel for tracking growth, understanding revenue trends, and identifying customer behavior patterns.

For an in-depth explanation of MRR as a metric, see the [MRR guide in the SaaS Metrics Academy](/academy/mrr/).

---

## Overview



The MRR report includes a chart, a breakdown table, and optionally a detail table. Each is described here:

### Timeline chart

The timeline chart shows your MRR over the selected period. If you hover the chart, you'll see a tooltip with the MRR movements broken down in types (explained under the Breakdown table), and you'll see the corresponding period marked in the table underneath. The currenly ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, currency picker, interval selector and a wealth of filters, explained in the Filters section underneath.

Note that the numbers for a given period shows how those numbers looked at the *end of the period*. 

### Breakdown table

The table underneath the chart shows the MRR, broken down into MRR movement types: New, expansion, reactivation, contraction, churn. It also shows Net MRR movements and currency fluctuations (FX impact). The table scrolls horizontally and if you hover the columns, you'll see a line in the chart showing the corresponding period. Each type is explained here:

  * **New**
    
    Recurring revenue from newly acquired customers.

  * **Expansion**
    
    Recurring revenue growth from existing customers due to upgrades, discount changes or billing frequency updates. A change from yearly to monthly payment can also contribute to expansion if the monthly plan has higher MRR.

  * **Reactivation** 
    
    Recurring revenue recovered from returning customers that previously churned.

  * **Contractions**
    
    Reductions in recurring revenue from downgrades, discount changes, prices changes or billing frequency changes. A change from monthly to yearly payment can also contribute to contraction if the annual plan is cheaper on a monthly basis.

  * **Churn** 
  
    Recurring revenue lost from cancellations. A cancellation is classified as a churn when the customer does not have any other active subscriptions, and the MRR is zero.

  * **MRR change**
  
    Net MRR change from real MRR movements (doesn't include currency fluctuations).
  
  * **FX impact**
    
    Changes due to currency exchange rate fluctuations. This line is only shown if customers pay in a currency that's different that the reporting currency.

  * **MRR**
    
    The MRR at the end of the period, including both MRR movements and FX impact.

Each cell of the table shows two numbers - an amount and a number. The amount shows the sum of the MRR movement type in the given period. Negative amounts are typically marked with a minus in front, depending on your locale. The number next to the amount shows the number of unique customers that contributed to this number. If a customer has multiple movements during the period, it's still only counted as one unique customer. Red numbers mean that the customers contributed with negative MRR, and green numbers mean positive MRR movements.

If you click a cell, a detail table under the breakdown table is revealed, showing all MRR movements in the selected period and type.

### Detail table



This table is shown when you click a cell in the breakdown table. The table shows each MRR movement in the selected period and type. You see the date, customer name/email, the description of the MRR movement, the type (New/Expansion/Reactivation/Contraction/Churn) and the MRR change. If the MRR change is in a different currency than the reporting currency, you see the converted amount as well as the original amount in parantheses.

Clicking the customer sends you to that customer's detail page.

---

## Filters

The report supports a wide range of filters to help you focus on specific segments of your business. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how MRR is aggregated: daily, weekly, monthly, quarterly, or yearly

* **Currency** 

  Select your reporting currency. When switching reporting currency, the reports are calculated on the fly using daily historical exchange rates. If you want to **fix/freeze** FX rates in your reports, you can tick a checkbox, and all FX rates are fixed at the start date of the report. Example: if you see "Year to date", all FX rates will be fixed at the 1st of january. 

* **Additional filters** – plan, region/country, billing frequency, payment method, customer age, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* Use the **interval** selector to understand trends at different granularities. Weekly intervals are useful for spotting short-term fluctuations, while monthly or quarterly intervals give a longer-term view.
* Use "All time" in the date picker to show you the numbers from when your first customer signed up.
* **Fixing the currency** is recommended when analyzing historical performance across multiple currencies, as it removes FX volatility from the analysis.
* Combine multiple **filters** to isolate specific customer segments or product lines, enabling precise revenue insights.

---

## Subscription Quantities
<!-- url: https://growpanel.io/docs/reports-and-metrics/quantities -->

The **Subscription Quantities report** provides a detailed view of the total number of units, seats, or licenses active across your subscription base. While the Subscribers report tracks unique customers, this report focuses on the total volume of billable units, making it essential for seat-based or volume-based pricing models.

---

## Overview

 

The Subscription Quantities report includes a chart, a breakdown table, and optionally a detail table. Each is described here:

### Timeline chart

The timeline chart shows your total active quantity (e.g., total seats) over the selected period. If you hover the chart, you'll see a tooltip with the quantity movements broken down by type (explained under the Breakdown table). The currently ongoing period is marked with a dashed line. You can adjust the chart data using the date picker, interval selector, and various filters.

Note that the numbers for a given period show how the total quantity looked at the *end of the period*. 

### Breakdown table
 
The table underneath the chart shows the quantity movements, broken down into types: New, Expansion, Reactivation, Contraction, and Churn. Each type is explained here:

  * **New**: The quantity (seats/units) added by brand-new customers who started a paid subscription.

  * **Expansion**: Quantity growth from existing customers, such as an account adding more seats or upgrading to a plan with a higher unit count - or adding an add-on subscription

  * **Reactivation**: Quantity recovered from returning customers who previously churned.

  * **Contraction**: Quantity lost from existing customers who reduced their seat count, downgraded to a plan with fewer units, or removed an add-on subscription.

  * **Churn**: Quantity lost from customers who cancelled their subscriptions entirely.

  * **Net Change**
  
    The net change in total quantity during the period (New + Expansion + Reactivation - Contraction - Churn).
  
  * **Total Quantity**
    
    The total number of active units/seats at the end of the period.

Each cell of the table shows a number representing the sum of units for that movement type. Red numbers indicate negative movement (Contraction, Churn), and green numbers indicate positive movement (New, Expansion, Reactivation).

If you click a cell, a detail table under the breakdown table is revealed, showing the individual customer movements that contributed to that specific quantity change.

### Detail table



This table is revealed when you click a cell in the breakdown table. It lists every individual quantity change in the selected period. You see the date, customer name/email, the description of the event, the movement type, and the specific quantity change (e.g., +5 or -2).

Clicking a customer entry will take you to that customer's detail page.

---

## Filters

The report supports a wide range of filters to help you analyze specific segments of your seat-based growth:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.).

* **Interval**
 
  Choose how quantity changes are aggregated: daily, weekly, monthly, quarterly, or yearly.

* **Additional filters** – plan, region/country, billing frequency, and customer age. ([see all filters](../filters/))

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Expansion vs. New:** Compare "New" quantity with "Expansion" quantity. If Expansion is higher, your existing customers are your primary growth engine (common in "Land and Expand" strategies).
* **Seat Churn vs. Customer Churn:** Use this report alongside the Subscribers report. If your "Total Subscribers" is flat but "Total Quantity" is dropping, your customers are staying but downsizing their usage (Contraction).
* **Average Account Size:** Use the "Total Quantity" and divide by "Total Subscribers" to calculate your average seats per customer, which is a key indicator of moving upmarket.

---

## Quick ratio
<!-- url: https://growpanel.io/docs/reports-and-metrics/quick-ratio -->

The **Quick Ratio report** (also known as SaaS Quick Ratio) is a measure of your business's growth efficiency. It quantifies how effectively you are adding recurring revenue compared to the amount of recurring revenue you are losing.

A Quick Ratio of **above 1.0** indicates that you are adding more revenue than you are losing, signaling sustainable growth. A ratio **below 1.0** suggests that revenue loss is outpacing gains, which may require immediate attention to retention and acquisition efforts.

**The Quick Ratio is calculated by summing all positive MRR movements (New and Expansion) and dividing them by the sum of all negative MRR movements (Contraction and Churn).**



> **Note on Reactivation:** Reactivation MRR is typically excluded from the Quick Ratio calculation as it represents recovered revenue, not net new growth, allowing the ratio to focus purely on the efficiency of your core acquisition and retention funnel.

---

## Overview



The Quick Ratio report includes a timeline chart, a breakdown table, and optionally a detail table.

### Timeline chart

The timeline chart shows your calculated Quick Ratio over the selected period.

* If the ratio is **above 1.0**, the chart line is rendered in **green** on a green background.
* If the ratio is **at or below 1.0**, the chart line is rendered in **red** on a red background.

If you hover the chart, you'll see a tooltip displaying the key components (Gained MRR and Lost MRR) used in the ratio calculation for that specific period. The currently ongoing period is marked as a dashed line.

### Breakdown table

The table underneath the chart breaks down the revenue movements into their constituent parts and shows the final Quick Ratio.

| Metric | Amount | Customers | Description |
| :--- | :--- | :--- | :--- |
| **New** | MRR amount | Number of customers | Recurring revenue from newly acquired customers. |
| **Expansion** | MRR amount | Number of customers | Recurring revenue growth from existing customers (upgrades, etc.). |
| **Contraction** | MRR amount | Number of customers | Reductions in recurring revenue from downgrades or discounts. |
| **Churn** | MRR amount | Number of customers | Recurring revenue lost from cancellations. |
| **SaaS Quick Ratio** | Final ratio | N/A | Gained MRR / Lost MRR. |

Each cell in the **Amount** and **Customers** columns for New, Expansion, Contraction, and Churn shows two numbers—an amount and a unique customer count. Green customer numbers indicate positive MRR movements (New, Expansion), and red customer numbers indicate negative MRR movements (Contraction, Churn).

If you click a cell showing a customer count, a detail table under the breakdown table is revealed, showing all MRR movements in the selected period and type.

### Detail table

This table is shown when you click a customer count cell in the breakdown table. The table shows each individual MRR movement contributing to the selected cell (e.g., all Expansion movements in that period). You see the date, customer name/email, the description of the MRR movement, the type, and the MRR change.

Clicking the customer sends you to that customer's detail page.

---

## Filters

The report supports a wide range of filters to help you isolate specific segments and analyze growth efficiency. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how the Quick Ratio is aggregated: daily, weekly, monthly, quarterly, or yearly.

* **Currency** Select your reporting currency. When switching currency, the MRR components are recalculated using daily historical exchange rates.

* **Additional filters** – plan, region/country, acquisition channel, customer age, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Target a High Ratio:** Ideally, a SaaS business should aim for a Quick Ratio consistently above 3.0, indicating strong, resilient growth.
* **Diagnose the Problem:** If the Quick Ratio is low (near or below 1.0), look at the **Lost MRR** and **Gained MRR** components in the breakdown table to diagnose the issue: Are your acquisition/upsell efforts stalling (low Gained MRR), or are retention issues spiking (high Lost MRR)?
* **Segment for Action:** Use **Additional filters** to check the Quick Ratio for specific product lines or regions. You may find that while your overall ratio is healthy, a particular segment has a ratio below 1.0, highlighting a specific area for immediate retention focus.

---

## Recovery Rate
<!-- url: https://growpanel.io/docs/reports-and-metrics/recovery-rate -->

The **Recovery Rate report** tracks the percentage of failed invoices that eventually recover — meaning the payment goes through after one or more retries. A high recovery rate means your dunning and retry processes are working well.

This report is accessible from the Cashflow tab group.

---

## Overview

The recovery rate measures how effectively your payment system handles failures. Of all invoices that experienced at least one failed payment attempt, how many ultimately succeeded?

### Timeline chart

The timeline chart displays the recovery rate as a line over time. Hover over any point to see the exact value for that period.

### Movement table

The movement table shows detailed data across time periods:

| Row | Description |
| :--- | :--- |
| **Recovery rate** | Percentage of failed invoices that recovered |
| **Recovered invoices** | Count of failed invoices that eventually succeeded |
| **Failed invoices** | Total count of invoices with failures |

Color coding indicates health:
* Green if ≥ 50%
* Red if < 50%

---

## Summary metrics

The summary section shows:

* **Recovery rate (MTD)** - Month-to-date recovery rate with change from prior month
* **Recovery rate (YTD)** - Year-to-date recovery rate with change from prior year

Changes are shown in percentage points (pp). For example, "+5pp" means the metric increased by 5 percentage points.

A positive change (green) means better recovery — which is good.

---

## Calculating the metric

```
Recovery Rate = (Recovered invoices) / (Failed invoices) × 100
```

An invoice is "recovered" if its most recent transaction status is `success`, meaning the payment eventually went through after initially failing.

---

## Filters

The Recovery Rate report supports comprehensive filtering:

* **Date range** - Select custom ranges or preset periods
* **Interval** - View by day, week, month, quarter, or year
* **Currency** - Choose your reporting currency
* **Payment method** - Filter by card, ACH, SEPA, etc.
* **Additional filters** - Filter by plan, region, customer segment, etc. ([see all filters](../filters/))

---

## Benchmarks

Typical benchmarks for SaaS businesses:

| Healthy | Needs Attention | Critical |
| :--- | :--- | :--- |
| > 70% | 50-70% | < 50% |

These benchmarks vary by industry, payment method mix, and customer type.

---

## Exporting the data

Export the recovery rate data as CSV by clicking the download icon.

---

## Improving your recovery rate

If your recovery rate is below 60%, consider implementing:

* **Smart retry scheduling** - Retry at optimal times (e.g., shortly after payday)
* **Card updater services** - Automatically update expired or replaced card numbers
* **Customer communication workflows** - Email/SMS dunning sequences to prompt customers to update payment details
* **Backup payment methods** - Allow customers to add a secondary payment method as fallback

---

## Related pages

* [Failure Rate](../failure-rate/) - Track what percentage of invoices fail
* [Failed Payments](../failed-payments/) - See failed payment amounts and details
* [Filters](../filters/) - All available filter options

---

## Refunds
<!-- url: https://growpanel.io/docs/reports-and-metrics/refunds -->

The **Refunds report** provides visibility into all refunds issued to your customers. Understanding your refund patterns helps identify product issues, customer satisfaction problems, or billing disputes that may need attention.

This report is accessible from the Cashflow tab group under "Refunds".

---

## Overview

The Refunds report includes a timeline chart showing your total refunds over time, along with a detailed breakdown table and transaction-level detail.

### Timeline chart

The timeline chart displays total refund amounts over the selected period, shown in red since refunds represent money flowing out of your business.

Hover over any bar to see the refund amount and count for that period.

### Movement table

The movement table shows refund data across time periods:

| Row | Description |
| :--- | :--- |
| **Total refunds** | Total amount refunded in each period |
| **Refund count** | Number of individual refunds issued |
| **Refund rate** | Percentage of revenue refunded |

### Detail table

Click on any cell in the movement table to see the individual refund transactions for that period. The detail table shows:

* **Date** - When the refund was issued
* **Customer** - Who received the refund (links to customer profile)
* **Description** - The invoice or transaction reference
* **Amount** - The refund amount in both the original currency and your base currency

---

## Summary metrics

The summary section at the top shows key metrics:

* **Refunds (MTD)** - Month-to-date refund total with comparison to the same period last month
* **Refund rate (MTD)** - Refunds as a percentage of revenue, month-to-date
* **Refunds (YTD)** - Year-to-date refund total with comparison to the same period last year
* **Refund rate (YTD)** - Refunds as a percentage of revenue, year-to-date

Green/red indicators show whether metrics are improving or deteriorating compared to the prior period.

---

## Filters

The Refunds report supports comprehensive filtering:

* **Date range** - Select custom ranges or preset periods
* **Interval** - View by day, week, month, quarter, or year
* **Currency** - Choose your reporting currency
* **Additional filters** - Filter by plan, region, customer segment, payment method, etc. ([see all filters](../filters/))

---

## Exporting the data

Export the refund data as CSV by clicking the download icon. This includes all refund transactions within the selected date range and filters.

---

## Practical tips

* **Monitor trends**: A sudden spike in refunds may indicate a product issue, billing error, or fraudulent activity that needs investigation.
* **Segmentation**: Use filters to identify if refunds are concentrated in specific plans, regions, or customer segments.
* **Benchmarking**: A healthy SaaS refund rate is typically under 2% of revenue. Rates above 5% warrant attention.
* **Seasonal patterns**: Some businesses see higher refund rates after annual renewals or during certain seasons.

---

## Gross Revenue Retention (GRR)
<!-- url: https://growpanel.io/docs/reports-and-metrics/retention/gross-revenue-retention -->

The **Gross Revenue Retention (GRR) report** measures the percentage of recurring revenue retained from an existing customer cohort over a specified period, **excluding** any revenue gained from upgrades or expansion. It is the most conservative measure of revenue health, focusing purely on revenue leakage due to cancellations (Churn) and downgrades (Contraction).

GRR provides the purest signal of product stability and customer success, as it is unaffected by expansion revenue. It is the direct opposite of MRR Churn Rate.

**GRR is calculated by taking the Starting MRR of the cohort and subtracting Contraction MRR and Churned MRR, then dividing the result by the Starting MRR.**

For an in-depth explanation of GRR as a metric, see the [GRR guide in the SaaS Metrics Academy](/academy/grr/).

---

## Overview



The Gross Revenue Retention (GRR) report includes a timeline chart and a breakdown table. This report is crucial for understanding the base stability of your revenue stream. The breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart displays a single line:

1.  **Gross Revenue Retention (Blue Line):** This is the primary metric, showing the calculated GRR rate for the selected period.

Because GRR excludes expansion revenue, the line will always be **at or below 100%**. A high GRR, close to 100%, indicates exceptional stability and very low gross revenue leakage.

The report employs a specific time-window convention:

* **Monthly Aggregation:** If you select an **Interval** of daily, weekly, or monthly, the calculation is performed on a **month-to-month** basis. This ensures the retained MRR is consistently measured against the Starting MRR at the start of that month, reducing noise.

* **Quarterly/Yearly Aggregation:** If you select quarterly or yearly, the calculation is performed on a quarter-over-quarter or year-over-year basis, respectively.

The currently ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, interval selector, and filters.

### Breakdown table

The table underneath the chart displays the core data points for each period.

| Metric | Description |
| :--- | :--- |
| **MRR** | The total MRR at the end of the period. |
| **Contraction** | The MRR lost from existing customers downgrading their subscriptions during the period. |
| **Churned MRR** | The total amount of MRR lost from customers who canceled all paid subscriptions during the period. |
| **GRR Rate** | The calculated Gross Revenue Retention Rate for the period (displayed as a percentage). |

The GRR Rate is typically shown in **blue** or green to visually emphasize revenue success and stability.

---

## Filters

The report supports a wide range of filters to help you analyze GRR within specific segments. These include:

* **Date range**
* **Interval** (Daily, weekly, monthly, quarterly, or yearly)
* **Additional filters** – plan, region/country, billing frequency, customer age (time since signup), etc. ([see all filters](../../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **The 100% Ceiling:** Remember that GRR can never exceed 100%. If you see it dipping, it signals an urgent need to address product experience, customer success, or billing issues.
* **GRR vs. NRR:** Use GRR to understand the quality of your product and service (how well you prevent loss), and compare it to Net Revenue Retention (NRR) to understand the effectiveness of your expansion and upsell strategies.
* **Segment for Stability:** Use filters to analyze GRR by cohort (e.g., customers who signed up 6 months ago vs. 12 months ago) to see if product maturity or onboarding improvements have stabilized your revenue base.

---

## Retention
<!-- url: https://growpanel.io/docs/reports-and-metrics/retention/ -->

## The true measure of product-market fit

Retention measures your success at keeping customers and the revenue they generate over time. In the subscription economy, high retention is the clearest signal of product-market fit and the single greatest driver of long-term valuation. It is the core financial mechanism that determines Customer Lifetime Value (LTV).

To master the story of your customer base, retention must be viewed through both a customer-count lens and a revenue lens. We break down retention into three complementary measures that give you full insight into how much value you are retaining and generating from your existing base:

* **Logo Retention:** Tracks the percentage of your original customer count that remains active.
* **Gross Revenue Retention (GRR):** Tracks the percentage of revenue retained, *excluding* expansion revenue. This is your most conservative measure of revenue stability.
* **Net Revenue Retention (NRR):** Tracks the percentage of revenue retained, *including* revenue gained from customer upgrades (expansion). This is the key metric for built-in revenue growth.

---

## Logo Retention Rate
<!-- url: https://growpanel.io/docs/reports-and-metrics/retention/logo-retention -->

The **Logo Retention Rate report** (also commonly referred to as Customer Retention Rate) tracks the percentage of active, paying customer accounts (or "logos") that were successfully retained during a specific period. It is a fundamental indicator of customer loyalty and product stickiness.

Logo Retention is the direct inverse of Logo Churn Rate.

**Logo Retention Rate is calculated by dividing the number of retained customers (starting customers minus churned customers) during a period by the number of active customers at the start of that period.**



---

## Overview



The Logo Retention Rate report includes a timeline chart and a breakdown table. This report is crucial for understanding the stability of your customer base and demonstrating consistent value delivery. The breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart displays two lines:

1.  **Logo Retention Rate (Blue Line):** This is the primary metric, showing the calculated retention rate for the selected period.

2.  **Average 6 Months (Grey Line):** This line represents the rolling average of the Logo Retention Rate over the previous six months. Retention data can be volatile, making the 6-month average a valuable tool for identifying the underlying long-term trend, rather than short-term fluctuations. This smoothed rate is typically used in predictive models, such as the calculation for Customer Lifetime Value ([LTV report](../../ltv)).

The report employs a specific time-window convention to ensure meaningful data, especially at daily or weekly intervals:

* **Monthly Aggregation:**

  If you select an **Interval** of daily, weekly, or monthly, the retention calculation is performed on a **month-to-month** basis. This means the retained customers for the preceding month are compared against the active customers at the start of that month, reducing noise and providing a standardized rate that is comparable across your entire history.

* **Quarterly/Yearly Aggregation:**

   If you select quarterly or yearly, the retention is calculated on a quarter-over-quarter or year-over-year basis, respectively.

The currently ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, interval selector, and filters.

### Breakdown table

The table underneath the chart displays the core data points for each period.

| Metric | Description |
| :--- | :--- |
| **Active Subscribers** | The total number of active, paying customers at the end of the period. |
| **Churned Customers** | The number of customers who canceled all paid subscriptions during the period (used to calculate the retention rate). |
| **Logo Retention Rate** (Green) | The calculated Logo Retention Rate for the period (displayed as a percentage). |
| **Avg. 6 Months** (Green) | The Logo Retention Rate averaged over the preceding six monthly periods (displayed as a percentage). |

The Logo Retention Rate and the 6-Month Average are typically shown in **green** to visually emphasize the success of keeping customers.

---

## Filters

The report supports a wide range of filters to help you analyze retention within specific segments. These include:

* **Date range**

    Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**

    Choose how the rate is displayed: daily, weekly, monthly, quarterly, or yearly. *Note the monthly calculation convention explained above.*

* **Additional filters** – plan, region/country, billing frequency, customer age (time since signup), etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Focus on the Grey Line:** For strategic planning (like LTV analysis, hiring, or capacity planning), rely on the **Average 6 Months (Grey Line)** to smooth out noise and understand the true long-term trend of customer retention.
* **Benchmark is High:** The goal for Logo Retention is to keep the rate as high as possible, ideally above 95% for long-term sustainable growth.
* **Isolate High-Value Segments:** Use **Additional filters** to check retention by the initial source, sales rep, or industry. High retention in a specific segment signals a clear product-market fit that can be replicated.

---

## Net Revenue Retention (NRR)
<!-- url: https://growpanel.io/docs/reports-and-metrics/retention/net-revenue-retention -->

The **Net Revenue Retention (NRR) report** (also known as Net Dollar Retention or NDR) is the most comprehensive measure of customer value. It tracks the percentage of recurring revenue retained from an existing customer cohort, factoring in all revenue changes: **Expansion**, **Reactivation**, **Contraction**, and **Churn**.

NRR is considered the single most important metric for demonstrating built-in revenue growth. The primary goal is to achieve an NRR above 100%.

**NRR is calculated by taking the Starting MRR of the cohort, adding all gains (Expansion + Reactivation), subtracting all losses (Contraction + Churned MRR), and dividing the result by the Starting MRR.**

For an in-depth explanation of NRR as a metric, see the [NRR guide in the SaaS Metrics Academy](/academy/nrr/).

---

## Overview



The Net Revenue Retention (NRR) report includes a timeline chart and a breakdown table. This report is critical because it demonstrates the financial growth you achieve from your existing customer base, without needing to acquire new logos. The breakdown table cells are not clickable and there is no detail table.

### Timeline chart

The timeline chart displays the NRR rate over time, typically alongside an average line (e.g., 6 months).

The NRR line will often change color based on the 100% threshold:

* **Green:** When the rate is above 100%. This indicates **Negative Churn** (Expansion and Reactivation revenue outweighs all losses). This is the hallmark of a growth-stage SaaS company.
* **Red:** When the rate is below 100%. This indicates that the revenue lost from Contraction and Churn is greater than the revenue gained from Expansion and Reactivation.

The report employs the same month-to-month calculation convention as other MRR reports to ensure consistent data over time.

### Breakdown table

The table underneath the chart displays the core data points for each period.

| Metric | Description |
| :--- | :--- |
| **MRR** | The total MRR at the end of the period (Closing MRR). |
| **Expansion** | The MRR gained from existing customers upgrading or adding more seats/products during the period. |
| **Reactivation** | The MRR gained from former, churned customers who started a new paid subscription during the period. |
| **Contraction** | The MRR lost from existing customers downgrading their subscriptions during the period. |
| **Churned MRR** | The MRR lost from customers who canceled all paid subscriptions during the period. |
| **NRR Rate** | The final calculated Net Revenue Retention Rate, displayed as a percentage. This value should ideally be above 100%. |

---

## Filters

The report supports a wide range of filters to help you analyze where revenue growth or loss is concentrated. These include:

* **Date range**
* **Interval** (Daily, weekly, monthly, quarterly, or yearly)
* **Additional filters** – plan, region/country, billing frequency, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **The 100% Benchmark:** NRR is most valuable when it is **above 100%**. This means your revenue grows even if you acquire zero new customers. Venture Capitalists often look for NRR benchmarks of 120%+ for the most successful SaaS models.
* **Identify Expansion Success:** Use filters to segment NRR by plan or feature usage to see which customer segments and pricing tiers are most effective at driving **Expansion MRR**.
* **NRR vs. GRR:** Compare NRR against your Gross Revenue Retention (GRR). The difference between the two rates represents the percentage of your Starting MRR generated purely by your expansion and upsell strategies.

---

## Scheduled Churn
<!-- url: https://growpanel.io/docs/reports-and-metrics/scheduled-churn -->

The **Scheduled Churn report** shows subscriptions that are set to cancel at the end of their current billing period. These customers have already made the decision to leave but are still active until their prepaid period ends. This report gives you a forward-looking view of expected churn and opportunities for retention outreach.

---

## Overview



<!-- IMAGE PLACEHOLDER: Screenshot of the Scheduled Churn report showing the summary metrics at top, a timeline of expected churn, and the customer list below -->

The Scheduled Churn report includes:

1. **Summary metrics** - Total MRR at risk and number of subscriptions scheduled to cancel
2. **Timeline chart** - Expected churn grouped by week or month
3. **Customer list** - Detailed list of subscriptions with scheduled cancellation dates

---

## Understanding scheduled churn

When a customer cancels their subscription, most billing systems offer two options:

- **Immediate cancellation** - The subscription ends right away
- **End-of-period cancellation** - The subscription continues until the current billing period ends

Scheduled churn tracks the second type. These subscriptions are "non-renewing" - the customer has access until their prepaid period expires, at which point they will churn.

This is different from the main [Churn reports](/docs/reports-and-metrics/churn/), which show churn that has already happened. Scheduled Churn shows churn that **will** happen unless the customer changes their mind.

---

## Summary metrics

At the top of the report, you'll see:

| Metric | Description |
|--------|-------------|
| **MRR at Risk** | Total MRR from subscriptions scheduled to cancel |
| **Subscriptions** | Number of subscriptions scheduled to cancel |
| **Avg. Days to Cancel** | Average time until cancellation across all scheduled subscriptions |

<!-- IMAGE PLACEHOLDER: Screenshot of the summary metrics showing "MRR at Risk: $12,450", "Subscriptions: 23", "Avg. Days to Cancel: 18 days" -->

---

## Timeline chart

The timeline chart shows when scheduled churn is expected to occur:

- **X-axis** - Future dates grouped by week or month
- **Y-axis** - Expected MRR loss
- **Bars** - Each bar represents the MRR expected to churn in that period

This helps you anticipate revenue impact and prioritize retention efforts. A large spike in an upcoming period may indicate a batch of annual renewals or a reaction to a recent pricing change.

<!-- IMAGE PLACEHOLDER: Screenshot of the timeline chart showing bars for upcoming weeks, with one taller bar indicating more scheduled churn -->

---

## Customer list

The table below the chart shows each subscription scheduled to cancel:

| Column | Description |
|--------|-------------|
| Customer | Customer name and email |
| Plan | Current subscription plan |
| MRR | Monthly recurring revenue from this subscription |
| Cancel Date | When the subscription will end |
| Days Until | Number of days until cancellation |
| Started | When the subscription originally started |
| Tenure | How long they've been a customer |

Click any customer to view their [Customer detail page](/docs/customers/customer-detail/) with full history.

<!-- IMAGE PLACEHOLDER: Screenshot of the customer list table with columns showing sample customer data, including cancel dates and MRR -->

---

## Filters

The Scheduled Churn report supports standard filters:

- **Cancel date range** - Show subscriptions canceling within a specific period
- **Plan** - Filter to specific plans or products
- **MRR range** - Focus on high-value or low-value subscriptions
- **Customer tenure** - Filter by how long they've been customers
- **Additional filters** - Currency, payment method, market, and custom variables

See the [Filters documentation](/docs/reports-and-metrics/filters/) for more details.

---

## Using scheduled churn for retention

Scheduled Churn gives you a window of opportunity to save customers before they leave. Here are some strategies:

### Prioritize by value

- Sort by MRR to focus on high-value customers first
- Use filters to identify enterprise or long-tenured customers worth extra attention

### Time your outreach

- Reach out early in the cancellation period, not at the last minute
- Use the "Days Until" column to prioritize customers canceling soon
- Allow enough time for back-and-forth conversation

### Understand the "why"

- Review the customer's history on their detail page
- Look for patterns: recent support tickets, usage drops, or billing issues
- Check if they downgraded before canceling (contraction → churn pattern)

### Offer targeted solutions

- For price-sensitive customers: offer a discount or annual plan
- For underutilized customers: offer onboarding help or training
- For churning to competitors: highlight differentiating features

### Track your results

- When you save a customer, they'll disappear from this report
- Compare scheduled churn over time to measure the impact of your retention efforts
- Use cohort analysis to see if saved customers stick around long-term

---

## Export

Click the **Export** icon to download the scheduled churn data as a CSV file. The export includes all customers with scheduled cancellations and their associated data. This is useful for:

- Creating outreach lists for your customer success team
- Building automated workflows in your CRM
- Reporting to stakeholders on at-risk revenue

---

## How data is collected

GrowPanel imports scheduled cancellation data from your billing source:

- **Stripe** - Subscriptions with `cancel_at_period_end: true`
- **Chargebee** - Subscriptions with status `non_renewing`
- **Recurly** - Subscriptions in `canceled` state with future `expires_at`

The report updates automatically as your billing source syncs. When a customer's cancellation is reversed, they're removed from the Scheduled Churn report within minutes.

---

## Related reports

- [Churn reports](/docs/reports-and-metrics/churn/) - View historical churn that has already occurred
- [MRR Movements](/docs/reports-and-metrics/mrr-movements/) - See all MRR changes including churn
- [CMRR](/docs/reports-and-metrics/cmrr/) - Committed MRR accounts for scheduled changes
- [Customer detail](/docs/customers/customer-detail/) - Deep dive into individual customer history

---

## Segments
<!-- url: https://growpanel.io/docs/reports-and-metrics/segments -->

**Segments** are saved filter combinations that you can reuse across GrowPanel. Instead of setting the same four or five filters every time you want to look at "Enterprise customers in Europe on annual plans", you save that combination once as a segment and apply it with a single click — on any report or customer list.

Segments can be used in two ways: as a **filter** to narrow a report to one group of customers, or as a **grouping dimension** to compare multiple groups side-by-side.

---

## What is a segment?

A segment is just a named bundle of filter values. For example:

* **Enterprise** → `plan = Enterprise`
* **UK monthly** → `region = United Kingdom`, `billing frequency = monthly`
* **EU annual** → `region = Europe`, `billing frequency = yearly`
* **High-touch accounts** → `company size = 501-1000`, `industry = Finance`

Any filter that's available in GrowPanel — standard filters like plan, region, billing frequency, payment method, or your own custom variables from Stripe metadata — can be part of a segment.

---

## Creating a segment

You can create a segment from any page that has filters:

1. Set the filters you want to save (for example, `region = United Kingdom` and `billing frequency = monthly`)
2. Click **Add filter** and open the **Segment** panel
3. Click **Save filters as segment** at the bottom of the list
4. Give it a name (e.g. "UK monthly") and save

The segment is now available on every report and customer list across your account.

> Segments are account-wide — anyone on your team can use them. Creating, renaming, and deleting segments requires **Admin** or **Owner** role. Read-only users can apply segments but not modify them.

### Renaming and deleting

Hover over a segment in the segment panel to reveal the pencil (rename) and trash (delete) icons. If your filters have changed since you created the segment, the edit dialog gives you the option to **Add current filters to segment**, merging whatever filters you have set now into the saved definition.

---

## Using segments as a filter

The most common use: apply a segment as a one-click filter.

1. Click **Add filter** → **Segment**
2. Tick the segment you want to apply

The report reloads showing only that group of customers. This is identical in effect to manually setting each individual filter, but much faster and less error-prone.

### Example: keep an eye on your enterprise tier

Save a segment called "Enterprise" with `plan = Enterprise`. Then, on any day:

* Open **MRR** and apply the Enterprise segment → see MRR for just your enterprise customers
* Switch to **Churn** → see enterprise churn
* Switch to **Customer lifetime** → see enterprise LTV
* Switch to **Customers** → see the list of enterprise accounts

No need to re-set the filter on each page — the segment is there as a filter option across all reports and customer lists.

---

## Using segments as a grouping (breakdown)

Segments really shine when you want to **compare** groups side-by-side. In the group-by dropdown at the top of most reports, choose **Segment** to produce one line (or bar, or row) per segment in your account.

### Example: Enterprise vs. non-Enterprise

Create two segments:

* **Enterprise** → `plan = Enterprise`
* **SMB** → `plan = Starter, Pro`

On the MRR report, group by **Segment**. The chart now shows two lines: Enterprise MRR and SMB MRR, side by side. Want to know if enterprise is growing faster than SMB? The answer is right there.

### Example: compare regional markets

Create a segment for each market you care about:

* **North America** → `region = North America`
* **Europe** → `region = Europe`
* **APAC** → `region = APAC`

Group the **Subscribers** or **NRR** report by Segment to see how the three regions compare on a single chart.

### Example: product-led vs. sales-led

If you use Stripe metadata to tag the acquisition motion on each customer, you can create:

* **Self-serve** → `custom_motion = self_serve`
* **Sales-led** → `custom_motion = sales`

Group any revenue or retention report by Segment to see whether the sales-led motion actually produces the retention and expansion you expected.

---

## Where segments are available

Segments work **across all reports and customer lists** in GrowPanel — MRR, ARR, churn, cohorts, cashflow, LTV, customer list, and so on — both as a filter and (where grouping is supported) as a breakdown dimension.

Segments are also available via the [REST API](/developers/api/) — pass `segment=<id>` or `breakdown=segment` to any endpoint that accepts filters, and use the `/data/segments` endpoints to list, create, or update segments programmatically.

---

## Troubleshooting and tips

### Some filters may not apply everywhere

A few pages in GrowPanel don't support the full set of filters. Specifically, **plan** and **billing frequency** filters aren't available on the **customers list**, the **leads** and **trials** reports, or the **customer concentration** report. These pages work with a slightly different slice of your data and don't use plan/billing information directly.

If a segment includes a filter that a given page doesn't support, that filter is silently ignored on that page. The segment still works — it just filters on the fields the page does support. For example, a segment `region = UK AND plan = Pro` will filter the customer list by region only; the plan part has no effect there.

### Combining segments with additional filters

You can add more filters on top of an active segment, or add filters while grouping by segment. GrowPanel combines them with **AND** semantics — each filter narrows the result set further:

* Segment "UK monthly" (`region = UK`, `billing freq = monthly`) **+** filter `currency = GBP` → UK monthly customers billing in GBP
* Segment "Europe" (`region = Europe`) **+** filter `region = UK` → UK only (UK is inside Europe, so the intersection is UK)
* Segment "UK monthly" **+** filter `billing freq = yearly` → zero results (the two billing frequencies don't overlap)

This is the same behaviour as stacking any two filters in GrowPanel: adding a filter never expands the result, it only narrows. If you're seeing empty charts after applying a segment plus extra filters, check whether the two are asking for mutually exclusive things.

---

## Related pages

- [Filters](/docs/reports-and-metrics/filters/) — the full list of available filters
- [Breakdown Reports](/docs/reports-and-metrics/breakdowns/) — other ways to group and compare data
- [Plan Groups](/docs/settings/plan-groups/) — organize plans into reusable groups for filtering

---

## Subscribers
<!-- url: https://growpanel.io/docs/reports-and-metrics/subscribers -->

The **Subscribers report** provides a detailed view of your active customer count over time. It is a fundamental tool in GrowPanel for tracking customer acquisition, retention, and the overall health of your user base.

---

## Overview



The Subscribers report includes a chart, a breakdown table, and optionally a detail table. Each is described here:

### Timeline chart

The timeline chart shows your active subscriber count over the selected period. If you hover the chart, you'll see a tooltip with the subscriber movements broken down in types (explained under the Breakdown table), and you'll see the corresponding period marked in the table underneath. The currently ongoing period is marked as a dashed line. You can adjust the chart data using the date picker, interval selector and a wealth of filters, explained in the Filters section underneath.

Note that the numbers for a given period shows how those numbers looked at the *end of the period*. 

### Breakdown table
 
The table underneath the chart shows the subscriber count, broken down into movement types: New, Reactivation, Churn, and the resulting net change. Each type is explained here:

  * **New**
    
    The number of newly acquired customers who started a paid subscription.

  * **Reactivation** 
  
    The number of returning customers who previously churned but started a new paid subscription.

  * **Churn** 
  
    The number of customers who cancelled all active paid subscriptions and became inactive.

  * **Change**
  
    The net change in the number of subscribers during the period (New + Reactivation - Churn).
  
  * **Total subscribers**
    
    The total number of active, paying customers at the end of the period.

  * **Growth rate**
  
    The percentage change in Total Subscribers compared to the previous period (Change / Subscribers at start of period $\times$ 100).

Each cell of the table shows a single number, representing the count of unique customers that contributed to that movement type or total. Red numbers typically indicate negative movement (Churn), and green numbers indicate positive movement (New, Reactivation).

If you click a cell, a detail table under the breakdown table is revealed, showing the individual customers or churn events in the selected period and type.

### Detail table



This table is shown when you click a cell in the breakdown table. The table shows each subscriber movement in the selected period and type. You see the date, customer name/email, the description of the movement, and the type (New/Reactivation/Churn).

Clicking the customer sends you to that customer's detail page.

---

## Filters

The report supports a wide range of filters to help you focus on specific segments of your customer base. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how subscriber counts are aggregated: daily, weekly, monthly, quarterly, or yearly

* **Additional filters** – plan, region/country, billing frequency, payment method, customer age, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* Use the **interval** selector to understand the velocity of your customer base changes. Daily or weekly intervals are great for monitoring recent signups and churn spikes.
* The **Growth rate** provides an easy way to understand if your customer base is accelerating or slowing down.
* Use "All time" in the date picker to see the full historical growth of your subscriber base.
* Combine multiple **filters** to isolate specific customer segments or product lines, enabling precise retention and acquisition insights.

---

## Trial Length
<!-- url: https://growpanel.io/docs/reports-and-metrics/trial-length -->

The **Trial Length report** measures the median number of days it takes for trial users to convert into paying customers. Understanding your trial-to-paid timeline helps you optimize onboarding, set appropriate trial durations, and identify friction in the conversion process.

For a broader look at trial volume and conversion rates, see the [Trials report](/docs/reports-and-metrics/trials/).

---

## Overview

<!-- image placeholder -->

The Trial Length report is part of the **Trials** tab group, alongside [New Trials](/docs/reports-and-metrics/trials/) and Conversion Rate. It includes three main sections:

1. **Trial length timeline** - Median days to convert over time
2. **Days to conversion chart** - Cumulative conversion curve
3. **Breakdown table** - Period-by-period trial metrics

---

## Trial length timeline

<!-- image placeholder -->

The timeline chart shows the **median number of days** from trial start to paid start for each period.

- **Y-axis** - Days (starting from zero)
- **X-axis** - Time periods (based on interval selection)
- **Current period** - Shown with a dashed line, as the period is still in progress and the value may change

A decreasing trend means users are converting faster, which typically indicates improvements in onboarding or product experience. An increasing trend may suggest friction, a more complex buying process, or a shift in your customer mix.

Hovering over the chart highlights the corresponding column in the breakdown table below.

---

## Days to conversion chart

<!-- image placeholder -->

This chart shows the **cumulative percentage** of trial users who have converted to paid, plotted by the number of days since they started their trial (from day 0 to day 50).

- **Y-axis** - Cumulative conversion percentage (0-100%)
- **X-axis** - Days since trial start

This visualization helps you answer questions like:

- **How many users convert on day 1?** - A steep early rise indicates strong immediate value
- **Where does the curve flatten?** - The point where the curve plateaus suggests the effective end of your conversion window
- **What's an ideal trial duration?** - If 90% of conversions happen within 14 days, a 30-day trial may be unnecessary

---

## Breakdown table

The table underneath the charts tracks trial performance for each period:

| Metric | Description |
| :--- | :--- |
| **New trials** | Total number of customers who started a trial during the period. |
| **Converted** | Number of trial customers from this period who later became paying customers. |
| **Trial length** | Median number of days from trial start to paid start for converted customers. |

Clicking a number in the **New trials** or **Converted** columns reveals the detail table below.

---

## Detail table

<!-- image placeholder -->

The detail table shows individual customer records for the selected period:

| Column | Description |
|--------|-------------|
| Created | Date the customer record was created |
| Customer | Customer name and email |
| Trial started | Date the trial began |
| Paid started | Date the first paid subscription began (empty if not yet converted) |
| Cancel date | Date of last cancellation (empty if still active) |
| Status | Current status: Lead, Trialing, Trial ended, Active, Cancelled, or Past due |

Click any row to view the customer's [detail page](/docs/customers/customer-detail/).

---

## Filters

The Trial Length report supports filters to help you compare conversion speed across segments:

* **Date range** - Select a custom range or preset period
* **Interval** - Aggregate by month, quarter, or year
* **Additional filters** - Region, currency, industry, company size, channel, data source, and more ([see all filters](/docs/reports-and-metrics/filters/))

Filters apply to both charts and the breakdown table simultaneously.

---

## Exporting the data

Click the **Export** icon next to the date picker to download the data as a CSV file.

---

## Practical tips

* **Shorten trials when possible.** If your days-to-conversion chart shows most conversions happen within 7 days, consider a shorter trial. Shorter trials create urgency and reduce your support burden.
* **Compare across segments.** Use filters to compare trial length by channel, region, or plan. If organic users convert in 5 days but paid-ad users take 20, your ad targeting or landing page messaging may need work.
* **Watch for outliers.** A sudden increase in median trial length could indicate a product issue, a change in customer mix, or seasonal effects.
* **Pair with conversion rate.** A shorter trial length is only good if the conversion rate stays healthy. Always review both metrics together.

---

## Related reports

- [Trials](/docs/reports-and-metrics/trials/) - Trial volume and conversion rates
- [Leads](/docs/reports-and-metrics/leads/) - Top-of-funnel lead metrics
- [Cohorts](/docs/reports-and-metrics/cohorts/) - Retention analysis by signup cohort
- [Filters](/docs/reports-and-metrics/filters/) - All available filter options

---

## Trials
<!-- url: https://growpanel.io/docs/reports-and-metrics/trials -->

The **Trials report** focuses on the middle stage of the customer funnel, tracking the volume of new trials started within a specific period and measuring the crucial conversion efficiency to paying customers. This report is essential for optimizing the product experience and onboarding process.

For an in-depth explanation of free trials, see the [Free trial guide in the SaaS Metrics Academy](/academy/free-trial/).

---

## Overview



The Trials report includes a timeline chart, a breakdown table, and a detail table for in-depth analysis of customer records.

### Timeline chart

The timeline chart is a **bar chart** showing the number of **New trials** started over the selected period. Hovering over a bar displays a tooltip with the total number of New Trials for that period.

The bar corresponding to the currently ongoing period includes a crucial feature:
* **Projected end-of-period Number:** The dimmed and striped part of the final bar represents the predicted trial volume by the end of the period, based on current trends. This projection allows you to assess, mid-period, whether your trial volume is meeting expectations.

### Breakdown table

The table underneath the chart tracks the performance of trials started in the given period.

| Metric | Description |
| :--- | :--- |
| **New trials** | The total number of unique customers who started a trial subscription during the period. |
| **Converted** | The number of customers starting a trial in this period who have *later* started a paid subscription. |
| **Trial conversion rate** | The conversion rate from new trials to paid customers (Converted / New Trials). |

> **Note on Date Logic:** All metrics in this table are tied to the *trial started date*. The actual start date for the paid subscription may occur *after* the period shown in the table. This historical view helps measure the long-term effectiveness of trials initiated in a specific month.

If you click a number in the **New trials** or **Converted** columns, a detail table under the breakdown table is revealed, showing the individual customer records that contributed to that number.

### Detail table



This table is shown when you click a count cell in the breakdown table. The table displays customer record attributes related to the trial lifecycle:

* **Created:** The date the customer record (lead) was created.
* **Customer name:** The name of the customer.
* **Email:** The customer's email address.
* **Trial started:** The date the trial subscription began.
* **Paid started:** The date the first paid subscription began (can be empty).
* **Cancel date:** The date the customer last canceled their paid subscription (can be empty).
* **Status:** The current status of the customer record: `Lead`, `Trialing`, `Trial ended`, `Active`, `Cancelled`, or `Past due`.

Clicking any row sends you to the customer's detail page.

---

## Filters

The report supports a wide range of filters to help you analyze trial quality and conversion efficiency across segments. These include:

* **Date range**

  Select a custom range or preset periods (last 30 days, last quarter, etc.)

* **Interval**
 
  Choose how trial initiation is aggregated: daily, weekly, monthly, quarterly, or yearly.

* **Additional filters** – source/channel, country, initial product plan, etc. ([see all filters](../filters/))

Filters are applied to both the chart and the table simultaneously.

---

## Exporting the data

You can **export the table** as a CSV file for offline analysis or reporting by clicking the "Export" icon next to the date picker.

---

## Practical tips

* **Optimize Onboarding:** If the **Trial conversion rate** is low, focus on optimizing your product onboarding flow during that specific period to help users realize value quickly.
* **Isolate High-Converting Segments:** Use **Additional filters** to view conversion rates by trial type, source, or initial plan. This helps identify which segments of users are most likely to become long-term paying customers.
* **Conversion Lag:** Be aware of the lag between the trial start date and the paid start date. For trials longer than 7 days, look at older periods (e.g., last month's trial cohort) to get the most accurate, fully realized conversion rates.

---

## World Map
<!-- url: https://growpanel.io/docs/reports-and-metrics/world-map -->

The **World Map report** provides a geographic visualization of your subscription business, showing how key metrics are distributed across countries. Use this report to identify your strongest markets, spot regional growth opportunities, and understand geographic patterns in customer behavior.

---

## Overview

The World Map report consists of two main components:

1. **Interactive map** - A color-coded world map where each country's color intensity represents its metric value
2. **Country table** - A detailed table listing each country with its corresponding metric values

---

## Available metrics

You can visualize any of these metrics on the map using the metric selector:

| Metric | Description |
|--------|-------------|
| **MRR** | Monthly Recurring Revenue from each country |
| **ARR** | Annual Recurring Revenue (MRR × 12) |
| **ARPA** | Average Revenue Per Account in each country |
| **Subscribers** | Number of active subscribers in each country |
| **Logo Churn** | Percentage of customers who churned |
| **Net MRR Churn** | Net revenue churn rate (churn minus expansion) |
| **LTV** | Lifetime Value of customers in each country |

---

## Using the map

### Selecting a metric

1. Use the **metric dropdown** at the top of the report to select which metric to display.
2. The map colors and table values will update to reflect the selected metric.

<!-- IMAGE PLACEHOLDER: Screenshot showing the metric dropdown expanded with options like MRR, ARR, ARPA, Subscribers, etc. -->

### Understanding the color scale

- **Darker colors** indicate higher values
- **Lighter colors** indicate lower values
- **Gray** indicates no data for that country
- The legend shows the value range for the current view

### Interacting with the map

- **Hover** over a country to see a tooltip with the exact value
- **Click** a country to filter other reports to that market
- **Zoom** in and out using your mouse wheel or the zoom controls

---

## Country table

Below the map, a table shows the same data in tabular format:

| Column | Description |
|--------|-------------|
| Country | Country name and flag |
| [Selected Metric] | The value for the selected metric |
| % of Total | What percentage of the total this country represents |
| Trend | Change compared to the previous period |

The table is sorted by the selected metric in descending order by default. Click column headers to sort by different columns.

<!-- IMAGE PLACEHOLDER: Screenshot of the country table showing columns for Country, MRR, % of Total, and Trend with sample data -->

---

## Filters

The World Map report supports the same filters as other reports:

- **Date range** - Select a time period for the analysis
- **Plan** - Filter to specific plans or products
- **Currency** - View in a specific currency
- **Data source** - Filter by connected billing platform
- **Additional filters** - Payment method, pricing model, customer age, and custom variables

See the [Filters documentation](/docs/reports-and-metrics/filters/) for more details.

---

## Use cases

### Identifying your strongest markets

Select **MRR** or **Subscribers** to see where your revenue and customer base are concentrated. This helps you:

- Prioritize markets for localization efforts
- Allocate sales and support resources
- Plan expansion strategies

### Finding churn hotspots

Select **Logo Churn** or **Net MRR Churn** to identify regions with retention problems:

- High churn in specific markets may indicate product-market fit issues
- Compare churn rates between similar markets to identify best practices
- Correlate with support ticket volume or NPS scores

### Understanding customer value by region

Select **LTV** or **ARPA** to compare customer quality across markets:

- Higher LTV markets may deserve more acquisition investment
- Lower ARPA regions might benefit from localized pricing
- Combine with subscriber count to find high-value growth opportunities

---

## Exporting data

Click the **Export** icon to download the country data as a CSV file. The export includes all countries with data and the currently selected metric values.

---

## Practical tips

- **Use in combination with Breakdowns** - The [Breakdown reports](/docs/reports-and-metrics/breakdowns/) let you see trends over time by market, which complements the snapshot view of the World Map.
- **Check for data completeness** - If many customers lack country data, their revenue will be excluded from this report. Ensure your billing source captures country information.
- **Consider currency impact** - When viewing revenue metrics, remember that currency exchange rates affect comparisons. Use the currency filter to normalize if needed.

---

## Related reports

- [Filters](/docs/reports-and-metrics/filters/) - Learn about all available filter options
- [Breakdown reports](/docs/reports-and-metrics/breakdowns/) - See trends broken down by market over time
- [MRR](/docs/reports-and-metrics/mrr/) - Detailed MRR analysis
- [Churn reports](/docs/reports-and-metrics/churn/) - In-depth churn analysis

---

## Data Sources
<!-- url: https://growpanel.io/docs/settings/data-sources -->

**Data Sources** settings let you manage your connections to billing platforms and other data providers. From here you can add new sources, monitor sync status, update credentials, and remove connections.

---

## Accessing data sources

Navigate to **Settings → Data Sources** to manage your connections.



---

## Data sources list

The main view shows all connected data sources:

| Column | Description |
|--------|-------------|
| **Name** | The name you gave this data source |
| **Type** | Stripe, Chargebee, Recurly, Google Sheets, or Custom API |
| **Status** | Active, Syncing, Error, or Disconnected |
| **Last Sync** | When data was last successfully synced |
| **Records** | Number of customers, invoices, etc. imported |
| **Actions** | Edit, sync, or remove the source |

---

## Adding a new data source

Click **Add Data Source** to connect a new billing platform.

### Step 1: Choose the source type

Select from the available integrations:

- **[Stripe](/docs/data-sources/stripe/)** - OAuth connection to Stripe
- **[Chargebee](/docs/data-sources/chargebee/)** - API key connection
- **[Recurly](/docs/data-sources/recurly/)** - API key connection
- **[Google Sheets](/docs/data-sources/google-sheets/)** - For spreadsheet imports
- **[Custom API](/docs/data-sources/custom-api/)** - For custom billing systems

<!-- IMAGE PLACEHOLDER: Screenshot of the "Add Data Source" modal showing the integration type options -->

### Step 2: Configure the connection

Follow the specific setup steps for your chosen integration. Each integration guide covers:

- Required credentials (OAuth or API keys)
- Configuration options
- Webhook setup (if applicable)

### Step 3: Initial import

After connecting, GrowPanel begins importing your historical data:

- The import progress is shown in real-time
- Large accounts may take several hours
- You'll receive an email when the import completes

---

## Managing existing sources

### View source details

Click a data source to see detailed information:

- Connection status and health
- Import/sync history
- Error logs (if any)
- Configuration options

<!-- IMAGE PLACEHOLDER: Screenshot of a data source detail page showing sync history, connection status, and configuration -->

### Sync status indicators

| Status | Meaning |
|--------|---------|
| **Active** | Connected and syncing normally |
| **Syncing** | Currently importing or updating data |
| **Error** | A problem occurred (check error details) |
| **Disconnected** | Connection was removed or credentials expired |

### Manual sync

Click **Sync Now** to trigger an immediate sync:

- Useful after making changes in your billing platform
- Forces a refresh of all data
- May take a few minutes depending on data volume

### Edit connection

Click **Edit** to modify connection settings:

- Rename the data source
- Update API keys or credentials
- Modify webhook URLs
- Change configuration options

**Note:** Changing credentials may interrupt syncing temporarily.

### Remove a source

Click **Remove** to disconnect a data source:

1. A confirmation dialog appears
2. Choose whether to delete imported data or keep it
3. Confirm the removal

**Warning:** Removing a source and its data cannot be undone. Consider exporting your data first.

**Important:** Removing a data source in GrowPanel does not automatically revoke access to your billing platform. To fully disconnect:

- **Stripe**: Uninstall the GrowPanel app in your Stripe Dashboard under **Settings → Installed apps**
- **Chargebee/Recurly**: Delete or revoke the API key you created for GrowPanel

---

## Sync behavior

### Real-time updates

Most integrations update in near-real-time:

- Stripe, Chargebee, Recurly: Updates within minutes via webhooks
- Google Sheets: Manual export required
- Custom API: Depends on your push frequency

### Historical data

When you first connect a source:

1. GrowPanel imports all historical data
2. MRR movements are calculated from invoice history
3. Metrics are available once import completes

### Rate limiting

Billing platforms have API rate limits:

- GrowPanel respects these limits automatically
- Large imports may be throttled by the platform
- Progress indicators show estimated completion time

---

## Multiple data sources

GrowPanel supports connecting multiple data sources:

- Different billing platforms (e.g., Stripe + Chargebee)
- Multiple accounts on the same platform (e.g., two Stripe accounts)
- Combination of automated and manual sources

When you have multiple sources:

- Use the **Data Source** filter in reports to view each separately
- Combined views show aggregate metrics across all sources
- Customer IDs are scoped to their source (no conflicts)

---

## Troubleshooting

### Connection failed

If a connection fails:

1. Verify your API key or OAuth permissions
2. Check that the account is active in the billing platform
3. Ensure required webhooks are configured (for Chargebee/Recurly)
4. Try removing and re-adding the connection

### Sync errors

If syncing fails:

1. Check the error message in the source details
2. Verify the API key hasn't been revoked or expired
3. Look for webhook delivery failures in your billing platform
4. Contact support if the error persists

### Missing data

If data appears incomplete:

1. Check that the API key has read access to all required resources
2. Verify the date range (very old data may be archived)
3. Look for import progress or errors
4. Wait for the initial import to complete

See the [Troubleshooting guide](/docs/troubleshooting/) for more help.

---

## Related pages

- [Stripe integration](/docs/data-sources/stripe/) - Connecting Stripe
- [Chargebee integration](/docs/data-sources/chargebee/) - Connecting Chargebee
- [Recurly integration](/docs/data-sources/recurly/) - Connecting Recurly
- [Google Sheets integration](/docs/data-sources/google-sheets/) - Using spreadsheets
- [Custom API integration](/docs/data-sources/custom-api/) - Custom billing systems

---

## Exports
<!-- url: https://growpanel.io/docs/settings/exports -->

The **Exports** settings page lets you download your complete customer list and all MRR movement events as CSV files. Use these exports for external analysis, board reporting, auditing, or migrating data to other tools.

Navigate to **Settings → Exports** to access the export options.



---

## All customers

Downloads a CSV file containing every customer in your account with their current status, revenue, and metadata.

### Columns included

| Column | Description |
|--------|-------------|
| **ID** | Unique customer identifier from your billing source |
| **Name** | Customer name or company name |
| **Email** | Primary email address |
| **Created** | Date the customer was created |
| **Country** | Billing country |
| **State** | Billing state (US customers) |
| **Trial started** | Date trial began (if applicable) |
| **Paid started** | Date first payment was made |
| **Cancel date** | Date subscription was cancelled (if applicable) |
| **Status** | Current status (Active, Trial, Cancelled, etc.) |
| **Currency** | The currency the customer pays in |
| **Data source** | Which billing source this customer comes from |
| **Cancel reason** | Cancellation reason (if provided) |
| **Current MRR (customer currency)** | MRR in the customer's original currency |
| **Current MRR (reporting currency)** | MRR converted to your reporting currency |
| **Payments** | Total number of payments received |
| **Total paid (customer currency)** | Total amount paid in original currency |
| **Total paid (reporting currency)** | Total amount paid converted to reporting currency |
| **Custom variables** | Any custom metadata fields from your billing source |

### Multi-currency handling

If you have customers paying in different currencies, the export includes both the original currency amount and the amount converted to your reporting currency using the latest exchange rates.

---

## All MRR movements

Downloads a CSV file containing every individual MRR movement event — new business, expansion, contraction, churn, and reactivation.

### Columns included

| Column | Description |
|--------|-------------|
| **Date** | When the movement occurred |
| **Customer name** | Name of the customer |
| **Customer ID** | Unique customer identifier |
| **Type** | Movement type: New, Expansion, Contraction, Churn, or Reactivation |
| **Subtype** | What caused the movement (quantity change, plan change, etc.) |
| **Currency** | Original currency of the movement |
| **MRR change** | The MRR amount that changed |
| **Quantity change** | Change in subscription quantity (if applicable) |
| **Subscription ID** | The subscription identifier from your billing source |
| **Billing frequency** | Monthly, annual, etc. |
| **Payment method** | Card, ACH, SEPA, etc. |
| **Description** | Human-readable summary of the change |
| **Plan ID** | The plan or product identifier |
| **Data source** | Which billing source this movement comes from |

This export can be large if you have a long history. It may take a moment to complete.

---

## File format

Both exports use **CSV (Comma-Separated Values)** format:

- UTF-8 encoding with BOM for Excel compatibility
- First row contains column headers
- Dates formatted as YYYY-MM-DD
- Amounts in cents (integer values)
- Compatible with Excel, Google Sheets, Numbers, and most data tools

### Filename format

Downloaded files are named with your account name and the current date:

- `customers_[account_name]_[date].csv`
- `mrr_movements_[account_name]_[date].csv`

---

## Use cases

| Use case | Which export |
|----------|--------------|
| Board reporting | Customers + MRR movements |
| Cohort analysis in a spreadsheet | MRR movements |
| Auditing MRR against your billing platform | MRR movements |
| Customer segmentation analysis | Customers |
| Churn pattern identification | MRR movements (filter by Type = Churn) |
| Custom financial reporting | Both |

### Combining exports

For comprehensive analysis, export both files and join them on Customer ID in your spreadsheet or data tool.

---

## Related pages

- [Exporting data](/docs/reports-and-metrics/exporting-data/) - Exporting data from individual reports
- [Notifications](/docs/settings/notifications/) - Scheduled email reports
- [REST API](/developers/) - Programmatic data access

---

## Settings
<!-- url: https://growpanel.io/docs/settings/ -->

The **Settings** section lets you configure how GrowPanel calculates and displays your subscription metrics. These settings affect how data is processed, how reports are generated, and how you receive notifications.

---

## Settings areas

| Section | Description |
|---------|-------------|
| [Reporting](/docs/settings/reporting/) | Configure currency, timezone, and how metrics are calculated |
| [Data Sources](/docs/settings/data-sources/) | Manage connections to Stripe, Chargebee, and other billing platforms |
| [Plan Groups](/docs/settings/plan-groups/) | Organize your plans into logical groups for reporting |
| [Notifications](/docs/settings/notifications/) | Set up per-user email alerts for MRR changes and scheduled reports |
| [Integrations](/docs/settings/integrations/) | Connect Slack, Microsoft Teams, and custom webhooks for team-wide alerts |
| [Exports](/docs/settings/exports/) | Download your complete customer list and MRR movements as CSV |

---

## Accessing settings

To access settings:

1. Click your profile icon or name in the top-right corner
2. Select **Settings** from the dropdown menu

Or navigate directly using the sidebar menu.

<!-- IMAGE PLACEHOLDER: Screenshot showing the settings menu in the navigation with the four main sections visible -->

---

## Who can change settings

Settings access depends on your role:

| Role | Access |
|------|--------|
| **Owner** | Full access to all settings |
| **Admin** | Full access to all settings |
| **Read-only** | Can view settings but not make changes |

See [Team management](/docs/account-and-billing/team/) for more about roles and permissions.

---

## Integrations
<!-- url: https://growpanel.io/docs/settings/integrations/ -->

**Integrations** let you connect GrowPanel to external services so you get notified about MRR changes in the tools your team already uses, or build custom dashboards with your subscription data. You can connect Slack, Microsoft Teams, custom webhooks, and Looker Studio.

All integrations are configured under **Settings > Integrations** and apply account-wide. Notification integrations have their own threshold and event filter, so you can control exactly what gets sent where.



---

## Available integrations

| Integration | How it connects | What it sends |
|-------------|-----------------|---------------|
| [Slack](/docs/settings/integrations/slack/) | OAuth (one-click) | Rich formatted messages to a Slack channel |
| [Microsoft Teams](/docs/settings/integrations/teams/) | Incoming webhook URL | Text messages to a Teams channel |
| [Webhooks](/docs/settings/integrations/webhooks/) | Custom HTTPS URL | JSON payloads with full movement data |
| [n8n](/docs/settings/integrations/n8n/) | Native community node | Workflow triggers for MRR events |
| [Make](/docs/settings/integrations/make/) | Webhook module | JSON payloads for automation scenarios |
| [Looker Studio](/docs/settings/integrations/looker-studio/) | API key | Subscription data for custom dashboards |

---

## How notifications work

When GrowPanel processes a customer import and detects an MRR movement (new, expansion, contraction, churn, reactivation, or scheduled cancellation), it checks each connected integration:

1. **Is the integration connected?** Does the account have a URL configured?
2. **Does the event match?** Is this movement type included in the integration's event filter?
3. **Does it meet the threshold?** Is the MRR change large enough (converted to USD for comparison)?

If all three checks pass, GrowPanel sends the notification. Each integration is evaluated independently, so you can have Slack notify on all movements while Teams only alerts on churn above $100.

---

## Notification settings

Every integration supports the same two settings, accessible via the **Settings** button on each integration card:

### Threshold

Controls the minimum MRR change (in USD) required to trigger a notification:

| Setting | Effect |
|---------|--------|
| All amounts | Notify on every movement |
| Over $25 | Only movements of $25+ MRR |
| Over $50 | Only movements of $50+ MRR |
| Over $100 | Only movements of $100+ MRR |
| Over $500 | Only movements of $500+ MRR |
| No | Disable notifications for this integration |

For non-USD currencies, GrowPanel converts the MRR change to USD using daily exchange rates before comparing against the threshold.

### Event types

Choose which movement types trigger notifications:

- **New MRR** - A new customer subscribes
- **Expansion** - An existing customer upgrades or adds seats
- **Contraction** - A customer downgrades
- **Churn** - A customer cancels
- **Reactivation** - A previously churned customer returns
- **Scheduled cancellation** - A customer schedules a future cancellation
- **Failed payment** - First payment failure after previously successful payments

By default, all event types are enabled when you first connect an integration.

---

## Integrations vs. email notifications

Integrations and email notifications are independent:

| | Email notifications | Integrations (Slack, Teams, Webhook) |
|---|---|---|
| **Scope** | Per-user | Per-account |
| **Configured in** | Settings > Notifications | Settings > Integrations |
| **Separate thresholds for expansion/churn** | Yes | No (single threshold) |
| **Who receives** | Individual user | Entire channel/endpoint |

You can use both simultaneously. For example, your CEO might get email alerts for movements over $500, while the #revenue Slack channel gets every movement.

---

## Related pages

- [Slack integration](/docs/settings/integrations/slack/) - Connect GrowPanel to Slack
- [Microsoft Teams integration](/docs/settings/integrations/teams/) - Connect GrowPanel to Teams
- [Webhooks](/docs/settings/integrations/webhooks/) - Send data to custom endpoints
- [n8n](/docs/settings/integrations/n8n/) - n8n integration with native node
- [Make](/docs/settings/integrations/make/) - Make (Integromat) integration
- [Looker Studio](/docs/settings/integrations/looker-studio/) - Build custom dashboards
- [Notifications](/docs/settings/notifications/) - Per-user email notification settings

---

## Looker Studio Integration
<!-- url: https://growpanel.io/docs/settings/integrations/looker-studio -->

The Looker Studio integration lets you build custom dashboards and reports in [Google Looker Studio](https://lookerstudio.google.com) using your GrowPanel subscription data. Visualize MRR trends, customer counts, churn rates, and more — all in a tool your team may already be using.

GrowPanel provides a read-only API key that you use to pull data into Looker Studio. There are two ways to connect, depending on your preference.

---

## Prerequisites

Before you start, enable the integration in GrowPanel:

1. Go to **Settings > Integrations**
2. Find the **Looker Studio** card and click **Enable**
3. Copy the **API Key** and **API Base URL** from the modal — you'll need them in the steps below

The API key is only shown once when you enable the integration. If you lose it, click **Remove** on the Looker Studio card and enable it again to generate a new key.

---

## Method 1: Via Google Sheets (recommended)

This is the easiest approach and works well for most teams. You use a small script to pull GrowPanel data into a Google Sheet, then connect that sheet to Looker Studio. The data refreshes automatically on a schedule you choose.

### Step 1 — Create a Google Sheet

1. Open [Google Sheets](https://sheets.google.com) and create a new spreadsheet
2. Rename it to something descriptive, like "GrowPanel — MRR Data"

### Step 2 — Add the import script

1. In your spreadsheet, go to **Extensions > Apps Script**
2. Delete any existing code and paste the following:

```javascript
const API_KEY = 'YOUR_API_KEY_HERE';
const BASE_URL = 'https://api.growpanel.io';

function importMRR() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MRR')
    || SpreadsheetApp.getActiveSpreadsheet().insertSheet('MRR');
  fetchAndWrite(sheet, '/reports/mrr');
}

function importCustomers() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Customers')
    || SpreadsheetApp.getActiveSpreadsheet().insertSheet('Customers');
  fetchAndWrite(sheet, '/customers');
}

function importSummary() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Summary')
    || SpreadsheetApp.getActiveSpreadsheet().insertSheet('Summary');
  fetchAndWrite(sheet, '/reports/summary');
}

function importAll() {
  importMRR();
  importCustomers();
  importSummary();
}

function fetchAndWrite(sheet, endpoint) {
  const options = {
    method: 'get',
    headers: { 'Authorization': 'Bearer ' + API_KEY },
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(BASE_URL + endpoint, options);
  if (response.getResponseCode() !== 200) {
    Logger.log('Error fetching ' + endpoint + ': ' + response.getContentText());
    return;
  }

  const json = JSON.parse(response.getContentText());
  const data = json.result || json;

  if (!Array.isArray(data) || data.length === 0) {
    Logger.log('No data returned for ' + endpoint);
    return;
  }

  const headers = Object.keys(data[0]);
  const rows = data.map(row => headers.map(h => row[h] ?? ''));

  sheet.clear();
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
  if (rows.length > 0) {
    sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
  }

  Logger.log('Imported ' + rows.length + ' rows into ' + sheet.getName());
}
```

3. Replace `YOUR_API_KEY_HERE` with the API key you copied from GrowPanel
4. Click **Save** (or Ctrl+S)

### Step 3 — Run the script

1. In the Apps Script editor, select **importAll** from the function dropdown
2. Click **Run**
3. The first time, Google will ask you to authorize the script — click through the prompts
4. Switch back to your spreadsheet — you should see sheets named "MRR", "Customers", and "Summary" filled with data

### Step 4 — Set up automatic refresh

1. In the Apps Script editor, click the clock icon on the left sidebar (**Triggers**)
2. Click **+ Add Trigger**
3. Set it up:
    - Function: **importAll**
    - Event source: **Time-driven**
    - Type: **Hour timer** (or Day timer for daily updates)
    - Interval: **Every 4 hours** (or your preference)
4. Click **Save**

Your sheet will now refresh automatically.

### Step 5 — Connect the sheet to Looker Studio

1. Open [Looker Studio](https://lookerstudio.google.com)
2. Click **Create > Data source**
3. Select the **Google Sheets** connector (built-in, no installation needed)
4. Find and select your spreadsheet
5. Choose the sheet tab you want (e.g., "MRR")
6. Click **Connect**

You can now use this data source in any Looker Studio report. Repeat for each sheet tab you want to use.

---

## Method 2: Community Connector (advanced)

This method creates a direct, live connection between Looker Studio and GrowPanel's API — no intermediate spreadsheet needed. It requires deploying a Google Apps Script project as a Looker Studio connector.

### Step 1 — Create the connector project

1. Go to [Google Apps Script](https://script.google.com) and click **New project**
2. Rename the project to "GrowPanel Connector"
3. Delete any existing code in `Code.gs` and paste the following:

```javascript
var cc = DataStudioApp.createCommunityConnector();

function getAuthType() {
  return cc.newAuthTypeResponse()
    .setAuthType(cc.AuthType.KEY)
    .setHelpUrl('https://growpanel.io/docs/settings/integrations/looker-studio/')
    .build();
}

function setCredentials(request) {
  PropertiesService.getUserProperties().setProperty('apiKey', request.key);
  return { errorCode: 'NONE' };
}

function isAuthValid() {
  var key = PropertiesService.getUserProperties().getProperty('apiKey');
  if (!key) return false;
  try {
    var response = UrlFetchApp.fetch('https://api.growpanel.io/reports/summary', {
      headers: { 'Authorization': 'Bearer ' + key },
      muteHttpExceptions: true
    });
    return response.getResponseCode() === 200;
  } catch (e) {
    return false;
  }
}

function resetAuth() {
  PropertiesService.getUserProperties().deleteProperty('apiKey');
}

function getConfig() {
  var config = cc.getConfig();
  config.newSelectSingle()
    .setId('endpoint')
    .setName('Data to import')
    .setHelpText('Choose which GrowPanel data to load')
    .setAllowOverride(true)
    .addOption(config.newOptionBuilder().setLabel('MRR over time').setValue('/reports/mrr'))
    .addOption(config.newOptionBuilder().setLabel('MRR summary').setValue('/reports/summary'))
    .addOption(config.newOptionBuilder().setLabel('Customers').setValue('/customers'))
    .addOption(config.newOptionBuilder().setLabel('Movement table').setValue('/reports/movement-table'))
    .addOption(config.newOptionBuilder().setLabel('Plans').setValue('/plans'))
    .addOption(config.newOptionBuilder().setLabel('Leads').setValue('/reports/leads'));
  config.setDateRangeRequired(false);
  return config.build();
}

function getSchema(request) {
  var key = PropertiesService.getUserProperties().getProperty('apiKey');
  var endpoint = request.configParams.endpoint || '/reports/summary';
  var data = fetchData(key, endpoint);
  if (!data || data.length === 0) {
    return { schema: [] };
  }

  var fields = Object.keys(data[0]).map(function(name) {
    var sample = data[0][name];
    var field = cc.newField()
      .setId(name)
      .setName(name);
    if (typeof sample === 'number') {
      field.setType(cc.FieldType.NUMBER);
    } else {
      field.setType(cc.FieldType.TEXT);
    }
    return field;
  });

  return cc.newGetSchemaResponse().setFields(fields).build();
}

function getData(request) {
  var key = PropertiesService.getUserProperties().getProperty('apiKey');
  var endpoint = request.configParams.endpoint || '/reports/summary';
  var data = fetchData(key, endpoint);

  var requestedFieldNames = request.fields.map(function(f) { return f.name; });
  var rows = data.map(function(row) {
    return {
      values: requestedFieldNames.map(function(name) {
        var val = row[name];
        return val !== undefined && val !== null ? val : '';
      })
    };
  });

  var fields = request.fields.map(function(f) {
    var sample = data.length > 0 ? data[0][f.name] : '';
    var field = cc.newField()
      .setId(f.name)
      .setName(f.name);
    if (typeof sample === 'number') {
      field.setType(cc.FieldType.NUMBER);
    } else {
      field.setType(cc.FieldType.TEXT);
    }
    return field;
  });

  return cc.newGetDataResponse()
    .setFields(fields)
    .addAllRows(rows)
    .build();
}

function fetchData(apiKey, endpoint) {
  var response = UrlFetchApp.fetch('https://api.growpanel.io' + endpoint, {
    headers: { 'Authorization': 'Bearer ' + apiKey },
    muteHttpExceptions: true
  });
  if (response.getResponseCode() !== 200) {
    cc.newUserError()
      .setText('API returned status ' + response.getResponseCode())
      .throwException();
  }
  var json = JSON.parse(response.getContentText());
  return json.result || json;
}
```

### Step 2 — Update the manifest

1. In the left sidebar, click **Project Settings** (gear icon)
2. Check **Show "appsscript.json" manifest file in editor**
3. Go back to the editor and open `appsscript.json`
4. Replace its contents with:

```json
{
  "timeZone": "America/New_York",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "dataStudio": {
    "name": "GrowPanel",
    "description": "Connect GrowPanel subscription analytics to Looker Studio",
    "company": "GrowPanel",
    "logoUrl": "https://growpanel.io/images/growpanel-icon.png",
    "addonUrl": "https://growpanel.io/docs/settings/integrations/looker-studio/",
    "supportUrl": "https://growpanel.io/docs/settings/integrations/looker-studio/"
  }
}
```

5. Click **Save**

### Step 3 — Deploy the connector

1. Click **Deploy > New deployment**
2. Click the gear icon next to "Select type" and choose **Add-on**
3. Add a description (e.g., "GrowPanel connector v1")
4. Click **Deploy**
5. Copy the **Deployment ID** — you'll need it next

### Step 4 — Use the connector in Looker Studio

1. Open [Looker Studio](https://lookerstudio.google.com)
2. Click **Create > Data source**
3. Search for **"GrowPanel"** in the connector list, or click **Build your own** and enter your Deployment ID
4. When prompted, paste your **GrowPanel API key**
5. Choose which data to import (MRR over time, Customers, etc.)
6. Click **Connect**

You now have a live data source that Looker Studio queries directly from GrowPanel's API.

---

## Available data

Both methods give you access to the same GrowPanel API endpoints. Here are the most useful ones for reporting:

| Endpoint | Description | Example fields |
|----------|-------------|----------------|
| `/reports/mrr` | MRR over time | date, mrr, customers |
| `/reports/summary` | Current period summary | new_mrr, churned_mrr, net_mrr, total_mrr |
| `/customers` | Customer list | name, email, status, current_mrr, plan |
| `/reports/movement-table` | MRR movements by month | date, new, expansion, contraction, churn, reactivation |
| `/reports/leads` | Trial and lead metrics | date, new_leads, conversions |
| `/plans` | Active plans | name, billing_freq, currency |

For the complete list, see the [API reference](/docs/api-reference/).

---

## Refreshing data

- **Google Sheets method**: Data refreshes on the schedule you set in Apps Script Triggers (e.g., every 4 hours). Looker Studio picks up changes automatically when the sheet updates.
- **Community Connector method**: Looker Studio caches data for up to 15 minutes by default. You can click the refresh icon in any report to fetch the latest data.

---

## Revoking access

To disconnect:

1. Go to **Settings > Integrations** in GrowPanel
2. Click **Remove** on the Looker Studio card

This revokes the API key immediately. Any connected Looker Studio reports or Google Sheets scripts using that key will stop receiving data. You can enable the integration again at any time to generate a new key.

---

## Troubleshooting

| Issue | Solution |
|-------|----------|
| "Authorization failed" in Looker Studio | Check that you pasted the full API key, including all three dot-separated parts |
| Google Sheets script returns no data | Open Apps Script, run `importAll` manually, and check the **Execution log** for errors |
| Data looks stale in Looker Studio | Click the refresh icon in your report, or check that your Sheets trigger is running |
| Lost your API key | Click **Remove** on the Looker Studio card in GrowPanel, then click **Enable** to generate a new key |
| "API returned status 401" | Your API key may have been revoked. Generate a new one in GrowPanel |

---

## Related pages

- [Integrations overview](/docs/settings/integrations/) - How integrations work
- [API reference](/docs/api-reference/) - Full list of available endpoints
- [Webhooks](/docs/settings/integrations/webhooks/) - Send data to custom endpoints
- [Exports](/docs/settings/exports/) - CSV export of customers and movements

---

## Make
<!-- url: https://growpanel.io/docs/settings/integrations/make -->

Connect GrowPanel to Make (formerly Integromat) to build powerful automation scenarios triggered by subscription events. Use Make's webhook module to receive real-time MRR data and connect it to hundreds of apps.

---

## Setting up the integration

### 1. Create a webhook in Make

1. Log in to your Make account
2. Create a new scenario or open an existing one
3. Add a **Webhooks > Custom webhook** module as the trigger
4. Click **Add** to create a new webhook
5. Give it a name like "GrowPanel MRR Events"
6. Copy the webhook URL that Make generates

### 2. Configure the webhook in GrowPanel

1. Go to **Settings > Integrations** in GrowPanel
2. Find the **Webhooks** card and click **Enable**
3. Paste your Make webhook URL
4. Click **Test** to send a test payload
5. Click **Enable** to save

### 3. Define the data structure in Make

After receiving the test payload:

1. Return to Make and click **Redetermine data structure**
2. Make will parse the test payload and create the data structure
3. You can now use the fields in subsequent modules

---

## Filtering events

You can filter which events trigger your scenario in two ways:

### Option 1: Filter in GrowPanel

Click **Settings** on the Webhooks card in GrowPanel:

- Set a **Threshold** to only send movements above a certain MRR value
- Enable/disable specific **Event types** (new, expansion, contraction, churn, etc.)

This reduces the number of webhook calls to Make.

### Option 2: Filter in Make

Add a filter after the webhook module to route or ignore certain events:

- Filter by `event` value (`new`, `expansion`, `contraction`, `churn`, `reactivation`, `scheduled_churn`, `failed_payment`)
- Filter by `movement.mrr_change` amount
- Filter by `customer.status`

This gives you more flexibility but uses more Make operations.

---

## Example scenarios

### Send Slack message for new customers

1. **Webhooks** module receives GrowPanel event
2. **Filter**: Only continue if `event` equals `new`
3. **Slack** module sends a message to #sales-wins

### Update HubSpot deal on churn

1. **Webhooks** module receives GrowPanel event
2. **Filter**: Only continue if `event` equals `churn`
3. **HubSpot** module searches for deal by customer email
4. **HubSpot** module updates deal stage to "Churned"

### Create Notion database entry for all MRR changes

1. **Webhooks** module receives GrowPanel event
2. **Notion** module creates a new database item with customer name, event type, MRR change, and date

### Trigger dunning sequence on failed payment

1. **Webhooks** module receives GrowPanel event
2. **Filter**: Only continue if `event` equals `failed_payment`
3. **Email** or **Customer.io** module triggers recovery campaign

---

## Webhook payload

The payload structure from GrowPanel:

### MRR movement events

```json
{
  "event": "expansion",
  "timestamp": "2025-03-15T10:30:00Z",
  "customer": {
    "id": "cus_456",
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "status": "active",
    "current_mrr": 9900,
    "currency": "usd"
  },
  "movement": {
    "type": "expansion",
    "mrr_change": 5000,
    "currency": "usd",
    "date": "2025-03-15",
    "plan_name": "Pro Plan",
    "subscription_id": "sub_789"
  }
}
```

### Failed payment events

```json
{
  "event": "failed_payment",
  "timestamp": "2025-03-15T14:30:00Z",
  "customer": {
    "id": "cus_456",
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "status": "past_due",
    "current_mrr": 4900,
    "currency": "usd"
  },
  "payment": {
    "invoice_id": "inv_789",
    "amount": 4900,
    "currency": "usd",
    "failure_reason": "card_declined",
    "attempt_count": 1,
    "date": "2025-03-15"
  }
}
```

---

## Available fields

| Field | Description |
|-------|-------------|
| `event` | Event type: `new`, `expansion`, `contraction`, `churn`, `reactivation`, `scheduled_churn`, `failed_payment` |
| `timestamp` | ISO 8601 timestamp of the event |
| `customer.id` | Customer ID from your billing source |
| `customer.name` | Customer name |
| `customer.email` | Customer email |
| `customer.status` | Current status: `active`, `trialing`, `past_due`, `canceled` |
| `customer.current_mrr` | Customer's total MRR in cents |
| `customer.currency` | Customer's currency |
| `movement.type` | Movement type (for MRR events) |
| `movement.mrr_change` | MRR change in cents |
| `movement.plan_name` | Name of the plan involved |
| `payment.invoice_id` | Invoice ID (for failed payment events) |
| `payment.failure_reason` | Why the payment failed |

---

## Troubleshooting

### Webhook not triggering

- Verify the scenario is **active** (toggle is on)
- Check that the webhook URL in GrowPanel matches Make exactly
- Use the **Test** button in GrowPanel to send a test payload

### Data structure issues

- Click **Redetermine data structure** after receiving a new test payload
- Make sure you received a real event, not just the connection test

### Missing fields

- Some fields only appear for certain event types (e.g., `payment` for failed_payment events)
- Use the "Ignore missing filters" option in Make if needed

---

## Related pages

- [Webhooks](/docs/settings/integrations/webhooks/) - Webhook payload reference
- [n8n](/docs/settings/integrations/n8n/) - n8n integration with native node
- [Integrations overview](/docs/settings/integrations/) - How integrations work

---

## n8n
<!-- url: https://growpanel.io/docs/settings/integrations/n8n -->

GrowPanel offers a native n8n community node that makes it easy to build powerful subscription automation workflows. The node automatically subscribes to GrowPanel webhooks and triggers your workflows when MRR events occur.

---

## Installing the node

The GrowPanel node is available as an npm package. Install it in your n8n instance:

```bash
npm install n8n-nodes-growpanel
```

After installation, restart n8n and you'll find the **GrowPanel Trigger** node in the node palette.

For n8n Cloud users, community nodes can be installed via **Settings > Community Nodes**.

---

## Setting up credentials

Before using the GrowPanel Trigger node, you need to configure your API credentials:

1. In n8n, go to **Settings > Credentials**
2. Click **Add Credential** and search for "GrowPanel"
3. Enter your GrowPanel API key (found in **Settings > API Keys** in GrowPanel)
4. Click **Save**

The node will automatically verify your API key when you save.

---

## Using the GrowPanel Trigger

The GrowPanel Trigger node listens for subscription events and starts your workflow when they occur.

### Event types

| Event | Description |
|-------|-------------|
| Any MRR Change | Triggers on any MRR movement |
| New Subscription | A new customer subscribes |
| Expansion | MRR increases (upgrade, add-on, quantity increase) |
| Contraction | MRR decreases (downgrade, quantity decrease) |
| Churn | Customer cancels their subscription |
| Reactivation | Previously churned customer resubscribes |
| Scheduled Churn | Future cancellation is detected |
| Failed Payment | First payment failure after successful payments |

### Optional filters

- **Minimum MRR Change** - Only trigger if the MRR change is at least this amount (in cents)
- **Currency Filter** - Only trigger for events in a specific currency

---

## Example workflows

### Slack notification for high-value churn

1. Add a **GrowPanel Trigger** node set to "Churn"
2. Set **Minimum MRR Change** to 10000 (= $100)
3. Connect to a **Slack** node to post to #revenue-alerts

### CRM update on new subscription

1. Add a **GrowPanel Trigger** node set to "New Subscription"
2. Connect to a **HTTP Request** node that updates your CRM
3. Use the customer email and MRR data from the trigger payload

### Failed payment recovery

1. Add a **GrowPanel Trigger** node set to "Failed Payment"
2. Connect to your dunning email service or internal ticketing system
3. Use the payment details to create appropriate follow-up

---

## Trigger payload

The GrowPanel Trigger provides the following data to your workflow:

```json
{
  "event": "new",
  "timestamp": "2025-03-15T10:30:00Z",
  "customer": {
    "id": "cus_456",
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "status": "active",
    "current_mrr": 4900,
    "currency": "usd"
  },
  "movement": {
    "type": "new",
    "mrr_change": 4900,
    "currency": "usd",
    "date": "2025-03-15",
    "plan_name": "Pro Plan",
    "subscription_id": "sub_789"
  }
}
```

For failed payment events, the payload includes payment details instead of movement:

```json
{
  "event": "failed_payment",
  "timestamp": "2025-03-15T14:30:00Z",
  "customer": {
    "id": "cus_456",
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "status": "past_due",
    "current_mrr": 4900,
    "currency": "usd"
  },
  "payment": {
    "invoice_id": "inv_789",
    "amount": 4900,
    "currency": "usd",
    "failure_reason": "card_declined",
    "attempt_count": 1,
    "date": "2025-03-15"
  }
}
```

---

## How it works

When you activate a workflow with a GrowPanel Trigger node:

1. n8n calls the GrowPanel API to register a webhook subscription
2. GrowPanel stores the webhook URL with your event filter settings
3. When a matching event occurs, GrowPanel sends a POST request to n8n
4. n8n receives the payload and executes your workflow

When you deactivate the workflow, n8n automatically removes the webhook subscription from GrowPanel.

---

## Troubleshooting

### Credential test fails

- Verify your API key is correct (copy from **Settings > API Keys** in GrowPanel)
- Ensure your GrowPanel subscription includes API access

### Triggers not firing

- Check that your workflow is **active** (not just saved)
- Verify the event type matches what you're expecting
- Check if filters (minimum MRR, currency) are too restrictive

### Multiple triggers for same event

- This is expected if you have multiple workflows listening for the same event type
- Each workflow with a GrowPanel Trigger creates its own webhook subscription

---

## Related pages

- [Webhooks](/docs/settings/integrations/webhooks/) - Custom webhook integration
- [Make](/docs/settings/integrations/make/) - Make (Integromat) integration
- [Integrations overview](/docs/settings/integrations/) - How integrations work

---

## Slack Integration
<!-- url: https://growpanel.io/docs/settings/integrations/slack -->

The Slack integration posts MRR movement alerts directly to a Slack channel in your workspace. When a customer subscribes, upgrades, churns, or triggers any other MRR change, GrowPanel sends a formatted message to Slack within minutes.

---

## Connecting Slack

1. Go to **Settings > Integrations**
2. Find the **Slack** card and click **Connect**
3. You'll be redirected to Slack's authorization page
4. Select the workspace and channel where you want notifications
5. Click **Allow**

You're redirected back to GrowPanel and the integration is active immediately. The card shows which workspace and channel you connected.



### Permissions

GrowPanel requests only the `incoming-webhook` scope, which allows it to post messages to the single channel you selected during authorization. GrowPanel cannot read your messages, access other channels, or perform any other actions in your workspace.

---

## Configuring notifications

After connecting, click the **Settings** button on the Slack card to configure what gets sent:

- **Threshold** - Minimum MRR change to trigger a notification (e.g., "Over $100" to skip small movements)
- **Event types** - Which movement types to send (new, expansion, contraction, churn, reactivation, scheduled cancellation)

By default, all event types are enabled with no minimum threshold, so every MRR movement is sent to Slack.

See [Integrations overview](/docs/settings/integrations/) for details on threshold and event type settings.

---

## Message format

Slack messages use Block Kit formatting and include:

- An emoji indicating the movement type (e.g. a money bag for new MRR, a red triangle for churn)
- The MRR change amount in the customer's currency
- The movement type label
- The customer's name
- A description of what changed (e.g. "subscribed to Pro Plan")

Example messages:

> **$500.00 new MRR** -- Acme Corp
> subscribed to Pro Plan

> **$200.00 MRR churned** -- Widget Co
> cancelled Business Plan

---

## Changing the channel

To send notifications to a different channel, disconnect the current integration and reconnect:

1. Click **Remove connection** on the Slack card
2. Click **Connect** again
3. Select the new channel during Slack authorization

---

## Disconnecting

Click **Remove connection** on the Slack card. This removes the webhook URL and notification settings. You can reconnect at any time.

---

## Troubleshooting

| Issue | Solution |
|-------|----------|
| Messages not appearing | Verify the channel still exists and hasn't been archived |
| "Slack integration failed" on connect | The authorization code may have expired. Try connecting again |
| Want to change the channel | Disconnect and reconnect, selecting the new channel |
| Too many notifications | Click **Settings** and increase the threshold or reduce event types |

---

## Related pages

- [Integrations overview](/docs/settings/integrations/) - How integrations work
- [Microsoft Teams](/docs/settings/integrations/teams/) - Teams integration
- [Webhooks](/docs/settings/integrations/webhooks/) - Custom webhook integration
- [Notifications](/docs/settings/notifications/) - Per-user email alerts

---

## Microsoft Teams Integration
<!-- url: https://growpanel.io/docs/settings/integrations/teams -->

The Microsoft Teams integration posts MRR movement alerts to a Teams channel using an Incoming Webhook. When a customer subscribes, upgrades, churns, or triggers any other MRR change, GrowPanel sends a message to your configured channel.

---

## Before you begin

Teams uses Incoming Webhooks, which means you first create a webhook URL inside Teams, then paste it into GrowPanel. No OAuth or app installation is required.

You need:

- Access to a Microsoft Teams workspace
- Permission to add connectors to a channel (or ask your Teams admin)

---

## Step 1: Create an Incoming Webhook in Teams

1. Open Microsoft Teams and go to the channel where you want notifications
2. Click the **...** (more options) menu on the channel name
3. Select **Connectors** (or **Manage channel > Connectors** in newer versions)
4. Find **Incoming Webhook** and click **Configure**
5. Give it a name like "GrowPanel" and optionally upload an icon
6. Click **Create**
7. Copy the webhook URL that appears

For detailed instructions, see [Microsoft's documentation on creating an Incoming Webhook](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=newteams%2Cjavascript#create-an-incoming-webhook).

---

## Step 2: Connect in GrowPanel

1. Go to **Settings > Integrations**
2. Find the **Teams** card and click **Connect**
3. Paste the webhook URL you copied from Teams
4. Click **Done**

The integration is active immediately and the card shows "Teams webhook activated".

---

## Configuring notifications

After connecting, click the **Settings** button on the Teams card to configure what gets sent:

- **Threshold** - Minimum MRR change to trigger a notification (e.g., "Over $100")
- **Event types** - Which movement types to send (new, expansion, contraction, churn, reactivation, scheduled cancellation)

By default, all event types are enabled with no minimum threshold.

See [Integrations overview](/docs/settings/integrations/) for details on threshold and event type settings.

---

## Message format

Teams messages are sent as plain text and include:

- An emoji indicating the movement type
- The MRR change amount in the customer's currency
- The movement type label
- The customer's name
- A description of what changed

Example messages:

> $500.00 new MRR -- Acme Corp
> subscribed to Pro Plan

> $200.00 MRR churned -- Widget Co
> cancelled Business Plan

---

## Disconnecting

Click **Remove Teams webhook** on the Teams card. This removes the webhook URL and notification settings. You can reconnect at any time by pasting a new webhook URL.

---

## Sending to multiple channels

To send different alerts to different Teams channels, you currently configure one channel per account. If you need alerts in multiple channels, consider using the [Webhook integration](/docs/settings/integrations/webhooks/) with a service like Power Automate to route notifications.

---

## Troubleshooting

| Issue | Solution |
|-------|----------|
| Messages not appearing | Verify the webhook URL is still valid in Teams (connectors can be removed by admins) |
| "Webhook URL must use HTTPS" | Ensure the URL starts with `https://` |
| Channel was deleted or renamed | Create a new Incoming Webhook in the new channel and reconnect |
| Too many notifications | Click **Settings** and increase the threshold or reduce event types |
| Connector option not available | Your Teams admin may have disabled third-party connectors. Contact your IT team |

---

## Related pages

- [Integrations overview](/docs/settings/integrations/) - How integrations work
- [Slack](/docs/settings/integrations/slack/) - Slack integration
- [Webhooks](/docs/settings/integrations/webhooks/) - Custom webhook integration
- [Notifications](/docs/settings/notifications/) - Per-user email alerts

---

## Webhooks
<!-- url: https://growpanel.io/docs/settings/integrations/webhooks -->

The webhook integration sends a JSON payload to any HTTPS URL whenever an MRR movement occurs. Use webhooks to build custom integrations, connect to automation tools, or feed data into internal systems.

---

## Connecting a webhook

1. Go to **Settings > Integrations**
2. Find the **Webhooks** card and click **Enable**
3. Enter your webhook endpoint URL (must use HTTPS)
4. Optionally click **Test** to send a test payload and verify your endpoint responds
5. Click **Enable** to save

The card shows "Webhook enabled" with your URL displayed.

---

## Testing your webhook

Before saving, you can send a test payload to verify your endpoint is working:

1. Enter the URL in the configuration modal
2. Click the **Test** button
3. GrowPanel sends a test payload with sample data to your URL
4. If the endpoint returns HTTP 2xx, the test passes
5. If it fails, the error message tells you what went wrong (timeout, non-2xx status, etc.)

The test payload looks like a real notification but uses dummy data (`cus_test_123`, `Pro Plan`, etc.) so you can identify it.

---

## Configuring notifications

After enabling, click the **Settings** button on the Webhooks card to configure filtering:

- **Threshold** - Minimum MRR change to trigger a notification (e.g., "Over $100")
- **Event types** - Which movement types to send (new, expansion, contraction, churn, reactivation, scheduled cancellation, failed payment)

By default, all event types are enabled with no minimum threshold, so every MRR movement is sent.

See [Integrations overview](/docs/settings/integrations/) for details on threshold and event type settings.

---

## Payload format

GrowPanel sends a `POST` request with `Content-Type: application/json`. The payload includes the customer and all movements in a single request.

### MRR movement payload

```json
{
  "event": "mrr_movement",
  "account_id": "acc_abc123",
  "customer": {
    "id": "cus_456",
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "status": "active"
  },
  "movements": [
    {
      "type": "new",
      "mrr_change": 4900,
      "currency": "usd",
      "date": "2025-03-15",
      "plan_name": "Pro Plan",
      "subscription_id": "sub_789",
      "description": "subscribed to Pro Plan",
      "is_future": false
    }
  ]
}
```

### Scheduled cancellation payload

```json
{
  "event": "scheduled_cancellation",
  "account_id": "acc_abc123",
  "customer": {
    "id": "cus_456",
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "status": "active"
  },
  "movements": [
    {
      "type": "churn",
      "mrr_change": -4900,
      "currency": "usd",
      "date": "2025-04-15",
      "plan_name": "Pro Plan",
      "subscription_id": "sub_789",
      "description": "scheduled cancellation of Pro Plan",
      "is_future": true
    }
  ]
}
```

### Failed payment payload

Sent when a customer's payment fails for the first time after previously successful payments:

```json
{
  "event": "failed_payment",
  "timestamp": "2025-03-15T14:30:00Z",
  "customer": {
    "id": "cus_456",
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "status": "past_due",
    "current_mrr": 4900,
    "currency": "usd"
  },
  "payment": {
    "invoice_id": "inv_789",
    "amount": 4900,
    "currency": "usd",
    "failure_reason": "card_declined",
    "attempt_count": 1,
    "date": "2025-03-15"
  }
}
```

This event only triggers on the first failed payment after successful payments, not on every retry or for customers who never paid successfully.

### Field reference

| Field | Type | Description |
|-------|------|-------------|
| `event` | string | `"mrr_movement"`, `"scheduled_cancellation"`, or `"failed_payment"` |
| `account_id` | string | Your GrowPanel account ID |
| `customer.id` | string | The customer's external ID from your billing source |
| `customer.name` | string | Customer name |
| `customer.email` | string | Customer email |
| `customer.status` | string | Current status: `active`, `trialing`, `past_due`, `canceled` |
| `movements[].type` | string | `new`, `expansion`, `contraction`, `churn`, or `reactivation` |
| `movements[].mrr_change` | integer | MRR change in cents (positive for growth, negative for churn) |
| `movements[].currency` | string | Three-letter currency code (lowercase) |
| `movements[].date` | string | Date of the movement |
| `movements[].plan_name` | string | Name of the plan involved |
| `movements[].subscription_id` | string | Subscription ID from the billing source |
| `movements[].description` | string | Human-readable description of the change |
| `movements[].is_future` | boolean | `true` for scheduled future movements |
| `payment.invoice_id` | string | Invoice ID from billing source (failed_payment only) |
| `payment.amount` | integer | Payment amount in cents (failed_payment only) |
| `payment.currency` | string | Three-letter currency code (failed_payment only) |
| `payment.failure_reason` | string | Why the payment failed (failed_payment only) |
| `payment.attempt_count` | integer | Number of payment attempts (failed_payment only) |
| `payment.date` | string | Date of the failed payment (failed_payment only) |

### Multiple movements

A single webhook call may contain multiple movements if they occurred together (e.g., a customer switching plans generates both a contraction on the old plan and an expansion on the new plan).

---

## Requirements for your endpoint

Your webhook endpoint must:

- Accept `POST` requests
- Use HTTPS (HTTP is not supported)
- Return a 2xx status code within 5 seconds
- Accept `Content-Type: application/json`

GrowPanel does not retry failed deliveries. If your endpoint is down or returns an error, that notification is lost. For reliable delivery, consider using a webhook relay service that queues and retries.

---

## Changing the URL

Click **Configure** on the Webhooks card to update the endpoint URL. You can also test the new URL before saving.

---

## Disabling

Click **Disable** on the Webhooks card. This removes the webhook URL and notification settings. No further payloads will be sent.

---

## Use cases

| Use case | How |
|----------|-----|
| Custom Slack bot | Point the webhook at your own Slack bot that formats messages your way |
| CRM updates | Update deal stages or customer records when MRR changes |
| Internal dashboard | Feed real-time MRR data into your own analytics system |
| Zapier / Make / n8n | Use webhook triggers to connect to thousands of apps |
| Alerting | Route to PagerDuty or Opsgenie for high-value churn alerts |
| Dunning workflows | Trigger automated payment recovery when a payment fails |

---

## Related pages

- [Integrations overview](/docs/settings/integrations/) - How integrations work
- [n8n](/docs/settings/integrations/n8n/) - n8n integration with native node
- [Make](/docs/settings/integrations/make/) - Make (formerly Integromat) integration
- [Slack](/docs/settings/integrations/slack/) - Slack integration
- [Microsoft Teams](/docs/settings/integrations/teams/) - Teams integration
- [Notifications](/docs/settings/notifications/) - Per-user email alerts

---

## Notifications
<!-- url: https://growpanel.io/docs/settings/notifications -->

**Notifications** let you receive email alerts when MRR changes occur and schedule automated email reports. These settings are per-user -- each team member configures their own preferences.



---

## Accessing notification settings

Navigate to **Settings > Notifications**. The page has two sections: MRR change notifications and scheduled reports.

Changes you make here affect only your user. Other team members on the same account have their own independent settings.

---

## MRR change notifications

Get an email when customers cause MRR changes. There are two separate thresholds:

### New MRR, expansions, and reactivations

Choose when to receive emails about positive MRR changes:

| Setting | Effect |
|---------|--------|
| **No** | Don't email me about these |
| **Yes, all amounts** | Email on every new subscription, upgrade, or reactivation |
| **Over $25** through **Over $1000** | Only email when the MRR change exceeds this amount |

### Churn and contractions

Choose when to receive emails about negative MRR changes:

| Setting | Effect |
|---------|--------|
| **No** | Don't email me about churn or contractions |
| **Yes, all amounts** | Email on every churn or downgrade |
| **Over $25** through **Over $1000** | Only email when the MRR loss exceeds this amount |

### Include scheduled churn

When churn/contraction notifications are enabled, you can also opt in to **scheduled churn** alerts. These notify you when a customer schedules a cancellation for a future date (e.g., "cancel at end of billing period"), giving you a chance to reach out before the cancellation takes effect.

This checkbox only appears when churn notifications are enabled.

### How thresholds work

Thresholds are compared in USD. For non-USD currencies, GrowPanel converts the MRR change using daily exchange rates before checking against your threshold. This means a threshold of "$100" applies consistently regardless of the customer's billing currency.

Very small movements (under $1 USD) are always skipped to filter out rounding artifacts from annual plan adjustments.

### Email format

Notification emails include:

- The MRR change amount and type (new, expansion, contraction, churn, reactivation)
- The customer's name and email
- Which plan or subscription changed
- A link to the customer's profile in GrowPanel
- A link to your MRR report

---

## Scheduled reports

Receive automated email summaries of your metrics on a regular schedule. Toggle each report type independently:

| Report | Frequency | Content |
|--------|-----------|---------|
| **Daily email report** | Every day | Previous day's MRR summary, movements, and highlights |
| **Weekly email report** | Every Monday | Previous week's metrics and trends |
| **Monthly email report** | First of each month | Previous month's full summary |

Reports are sent based on your account's timezone setting. They are generated using AI to provide narrative insights alongside the numbers.

Changes take effect immediately -- check or uncheck a report type and it saves automatically.

---

## Integrations (Slack, Teams, Webhooks)

For team-wide notifications via Slack, Microsoft Teams, or custom webhooks, see [Integrations](/docs/settings/integrations/). These are account-level settings configured separately under **Settings > Integrations**.

| | Email notifications (this page) | Integrations |
|---|---|---|
| **Scope** | Per-user | Per-account |
| **Separate expansion/churn thresholds** | Yes | No (single threshold) |
| **Channel** | Your email | Slack channel, Teams channel, or webhook URL |

---

## Related pages

- [Integrations](/docs/settings/integrations/) - Account-wide Slack, Teams, and webhook notifications
- [MRR](/docs/reports-and-metrics/mrr/) - Understanding MRR movements
- [Scheduled Churn](/docs/reports-and-metrics/scheduled-churn/) - Track upcoming cancellations
- [Team](/docs/account-and-billing/team/) - Manage team members and roles

---

## Plan Groups
<!-- url: https://growpanel.io/docs/settings/plan-groups -->

**Plan Groups** let you organize your subscription plans into logical groups for cleaner reporting. Instead of seeing every individual price point, you can group related plans together to analyze performance at a product or tier level.

---

## Why use plan groups?

Billing platforms often create many individual plan records:

- Different billing intervals (monthly, annual)
- Different currencies (USD, EUR, GBP)
- Legacy plans and grandfathered prices
- Regional pricing variations

Without grouping, your reports might show:

```
Pro Monthly USD
Pro Monthly EUR
Pro Annual USD
Pro Annual EUR
Pro Legacy Monthly
...
```

With plan groups, you can consolidate these into:

```
Pro
```

This makes it easier to answer questions like "How is the Pro tier performing?" without manually aggregating across multiple line items.

---

## Accessing plan groups

Navigate to **Settings → Plan Groups** to manage your plan organization.



<!-- IMAGE PLACEHOLDER: Screenshot of the Plan Groups page showing a list of plan groups on the left, and the plans within a selected group on the right -->

---

## Default behavior

When you connect a data source, GrowPanel automatically creates plan groups based on your billing platform's structure:

| Platform | Default Grouping |
|----------|------------------|
| **Stripe** | Groups by Product, with Prices as individual plans |
| **Chargebee** | Groups by Plan, with prices as individual plans |
| **Recurly** | Groups by Plan, with currencies as individual plans |

This default works well for many businesses, but you can customize it to match how you think about your products.

---

## Plan groups list

The left panel shows all your plan groups:

| Element | Description |
|---------|-------------|
| **Group name** | The display name for this group |
| **Plan count** | Number of individual plans in the group |
| **MRR** | Current MRR from all plans in this group |
| **Subscribers** | Active subscriber count |

Click a group to see and manage the plans it contains.

---

## Managing plan groups

### Create a new group

1. Click **New Plan Group**
2. Enter a name for the group
3. Click **Create**

The new group is created empty. Add plans to it using drag-and-drop or the plan editor.

<!-- IMAGE PLACEHOLDER: Screenshot of the "New Plan Group" dialog with a name input field -->

### Rename a group

1. Click the group to select it
2. Click the **Edit** (pencil) icon
3. Enter the new name
4. Press Enter or click Save

### Delete a group

1. Select the group
2. Click **Delete**
3. Choose what to do with the plans inside:
   - Move to another group
   - Create individual groups for each plan
   - Move to "Ungrouped"

---

## Managing plans within groups

### View plans in a group

Click a group to see its plans in the right panel:

| Column | Description |
|--------|-------------|
| **Plan name** | Individual plan/price name |
| **Plan ID** | Identifier from your billing source |
| **Interval** | Billing frequency (monthly, annual, etc.) |
| **Currency** | Billing currency |
| **MRR** | Current MRR from this specific plan |

### Move plans between groups

**Drag and drop:**
1. Click and hold a plan
2. Drag it to the target group in the left panel
3. Release to move it

**Using the plan editor:**
1. Click a plan to select it
2. Click **Move to...**
3. Select the target group

### Move multiple plans

1. Hold Shift and click to select multiple plans
2. Drag to the target group, or use **Move to...**

---

## Ungrouped plans

Plans that haven't been assigned to a group appear in the **Ungrouped** section:

- New plans from your billing source land here first
- Review ungrouped plans periodically
- Assign them to appropriate groups for cleaner reports

GrowPanel will notify you when new ungrouped plans appear after syncing.

---

## Organize with AI

If you have many plans and aren't sure how to group them, click the **Organize with AI** button in the top-right corner. GrowPanel will analyze all your plans and suggest logical groupings automatically.



### How it works

1. Click **Organize with AI** in the plan groups header
2. GrowPanel sends your plan names and IDs to an AI model for analysis
3. A modal appears showing the suggested groupings
4. Review the suggestions — each group shows its name and the plans it contains
5. Click **Apply suggestions** to replace your current plan groups with the AI's recommendation

The AI groups plans by their **product or tier name**, ignoring differences in currency, billing interval, and price. For example, "Pro Monthly USD", "Pro Yearly EUR", and "Pro Monthly GBP" would all be grouped under "Pro".

### What to expect

- Plans that don't clearly fit any group are placed in an "Other" group
- If the AI's suggestions already match your current setup, you'll see a message confirming that
- Every plan is assigned to exactly one group — nothing is left out
- Group names are kept short and descriptive (e.g., "Starter", "Pro", "Enterprise")

### Important notes

- **Applying replaces all groups** — when you click "Apply suggestions", all your existing plan groups are deleted and replaced with the AI's recommendation. Review the suggestions carefully before applying.
- **Admin or Owner only** — the Organize with AI button is only visible to users with Admin or Owner roles.
- You can always manually adjust the groups after applying, using the standard drag-and-drop and editing tools.

---

## How plan groups affect reports

Plan groups appear throughout GrowPanel:

| Report Feature | How Plan Groups Appear |
|----------------|----------------------|
| **Plan filter** | Filter by plan group instead of individual plans |
| **Breakdown by Plan** | Shows one line/bar per plan group |
| **MRR by Plan table** | Aggregates to plan group level |
| **Customer detail** | Shows plan group name |

### Viewing individual plans

If you need to see individual plan performance:

1. Use the plan filter to select a specific group
2. Within that view, individual plans may be visible in detail tables
3. Or create single-plan groups for plans you want to track separately

---

## Best practices

### Strategy 1: Group by product tier

The most common approach is grouping by pricing tier:

```
Starter    → Starter Monthly, Starter Annual, Starter EUR...
Pro        → Pro Monthly, Pro Annual, Pro EUR...
Enterprise → Enterprise Monthly, Enterprise Annual...
```

**Benefits:**
- Compare tier performance at a glance
- See upgrade/downgrade flow between tiers
- Answer "How is Pro doing?" without manual aggregation

**When to use:** Single-product companies with clear pricing tiers.

### Strategy 2: Group by product line

For multi-product companies:

```
Product A - Starter
Product A - Pro
Product A - Enterprise
Product B - Basic
Product B - Premium
```

**Benefits:**
- Track each product's performance independently
- Understand which product drives growth
- Segment cohorts by product

**When to use:** Companies with multiple distinct products sold to the same or different audiences.

### Strategy 3: Separate legacy and current plans

When you've changed pricing:

```
Pro (Current)  → Current Pro plans actively sold
Pro (Legacy)   → Grandfathered plans no longer sold
```

**Benefits:**
- Track migration progress from old to new pricing
- Understand revenue mix between legacy and current
- Measure ARPA improvements from pricing changes

**When to use:** After a pricing change when you want to track the transition.

### Strategy 4: Separate base plans and add-ons

For usage-based or add-on pricing:

```
Base Plans    → Core subscription plans
Add-ons       → Optional features, seats, usage
One-time      → Setup fees, services, non-recurring
```

**Benefits:**
- Understand recurring base revenue vs variable revenue
- Track add-on attach rates
- Forecast more accurately

**When to use:** Companies with significant add-on or usage-based revenue.

### Strategy 5: Group by customer segment

For different market segments:

```
SMB Plans       → Self-serve plans
Mid-Market      → Sales-assisted plans
Enterprise      → Custom enterprise deals
```

**Benefits:**
- Compare segment performance
- Track different go-to-market motions
- Measure segment-specific metrics (ARPA, churn)

**When to use:** Companies serving distinct market segments with different plans.

### Common mistakes to avoid

**Too granular:**
```
Pro Monthly USD
Pro Monthly EUR
Pro Annual USD
Pro Annual EUR
```
This defeats the purpose of grouping. Consolidate into "Pro" unless you need currency/interval breakdown.

**Too aggregated:**
```
All Plans
```
One giant group provides no insight. At minimum, separate by tier or product.

**Inconsistent naming:**
```
starter
Pro Plan
ENTERPRISE tier
```
Use consistent naming conventions (e.g., all title case, no suffixes).

**Forgetting to group new plans:**
Check the "Ungrouped" section regularly. New plans from your billing source land there and should be organized.

### Recommended grouping for common scenarios

**Simple SaaS (one product, 3 tiers):**
```
Free / Trial
Starter
Pro
Enterprise
```

**Multi-product SaaS:**
```
[Product A] Starter
[Product A] Pro
[Product B] Basic
[Product B] Pro
```

**Usage-based SaaS:**
```
Platform Fee
Usage - API Calls
Usage - Storage
Add-ons
```

**B2B with segments:**
```
SMB - Self-serve
Mid-Market - Sales
Enterprise - Custom
Professional Services
```

---

## Syncing with your billing platform

Plan groups are managed in GrowPanel, not in your billing platform:

- New plans from your billing source are added to "Ungrouped"
- Deleted plans are automatically removed from their groups
- Changes to plan names in your billing source are reflected in GrowPanel

**Important:** Plan group assignments are stored in GrowPanel. If you disconnect and reconnect a data source, you may need to reorganize your groups.

---

## Related pages

- [Filters](/docs/reports-and-metrics/filters/) - Filter reports by plan
- [Breakdown Reports](/docs/reports-and-metrics/breakdowns/) - Analyze metrics by plan
- [Data Sources](/docs/settings/data-sources/) - Manage billing connections

---

## Reporting Settings
<!-- url: https://growpanel.io/docs/settings/reporting -->

**Reporting Settings** control how GrowPanel calculates your metrics and displays data across all reports. These settings apply account-wide and affect every user on your team.

---

## Accessing reporting settings

Navigate to **Settings → Reporting** to configure these options.



<!-- IMAGE PLACEHOLDER: Screenshot of the Reporting settings page showing tabs and the main settings form with currency, timezone, and other options -->

---

## General settings

### Default reporting currency

Set the currency used by default in all reports.

- Reports will display values in this currency
- Multi-currency revenue is converted using daily exchange rates
- Users can override this per-report using the currency selector
- Common options: USD, EUR, GBP, etc.

**Recommendation:** Choose the currency your business primarily operates in or reports to stakeholders.

### Timezone

Set the timezone for all date-based calculations.

- Affects how daily, weekly, and monthly periods are calculated
- Determines when a "day" starts and ends
- Impacts scheduled reports delivery time

**Recommendation:** Use your company's headquarters timezone or where most of your team is located.

### First day of week

Choose which day starts a new week in reports.

- Options: Sunday or Monday
- Affects weekly interval groupings in charts and tables
- Impacts week-based cohort analysis

**Recommendation:** Match your organization's standard work week definition.

---

## Churn settings

These settings control how GrowPanel recognizes and calculates churn.

### When to recognize churn

Choose when a cancellation is counted as churn:

| Option | Description |
|--------|-------------|
| **Immediate** | Churn is recognized when the cancellation is submitted |
| **End of billing period** | Churn is recognized when the subscription actually ends |

**Immediate churn recognition:**
- Reflects customer decisions in real-time
- May show higher churn in the month the customer cancels
- Revenue still appears until the subscription ends

**End-of-period churn recognition:**
- Matches when revenue actually stops
- Churn appears in the period the subscription expires
- More aligned with cash flow timing

**Recommendation:** Most businesses use "End of billing period" to match when revenue impact is felt.

<!-- IMAGE PLACEHOLDER: Screenshot showing the "When to recognize churn" dropdown with both options visible -->

### Auto-churn past-due subscribers

Automatically count customers as churned after a certain number of days past due. There are one setting for credit-card based customers, and another one for manually invoiced customers.

- Enter the number of days (e.g., 30, 60, 90)
- After this period, past-due customers are counted as churned
- If they later pay, they become a "reactivation"

**How it works:**

1. A payment fails and the customer becomes "past due"
2. The billing platform continues retrying payment
3. After X days (your setting), GrowPanel marks them as churned
4. If payment succeeds later, it's recorded as a reactivation

**Recommendation:** Set this to match your dunning (payment retry) period. If Stripe retries for 30 days, set this to 30.

---

## Movement settings

### Group MRR movements

Combine multiple movements that happen close together into a single movement.

- Enter a number of hours (e.g., 24)
- Movements within this window are combined
- Affects how movements are displayed, not the underlying calculation

**Example without grouping:**
A customer signs up, then immediately upgrades:
- 10:00 AM - New: $50 MRR
- 10:05 AM - Expansion: $50 MRR

**Example with 24-hour grouping:**
- 10:00 AM - New: $100 MRR

**When to use grouping:**
- When customers often upgrade immediately after signup
- When you want cleaner movement logs
- When trials convert and upgrade in quick succession

**When to avoid grouping:**
- When you need precise timing of each change
- When auditing individual transactions
- When movements should be tracked separately

**Recommendation:** A 24-hour window works well for most businesses to reduce noise in movement logs.

<!-- IMAGE PLACEHOLDER: Screenshot showing the group movements setting with a number input for hours -->

---

## How settings affect reports

| Setting | Affected Reports |
|---------|-----------------|
| Default currency | All revenue-based reports (MRR, ARR, LTV, etc.) |
| Timezone | All date-based groupings (daily, weekly, monthly views) |
| First day of week | Weekly intervals, cohort analysis |
| Churn recognition | Churn reports, MRR movements, scheduled churn |
| Auto-churn | Churn reports, customer status |
| Group movements | MRR detail tables, movement logs |

---

## Saving changes

After modifying settings:

1. Click **Save** at the bottom of the page
2. Changes take effect immediately for new calculations
3. Historical data is recalculated where applicable

Note: Some changes (like churn recognition timing) may cause historical metrics to shift as data is reprocessed.

---

## Related pages

- [Data Sources](/docs/settings/data-sources/) - Manage billing platform connections
- [Plan Groups](/docs/settings/plan-groups/) - Organize plans for reporting
- [Filters](/docs/reports-and-metrics/filters/) - Per-report filtering options

---

## Data Discrepancies
<!-- url: https://growpanel.io/docs/troubleshooting/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 automatically churns customers after a configurable number of days past-due (default: 30 days). Your billing platform may use a different threshold or not auto-churn at all.

If a customer's payment fails and they remain past-due for longer than your threshold, GrowPanel will count them as churned while your billing platform might still show them as active.

You can adjust this in **Settings → Billing**.

### 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.

### 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.

### 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](https://www.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 status | What it means |
|------------------|---------------|
| **Lead** | Customer record exists, no trial or subscription |
| **Trial** | In active trial period |
| **Active** | Has an active subscription (including $0 plans) |
| **Past Due** | Payment failed, awaiting payment or auto-churn |
| **Canceled** | Previously 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:
- Billing platform includes MRR on unpaid subscriptions
- One-time discounts are subtracted in GrowPanel but not in your billing platform
- Past-due customers auto-churned
- Trials are excluded
- Pending invoices not counted
- Currency conversion at different rates

### "GrowPanel shows more MRR"

Usually because:
- 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: 30 days)
- 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.

---

## 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

---

## Related pages

- [Troubleshooting](/docs/troubleshooting/) - General troubleshooting guide
- [MRR report](/docs/reports-and-metrics/mrr/) - Understanding MRR calculations
- [Reporting settings](/docs/settings/reporting/) - Configure how metrics are calculated

---

## Troubleshooting
<!-- url: https://growpanel.io/docs/troubleshooting/ -->

Having issues with GrowPanel? This section covers common problems and their solutions. If you can't find an answer here, contact our support team.

---

## Common issues

### Data and sync issues

- [Data not syncing](#data-not-syncing)
- [Missing customers or invoices](#missing-data)
- [Import taking too long](#slow-import)
- [Duplicate data](#duplicate-data)

### Metric discrepancies

- [MRR doesn't match billing platform](#mrr-doesn't-match-billing-platform)
- [Churn numbers seem wrong](#churn-numbers-seem-wrong)
- [Currency conversion issues](#currency-conversion-issues)

### Connection problems

- [Can't connect data source](#cant-connect-data-source)
- [OAuth errors with Stripe](#stripe-oauth-errors)
- [Webhook failures](#webhook-failures)

### Account issues

- [Can't sign in](#cant-sign-in)
- [Not receiving emails](#not-receiving-emails)

---

## Data not syncing

**Symptoms:** New transactions in your billing platform aren't appearing in GrowPanel.

**Possible causes and solutions:**

| Cause | Solution |
|-------|----------|
| Webhook not configured | Set up webhooks for [Chargebee](/docs/data-sources/chargebee/) or [Recurly](/docs/data-sources/recurly/) |
| Webhook URL changed | Update the webhook URL in your billing platform |
| API key revoked | Generate a new API key and update in GrowPanel |
| Rate limiting | Wait for the sync to resume (usually within an hour) |
| Data source disconnected | Reconnect the data source in Settings |

**To check sync status:**

1. Go to **Settings → Data Sources**
2. Check the status and "Last sync" time
3. Click on the source to see detailed sync history

---

## Missing data

**Symptoms:** Some customers or invoices aren't appearing in GrowPanel.

**Possible causes and solutions:**

| Cause | Solution |
|-------|----------|
| Import not complete | Wait for initial import to finish |
| API key permissions | Ensure the API key has read access to all resources |
| Filters applied | Check if a filter is hiding the data |
| Different date range | Adjust the date range in the report |
| Data source filter | Check Data Source filter if you have multiple sources |

**To verify:**

1. Search for the specific customer in the Customers list
2. Check if filters are hiding data (look for "Filtered" badge)
3. Review the import progress in Data Sources

---

## Slow import

**Symptoms:** Initial data import is taking many hours.

**This is normal for accounts with:**

- Many thousands of customers
- Years of historical data
- Millions of invoices or transactions

**What's happening:**

1. GrowPanel fetches all historical data
2. Billing platforms have rate limits
3. Large accounts are processed in batches

**What to do:**

- Let the import continue - you'll receive an email when complete
- Check progress in **Settings → Data Sources**
- You can start using GrowPanel with partial data while import continues

**Estimated times:**

| Account size | Estimated import time |
|--------------|----------------------|
| < 1,000 customers | Minutes |
| 1,000-10,000 customers | 1-2 hours |
| 10,000-100,000 customers | 2-8 hours |
| > 100,000 customers | 8+ hours |

---

## Duplicate data

**Symptoms:** Same customer or transaction appears multiple times.

**Possible causes and solutions:**

| Cause | Solution |
|-------|----------|
| Multiple data sources | Use Data Source filter to view one source at a time |
| Webhook replay | GrowPanel handles duplicates - should resolve automatically |
| Test mode mixed with live | Ensure you're only connected to production/live accounts |

**Note:** If you connect both a Stripe test account and live account, you may see test data mixed with real data. Remove the test connection if not needed.

---

## MRR doesn't match billing platform

**Symptoms:** GrowPanel's MRR is different from your billing platform's dashboard.

**Common reasons:** Trial handling, currency conversion, pending invoices, churn timing settings, and metered billing differences.

**Quick checks:**

1. Review churn recognition setting in **Settings → Reporting**
2. Check your reporting currency settings
3. Compare at the customer level

See [Data Discrepancies](/docs/troubleshooting/data-discrepancies/) for a detailed investigation guide.

---

## Churn numbers seem wrong

**Symptoms:** Churn rate or churned MRR doesn't match expectations.

**Check these settings:**

1. **Churn recognition timing** (Settings → Reporting)
   - "Immediate" counts churn when canceled
   - "End of period" counts churn when subscription ends

2. **Auto-churn past-due setting**
   - Customers past-due beyond this threshold are counted as churned

3. **Date range**
   - Ensure you're viewing the correct period

**Common misunderstandings:**

| Situation | GrowPanel behavior |
|-----------|-------------------|
| Customer cancels mid-month | Churn is recognized based on your settings |
| Customer downgrades to free | Counted as churn (MRR goes to zero) |
| Customer switches plans | May show as contraction, not churn |
| Failed payment | Counted as churn after auto-churn threshold |

---

## Currency conversion issues

**Symptoms:** Revenue numbers in reports don't match expected conversions.

**How GrowPanel handles currency:**

1. Multi-currency revenue is converted to your reporting currency
2. Daily historical exchange rates are used
3. You can optionally fix rates at a specific date

**To troubleshoot:**

1. Check your default reporting currency in **Settings → Reporting**
2. Use the currency filter to view a specific currency
3. Enable "Fix exchange rate" to remove FX fluctuations
4. Compare individual transactions in the customer detail page

---

## Can't connect data source

**Symptoms:** Error when trying to add Stripe, Chargebee, or Recurly.

**For Stripe (OAuth):**

| Error | Solution |
|-------|----------|
| "Access denied" | Ensure you have admin access to the Stripe account |
| "Invalid account" | Verify you're connecting the correct Stripe account |
| Redirect loop | Clear browser cookies and try again |

**For Chargebee/Recurly (API key):**

| Error | Solution |
|-------|----------|
| "Invalid API key" | Verify the key is correct and has read access |
| "Site not found" | Check the subdomain/site name is correct |
| "Permission denied" | Ensure the API key has full read-only access |

---

## Stripe OAuth errors

**Symptoms:** Error during Stripe connection or disconnected unexpectedly.

**Common issues:**

| Issue | Solution |
|-------|----------|
| "This account is already connected" | The Stripe account is linked to another GrowPanel account |
| Connection keeps disconnecting | Check if another admin revoked access in Stripe |
| Can't select the right account | Clear cookies or use incognito mode |

**To reconnect:**

1. Go to **Settings → Data Sources**
2. Remove the existing Stripe connection
3. Click **Add Data Source → Stripe**
4. Complete the OAuth flow again

---

## Webhook failures

**Symptoms:** Data source shows webhook errors; real-time sync not working.

**To troubleshoot:**

1. Check webhook logs in your billing platform (Chargebee/Recurly)
2. Verify the webhook URL matches what's shown in GrowPanel
3. Ensure the webhook isn't disabled
4. Test the webhook from your billing platform

**Common fixes:**

- Re-copy the webhook URL from GrowPanel
- Delete and recreate the webhook
- Verify no firewall is blocking GrowPanel's IP addresses

---

## Can't sign in 

**Symptoms:** Unable to access your GrowPanel account.

| Issue | Solution |
|-------|----------|
| Forgot password | Click "Forgot password" and check your email |
| Wrong email | Try other email addresses you might have used |
| Google/Microsoft sign-in fails | Try the email/password option if you set one |
| "Account not found" | Check you're on the correct GrowPanel URL |
| Locked out | Contact support for account recovery |

---

## Not receiving emails

**Symptoms:** No notification emails, scheduled reports, or password resets.

**Check:**

1. Your spam/junk folder
2. That emails from growpanel.io aren't blocked
3. Your email address in **Account → Profile**
4. Notification settings in **Settings → Notifications**

**Add to safe senders:**

- notifications@growpanel.io
- reports@growpanel.io
- hello@growpanel.io

---

## Still need help?

If you can't resolve your issue, use the support widget in the bottom-right corner of the app. Include:

- Your account email
- Description of the issue
- Screenshots if applicable
- Steps you've already tried

We typically respond within 24 hours on business days.

---

## From invoices to MRR
<!-- url: https://growpanel.io/docs/understanding-your-data/from-invoices-to-mrr -->

This guide explains how GrowPanel transforms your billing data—invoices, subscriptions, refunds—into MRR movements. Understanding this process helps you trust your numbers, explain differences from your billing platform, and interpret edge cases correctly.

MRR movements are the foundation of nearly every report in GrowPanel: MRR, ARR, churn, retention, cohorts, and more. They all derive from the same underlying movement data.

---

## How billing data becomes MRR movements

GrowPanel processes your billing data in this order:

1. **Import invoices and subscriptions** from your billing source
2. **Walk through invoices chronologically** for each customer
3. **Calculate MRR from each invoice line item** (subscription charges)
4. **Compare to previous state** to determine what changed
5. **Classify the change** as New, Expansion, Contraction, Churn, or Reactivation

### The MRR calculation

For each subscription line item on a paid invoice:

1. **Start with the charge amount** (unit price × quantity)
2. **Subtract discounts** (percentage or fixed-amount coupons)
3. **Normalize to monthly**:
   - Monthly subscriptions: use the amount directly
   - Quarterly: divide by 3
   - Semi-annual: divide by 6
   - Annual: divide by 12

**Example:**
- Customer pays $2,400/year for an annual plan with 20% discount
- Gross: $2,400, Discount: $480, Net: $1,920
- MRR: $1,920 ÷ 12 = **$160/month**

### Zero-decimal currencies

Some currencies like Japanese Yen (JPY), Korean Won (KRW), and Vietnamese Dong (VND) don't use decimal places—there are no "cents." GrowPanel handles these automatically:

- Amounts from your billing source are stored in the correct unit
- A ¥10,000 JPY subscription is stored and displayed as ¥10,000 (not ¥100)
- No manual configuration needed

See [Multi-currency and exchange rates](/docs/understanding-your-data/multi-currency-and-exchange-rates/) for the complete list of zero-decimal currencies.

---

## Movement types

Every MRR change is classified into one of these types:

| Type | When it happens |
|------|-----------------|
| **New** | Customer's first payment (MRR goes from $0 to >$0, no prior history) |
| **Expansion** | Existing customer's MRR increases |
| **Contraction** | Existing customer's MRR decreases but stays above $0 |
| **Churn** | Customer's MRR goes to $0 with no remaining active subscriptions |
| **Reactivation** | Previously churned customer starts paying again |

There are also internal movement types used for reporting:

| Type | Purpose |
|------|---------|
| **Segment exit** | Customer leaves a plan (used in plan-level reporting) |
| **Segment entry** | Customer joins a plan (used in plan-level reporting) |

---

## Multiple subscriptions

A single customer can have multiple active subscriptions simultaneously—even with different billing intervals or currencies.

### How it works

- Each subscription is tracked independently
- The customer's **total MRR** is the sum of all active subscriptions
- **Churn only happens when all subscriptions end** and total MRR reaches $0

### Example: Customer with monthly + annual subscriptions

| Date | Event | Subscription A (Monthly) | Subscription B (Annual) | Total MRR |
|------|-------|--------------------------|-------------------------|-----------|
| Jan 1 | Subscribes to A | $100 | — | $100 |
| Mar 1 | Adds B | $100 | $200 | $300 |
| Jun 1 | Cancels A | $0 | $200 | $200 |
| Mar 1 (next year) | B expires | $0 | $0 | $0 (Churn) |

In this example:
- Adding subscription B is recorded as **Expansion** (+$200)
- Canceling subscription A is recorded as **Contraction** (-$100)
- The customer only **churns** when subscription B ends

### Different billing intervals

When a customer has subscriptions with different intervals (e.g., one monthly, one annual), each is normalized to monthly MRR independently. The customer's movements reflect changes to their combined MRR.

---

## Mid-cycle changes and prorations

When a customer upgrades, downgrades, or changes quantity mid-billing-cycle, your billing platform typically creates prorated invoice line items.

### How GrowPanel handles prorations

1. **Proration credits** ("Unused time on...") indicate the old subscription ending
2. **Proration charges** ("Remaining time on...") indicate the new subscription starting
3. GrowPanel reads both to understand the change

### Example: Mid-month upgrade

Customer upgrades from $50/month to $100/month on the 15th:

| Invoice line | Amount | GrowPanel interpretation |
|--------------|--------|-------------------------|
| Unused time on Basic | -$25 | Old plan ending |
| Remaining time on Pro | +$50 | New plan starting |
| **Net charge** | $25 | — |

GrowPanel records:
- **Segment exit** from Basic (-$50 MRR)
- **Segment entry** to Pro (+$100 MRR)
- **Expansion** of $50 MRR

The movement is dated when the change took effect (the 15th), not when the invoice was created.

---

## Invoice gaps and missing renewals

Sometimes there's a gap in invoicing—a subscription should have renewed but no invoice appeared.

### How GrowPanel detects this

If a subscription's billing period ended more than 3 days ago and no new invoice has arrived, GrowPanel marks it as churned. This catches cases where:

- A subscription was quietly canceled
- The billing platform failed to generate an invoice
- Data sync missed an event

### What you'll see

The churn movement is backdated to when the subscription period ended, ensuring your historical MRR is accurate even if the detection happens later.

---

## Edge cases

### Paying customer starts a new trial

If a customer already has a paying subscription and then starts a trial on a different product:

- The trial doesn't affect their existing MRR
- The trial is tracked separately
- When the trial converts, it's recorded as **Expansion** (not New)

### First invoice fully refunded

If a customer's very first invoice is fully refunded:

- GrowPanel treats it as if the subscription never happened
- No "New" movement is recorded
- No "Churn" movement is recorded
- The customer remains a lead/trial (depending on their state)

This prevents inflating your New MRR with subscriptions that were immediately cancelled or disputed.

### Partial refunds

Partial refunds don't automatically reduce MRR. MRR is based on the ongoing subscription, not individual invoice adjustments. If a refund represents an actual subscription change (downgrade, quantity reduction), that change should appear in subsequent invoices.

### Zero-value invoices

Invoices with $0 total (common during trials) don't create MRR movements. However, they may update subscription status or trigger trial tracking.

### Customer with only free/zero-MRR subscriptions

A customer can have active subscriptions with $0 MRR (e.g., free plans, 100% discounted plans). In this case:

- They're considered "active" (not churned)
- Their MRR is $0
- Churn only happens if those subscriptions are cancelled

---

## Churn recognition timing

GrowPanel offers two options for when to recognize churn:

### End of billing period (default)

Churn is recorded when the subscription **actually ends**—when the customer's paid access expires.

**Example:**
- Customer cancels on January 15
- Their annual subscription runs until March 1
- **Churn is recorded on March 1**

This approach shows when revenue actually stops.

### Immediate

Churn is recorded when the cancellation is **submitted**.

**Example:**
- Customer cancels on January 15
- **Churn is recorded on January 15**

This approach shows when the customer made their decision.

**To change:** Settings → Reporting → When to recognize churn

---

## Past-due and failed payments

When a payment fails, the customer enters a "past-due" state while your billing platform retries.

### Auto-churn threshold

GrowPanel automatically marks customers as churned after a configurable number of days past-due (default: 30 days).

**Example:**
- Payment fails on January 1
- Billing platform retries for several weeks
- After 30 days (January 31), GrowPanel records churn

**To change:** Settings → Reporting → Auto-churn past-due subscribers

### Why this matters

Without auto-churn, customers with perpetually failing payments would stay in your "active" count forever. The threshold should match your dunning (retry) period—if your billing platform gives up after 30 days, set this to 30.

---

## Movement grouping

When a customer makes multiple changes in quick succession, GrowPanel can combine them into a single movement.

### How it works

Movements within the configured time window (default: 24 hours) are grouped together.

**Without grouping:**
- 10:00 AM — New: $50 MRR (subscribed to Basic)
- 10:05 AM — Expansion: $50 MRR (upgraded to Pro)

**With 24-hour grouping:**
- 10:00 AM — New: $100 MRR (subscribed to Pro)

### Why this is useful

- Cleaner movement logs
- Accurate "New customer" tracking (the final plan, not the starting plan)
- Reduces noise from immediate upgrades during checkout

**To change:** Settings → Reporting → Group MRR movements

---

## Why numbers differ from your billing platform

Common reasons for differences:

| Difference | Reason |
|------------|--------|
| GrowPanel shows less MRR | Trials excluded, past-due customers auto-churned, end-of-period churn recognition |
| GrowPanel shows more MRR | Currency conversion differences, multiple data sources combined |
| Churn timing differs | Different churn recognition (immediate vs. end-of-period) |
| New customer count differs | Movement grouping combines signup + upgrade into single "New" |

### Stripe-specific differences

| Stripe shows | GrowPanel shows | Why |
|--------------|-----------------|-----|
| Subscription MRR | Invoice-based MRR | GrowPanel uses actual charges, not projected amounts |
| Trials in MRR | Trials excluded | GrowPanel only counts paid revenue |
| Immediate cancellation impact | End-of-period impact (default) | Configurable in settings |
| Indefinite retry on failed payments | Churn after 30 days (default) | Configurable in settings |

---

## Verifying the calculations

To investigate a specific customer's MRR:

1. Go to **Customers** and find the customer
2. Click to open their detail page
3. Review the **MRR movements** table
4. Compare with invoices in your billing platform

Each movement shows:
- Date it occurred
- Type (New, Expansion, etc.)
- Description of what changed
- MRR change amount

---

## Summary

GrowPanel calculates MRR movements by:

1. Processing paid invoices chronologically
2. Normalizing subscription charges to monthly amounts
3. Tracking each subscription independently
4. Detecting changes by comparing current vs. previous state
5. Classifying changes into movement types

Key configurable settings:
- **Churn recognition timing** — when cancelled subscriptions count as churned
- **Auto-churn threshold** — when past-due customers count as churned
- **Movement grouping** — how quickly successive changes are combined

Understanding these rules helps you interpret your data correctly and explain any differences from your billing platform.

---

## Related pages

- [MRR report](/docs/reports-and-metrics/mrr/) — Using the MRR report
- [MRR movements report](/docs/reports-and-metrics/mrr-movements/) — Viewing all movements
- [Reporting settings](/docs/settings/reporting/) — Configuring calculation rules
- [Data discrepancies](/docs/troubleshooting/data-discrepancies/) — Troubleshooting differences

---

## Understanding your data
<!-- url: https://growpanel.io/docs/understanding-your-data/ -->

These articles explain how GrowPanel works under the hood—the logic behind the numbers, how data is processed, and why things work the way they do.

---

## Available articles

### [From invoices to MRR](/docs/understanding-your-data/from-invoices-to-mrr/)
How GrowPanel transforms billing data (invoices, subscriptions, refunds) into MRR movements. Covers the calculation logic, edge cases, and why your numbers might differ from your billing platform.

### [Multi-currency and exchange rates](/docs/understanding-your-data/multi-currency-and-exchange-rates/)
How GrowPanel handles multiple currencies, converts to your reporting currency, and why your MRR can change due to exchange rate fluctuations—even without any customer activity.

### [MRR movement types](/docs/understanding-your-data/mrr-movement-types/)
The five main movement types (New, Expansion, Contraction, Churn, Reactivation), subtypes like quantity and frequency changes, segment movements for plan-level reporting, and edge cases.

---

## Learn more about SaaS metrics

For deep-dive explanations of SaaS metrics beyond GrowPanel's implementation, visit the [SaaS Metrics Academy](/academy/). Key topics include:

- [MRR fundamentals](/academy/mrr/) - How MRR is defined and calculated
- [Cohort analysis](/academy/cohort-analysis/) - Understanding customer behavior over time
- [Net Revenue Retention](/academy/nrr/) - The gold standard retention metric
- [Customer churn](/academy/customer-churn-rate/) - Measuring customer loss

---

## MRR movement types
<!-- url: https://growpanel.io/docs/understanding-your-data/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:

1. **Segment exit** from Plan A (negative MRR)
2. **Segment entry** to Plan B (positive MRR, equal to what exited)
3. **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](/docs/understanding-your-data/from-invoices-to-mrr/) — How billing data becomes movements
- [MRR report](/docs/reports-and-metrics/mrr/) — Using the MRR report
- [MRR movements report](/docs/reports-and-metrics/mrr-movements/) — Viewing all movements
- [Breakdown reports](/docs/reports-and-metrics/breakdowns/) — Segmenting by plan and other dimensions

---

## Multi-currency and exchange rates
<!-- url: https://growpanel.io/docs/understanding-your-data/multi-currency-and-exchange-rates -->

If you have customers paying in different currencies, understanding how GrowPanel handles exchange rates is essential. This article explains the approach in detail—why your MRR can change even without customer activity, how to read FX impact in your reports, and when to use the "Fix FX" feature.

---

## The core concept

GrowPanel stores all amounts in their **original currency**. When you view reports, amounts are converted to your **reporting currency** on demand, using historical daily exchange rates.

This is different from most other tools, which convert to a single currency when data is imported and never update it.

### Why this matters

**GrowPanel's approach:**
- You can switch reporting currency instantly
- Historical reports are recalculated with accurate rates for each day
- You see true currency exposure and FX impact

**Other tools' approach:**
- Currency is locked at import time (or at each payment)
- Switching reporting currency requires re-importing data
- FX changes only appear when customers pay again

---

## How it works in practice

### Step 1: Original currency is stored

When a customer pays, GrowPanel stores the exact amount in the original currency.

**Example:**
- Customer pays $100 USD on January 1st, 2025
- GrowPanel stores: **$100 USD**

### Step 2: Conversion happens on demand

When you view a report with EUR as your reporting currency, GrowPanel looks up the USD→EUR exchange rate for that specific date.

**Example:**
- January 1st, 2025: USD→EUR rate is 0.96
- Displayed MRR: $100 × 0.96 = **€96**

### Step 3: Rates are updated daily

GrowPanel maintains daily exchange rates for 150+ currencies. As rates change, so does the converted value—even for the same underlying subscription.

**Example (same customer, later date):**
- June 1st, 2025: USD→EUR rate has dropped to 0.85
- Displayed MRR: $100 × 0.85 = **€85**

The customer hasn't changed anything. They're still paying $100 USD. But when viewed in EUR, their MRR has decreased by €11 due to exchange rate movement.

---

## FX impact in reports

Because exchange rates change daily, your MRR in the reporting currency can change even without any customer activity. GrowPanel shows this separately as **FX Impact**.

### In the MRR table

The breakdown table shows FX Impact as a separate row:

| Row | Description |
|-----|-------------|
| New | MRR from new customers |
| Expansion | MRR increases from existing customers |
| Contraction | MRR decreases from existing customers |
| Churn | MRR lost from cancelled customers |
| Reactivation | MRR from returning customers |
| **MRR change** | Net change from real customer activity |
| **FX Impact** | Change due to exchange rate fluctuations |
| **MRR** | Total MRR at end of period (includes FX) |



<!-- IMAGE PLACEHOLDER: Screenshot of MRR breakdown table showing the FX Impact row, with a negative value indicating currency depreciation -->

### In charts

Bar charts show FX Impact as a separate segment. You can show or hide any segment by clicking it in the legend.



<!-- IMAGE PLACEHOLDER: Screenshot of MRR bar chart with FX Impact shown as a distinct color segment -->

### When FX Impact appears

The FX Impact row only appears if:
- You have customers paying in currencies other than your reporting currency
- Exchange rates have changed between periods

If all your customers pay in your reporting currency, you won't see FX Impact.

---

## A complete example

Let's walk through a realistic scenario to show how FX affects your reports.

### The situation

- Your reporting currency is EUR
- You have two customers:
  - Customer A: $1,000 USD/month
  - Customer B: €500 EUR/month
- You're looking at January through March 2025

### January 1st

| Customer | Original amount | USD→EUR rate | MRR in EUR |
|----------|-----------------|--------------|------------|
| A | $1,000 USD | 0.96 | €960 |
| B | €500 EUR | 1.00 | €500 |
| **Total** | | | **€1,460** |

### February 1st (USD weakens)

| Customer | Original amount | USD→EUR rate | MRR in EUR |
|----------|-----------------|--------------|------------|
| A | $1,000 USD | 0.92 | €920 |
| B | €500 EUR | 1.00 | €500 |
| **Total** | | | **€1,420** |

**What the report shows:**
- MRR change from customers: €0 (no one upgraded, downgraded, or churned)
- FX Impact: -€40 (Customer A's USD is now worth less in EUR)
- Net MRR change: -€40

### March 1st (USD recovers slightly)

| Customer | Original amount | USD→EUR rate | MRR in EUR |
|----------|-----------------|--------------|------------|
| A | $1,000 USD | 0.94 | €940 |
| B | €500 EUR | 1.00 | €500 |
| **Total** | | | **€1,440** |

**What the report shows:**
- MRR change from customers: €0
- FX Impact: +€20
- Net MRR change: +€20

### The key insight

Your total MRR went from €1,460 → €1,420 → €1,440 over three months, even though:
- No customers churned
- No customers upgraded or downgraded
- Both customers are still paying the exact same amount in their original currency

This is entirely due to USD/EUR exchange rate fluctuations. GrowPanel makes this visible so you understand what's driving your numbers.

---

## The Fix FX feature

Sometimes you want to analyze growth without FX noise. The **Fix FX** feature freezes exchange rates at a specific point in time.

### How to use it

1. Open any report with a date range
2. Find the **Fix FX** checkbox (near the currency selector)
3. Enable it

When enabled, all exchange rates are frozen at the **start date** of your selected period.



<!-- IMAGE PLACEHOLDER: Screenshot showing the Fix FX checkbox/toggle near the currency and date selectors -->

### Example

You're viewing "Year to date" (January 1 – today) with EUR as reporting currency:

**Without Fix FX:**
- Each day uses that day's exchange rate
- FX Impact row shows currency fluctuation effects
- MRR changes reflect both customer activity AND exchange rates

**With Fix FX:**
- All amounts use the January 1st exchange rate
- FX Impact row shows €0 (or is hidden)
- MRR changes reflect ONLY customer activity

### When to use Fix FX

| Scenario | Use Fix FX? |
|----------|-------------|
| Analyzing real business growth | Yes — removes FX noise |
| Reporting to investors in a specific currency | Yes — shows operational performance |
| Understanding currency exposure | No — you need to see FX impact |
| Comparing to bank deposits | No — actual received amounts vary with FX |
| Year-over-year comparison | Consider it — makes comparison fairer |

---

## Why growth looks different in different currencies

A common question: "My MRR grew 20% in USD but only 12% in EUR. Which is correct?"

**Both are correct.** They're measuring different things.

### Example

Starting point (January):
- Total MRR: $10,000 USD
- At 0.96 USD→EUR: €9,600 EUR

Ending point (December):
- Total MRR: $12,000 USD (grew $2,000)
- But USD→EUR rate is now 0.90
- At 0.90: €10,800 EUR (grew only €1,200)

**In USD:** 20% growth ($2,000 ÷ $10,000)
**In EUR:** 12.5% growth (€1,200 ÷ €9,600)

The difference isn't a bug—it's currency math. If the USD weakened against the EUR during the year, your USD growth is partially offset when viewed in EUR.

### Which should you report?

| Audience | Recommendation |
|----------|----------------|
| US investors | Report in USD |
| European investors | Report in EUR, consider Fix FX |
| Internal operations | Report in your functional currency |
| Board meetings | Pick one and be consistent |

---

## Switching reporting currency

You can change your reporting currency instantly:

1. Use the **currency dropdown** in any report
2. Or change the default in **Settings → Reporting → Default reporting currency**

When you switch:
- All amounts are recalculated immediately
- Historical data uses historical rates for each period
- No data re-import is needed

This is one of GrowPanel's strengths—you can view your business through different currency lenses without any setup.

---

## Exchange rate sources and accuracy

GrowPanel uses daily exchange rates from trusted financial data providers, covering 150+ currencies.

### Rate timing

- Rates are captured at end-of-day (UTC)
- Each day's transactions use that day's rate
- Rates are updated automatically

### Supported currencies

All major currencies are supported, including:
- USD, EUR, GBP, JPY, CHF, CAD, AUD
- Emerging market currencies
- Cryptocurrencies are not supported (due to volatility)

### Rate accuracy

The rates used match major financial data sources. Small differences from your bank's rates are normal because:
- Banks add margin to exchange rates
- Exact timing of rate capture varies
- Interbank rates differ from consumer rates

---

## Zero-decimal currencies

Most currencies have decimal places (cents, pence, etc.), but some currencies don't use subunits at all. These are called **zero-decimal currencies**.

### What are zero-decimal currencies?

Zero-decimal currencies are currencies where the smallest unit is the whole currency unit—there are no cents or similar fractional units. Common examples include:

| Currency | Code | Country |
|----------|------|---------|
| Japanese Yen | JPY | Japan |
| South Korean Won | KRW | South Korea |
| Vietnamese Dong | VND | Vietnam |
| Chilean Peso | CLP | Chile |
| Ugandan Shilling | UGX | Uganda |

The complete list of zero-decimal currencies supported by Stripe and GrowPanel:

**BIF** (Burundian Franc), **CLP** (Chilean Peso), **DJF** (Djiboutian Franc), **GNF** (Guinean Franc), **JPY** (Japanese Yen), **KMF** (Comorian Franc), **KRW** (South Korean Won), **MGA** (Malagasy Ariary), **PYG** (Paraguayan Guarani), **RWF** (Rwandan Franc), **UGX** (Ugandan Shilling), **VND** (Vietnamese Dong), **VUV** (Vanuatu Vatu), **XAF** (Central African CFA Franc), **XOF** (West African CFA Franc), **XPF** (CFP Franc)

### How GrowPanel handles zero-decimal currencies

When importing data from Stripe, Chargebee, or Recurly, amounts are stored in the smallest currency unit:
- For USD: amounts are in cents (e.g., $10.00 = 1000)
- For JPY: amounts are in yen (e.g., ¥1000 = 1000)

GrowPanel automatically detects zero-decimal currencies and displays amounts correctly:
- A $100 USD subscription shows as "$100"
- A ¥10,000 JPY subscription shows as "¥10,000" (not "¥100")

### No action required

Zero-decimal currency handling is automatic. Whether your customers pay in USD, EUR, JPY, or any other supported currency, GrowPanel imports, stores, and displays amounts correctly.

---

## Common questions

### "My MRR dropped but I didn't lose any customers"

This is likely FX Impact. Check:
1. Look at the FX Impact row in the MRR table
2. Compare MRR in the customer's original currency vs. your reporting currency
3. Consider using Fix FX if you want to see only customer-driven changes

### "FX Impact is huge this month"

Large FX swings happen during currency volatility (economic events, interest rate changes, etc.). This is real—your revenue in the reporting currency did change. If you want to filter it out for analysis, use Fix FX.

### "Why can't I just see everything in the original currency?"

You can! Filter by currency to see only customers in a specific currency, or use Fix FX to neutralize exchange effects. But for a complete business view, you typically need a single reporting currency.

### "My annual report looks worse in EUR than USD"

This happens when your customer base is USD-heavy and the USD weakened during the year. Your USD growth was real, but it's offset by unfavorable exchange rates when viewed in EUR. Use Fix FX for an apples-to-apples comparison.

### "When does GrowPanel update exchange rates?"

Daily. Each day's amounts use that day's closing rate. Historical data doesn't change retroactively—rates are locked for past dates.

---

## Summary

- GrowPanel stores amounts in **original currencies** and converts on demand
- Daily exchange rates for **150+ currencies** ensure accurate conversions
- **FX Impact** appears as a separate row/segment showing currency fluctuation effects
- Use **Fix FX** to freeze rates and see only customer-driven changes
- Growth percentages **differ by currency**—this is correct currency math
- You can **switch reporting currency instantly** without re-importing data

Understanding FX handling helps you interpret your reports correctly and explain changes to stakeholders—especially when currency markets are volatile.

---

## Related pages

- [From invoices to MRR](/docs/understanding-your-data/from-invoices-to-mrr/) — How billing data becomes MRR movements
- [MRR report](/docs/reports-and-metrics/mrr/) — Using the MRR report
- [Reporting settings](/docs/settings/reporting/) — Setting your default currency
- [Filters](/docs/reports-and-metrics/filters/) — Filtering by currency

---
