Skip to content

Merchant Dashboard

Who: the Vecnet client / merchant (the government entity or operator). Read-mostly, hard-scoped by RLS to their own entity_id.

Live mockup

See the working dashboard at vecnet-dashboard.vercel.app — specifically /finances, /transactions, and /terminales. Per-module deep-dives: Finances surface, Terminales. Recent changes: Changelog.

Capabilities

CapabilityBacked byNotes
Balance overview (per account/currency)accounts (RLS)Realtime subscription for live balance
Transaction historyjournals + ledger_entries (RLS)filter by category/date/rail/correlation_id
Disputas submodulejournals (dispute states)Inside /transactions — KPI strip, status tabs, evidence-upload form. New in v0.2 (see changelog).
Terminalessucursales + terminales (operator tier)Sub-MID hierarchy + per-device payment history. Dedicated surface: Terminales. New in v0.2.
Daily ledger statementsbalance_snapshots + Storagedownload XLSX (CSV in v0.2 dashboard mock)
Settlement statementsjournals where settlement_id setread-only, with date + amount filter UI; see Finances surface
Rolling reserve viewjournals (rr_amount, expected_reserve_release_date)upcoming releases
Payment status (live)Webhook Manager → Realtimethe citizen-facing notification loop

The merchant cannot create fee rules, run settlements, post transfers, or see other entities.

Metric catalog

The Dashboard organizes into four pages. Two data sources, never confused (§7.9):

  • Money metrics (settled volume, refunds, disputes, deposits, fees, net) → journals / ledger_entries.
  • Acceptance / conversion / risk metrics (acceptance rate, decline reasons, status mix, 3DS, BIN/issuer, Guardian) → transactions (the only place declines/failures/pending/expired live).

Global metric rules

Get these exactly right — they're the usual source of wrong dashboards

  1. Acceptance rate = successful ÷ (success + declined + failed) × 100. Exclude expired, pending, and duplicates from the denominator.
  2. APM conversion rate = successful APM ÷ all APM intents × 100. Include expired and pending (it measures conversion, not authorization).
  3. Card acceptance rate and APM conversion rate are never blended into one number — they measure different things.
  4. Dedup everywhere: each payment_intent_id is counted once; retries behind one intent collapse.
  5. FTD = first-ever successful payment for a customer_ref, confirmed by looking back across all history (not just the selected range).
  6. Every metric respects the global date-range filter (Today / 7D / 30D / 90D / custom).

Home — Primary KPIs

MetricFormula
Gross volumeΣ all transaction amounts, any outcome
Success volumeΣ amounts where status = success
Successful paymentscount of unique successful payments
Acceptance rate (count & volume)rule #1, computed by count and by amount

Secondary KPIs: Refunds (count + Σ; cards only), Disputes (count + Σ chargebacks), FTDs (rule #5), Avg ticket (success volume ÷ successful payments).

Charts: Payment volume over time (toggle $ / count / acceptance); Payment-method donut; Status distribution; Top issuing banks by acceptance; Daily-health 30-day heatmap (green ≥80%, amber 50–79%, red <50%); Top decline reasons (code + count + severity).

Analytics — Acceptance & Conversion

KPIFormula
Overall acceptance raterule #1
FTD acceptance ratesuccessful ÷ total payments, restricted to first-time customers (rule #1 denominator)
Trusted acceptance ratesame, restricted to returning customers
APM conversion raterule #2

Charts: acceptance over time (Overall / FTD / Trusted lines); acceptance by method (APM bars show conversion); card-network performance table (Visa/MC/Amex); top & worst issuing banks (with auth rate); FTD-vs-Trusted comparison.

Analytics — Deposit Analytics

(operator/iGaming framing; relabel "deposit/depositor" → "payment/payer" for GovTech)

KPIFormula
Total depositsΣ successful payment amounts
FTDscount of new first-time customers (rule #5)
Active depositorscount of distinct customer_ref with ≥1 success in range
Avg deposit amounttotal deposits ÷ successful deposits

Charts: deposit volume + count; FTD funnel (initiated → authorized → FTD completed, incl. pending/expired since it's conversion); deposit-amount distribution; deposits vs withdrawals (net-flow); top depositors; payment-method mix over time.

Fraud & Risk

(Tonder marks these formulas "pending to confirm" — treat as provisional.)

KPIFormula
Guardian block rateblocked ÷ total card transactions screened × 100 (healthy <5%)
3DS abandonment rate3DS challenges abandoned ÷ total 3DS transactions × 100
Intl card acceptancesuccessful international card payments ÷ total international card payments × 100

3D Secure sub-metrics: success rate (successful 3DS ÷ total 3DS); challenge rate (challenged ÷ total 3DS); frictionless = 100% − challenge rate; abandonments (count). Charts: block decisions over time (allowed / issuer declines / Guardian blocks); suspicious BINs; geographic risk; suspicious email velocity.

Rail note

The tonder rail is card/CNP-rich (full card_brand/BIN/3DS/Guardian); the menta POS rail is card-present and won't populate every fraud field. Status/acceptance/volume span both. The Vecnet admin sees these same metrics across all entities.

The live mockup is at vecnet-dashboard.vercel.app/finances; the vecnet-dashboard repo is private, so this page/metric structure is the working model until the repo is shared (open items). The metric formulas are already captured from Tonder's metric-definitions page.

Vecnet — Build Spec v0.2 · Obsidian Terminal