Documentation

Set up SaveMRR. Fast and clear.

Connect Stripe with a restricted API key. Most engines need zero code. Cancel Shield requires one small JS snippet. This guide covers every step.

Getting Started

Here's the big picture. SaveMRR connects to your Stripe account via a restricted API key, watches for failed payments and cancellation signals, then automatically sends recovery emails and shows cancel-save offers. Most engines (dunning, churn radar, win back) need zero code. Cancel Shield requires adding a small JavaScript snippet to your app to intercept cancel clicks.

1

Create your account

Go to app.savemrr.co and sign up with your email. Takes 30 seconds.

2

Paste your Stripe API key

We'll walk you through creating a restricted key with only the permissions we need. No full access required.

3

Configure your engines

Turn on the engines you want (dunning, cancel shield, win back, etc.), customize email templates, and set your preferences.

4

You're done

SaveMRR monitors your Stripe account 24/7 and takes action automatically. Check your dashboard anytime to see recovered revenue.

Your first $200 in recovered revenue free. No credit card required to start.

Stripe API Key Setup

SaveMRR needs a restricted Stripe API key to read your subscription data and send recovery actions. Here's how to create one:

1

Open Stripe Dashboard

Log in to your Stripe account. Click Developers in the left sidebar, then API keys.

2

Create a restricted key

Click Create restricted key. Name it something like "SaveMRR" so you know what it's for.

3

Set permissions

Set ONLY the permissions listed in the next section. Everything else stays at "None." This keeps your account safe.

4

Copy and paste into SaveMRR

Copy the key (starts with rk_live_). Go to your SaveMRR dashboard → Settings → paste it in the Stripe API Key field.

Never share your full secret key (sk_live_). SaveMRR only needs a restricted key with limited permissions. Your key is encrypted with AES-256 and never stored in plain text.

Stripe Permissions

When creating your restricted key, set exactly these permissions. Everything else should be "None."

PermissionAccessWhy we need it
CustomersReadSee who your customers are and their subscription status
SubscriptionsReadMonitor active subscriptions and detect cancellations
InvoicesReadTrack payment failures and recovery attempts
ChargesReadUnderstand payment history and failure patterns
ProductsReadDisplay correct plan names in emails and cancel flows
PricesReadShow accurate pricing in offers and discount flows
CouponsWriteCreate discount offers for cancel shield and win back
Promotion CodesWriteGenerate unique promo codes for retention offers
Customer PortalWriteEnable card update pages for failed payment recovery
Webhook EndpointsWriteSet up real time event listening for payment events
We never access your payouts, bank details, transfers, or full card numbers. Your money is always yours.

Email Templates

SaveMRR comes with 17 pre-written email templates across all engines. Every template is customizable. Edit the subject, body, and timing to match your brand voice.

Dunning Emails (Failed Payment Recovery)

Automatically sent when a customer's payment fails. These are spaced out over days to recover the payment without annoying your customer.

  • Email 1: Sent immediately after failure. Friendly heads-up.
  • Email 2: Sent 3 days later. Reminder with update link.
  • Email 3: Sent 7 days later. Urgency, subscription at risk.
  • Email 4: Final notice before cancellation.

Pre-Expiration Alerts (Card Expiry)

Sent when a customer's card is about to expire. Catches the problem before the payment fails.

  • 30-day warning: Early heads-up with one click card update link.
  • 7-day warning: Urgent reminder.
  • Expiry day: Last chance to update before payment fails.

Engagement Emails (Churn Prevention)

Sent to customers showing signs of disengagement, before they even think about canceling.

  • Low-usage alert: "We noticed you haven't logged in recently"
  • Feature highlight: Showcase features they haven't tried
  • Check-in: Personal outreach from the founder

Win-Back Emails (After Cancellation)

Sent after a customer cancels. Timed sequence to bring them back with the right offer at the right time.

  • Day 1: Acknowledgment + "door is always open"
  • Day 7: Share what's new since they left
  • Day 14: Special comeback offer (discount or extended trial)
  • Day 30: Final reach-out
