v0.2.0
11 October 2026 Latest- Weekly report. Monday 08:00 (server-local) e-mail from the worker with the week's holds placed / captured / released, held value, bank transfers confirmed, rate-limited requests, denied order lookups and orphaned charges — each with the previous week for comparison — plus the next open set-up step and, on trial/free, what a licence adds. Sent through the ops SMTP settings (
SMTP_*), falling back to the SDK env transport. Recipient defaults toops.adminEmail, then the licence customer, then the trial reminder address.GET|POST /checkout-guard/digest/settings,POST /digest/send-test,GET /digest/preview, and a *Weekly report* card in the Settings tab (toggle, recipient, last/next, Send me a test, Preview). - Set-up checklist on the Overview tab (
GET /checkout-guard/setup): Stripe webhook secret,stripe-holdmethod,bank-transfermethod, trusted client IP (secret header ortrustedProxies), ops channel — real checks, with links to the fix. Hideable once complete; reappears if a check regresses. Replaces the static checklist in Settings. - Dashboard widget (
registerDashboardWidget, *Dashboard → Add widget → Checkout Guard*): three 7-day headline figures, the licence notice and a link to the page.GET /checkout-guard/widget. - Usage counters.
cg_counter(day, name, n) records Shop API rate-limit rejections and session-boundorderByCoderefusals (fire-and-forget, buffered, one upsert per counter every two seconds). New Overview tiles *Held value (30d)*, *Rate-limit rejections (7d)* and *Denied order lookups (7d)*;summarygains ausageblock. - Usage stats to the licence server.
holdsPlaced,holdsCaptured,holdsCancelled,heldValuePence,bankTransfersConfirmed,rateLimitRejections,orderAccessDenied,orphansFound(last 30 days, numbers only) ride on the daily heartbeat and evaluation pings — licensed installs keep reporting after purchase. - Licence banner.
metanow carriesnotice(trial / key / evaluation lifecycle sentence, shown as an amber strip),premiumFeatures,recentStats("So far: £… held on customers' cards · …") andbuyUrl. The trial banner gains "Email me before it ends" (wired to the existingeval/remind-me; the address is remembered as the report's fallback recipient). Every 402 andlicence_required/premium-featureerror in the admin now reads "… needs a licence — start the free trial or activate a key at the top of this page."
402bodies from the hold capture/cancel endpoints includebuyUrl.- Retention cron also prunes
cg_counterafter 400 days. ReconciliationServiceandObservabilityServiceaccept the newCounterService;OpsAlertServiceexposessendMail(),hasSmtp()andadminEmail().- Heartbeat reports the key in force. The daily ping now reads the active licence through
licenceKeyProvider, so a key activated from the admin, installed by the purchase claim or restored at boot is reported under its own jti instead of "unlicensed" (the licence server dropped the usage stats for those installs before). - Licence SDK dependency raised to
^0.15.1.