Card Payments, Integration Health & Para Authentication

Card payment fixes, automatic OAuth token refresh, integration health monitoring, improved authentication, and unified balance top-ups.
Card Payments
Several card payment improvements shipped this week:
- Fixed initialization hang — Card payment sessions no longer stall when opening the payment dialog.
- 4-digit expiration year — Eliminates ambiguous 2-digit year handling that allowed invalid dates to pass validation.
- Better error messages — User-actionable errors like invalid zip or declined card are now shown directly instead of a generic failure message.
- Auto-resolved email — Authenticated customers no longer need to re-enter their email in the card form.
- Hidden zero fees — The "$0.00 processing fee" text no longer appears when there is no fee.
- Test mode fix — Stablecoin confirm and cancel operations no longer fail in test mode.
Integration Health Monitoring
Integration pages now surface connection health directly in the dashboard. Health badges show auth refresh failures, upcoming expirations, and expired auth tokens at a glance. Detail pages include alert banners with an actionable "Resync Now" button.
Behind the scenes, a daily cron job automatically refreshes expiring OAuth tokens with a 7-day lookahead window. Failed refreshes trigger admin alert emails. The system supports any OAuth integration type automatically.
Improved Customer Authentication
Sign-in now streamlines customer authentication into a single OTP prompt. Customers authenticate once and get both a customer session in a single flow. This fixes the previous scenarios that would require a customer to authenticate twice, reducing friction at login.
Balance Top-Ups
The balance top-up flow has been unified so the guest token experience reuses the same components as the authenticated flow. Card payments are now supported for balance top-ups in addition to stablecoins. Payment method selection is displayed inline and selecting a method immediately opens the payment sheet.
Minor Improvements
- Session mode is now the single source of truth for all checkout and top-up actions, matching industry standard approaches. Mode is no longer derived from location integrations or passed from the client.
- Checkout URLs simplified from
loc_live_{id}to raw CUIDs, with backwards-compatible redirects for old URL formats, resulting in shorter URLs. - Dashboard revenue chart fixed for merchants in non-UTC timezones.
- Square integration switched to production APIs for both test and live modes, with data isolation handled within the Decal dashboard.
- Square resync now correctly updates OAuth tokens when the integration has an expired auth token.
- Test mode banner is now a shared component across apps with improved scroll-hide behavior.
- Failed top-up transactions can now be retried without creating duplicate records — the existing transaction resets from FAILED to INITIATED.