Go to Settings → Email Templates in your dashboard to customize any template. You can edit the subject line, body text, sender name, and timing for each email.

SaveMRR Widget

The SaveMRR widget is one small script that does two things:

  • Cancel Flow: Shows a retention offer when a customer tries to cancel
  • Login Tracking: Tracks when customers log in, powering the Churn Radar and Engagement Engine
The widget is a standard JavaScript snippet that works on every platform: React, Next.js, Vue, WordPress, Webflow, Framer, Bubble, Squarespace, plain HTML, or anything else. If your platform lets you add custom code, you can use SaveMRR.

1Add the script to your site

Copy this snippet and paste it into your site. This is the same code for every platform.

html
<script src="https://cdn.savemrr.co/w.js" defer></script>

This loads the SaveMRR widget. It doesn't do anything visible yet. You'll activate it in Step 2.

Where to paste this on your platform:

PlatformWhere to paste
HTML / JavaScriptPaste before the closing </body> tag in your HTML file
React / Next.jsAdd to your index.html, or paste in your root layout's <head> section
Vue / NuxtAdd to your index.html, or use the nuxt.config head option
WordPressGo to Appearance → Theme Editor → header.php, paste before </head>. Or use a plugin like "Insert Headers and Footers"
WebflowGo to Project Settings → Custom Code → Footer Code, paste it there
FramerClick the page → Settings → Custom Code → End of <body> tag
BubbleGo to Settings → SEO/Meta Tags → Script/meta tags in header
SquarespaceGo to Settings → Advanced → Code Injection → Footer
ShopifyGo to Online Store → Themes → Edit Code → theme.liquid, paste before </body>
OtherLook for a "Custom Code", "Scripts", or "Header/Footer Code" option in your platform's settings

2Initialize the widget after your customer logs in

After the script loads and your customer is logged in, call SaveMRR.init() with your API key and the customer's Stripe IDs. This activates both login tracking and the cancel flow.

javascript
SaveMRR.init({
  key: "YOUR_API_KEY",           // from Settings → Widget in your dashboard
  customer: {
    stripeId: "cus_...",         // this customer's Stripe ID
    subscriptionId: "sub_..."    // this customer's subscription ID
  }
});
Replace YOUR_API_KEY with your actual Widget API key. To find it: open your SaveMRR dashboard → click Settings in the sidebar → scroll to the Widget section → copy the key shown there. It looks something like wk_live_abc123...

The stripeId and subscriptionId come from your own app's database. They're the IDs Stripe gave you when this customer subscribed. Your app already has these if you're using Stripe for billing.

Not sure how to get the Stripe IDs to your frontend? Most apps store the Stripe customer ID in their user/account table. When a user logs in, your backend already knows their Stripe ID, so just pass it to the page. If you use a no code platform like Bubble, you can store it as a field on the User data type.

3Trigger the cancel flow (when a customer clicks "Cancel")

When a customer clicks your cancel button, call this instead of immediately canceling:

javascript
SaveMRR.showCancelFlow({
  stripeId: "cus_...",           // this customer's Stripe ID
  subscriptionId: "sub_..."      // this customer's subscription ID
});

This opens the cancel flow widget. It asks why they're leaving, shows a personalized offer, and handles everything. If they accept the offer, their subscription is saved in Stripe automatically. If they decline, normal cancellation proceeds.

What's required vs optional?

  • Step 1 (script tag): Required. Loads the widget code.
  • Step 2 (init): Required. Activates the widget with your API key and enables login tracking. Without this, the script does nothing.
  • Step 3 (cancel flow): Optional. Call showCancelFlow() when a customer clicks cancel. Skip if you only want login tracking.

How Login Tracking Works Behind the Scenes

When you call SaveMRR.init() with a customer's Stripe ID, the widget sends a single lightweight ping (~200 bytes) to SaveMRR. That's all it does on your customer's end. Behind the scenes:

