Invite Your Team, Checkout API Upgrades & Payouts GA

Team invites end-to-end, payouts GA for all organizations, and checkout API upgrades — external IDs for idempotent order creation, required-field collection before payment, and a live session expiry countdown.
Team Invites
Merchants can now invite teammates end-to-end from Team settings. Enter a name, email, and role (Admin or Owner), and the invite is sent by email automatically — with a copyable invite link for sharing outside of email.
- Resend email is available from the pending invites menu, so a lost email isn't a dead end
- Leave Organization is now a first-class action from your own member profile, with a safety guard that prevents the last owner from leaving without first transferring ownership
- Remove Member and Change Role actions are live in member detail page as well
- Invitee display name is set automatically from the name fields the inviter provides
Checkout API Upgrades
Following the Checkout Sessions and Orders API launch last week, a batch of upgrades aimed at integration reliability.
Top-level externalId on POST /v0/checkout/sessions and POST /v0/orders. Pass your own
order identifier (cart ID, POS ticket, order number) directly on the order and retry safely — a
second create call with the same externalId returns 409 Conflict with a DUPLICATE_EXTERNAL_ID
error code. Built-in idempotency key that makes flaky network calls safe to retry.
Required fields at checkout. Create a session with requiredFields set to phone,
shippingAddress, and/or location, and Decal's hosted checkout page will collect the missing
information from the customer during the payment collection. Any fields you pre-fill at session
creation allow the skipping those fields entirely.
{ORDER_ID} URL template. successUrl and callbackUrl now support {ORDER_ID} alongside the
existing {SESSION_ID}. Substitution uses the formatted typed IDs (cs_<mode>_<cuid>,
ord_<mode>_<cuid>), so the URLs your handlers receive are ready to plug straight back into the
API.
Metadata limits. Orders and order items now have metadata shape constraints — max 50 keys, keys up to 40 characters, string values up to 500 characters, flat primitive arrays only. Keeps row sizes, response payloads, and webhook deliveries tidy. Well-formed existing metadata is unaffected.
Live Session Expiry Countdown
Checkout sessions now show a live countdown timer when less than 10 minutes remain, and transition gracefully to the expired or cancelled page mid-checkout — no page reload required. Whichever fires first (the timer hitting zero or the order polling detecting expiry) wins, so the customer always lands on the right page.
Saved Customer Payment Methods
Card and wallet details are now persisted after each successful payment. This enables returning-customer detection by card fingerprint — groundwork for faster repeat checkout flows.
Payouts for All Merchants
The Payouts page is now available to every organization — previously it was gated behind a feature flag.
Submitting a stablecoin payout updates the available balance and payout activity in-place. The active payout shows a spinner until it confirms (usually within sub-second), and failures surface inline with a clickable error badge. No more full-page reloads on submit.
Manual Wallet Connect
Wallets that don't publish a deep link scheme (e.g. Jupiter) can now be connected via a guided manual flow. A Don't see your wallet? entry appears at the bottom of the wallet list and opens a sheet with step-by-step instructions and a copy button — no auto-redirect or auto-copy.
Wallet sort order also updated so Mobile Wallet Adapter appears after named wallets but before Brave.
Minor Improvements
- QR codes canonicalized to pay.usedecal.com — scan-to-pay QR codes and wallet deep links now
route through the pay app redirect, so customers always see and share
pay.usedecal.com/loc/{id}URLs regardless of your merchant handle or site configuration. Printed QRs keep working across handle and location status changes. - Dashboard time range sync — changing the chart period now updates all four metric cards to the same window, and the selection is preserved in the URL so it survives refresh and can be shared. Adds Year to date as a fourth option.
- Payment destination fix —
paymentDestinationset on a checkout session now correctly routes funds to the specified wallet instead of the merchant's default orchestration wallet. - Checkout polling on tab return — returning to the browser tab after a wallet deep-link now immediately triggers an order status check, regardless of whether the wallet sheet is still open.
- Dashboard sign-in fix — resolved a schema validation error that could reject valid emails on the sign-in screen, plus a layout fix to the error alert on dashboard, passport, and admin login screens.