Menu bar app that adds up your MRR from Stripe, RevenueCat, Paddle, Lemon Squeezy, Polar, Dodo Payments and Gumroad, keeping the API keys in the macOS K...

A free, open-source MRR tracker for Mac. It reads Stripe, RevenueCat, Paddle, Lemon Squeezy, Polar, Dodo Payments and Gumroad, adds them up, and keeps the total one glance away in your menu bar.
No account, no server, no subscription. Your API keys stay in your macOS Keychain and the numbers never leave your Mac.
brew install --cask simonsruggi/tap/mrrdock
If you sell software, your revenue is scattered. The SaaS is on Stripe, the iOS apps report through RevenueCat, the desktop app went through Paddle because of VAT, the templates sit on Lemon Squeezy. Answering "how am I doing this month?" means four dashboards, four logins, and a mental sum that ignores the fact that three of them bill in dollars.
MRRDock does that sum for you, once every fifteen minutes, and leaves the answer in the menu bar:
It's a companion to the analytics products, not a replacement: ChartMogul, Baremetrics or the RevenueCat dashboard will do cohorts, LTV and churn analysis that a menu-bar popover shouldn't. MRRDock answers the one question you ask twenty times a day, without opening a browser.
••• for screen sharing or a café, revealed with one click.Figures in the screenshots are demo data.
| Platform | MRR | Active subs | Trials | 28-day revenue | Endpoint used |
|---|---|---|---|---|---|
| Stripe | ✅ | ✅ | ✅ | optional | /v1/subscriptions, priced item by item |
| RevenueCat | ✅ | ✅ | ✅ | ✅ | /v2/projects/{id}/metrics/overview |
| Paddle (Billing) | ✅ | ✅ | ✅ | — | /subscriptions, priced per item |
| Lemon Squeezy | ✅ | ✅ | ✅ | — | /v1/subscriptions + each plan's price |
| Polar | ✅ | ✅ | — | ✅ | /v1/metrics |
| Dodo Payments | ✅ | ✅ | — | — | /subscriptions, priced per subscription |
| Gumroad | — | — | — | ✅ | /v2/sales |
| Custom endpoint | ✅ | ✅ | ✅ | ✅ | your own HTTPS URL |
Every key is used read-only: MRRDock issues GET requests and nothing else.
Why Gumroad has no MRR: Gumroad's API exposes sales, not a subscription ledger you can price. Deriving an MRR from one-off sales would be a guess, so the source contributes revenue only — and says so in the UI.
brew install --cask simonsruggi/tap/mrrdock
Or **download MRRDock.zip**, unzip it and drag the app to /Applications. It's signed with a Developer ID and notarized by Apple, so it opens with a double-click — no right-click dance, no "unidentified developer".
Auto-updates are built in (Sparkle): MRRDock checks a signed update feed every 6 hours and offers new versions in place. Settings → *Check for updates* forces a check, and the Homebrew cask is marked auto_updates true so brew leaves it alone.
Prefer to build it yourself? See Build from source — it takes one command.
MRRDock lives in the menu bar: there's no Dock icon and no window. Click the figure to open the popover.
MRRDock 1.2.0 and later is also an MCP server: AI assistants that support the Model Context Protocol can read its data and answer questions about it.
| Tool | What it returns |
|---|---|
get_mrr | MRR, ARR, revenue of the last 28 days, active subscriptions and trials, in total and per platform, fetched live; change vs 30 days ago |
get_mrr_history | Daily total MRR, up to two years back |
Try asking:
Claude Code
claude mcp add mrrdock -- /Applications/MRRDock.app/Contents/MacOS/MRRDock --mcp
Claude Desktop, Cursor and other MCP clients — add this to the client's MCP config (Claude Desktop: *Settings → Developer → Edit Config*; Cursor: ~/.cursor/mcp.json):
{
"mcpServers": {
"mrrdock": {
"command": "/Applications/MRRDock.app/Contents/MacOS/MRRDock",
"args": ["--mcp"]
}
}
}The menu bar app doesn't need to be running: the client starts MRRDock in the background with --mcp, without any window or menu bar icon.
API keys never leave the macOS Keychain and are never shown to the AI: MRRDock calls the providers itself and passes only the numbers. Those numbers do reach the AI service you connect, so connect only one you trust with your revenue figures. The tools only read: history, milestones and webhooks are untouched.
Open the popover → Sources → Add source, pick the platform, paste the key, hit Test, then Add. Below is where each key comes from and which permissions it needs.
rk_live_… key into MRRDock.Options: Connected account ID (acct_…) reads a connected account instead of the platform's own subscriptions; Include revenue over the last 28 days enables the extra Charges call.
A restricted key is worth the extra minute: even if your Mac were compromised, that key can only list subscriptions.
proj…).MRRDock reads RevenueCat's own MRR rather than recomputing one from the subscriber list, so the number matches the RevenueCat dashboard exactly — including its currency, which the app picks up automatically.
Add one source per project: the totals then include every app you ship.
pdl_live_apikey_… key. Tick Sandbox to point the source at sandbox-api.paddle.com.Paddle Billing only (the v2 API). Paddle Classic is not supported.
Trials (on_trial) are counted separately and contribute no MRR.
polar_oat_…), with read access to metrics.sandbox-api.polar.sh.test.dodopayments.com instead of live.).MRR uses recurring_pre_tax_amount, so a merchant-of-record VAT charge doesn't inflate your figures.
Some platforms have no public revenue API — Superwall today, for instance — and some keys you'd rather not keep on a laptop at all. Both cases are covered by the custom source: point MRRDock at an HTTPS URL of yours (a Cloudflare Worker, a Lambda, a static file your backend regenerates) that returns:
{
"mrr": 4820.50,
"currency": "EUR",
"active_subscriptions": 312,
"trials": 24,
"revenue_28d": 6100
}Only mrr is required (monthly_recurring_revenue, monthlyRecurringRevenue and value are accepted too). The response may be wrapped in data or result, the field holding the MRR can be named in the source options, and an optional bearer token is sent with the request. Everything else is optional and simply won't be shown.
This is the recommended setup for App Store Connect and Google Play sales reports, for an internal billing table, and for keeping a live Stripe key on a server you control instead of on your desktop.
For every recurring line item MRRDock knows the price, the interval, the quantity and any percentage discount:
monthly = unit_price × quantity × (intervals_per_month ÷ interval_count) × (1 − discount)
where intervals_per_month is 30.4375 for daily, 4.348 for weekly, 1 for monthly and 1/12 for yearly — the average Gregorian month (365.25 ÷ 12), so twelve monthly plans and one yearly plan reconcile to the cent instead of drifting apart.
Decisions worth knowing about, because they're the ones that make dashboards disagree:
| Case | What MRRDock does |
|---|---|
| Free trial | Counted in Trials, contributes €0 to MRR |
| Yearly plan | Divided by 12 |
| Every-3-months plan | Divided by 3 |
| Seats / quantity | Multiplied |
| Percentage coupon (−20%) | Applied |
| Fixed-amount coupon (−€5) | Not applied — prorating it across a multi-item subscription needs data these APIs don't return |
| Usage-based / tiered / metered price | Not guessed. Counted as "could not be priced" and shown as a warning, so an understated total is visible |
| Taxes | Excluded where the provider separates them (Dodo's pre-tax amount, Paddle's unit price) |
| Past due / grace period | Follows the provider's own status: still active until the provider says otherwise |
| Mixed currencies | Kept separate until an exchange rate exists, then converted; anything unconvertible is reported, not dropped |
| ARR | Exactly MRR × 12, nothing smoothed or annualised behind your back |
Exchange rates come from Yahoo Finance's public quote endpoint (no key, no identifying data) and are cached for 12 hours.
Every MRR tracker for the Mac menu bar makes a different trade. Here is where MRRDock sits, so you can pick the right one rather than the first one.
| MRRDock | CatBar | IndieBar | Baremetrics / ChartMogul / ProfitWell | |
|---|---|---|---|---|
| Price | Free, MIT | Freemium, Pro subscription | Paid, one-time | Paid monthly, per MRR tier |
| Source code | Open | Closed | Closed | Closed |
| Platforms read | Stripe, RevenueCat, Paddle, Lemon Squeezy, Polar, Dodo, Gumroad, custom HTTPS | RevenueCat | Stripe, RevenueCat, GA4 | Stripe, and whatever the plan includes |
| Several accounts per platform | Yes | — | — | Depends on plan |
| Where the data goes | Nowhere: Mac → platform API | Mac → RevenueCat API | Mac → platform APIs | Your billing data on their servers |
| Cohorts, LTV, churn analysis | — | — | — | Yes, that's the point |
| Menu bar | Yes | Yes | Yes | Browser |
Read it this way:
| Mode | Example |
|---|---|
| MRR | €2,191 |
| MRR + 30-day change | €2,191 +8% |
| ARR | €26,290 ARR |
| Revenue (28 days) | €3,188 |
| Active subscriptions | 563 subs |
| Cycle through sources | Acme SaaS €842 → iOS apps €938 → … |
| Icon only | 📈 |
Figures above €10,000 are abbreviated (€26.3k) so the menu bar stays narrow. Privacy mode replaces the lot with •••.
Paste a Discord or Slack incoming webhook in Settings and pick what should reach it:
The payload shape follows the host automatically: a coloured embed for Discord, plain text for Slack. Only those two hosts are accepted — your revenue figures shouldn't be one typo away from an arbitrary server.
com.simone.mrrdock), never in the app's JSON file, never in logs, never in a backup you might paste in an issue.http:// is refused rather than sent your token in clear.~/Library/Application Support/MRRDock/; deleting that folder resets the app, and removing a source deletes its key from the Keychain.GET requests, so a key with write access still can't be used to change anything through MRRDock.git clone https://github.com/simonsruggi/MRRDock.git cd MRRDock ./build-app.sh # universal MRRDock.app in ./build open build/MRRDock.app
Or straight from SwiftPM:
swift run MRRDock # runs the menu bar app swift test # unit tests over the pure logic
Requirements: macOS 14+, Swift 5.9 (Xcode 15). One package dependency: Sparkle for in-app updates. See PROJECT.md for the architecture.
Is it really free?
Yes. MIT licensed, no paid tier, no limits on sources. If it saves you a browser tab a day, sponsoring keeps it going.
Does my revenue data leave my Mac?
No. There's no MRRDock server. The app calls your payment platforms directly and stores everything locally.
Is giving a desktop app my Stripe key safe?
It's stored in the Keychain and only sent to Stripe over HTTPS — but you don't have to: create a restricted key limited to reading subscriptions, or use the custom endpoint and keep the real key on your own server.
Why doesn't the total match my Stripe dashboard exactly?
Stripe's dashboard MRR (Sigma / Revenue Recognition) applies its own rules to proration, taxes and fixed-amount coupons. MRRDock states its rules in How MRR is calculated, so any difference is explainable rather than mysterious. If your account has usage-based prices, check the "could not be priced" warning under the totals.
Can I add several accounts of the same platform?
Yes — as many as you like. Each is a separate source with its own name, key and toggle.
Does it support Superwall?
Not directly: Superwall has no public revenue API. Route it through the custom endpoint, or read the same subscriptions through RevenueCat if you use both.
What about App Store Connect and Google Play?
Not yet as first-class sources (they need report downloads rather than a metrics API). Today: RevenueCat if you use it, or the custom endpoint. Native support is on the roadmap.
Does it drain the battery?
It sleeps between refreshes — every 15 minutes by default, configurable from 5 minutes to 6 hours — and does nothing else while idle.
Where's the 30-day change on day one?
It appears once there's history to compare against. MRRDock refuses to compute growth against a baseline that isn't 30 days old, because "+400% since Tuesday" is not information. Providers that expose their own MRR series (RevenueCat) are backfilled once a day, so the baseline is usually there from the first launch.
Which macOS versions?
macOS 14 Sonoma and later, Apple Silicon and Intel.
Is there a free alternative to Baremetrics or ChartMogul?
For the MRR figure itself, yes: MRRDock reads the same subscriptions from the same platforms and costs nothing. For cohort analysis, LTV and churn forecasting, no — see MRRDock vs the alternatives.
Can it show MRR from several Stripe accounts and RevenueCat projects at once?
Yes, that's the main reason it exists. Add one source per account or project, in any mix, and the menu bar shows the converted total.
Is there a Windows or Linux version?
No. MRRDock is a native macOS menu bar app (SwiftUI, only Sparkle for updates). The provider code is plain Swift and reusable, but there's no cross-platform build.
| Symptom | Fix |
|---|---|
HTTP 401: Invalid API key | Wrong key, or a test key on a live source (and vice versa). The error shown is the platform's own message. |
Missing Project ID (RevenueCat) | The proj… id from Project settings goes in its own field, not in the key field. |
| MRR lower than expected | Check the warnings under the totals: unpriced usage-based subscriptions, or a currency with no exchange rate. |
| A source shows a warning triangle | It failed its last refresh and is showing its previous figure. Hover the triangle for the reason. |
| Nothing in the menu bar | With many menu bar items macOS hides the newest ones. Free a slot, or use a menu bar manager. |
| "MRRDock is damaged / unidentified developer" | Shouldn't happen — the app is notarized. If it does, the download was corrupted: delete it and grab the zip again from Releases. |
| macOS asks for your Keychain password | Click Always Allow. The Keychain ties a saved key to the signature of the app that stored it, so a copy signed differently (a local ad-hoc build next to the released app) is treated as a different app. If the prompt keeps coming back, delete the source and add it again from the copy you actually use. |
New providers are welcome and small — a case in ProviderKind, an implementation of RevenueProvider, a parsing test with a real response body. PROJECT.md walks through the architecture and the five steps.
Bug reports and feature requests: open an issue. If MRRDock's number disagrees with your dashboard's, that's the most useful issue you can file — bring the two figures and the platform.
Looking for other free, open source apps for your Mac? I keep **Awesome Mac Open Source**: 1,000+ maintained macOS apps sorted by GitHub stars, with the Homebrew command to install each one, refreshed every week.
MIT — see LICENSE.
Made with ❤️ by Simone Ruggiero
100% Free & Open-Source native desktop software. Star the repository to support development.

Ten menu bar utilities in one app: a window manager with snap zones you draw yourself, workspaces that reopen your apps on the right monitor, on-device ...

Better input source switcher for macOS.

Tells you, in plain English, what each USB-C cable plugged into your Mac can do - speed, power, and e-marker info - from the menu bar.