What we store per customer

  • Last seen date: When they last loaded your app
  • Total sessions: How many times they've logged in

That's it. No page views, no clicks, no mouse tracking, no personal data beyond their Stripe customer ID.

Silent Churn Radar (runs every 6 hours)

Uses login data + Stripe signals to detect at risk customers:

  • No login in 14 days → flags customer as at risk, sends re engagement email
  • No login in 30 days → escalated alert, stronger email
  • Card expiring → sends one click card update link before payment fails
  • Subscription downgraded → sends check in email
  • Cancel scheduled → sends save offer automatically
  • Dispute filed → alerts you immediately

Deduplication built in: the same signal won't trigger duplicate emails within 14 days.

Engagement Engine (runs every 6 hours)

Uses login data to catch customers who signed up but aren't engaging:

  • Never logged in after subscribing → activation emails at Day 1, 3, and 7
  • Logged in once or twice but stopped → "you're almost there" onboarding nudge at Day 2
  • Was active (10+ sessions) then went quiet → usage drop off re engagement email

All emails stop automatically if the customer starts engaging again or unsubscribes.

Privacy & Compliance

  • No personal data collected: Only Stripe customer ID, last seen timestamp, and session count. No names, no emails, no IP addresses, no device fingerprinting.
  • No cookies: The widget doesn't set any cookies on your customers' browsers.
  • No third party sharing: Login data is never sold or shared. It stays in your SaveMRR account.
  • GDPR compliant: Processing based on legitimate interest. Customer data can be deleted on request.
  • No performance impact: One ~200 byte POST request per page load. Rate limited.
  • DPA available: Data Processing Agreement on request for EU-based businesses.

Tier Availability

FeatureStarterGrowth
Cancel Flow Widget
Churn Radar (Stripe signals)
Churn Radar (Login tracking).
Engagement Engine
Login-based inactivity alerts.
Don't have Stripe customer IDs on your frontend? That's fine. You can still use the cancel flow and all Stripe-signal features (card expiring, downgrades, disputes). Those come from Stripe webhooks, not the widget. Login tracking is the only part that needs the customer's Stripe ID passed in.

Custom SMTP (Optional)

By default, emails are sent through SaveMRR's built in email service. If you want emails to come from your own domain (recommended for better deliverability), set up custom SMTP.

1

Go to Settings → SMTP

In your SaveMRR dashboard, navigate to the Settings page and find the SMTP section.

2

Enter your SMTP details

Fill in these fields:

  • SMTP Host: e.g., smtp.resend.com, smtp.sendgrid.net
  • SMTP Port: Usually 587 (TLS) or 465 (SSL)
  • Username: Your SMTP username (often your email or API key)
  • Password: Your SMTP password or API key
  • From Email: e.g., billing@yourcompany.com
  • From Name: e.g., "YourCompany Billing"
3

Send a test email

Click "Send Test Email" to verify everything works. You should receive a test email within seconds.

Popular SMTP providers: Resend, SendGrid, Postmark, Amazon SES, Mailgun. All work great with SaveMRR. We recommend Resend for the simplest setup.

Twilio SMS (Optional)

Add SMS as a recovery channel. When emails don't get a response, a well timed text message can recover the payment. This is optional but powerful.

1

Create a Twilio account

Go to twilio.com and sign up. You'll get a free trial with some credits to test.

2

Get your credentials

From your Twilio dashboard, copy these three things:

  • Account SID: Starts with AC
  • Auth Token: Your secret token
  • Phone Number: The Twilio number you'll send SMS from (buy one for ~$1/month)
3

Add to SaveMRR

Go to Settings → SMS in your SaveMRR dashboard. Paste your Account SID, Auth Token, and From Number.

4

Send a test SMS

Enter your phone number and click "Send Test SMS" to verify it works.

SMS is sent as a secondary channel, only after emails go unanswered. Customers aren't spammed. Typical cost: ~$0.01 per message in the US.

