MRRX
Documentation

Getting Started with MRRX

From signup to your first saved subscriber — everything you need to set up MRRX and start retaining customers.

12 min read9 steps5-min setup
In this guide
1.Create your MRRX account
2.Connect your Stripe account
3.Generate your API key
4.Configure retention offers
5.Customize your branding
6.Integrate the API
7.Set up webhooks
8.Connect Slack notifications
9.Use analytics and feedback
Step 1

Create Your MRRX Account

Head to mrrx.app/sign-up and create your account. You can sign up with email or continue with Google or GitHub.

1
Sign up
30 sec
Enter your email and password, or click "Continue with Google" for one-click signup.
2
Create your organization
Name your organization (usually your company name). This manages team access and appears in your dashboard header.
Free 30-day pilot
No credit card required. Full access to all features. Billing only starts when you choose a plan.
Step 2

Connect Your Stripe Account

MRRX needs access to your Stripe account to execute retention actions on your subscriptions. The connection uses Stripe Connect OAuth — secure, revocable, and limited to subscription management.

1
Click Connect Stripe
30 sec
In your dashboard, go to Onboarding or the Connect page. Click Connect Stripe to start the OAuth flow.
2
Authorize on Stripe
Stripe's authorization page shows the permissions MRRX requests. Review and click Connect. MRRX only requests access to manage subscriptions and customers — nothing else.
3
Verify connection
You're redirected back to your dashboard. The status shows Connected with your Stripe account ID.
Security
OAuth tokens are encrypted with AES-256-GCM before storage. MRRX never sees your Stripe secret keys. Customer payment data never touches MRRX servers.
Step 3

Generate Your API Key

Your API key authenticates your application when creating cancellation sessions.

1
Go to Settings → API Keys
In your dashboard sidebar, click Settings then API Keys.
2
Generate a key
30 sec
Click Generate API Key, name it (e.g., "Production"), and click Create. The key is shown once — copy it immediately.
3
Store it in your environment
Add the key to your app's environment variables. Never commit it to code.
.env.local
MRRX_API_KEY=mrrx_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Key security
API keys are SHA-256 hashed before storage. Only the prefix is stored in cleartext. You can revoke and regenerate keys instantly from the dashboard.
Step 4

Configure Retention Offers

Go to Settings → Offers to configure which retention offers your subscribers see when they try to cancel. You can enable any combination of four offer types:

Pause Subscription
30 / 60 / 90 days
%
Discount Offer
10-50% off, 1-6 months
Downgrade Plan
Select target plan
📅
Extend Trial
+7 / 14 / 30 days
1
Enable offer types
1 min
Toggle on the offers you want to display. Each offer type has its own configuration panel where you set the specific parameters.
2
Set priority order
Drag to reorder offers. The first offer is shown most prominently. Put your highest-converting offer first (usually Pause).
3
Configure per plan (optional)
You can show different offers for different plans. For example, show downgrade only to customers on your highest tier.
Best practice
Start with Pause + Discount enabled. Pause typically has the highest save rate (35-40%) because many cancellations are temporary. Add Downgrade after you have data on which plans churn most.
Step 5

Customize Your Branding

Go to Settings → Branding to make the cancellation flow look like your product, not a third-party tool.

1
Upload your logo
Upload your company logo. It appears at the top of the cancellation flow page.
2
Set brand colors
Configure your primary and accent colors. The cancellation flow buttons, highlights, and accents will match your brand.
3
Customize copy
Edit the headline, description, and button text shown to subscribers. Use language that matches your brand voice.
Why branding matters
Subscribers who see a branded cancellation flow are more likely to trust the retention offers. A generic-looking page feels like a dark pattern. A branded page feels like your product giving them options.
Step 6

Integrate the API

This is the core integration — one API call that connects your cancel button to MRRX. When a subscriber clicks "Cancel" in your app, create a session and redirect them.

your-cancel-handler.ts
// When subscriber clicks "Cancel Subscription"
async function handleCancelClick(customerId: string, subscriptionId: string) {
  const response = await fetch('https://mrrx.app/api/v1/sessions', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.MRRX_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      customer_id: customerId,
      subscription_id: subscriptionId,
    }),
  });

  const { url } = await response.json();

  // Redirect subscriber to MRRX retention flow
  window.location.href = url;
}

That's the entire integration. MRRX returns a hosted URL where the subscriber sees your branded retention offers. When they make a choice:

