{{ summaryError }}
Revenue unavailable. Stripe is not configured on this server, so amounts can't be looked up. Counts are complete.
Some Stripe prices are unavailable. Affected totals are marked incomplete: {{ fmt?.number(summary.revenue.missingSales || 0) }} period sales, {{ fmt?.number(summary.revenue.missingAllTimeSales || 0) }} historical sales, {{ fmt?.number(summary.revenue.missingSubscriptions || 0) }} active subscriptions.
Active subscriptions
{{ fmt?.number(summary.subscriptions.active) }}
{{ fmt?.number(summary.subscriptions.monthly) }} monthly · {{ fmt?.number(summary.subscriptions.annual) }} annual
MRR
{{ revenueOn() ? (summary.subscriptions.complete === false ? 'Incomplete' : (money(summary.subscriptions.mrr)[0] || fmt?.money(0))) : 'Unavailable' }}
+ {{ money(summary.subscriptions.mrr).slice(1).join(' · ') }}
{{ revenueOn() ? 'Annual plans ÷ 12' : 'Needs Stripe prices' }}
Sales · {{ periodPhrase() }}
{{ fmt?.number(summary.sales.count) }}
{{ revenueOn() ? (summary.sales.complete === false ? 'Revenue incomplete' : moneyText(summary.sales.revenue, fmt?.money(0))) : 'Revenue unavailable' }}
All-time sales
{{ fmt?.number(summary.allTime.count) }}
{{ revenueOn() ? (summary.allTime.complete === false ? 'Revenue incomplete' : moneyText(summary.allTime.revenue, fmt?.money(0))) : 'Revenue unavailable' }}
Cancelling
{{ fmt?.number(summary.subscriptions.cancelling) }}
at period end, of {{ fmt?.number(summary.subscriptions.active) }} active
Refunds & disputes
{{ fmt?.number(summary.reversals.refunds + summary.reversals.disputes) }}
{{ fmt?.number(summary.reversals.refunds) }} {{ summary.reversals.refunds === 1 ? 'refund' : 'refunds' }} · {{ fmt?.number(summary.reversals.disputes) }} {{ summary.reversals.disputes === 1 ? 'dispute' : 'disputes' }}
Stripe webhooks
Pending {{ fmt?.number(summary.webhooks.pending) }} · oldest {{ age(summary.webhooks.oldestPendingSeconds) }}
Failed {{ fmt?.number(summary.webhooks.failed) }}
Last error {{ summary.webhooks.lastError.error }} on {{ summary.webhooks.lastError.type }} · {{ fmt?.humanTime(summary.webhooks.lastError.receivedAt) }}
Last error none
Unreviewed reversals {{ fmt?.number(summary.webhooks.unreviewedRevocations) }}
Sales per {{ bucketName() }} · {{ periodPhrase() }}
{{ f.label }} · {{ fmt?.number(familyTotal(f.id)) }}
{{ fmt?.number(chartMax()) }}{{ fmt?.number(chartMax() / 2) }}0
{{ bucketLabel(summary.series[0]) }}
{{ bucketLabel(summary.series[Math.floor(summary.series.length / 2)]) }}
{{ bucketLabel(summary.series[summary.series.length - 1]) }}
No sales {{ period === 'all' ? 'yet' : 'in the ' + periodPhrase() }}.
By plan
{{ fmt?.number(plansWithActivity().length) }} of {{ fmt?.number(summary.plans.length) }} plans sold
A paper pack counts once, under Paper pack. Active means paid time remains and the payment wasn't reversed.
Subscriptions and purchases
{{ total >= 0 ? fmt.number(total) : '…' }} shown
{{ grantsError }}
{{ hasFilters() ? 'No subscriptions or purchases match these filters.' : 'No subscriptions or purchases yet.' }}
Loading subscriptions and purchases…