Slack Notifications (Optional)

Get real time alerts in Slack when payments fail, customers are recovered, or someone cancels. Perfect for staying in the loop without checking the dashboard.

1

Create a Slack webhook

In Slack, go to your workspace settings → Apps → search for Incoming Webhooks → add it to a channel (e.g., #revenue-alerts).

2

Copy the webhook URL

It looks like: https://hooks.slack.com/services/T.../B.../xxx

3

Paste into SaveMRR

Go to Settings → Slack and paste the webhook URL. That's it!

You'll get notifications for: payment failures, successful recoveries, cancellation attempts (saved or lost), and win back conversions.

Cancel Shield Offers

Cancel Shield intercepts cancellation requests and presents a tailored offer based on why the customer wants to leave. Here's how to configure your offers:

Cancellation Reasons

When a customer clicks cancel, they choose a reason. You can map each reason to a different offer:

  • "Too expensive" → Offer a discount (e.g., 20% off for 3 months)
  • "Not using it enough" → Offer a pause (1-3 months) instead of cancel
  • "Missing features" → Show upcoming features or offer a call with the founder
  • "Switching to competitor" → Offer an exclusive deal or extended trial of premium features
  • "Other" → Default offer (discount or pause)

Setting Up Offers

Go to Settings → Cancel Shield in your dashboard. For each cancellation reason, you can configure:

  • Offer type: Discount, pause, free month, or custom message
  • Discount amount: Percentage off (e.g., 20%, 30%, 50%)
  • Duration: How long the offer lasts (1 month, 3 months, forever)
  • Headline & body text: What the customer sees
The most effective strategy: offer a pause for "not using it" and a discount for "too expensive." Most SaaS founders see 15-30% of cancellations saved with the right offers.

Win-Back Campaigns

When a customer cancels despite the cancel shield, the win back engine kicks in. It sends a timed series of emails over the next 30 days to bring them back.

How It Works

  1. Customer cancels their subscription
  2. SaveMRR automatically starts the win back sequence
  3. Emails are sent at Day 1, 7, 14, and 30 (customizable)
  4. Each email can include a different offer, escalating from gentle to compelling
  5. If the customer resubscribes, the sequence stops automatically

Configuring Win-Back

Go to Settings → Win-Back. You can customize:

  • Email timing: When each email in the sequence sends
  • Email content: Subject and body for each email
  • Offers: Discount codes or free months to include
  • Enable/disable: Turn individual emails on or off

Engine Settings

Each of SaveMRR's 6 engines can be turned on or off independently. Go to Settings → Engines to control them.

💸Revenue Rescue

Failed payment recovery with smart dunning emails and card update pages

📡Silent Churn Radar

Pre-expiration alerts that catch expiring cards before they fail

🛡️Cancel Shield

Intercepts cancellation and shows a save offer via the widget

💓Engagement Pulse

Re engagement emails for customers showing disengagement signals

🔄Win-Back Engine

Automated email sequences to recover customers after cancellation

🧠AI Cancel Insights

AI analysis of cancellation reasons to spot patterns and trends

We recommend starting with Revenue Rescue and Silent Churn Radar enabled. These have the highest ROI with zero setup beyond the Stripe key.

Gift Coupons

SaveMRR can automatically create Stripe coupons and promotion codes for your cancel shield and win back offers. Here's how it works:

  • When you configure a discount offer in Cancel Shield or Win-Back, SaveMRR creates a Stripe coupon automatically
  • Each customer gets a unique, single-use promotion code, so there's no sharing or abuse
  • Coupons are applied directly to the Stripe subscription, so you don't need to do anything manually
  • All coupons and their usage are tracked in your SaveMRR dashboard
You need the Coupons: Write and Promotion Codes: Write Stripe permissions for this feature to work. See the permissions table above.

Still have questions?

Chat with the Churn Doctor on our homepage, email us at support@savemrr.co, or check the FAQ.

Get Started Free