Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/sadanalytics-wp/sad-subscription-analytics/archive/refs/heads/main.zipSad Subscription Analytics (SadAnalytics)
Subscription analytics for WordPress. Connect your payment provider once and SadAnalytics turns your billing data into the numbers that actually run a subscription business: MRR, churn, LTV, retention, and more, all inside wp-admin.
SadAnalytics reads your data on a background schedule and stores pre calculated results, so your dashboards load instantly and your site's front end is never touched.
- Version: 1.3.1
- Requires WordPress: 6.9 or higher
- Requires PHP: 7.4 or higher
- Database: MySQL 5.7+ or MariaDB 10.2+
- Scope: single site (Multisite is not supported)
- License: GPL-2.0-or-later
Features marked (SadAnalytics Pro) belong to SadAnalytics Pro, a separate paid add-on with a 30-day money-back guarantee. Buy it at https://sadanalytics.com/pricing/ or on the Add-Ons page under SadAnalytics, then download it and upload it under Plugins, Add New Plugin.
What it does
Headline metrics
- MRR (monthly recurring revenue) and ARR
- Subscriptions (active, trialing and past due)
- Customers: everyone with a subscription or a payment on record from a provider you have not disconnected. Switching a connector (SadAnalytics Pro) off, in Settings on the Connectors tab, does not remove its customers.
- Average LTV (lifetime value)
- ARPU (average revenue per paying customer), on the Dashboard and in the weekly digest
- Churn rate, split into voluntary and involuntary
- Net revenue retention (NRR)
- Failed payment recovery rate and revenue at risk
Trends and movement
- 12 month MRR trend
- Period comparisons on the dashboard: see MRR, subscriptions and customers against last month, the same month last year, or a month you pick (the other headline numbers build their history from the first sync onward)
- A "what changed" view for any period: new, reactivation, expansion, contraction, and churn
- Cohort retention by first-payment month
Lists and detail
- Customers, with WordPress user matching, and a per customer drawer
- Transactions, with signed amounts and filters
- Filter Customers and Subscriptions by several statuses at once
- Upcoming payments (SadAnalytics Pro)
- Trial to paid conversions (from provider trials and WordPress signups)
- CSV export on every report list (SadAnalytics Pro)
Beyond the provider
- Detected subscriptions: SadAnalytics spots recurring payments that the provider did not model as a subscription and counts them toward your real MRR
- Manual / off processor payments (SadAnalytics Pro): record subscriptions and one off sales by hand or via CSV import, so revenue collected outside the processor still shows up
- Multi currency: headline metrics and report totals are converted to your primary currency, using exchange rates from freecurrencyapi.com with a free key you add in Settings (without a key, amounts in other currencies are left out and a note says so). On the Dashboard, only your primary currency counts toward cash collected, MRR churn and (with SadAnalytics Pro) expected renewal cash.
Operations
- Weekly email digest of the key numbers
- Onboarding wizard (connect, pick your trial roles, set a revenue target, then sync)
- Diagnostics tab with a grouped error log
- GDPR personal data export and erase
- Access control (SadAnalytics Pro): choose who can see and manage SadAnalytics, instead of every administrator, and give people who are not administrators view-only access. Without SadAnalytics Pro, every administrator can see SadAnalytics and nobody else can; a list saved earlier is kept and applies again when SadAnalytics Pro returns
- Exempted accounts: list email addresses (your own test accounts, say) and SadAnalytics removes everything it holds for them, on save and again after every sync
Requirements
- WordPress 6.9+ on PHP 7.4+
- MySQL 5.7+ or MariaDB 10.2+ (the analytics use JSON functions)
- A single site install (not Multisite)
- A payment provider account. SadAnalytics ships with Stripe and accepts either a standard secret key (
sk_...) or a restricted key (rk_...) with read access to Customers, Subscriptions, Charges, Invoices and Prices (add Products too if you want plan names to show). A read only restricted key is recommended. - Optional: a Paid Memberships Pro install. The free core detects it (and flags what the add-on would import); importing those off-processor memberships (PMPro's pay-by-check gateway and orders recorded with no gateway), and entering off-processor payments by hand on the Manual page, are SadAnalytics Pro add-on features.
The bundled Stripe SDK is namespace isolated, so SadAnalytics can run alongside other plugins that use Stripe.
Installation
- Download the release ZIP from https://sadanalytics.com/download/ and upload it under Plugins, Add New Plugin, Upload Plugin, or unpack it into
wp-content/plugins/, which creates thesad-subscription-analyticsfolder. Use that release ZIP rather than the ZIP from GitHub's "Download ZIP" button, which unpacks into a folder with a different name. - Activate it. SadAnalytics creates its database tables on activation and keeps their structure up to date automatically on later updates. Provider data already synced (customers, subscriptions, payments, invoices) is not re-derived, so an accuracy fix in a later version applies to newly synced data. A few upgrades backfill internal bookkeeping columns.
- Open SadAnalytics in the admin menu. The onboarding wizard appears on first run.
Getting started
- Connect your provider in the wizard (paste your Stripe key). SadAnalytics detects test or live mode from the key.
- Pick your trial roles. Choose the WordPress roles (such as Subscriber) that represent a free or trial member, so SadAnalytics can count trial to paid conversions from WordPress signups. You can skip this step.
- Set a monthly revenue target. The Dashboard then shows the gap to it. You can skip this step, and change or remove the target later in Settings.
- Sync. Choose how much history to pull (default 24 months) and start the first sync. It runs in the background and may take a few minutes depending on volume; you can close the wizard and keep working.
- When the sync finishes, the Dashboard is populated. After that, SadAnalytics syncs on a schedule you choose (manual, every 6 hours, every 12 hours, or daily). Whichever you choose, manual included, it also runs a full re-sync once a month to catch older refunds and changes.
Privacy and data
SadAnalytics stores billing data (customers, subscriptions, payments, invoices) in your own WordPress database. Provider API keys are encrypted at rest with AES-256-GCM. SadAnalytics sends your billing and customer records to no outside service. The weekly digest, if you turn it on, emails your headline numbers to the recipients you choose.
SadAnalytics talks to these outside services:
- Your payment provider (Stripe), to read your billing data.
- freecurrencyapi.com, only if your site bills in more than one currency and you add a key in Settings: SadAnalytics sends the key and your primary currency code, and gets exchange rates back.
- Sentry, the plugin developer's error tracker, for diagnostic error reports (below).
- Freemius, which powers an opt-in screen and SadAnalytics Pro's licensing. If you opt in, Freemius receives your site's basic details (web address and title, WordPress and PHP versions, language), SadAnalytics' version and whether it is active, your WordPress user's name and email, and, unless you switch it off, the list of your plugins and themes. It never receives the billing data SadAnalytics stores. You can skip the opt-in, and SadAnalytics works the same. Whether or not you opted in, opening the Add-Ons page under SadAnalytics asks Freemius for the list of add-ons; buying SadAnalytics Pro there sends Freemius's checkout your name and email, your site's address, title and language, and your WordPress, PHP and SadAnalytics versions, and connects the site to your Freemius account once you complete the purchase; and the optional feedback form shown when you deactivate SadAnalytics sends your answer if you submit it. If you opted in, you can pause sharing with the Opt Out link under Sad Subscription Analytics on the Plugins page, or disconnect the site from your account page, which Settings, Diagnostics links to.
Requests to freecurrencyapi.com, Sentry and Freemius also carry your site's web address, which WordPress and the bundled Freemius code add by default.
Diagnostic error reporting is off by default on a new install. You can turn it on in Settings, on the Diagnostics tab, under Error reporting. While it is on, when an error occurs inside the plugin, a report is sent to Sentry so it can be fixed. A report describes the error and can quote an ID from your payment provider. Before it is sent, email addresses, Stripe keys, your Stripe account ID and your server's WordPress and plugin folder paths are removed from its text, and fields named for personal data or secrets (such as first, last and customer names, emails, phone numbers, addresses, passwords and API keys) are blanked. You can turn it off again at any time.
The Diagnostics tab and a personal data exporter / eraser (under Tools, Export Personal Data and Erase Personal Data) help you meet GDPR requests.
For developers
- Architecture: a provider abstraction (Stripe ships first) feeds an asynchronous sync pipeline. Its batches run as Action Scheduler actions. A once-a-minute WP-Cron tick, and SadAnalytics' own sync driver on admin pages while a sync is running, also run them directly, and when an admin starts a sync, the AJAX request that starts it normally runs each provider's first batch. None of this happens inside a page render. Fetched data is normalized into
wp_sadanalytics_*tables, then derived metrics, cohorts, pattern detection, and user matching run as separate background stages. Reports and the Dashboard never query a provider directly; they read what SadAnalytics has synced and stored. - Extensibility: meaningful actions and data transformations expose
do_action()/apply_filters()hooks, all namespacedsadanalytics_*. New sources register through the provider interface. Stripe ships in the free core; manual entry, the Upcoming Payments, CSV-export and Access-list features, and the Paid Memberships Pro connector are in the SadAnalytics Pro add-on. WooCommerce Subscriptions is the next planned connector. - Tech: vanilla PHP admin partials, a small amount of jQuery and vanilla JS, Chart.js for charts. No build step, no React.
- Source: each release is published on GitHub at https://sadanalytics.com/github. That repository holds only the released code and does not take issues or pull requests; report bugs at https://sadanalytics.com/support/.
- Security problems: report them privately by email to support@sadanalytics.com, as the security policy at https://github.com/sadanalytics-wp/sad-subscription-analytics/blob/main/SECURITY.md describes, and please do not post them anywhere public.
- Tests: two PHPUnit suites for the core (pure logic, and real-MySQL integration; SadAnalytics Pro has its own) live in the developer's private repository, not in the release ZIP or its GitHub copy.
Technical reference
The detailed technical reference (database tables and versions, the hooks reference, cron events, the sync chain, data-accuracy rules and known issues) is kept by the developer and is not published. This README is the public, high-level overview.
License
GPL-2.0-or-later. Copyright Sadik Bhimani. See https://www.gnu.org/licenses/gpl-2.0.html.