Webhook Visibility, Location Management & Friendlier Errors

Merchants can now debug webhook deliveries from the dashboard, create and edit locations, and personalize the first-top-up nudge with a formatting toolbar.
Webhook Delivery Inspector
A new Webhooks view under Settings → Connections lets merchants see exactly what happened to every outgoing webhook. Filter by status and event type, drill into any individual delivery to view the request body, response body, headers, response code, and duration as code blocks, and read the error details for failed attempts (DNS lookup failed, HTTP error, request timed out, etc.) right at the top of the page.
Every webhook attempt is now persisted with full forensics, so a failure that happened overnight is still inspectable the next morning — no more guessing whether the endpoint was reachable.
Manual Locations
Locations no longer require a Square integration. A unified location form covers name, description, street address, phone, email, timezone, and recurring business hours, and works whether the location was created manually or imported from Square.
For merchants who do use Square, sync precedence is now snapshot-based: Square only overwrites a field if the merchant hasn't changed it since the last sync. Edit business hours, fix a typo in your address, or update a phone number directly in Decal without worrying that the next Square sync will clobber it.
Custom Sign-Up Bonus Messages
Merchants running Stored Value programs can now write their own first-top-up bonus message. The dashboard Sign-Up Bonus settings tab adds a formatting toolbar (bold, italic, center alignment), a 140-character counter, and a one-click Remove button to return to the default. The phone mock preview updates live as you type so you can see exactly what first-time top-up customers will see at checkout.
Friendlier API Errors
Errors returned from the API now carry through the actual reason instead of a generic "An unexpected error occurred" fallback. Auth flows in particular — invalid OTP, expired challenge, fingerprint mismatch, hourly refresh limit — now surface real messages to integrators and apps. The HTTP status code and error code contract is unchanged; only the user-facing message is more useful.
Minor Improvements
- Square order-not-found shows the right page. Checkout sessions for missing Square orders now display the order-not-found message instead of a generic server error.
- Payment page production crash fixed. Resolved a minor error that could surface on the payment page in production for some wallets.
- "Required information" heading hidden when not needed. The checkout page no longer shows the Required information heading if you haven't configured any required customer input fields on the checkout session.
- Branded merchant sites are more resilient. Custom domain sites now tolerate transient database hiccups instead of bubbling to an error page, with a friendlier in-page recovery state when something does fail.