PROTOTYPE Clickable mockup · simulates the finished app ◃ Product overview
Petanque Life Operator Console
Production OP

Finance oversight

Cross-tenant invoice and payment oversight, refunds and reconciliation. Pricing, subscriptions, dunning and bank import live in Billing & subscriptions; MRR/churn analytics in Growth. Every money mutation requires sys_finance + fresh authentication + a written reason.

86 400 SEK
MRR (platform)
trend + per plan/country → /sys/growth
72 100 SEK
Net revenue (June)
after refunds
9 340 SEK
Platform fees (June)
issuer_type=platform
3
Unmatched payments
assign queue → /sys/billing (bank import)
Cross-tenant invoices · status, amount, due date, dunning stage · filter + export · F21.07.02
InvoiceTenantAmountDueStatusDunning
INV-8841 Skåne Bouleförbund 4 500 SEK 2026-07-15 open
INV-8839 Nordvik Boule 350 SEK 2026-06-30 paid
INV-8822 Sjöstad PK 1 200 SEK 2026-06-01 overdue dunning stage 2
INV-8807 Fjordkedjan Boule AB 14 200 SEK 2026-06-01 paid
INV-8791 Boule Provence (demo) 900 SEK 2026-05-15 partially_refunded refund 450 SEK
Payments · all tenants · detail: method, provider reference, linked invoice, refund timestamps · F21.07.03
PaymentMethodAmountLinked toStatus
PAY-77102 Swish 350 SEK INV-8839 · Nordvik Boule settled
PAY-77098 Stripe card 14 200 SEK INV-8807 · Fjordkedjan settled
PAY-77081 Bankgirot 4 500 SEK unmatched — see bank import unmatched
PAY-77066 Stripe card 900 SEK INV-8791 · refunded 450 SEK 28 Jun 14:11 partially refunded

Unmatched bank transfers with fuzzy invoice suggestions (OCR / amount / tenant / due-window / counterparty) and assign / ignore actions live in Billing → Bank import (F21.07.04).

States
⏳ Loading invoices…
📭 No invoices in this window.
⚠ Could not load invoice list. Retry.
Refund · two-step preview → execute · idempotent on (payment, amount, actor) · F21.07.05
Preview: gateway refund 450 SEK → counter AccountingEntry → invoice INV-8791 transitions to partially_refunded.
sys_finance fresh-auth < 5 min
Recent refunds
28 Jun 14:11 · PAY-77066 · 450 SEK · jonas.holm · "#4462 double charge" · invoice → partially_refunded
12 Jun 09:40 · PAY-76911 · 1 200 SEK · maria.ek · "#4390 cancelled event" · invoice → refunded

Every refund is reversible only via a new counter-entry; the audit log keeps the undo path (cross-cutting reversibility rule).

Platform-fee report · group by tenant or country · F21.07.09
TenantGrossPaidOutstanding
Svenska Bouleförbundet4 210 SEK4 210 SEK0 SEK
Fjordkedjan Boule AB2 830 SEK2 130 SEK700 SEK
Skåne Bouleförbund1 400 SEK1 400 SEK0 SEK

Churn report by reason / plan / country (F21.07.07) renders in Growth with revenue impact locked at cancellation.

Reconciliation · provider ledger vs internal AccountingEntry · tolerance 100 öre · F21.07.10
ProviderProvider totalInternal totalDriftStatus
Stripe 61 400 SEK 61 400 SEK 0 SEK balanced
Bankgirot 18 700 SEK 18 550 SEK 150 SEK drift flagged

1 h in-process cache · returns 503 with guidance when provider credentials are missing.

Bankgirot drift 150 SEK above tolerance.

Likely cause: unmatched transfer BG-2026-0701-021 not yet assigned.

Open bank import →