MRRX executes the action on Stripe (pause, discount, downgrade, or cancel)
You receive a webhook notification with the outcome
A Slack notification fires (if configured)
The session appears in your dashboard with full details
An email confirmation is sent to the subscriber (if configured)
Framework examples
Check the API reference for Next.js, Express, Ruby on Rails, and Django integration examples.
Step 7

Set Up Webhooks

Webhooks notify your application in real time when events occur — a subscriber is saved, canceled, paused, or discounted. Go to Settings → Webhooks.

1
Add an endpoint
1 min
Click Add Webhook Endpoint and enter your URL (e.g., https://yourapp.com/api/mrrx/webhook). Select which events to receive.
2
Copy your webhook secret
Each endpoint gets a unique secret for signature verification. Copy it and add it to your environment variables.
3
Verify signatures
MRRX signs every webhook delivery with HMAC-SHA256. Verify the signature in your handler to ensure authenticity.
webhook-handler.ts
// Verify webhook signature
import crypto from 'crypto';

function verifyWebhook(payload: string, signature: string, secret: string) {
  const [timestamp, hash] = signature.split(',');
  const t = timestamp.replace('t=', '');
  const v1 = hash.replace('v1=', '');

  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${t}.${payload}`)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(v1), Buffer.from(expected)
  );
}

Available webhook events:

session.completedSession finished (saved or canceled)
subscription.pausedSubscription was paused
subscription.discount_appliedDiscount was applied
subscription.downgradedPlan was downgraded
subscription.trial_extendedTrial was extended
subscription.canceledSubscription was canceled
Delivery logs
Every webhook delivery is logged with status code, response time, and payload. View delivery history in Settings → Webhooks → Delivery Log tab. Failed deliveries can be retried from the dashboard.
Step 8

Connect Slack Notifications

Get real-time Slack alerts when subscribers are saved or cancel. Go to Settings → Slack.

1
Create a Slack webhook
2 min
In your Slack workspace, go to Apps → Incoming Webhooks → Add New Webhook. Choose a channel (e.g., #churn-alerts) and copy the webhook URL.
2
Paste in MRRX
In your MRRX dashboard, go to Settings → Slack, paste the webhook URL, and click Save.
3
Send a test
10 sec
Click Send Test to verify the connection. You should see "MRRX Slack integration is working!" in your channel.

You'll receive alerts for:

New cancellation session started — see who's trying to cancel in real time
Subscriber saved — which offer they accepted (pause, discount, downgrade)
Subscriber canceled — reason and feedback they provided
Daily digest — summary of yesterday's retention performance
Step 9

Use Analytics and Feedback

Your MRRX dashboard tracks everything automatically. No setup required — data flows in as soon as sessions start running.

Dashboard Overview

The main dashboard shows your key retention metrics at a glance:

Total sessions — how many cancellation flows were initiated
Save rate — percentage of sessions that resulted in a save (not a cancel)
Revenue retained — estimated dollar value of saved subscriptions
Active offers — which retention offers are currently enabled

Analytics Page

The Analytics page gives deeper insights:

Save rate over time — daily/weekly/monthly trends
Save rate by offer type — which offers work best (pause vs discount vs downgrade)
Revenue impact — how much MRR was retained vs lost

Cancellation Reasons

The Reasons page aggregates exit survey responses so you can see why subscribers are leaving:

Too expensive — your discount offer may need adjustment
Not using it — this is a product signal, not a retention one
Missing features — direct feedback for your product roadmap
Switching to competitor — market intelligence
Temporary break — confirms that pause offers are valuable

Session Detail

Click any session in the Sessions page to see the full timeline:

When the session was created and by which subscriber
Which offers were shown and in what order
What the subscriber chose (or if they canceled)
The exit survey response (reason + written feedback)
Webhook delivery status and Slack notification status
The feedback loop
Use analytics to continuously improve: if 40% of cancels cite price, make your discount offer more prominent. If "not using it" dominates, that's a product problem to solve, not a retention one. Review your reasons page weekly and adjust offers monthly.

What's Next

You're set up. Here's what to do from here:

Run your first test session — create a session via API and walk through the flow yourself
Invite your team — go to Settings → Team to add team members to your dashboard
Choose a plan — when your pilot ends, pick Starter ($79/mo), Growth ($149/mo), or Scale ($399/mo)
Review analytics weekly — check your save rate and top cancellation reasons
Iterate on offers — adjust offer types, priorities, and parameters based on data

Need Help?

We're here to help you get integrated. Reach out anytime.