Changelog

All the latest updates, improvements, and fixes to Decal

Book and Pay Online, Automatic Booking Emails, and Store-Credit Refunds

Customers Can Book and Pay Online

Building on last cycle's customer booking pages, where customers could browse your services and pick a time, they can now finish the booking and pay online.

Customers add one or more of your services or classes to a cart, held together under a single countdown, and check out on a cleaner two-column checkout page: contact details and a desired payment method. Signed-in customers are recognized automatically, and guests enter their details once, which creates an account they can sign into later to see their history. An order is created only when a customer goes to pay, so revisiting, reloading, or going back never creates a duplicate. Each time slot is locked the instant before payment, and the booking is confirmed the moment payment succeeds. If someone takes the slot first, the customer is told directly at the payment step and can pick another, with no charge made.

The online booking checkout page with contact details and payment methodsThe online booking checkout page with contact details and payment methods

Customers can also book across more than one of your locations in a single checkout, for example a session at one studio and a class at another, paid once as one order. Each booking is still made at its correct location and shows in that location's timezone on the receipt.

Automatic Booking Emails

Bookings now keep both sides in the loop by email, from the first booking to the follow-up:

  • Confirmations go to the customer as soon as a booking is confirmed, and you get a new-booking alert.
  • Cancellations and reschedules notifies the customer and you. Reschedule notifications show both the previous time (now free) and the new one, so you don't have to cross-reference your calendar to see what opened up.

The confirmation email is redesigned into clear "When" and "Where" sections. The date is spelled out in full ("Saturday, August 1, 2026") and shown prominently, the location's full street address and formatted phone number appear, and "Get directions" is a proper button. Cancellation emails now show the reason in its own card below the booking details, so it reads clearly instead of a small line above them.

Customers control what they hear from you. A new Notifications page in a customer's account groups booking emails so they can toggle confirmations, cancellations, and reschedule notifications on their own. Confirmations, cancellations, and reschedules always keep email on, so customers always keep a record of their bookings.

Refunds as Store Credit

You can now refund a customer as store credit even before they've joined your stored value program. The customer's wallet is created automatically behind the scenes and the balance is waiting the first time they sign in.

Cancelling a paid appointment now opens a cancellation wizard where you can more easily refund in the same step, choosing the refund method and amount. The amount defaults to that booking's share of the order, so cancelling one booking of a multi-booking order doesn't over-refund, and the wizard shows how much of the order has already been refunded.

A refunded order also shows a proper refunded receipt on the customer-facing order page. The items and totals stay visible under a clear "Refunded" or "Partially Refunded" header and the refunded amount.

A Cleaner Merchant Site

  • Desktop navigation. Your site now shows a proper desktop navigation bar with inline links, keeping the mobile menu for smaller screens. "Show Member ID" is now available from the account menu.
  • Location booking pages. Each location's booking page now shows its address, a map, opening hours, and phone number.
  • Browse everything in one place. Customers can browse everything you offer to book from a single /book page. Picking a service offered at more than one location opens a location selector.
  • Back to where you were. After signing in, customers return to the page they originally opened instead of the home page.

Minor Improvements

  • Choose where each item sells. Picking which locations a catalog item is available at is now generally available, right in the catalog item wizard and on the item detail page. Leave it unset to keep an item available at every current and future location.
  • Smoother sign-in at checkout. Fixed a sign-in issue where verifying your identity, including when paying with a stored-value balance, could get stuck asking you to verify again or briefly flash a "wallet unavailable" error while loading.
  • Cart clears after mobile wallet payment. After paying with a mobile wallet and returning to the original browser tab, the cart now correctly empties along with the confirmation instead of lingering.
  • Refresh-safe confirmation. Refreshing the checkout page right after paying now reliably lands on your order confirmation instead of an empty cart.
  • Jump to the order from a booking. The booking detail page now has an "Order" button when a booking has a linked order.
Read more →

Customer Booking Pages, Treasury Automation & Smarter Scheduling

Customers Can Book Right on Your Site

Building on the customer booking beta, customers can now browse a merchant's bookable services and classes directly on their site at /book. Each offering gets its own page showing the name, description, price, duration, and real available times in the location's timezone, so a customer can find a service and pick an open slot without calling ahead.

Select a date and time for a booking on the merchant's siteSelect a date and time for a booking on the merchant's site

Faster, Smarter Booking Pages

The public booking experience is quicker and clearer. Availability now loads a full week at a time instead of one day per click, so flipping between days you've already looked at is instant with no loading spinner. Booking date pickers dim days the location is closed or a class isn't offered and explain why on tap or hover, so a customer never picks a day that turns out to have no times. When a day has nothing open, the empty state names the reason (closed, not offered, or fully booked) instead of a generic "no times available." Offerings bookable on only a handful of specific dates now show a compact list of just those dates rather than an almost-empty calendar. Open booking pages also keep availability current in the background: while a customer is deciding, a slot taken by someone else quietly disappears, and a selected time that gets booked away is cleared with a gentle notice.

Both booking flows now share a cleaner date-strip picker, a month and year header with week navigation over a row of day cards, and tapping the month opens a full calendar so customers can jump straight to a far-future date.

Multi-Service Appointments & Timezone-Aware Views

Merchants can now book multiple services in a single appointment from the dashboard. Search and add a haircut and a color to one booking, pick a single start time, and each service is scheduled back-to-back automatically. The calendar and bookings list show every service on the appointment instead of just the first.

The bookings calendar and all-bookings list now display in your own timezone by default, with a control to switch to a location's timezone or any timezone you choose. Booking times also show their zone (for example "EDT" or "PST"), so appointments at the same clock time in different locations are no longer indistinguishable. And for solo-operator businesses, booking one service now blocks that same time across your other bookable offerings at that location, so you can't get double-booked across multiple locations at the same time for single staff businesses.

Automatic Treasury Deposits

Merchants can now put idle balances to work automatically. A new Treasury settings page (Finances then Settings) lets you enable automatic Treasury deposits, set an operating buffer to keep on hand, and choose a target tier. Once enabled, idle balances above your buffer are swept into Treasury to earn yield on a recurring schedule. It stays off unless you turn it on, deposits respect your existing payout rules, and anything deposited remains withdrawable through the usual Send to Balance flow. Automated deposits show up in your finances activity with a clear "System" label so it's obvious when the system automation acted on your behalf versus a team member.

Enable automatic Treasury deposits from the Treasury settings pageEnable automatic Treasury deposits from the Treasury settings page

You can also now see your all-time Treasury earnings on the Finances overview and on Stored Value program pages, instead of a placeholder dash.

Add Customers Without Leaving the Page

Adding and editing customers now happens in a slide-over wizard, consistent with catalog items, bookings, and locations. You can also create a customer inline while booking or while creating an order: "Add new customer" opens the customer form over your current work and pre-selects the new customer when you save.

Minor Improvements

  • More reliable checkout notifications. Checkout webhooks still fire immediately, but are now retried automatically (up to five attempts with increasing delay) if the first attempt fails, instead of being dropped.
  • Treasury "Max" withdrawals fixed. Full-balance and dust-sweep Treasury withdrawals no longer fail with a false "insufficient balance" error, and a stale "reserved by a pending transfer" notice no longer lingers after a transfer has settled.
  • Proper 404 pages in the dashboard. Unmatched URLs under an organization now show a "Page Not Found" inside the dashboard chrome, and visiting an organization you don't have access to shows a clear "Organization Not Found" page instead of a bare error.
  • Class size is now intentional. Creating or editing a class requires you to set the number of seats per session rather than defaulting to a single seat capacity.
  • Tidier date displays. Dates now read "Jul 6, 2025" (unpadded day) and relative times read "1 hour ago" instead of "about 1 hour ago" across the platform.
  • Cleaner wizard dialogs. Removed a large empty gap above the title in the customer, booking, location, and catalog dialogs.
Read more →

Booking Management, Order Invoicing & Stored-Value Insights

Manage Bookings from Your Dashboard

Merchants can now run their entire appointment schedule from the dashboard. A new Bookings section gives you a live calendar board you can view by day, by week, or across a custom number of days, with a current-time indicator and appointments that refresh on their own. Click an open time to book, or click an appointment to view it, reschedule, or cancel, all without leaving the calendar. Next to the calendar is a filterable, sortable bookings list you can narrow by location and by date range.

Booking calendar view in the dashboardBooking calendar view in the dashboard

Creating a booking works from anywhere: the list, the calendar (pre-filled with the day you clicked), or a customer's profile. On a single screen you pick the offering and location, enter a start time and length (with a live heads-up if the time falls outside business hours or is already taken), and choose an existing customer or add new contact details inline. From a booking's detail page you can edit the customer, notes, or time, mark it completed or no-show, or cancel it, with your cancellation, no-show, and reschedule policies applied automatically. When you need to act outside a policy window, a one-off override with a recorded reason keeps things clean.

Flexible Scheduling for Services and Classes

Offerings can now be scheduled with far more control. A service or class can have different start times on different days (for example Mon and Wed at 6pm, Fri at 5pm), repeat on a custom interval, and include one-off sessions on specific dates, all on the same offering. You can also set date exceptions to close an offering for a day, restate that day's hours for a holiday, or block out a range for a vacation or closure.

Any catalog item can be made bookable as a Service (one-to-one) or a Class (a group session with a capacity you set), and each item chooses the locations it's available at. That one selection is the single source of truth for where an item is sold and where it can be booked, so a multi-location merchant can't accidentally create a booking at the wrong place. Booking times are now stored and shown in each location's real timezone across the wizard, list, calendar, and detail page, matching how orders and receipts already show appointment times.

Booking management is rolling out to select merchants. Reach out if you'd like it enabled for your account.

Create and Invoice Orders

Merchants can now create an order directly from the Orders page. A wizard captures line items and an optional customer, then generates a checkout link you can copy and send. The order stays open until it's paid or cancelled. You can edit an open order (line items, customer, due date) from the order page at any time, and the checkout link you already shared updates automatically. The order detail page shows the invoice's checkout link and whether it's been paid, so you can re-copy the link or check its status without recreating anything.

Browse and Manage Your Catalog

The dashboard now has a catalog you can browse, search, and filter. It shows your active items by default, with archived items available from the status filter. You can create and edit both physical items and services from a single-step wizard, including pricing and categories. New items are active the moment you create them, with no separate draft or publish step. This is rolling out to merchants gradually.

Stored-Value Activity Chart

The Stored Value program overview now includes a daily Activity chart showing customer top-ups, customer spend, and bonus value issued over a period you choose (7 days, 30 days, 3 months, or year to date). Toggle each series on or off to focus on the activity you care about.

Stored-Value Activity ChartStored-Value Activity Chart

Merchants can now set their Terms of Service, Privacy Policy, and Refund Policy from the new Policies tab on Settings, General. Link your own pages, or use a Decal-hosted template filled in with your business details. Your policies are then published on your Decal site for customers to read.

Accurate Timezones for Revenue Reporting

Locations now record their real timezone from the connected point of sale (e.g. Square, Lightspeed, etc) instead of defaulting to UTC, which keeps revenue reporting dated correctly. Existing Square locations are corrected automatically on the next sync. The locations list and detail pages now flag any location whose timezone couldn't be read, so you can set it yourself, and the timezone picker is now a searchable dropdown that shows each zone's current UTC offset.

Minor Improvements

  • Cleaner links in the address bar. Order, transaction, location, customer, loyalty, and stored-value pages now show short, readable IDs. Older or shared links still resolve automatically.
  • "Order Not Found" fix on Square checkout. Open orders pulled from Square are now saved as soon as they're listed, so selecting one reliably opens its order page.
  • Clearer customer labels on orders. Order details now distinguish "No customer attached" from a guest contact and from a linked customer.
  • Jump to Square from a customer. A customer's linked accounts now include an "open in Square" link to the matching record.
  • Friendlier date and time pickers across business setup, availability, and location hours, plus a fix for payment-link expiration dates showing in the wrong local time.
  • Appointment durations read naturally on the public booking site (for example "2 hrs" and "45 mins").
Read more →

Appointment Booking (Beta), Store-Credit Refunds, and Customer Management

Appointment Booking (Beta)

Customers can now book and pay for a merchant's services directly on the merchant's Decal site. They browse the bookable services, open one to see available times for a day in the merchant's timezone, and pick a slot. The chosen day stays in the page URL, so reloading or sharing a link keeps the selected date. Picking a time takes the customer straight to the order page, where the appointment summary, the payment options (card, stablecoin, or stored balance), and any required contact details all appear together. Signed-in customers pay right away without re-entering their details; guests are asked for an email inline only when they go to pay. On payment, the appointment is added to the merchant's connected calendar and the confirmation appears in place, with no separate review screen.

Nothing is created in the merchant's point of sale while a customer browses or changes times. The order is held on Decal until payment, so abandoned or re-timed selections leave nothing behind.

Appointment booking is in beta for select merchants while we put it through production use. If you'd like early access for your services, reach out and we'll enable it for your account.

Refund Orders to Store Credit

Merchants can now refund a paid order right from the order page. The new Refund order action opens a dialog to pick a method and amount (full or partial); today the available method is store credit through the merchant's stored-value program, shown by name. For a card order that was settled through Square, refunding as store credit returns the value without card fees and credits the customer's balance instead.

A few things this handles cleanly:

  • Partial refunds add up correctly. An order that was already partially refunded can be refunded again up to its full paid amount, and is marked fully refunded once the refunds reach that total.
  • Mixed orders are handled. When an order includes both a regular item and a balance top-up, only the purchased portion is refundable (the top-up was already received as balance), and the dialog shows the excluded amount.
  • Appointment orders are refundable too. Bookings that settle through Square can now refund as store credit just like a point-of-sale order.

Issue Store Credit Directly

Merchants can now grant store credit to a program member straight from the dashboard, for comps, promotions, or goodwill, without the customer making a payment. The credit appears in the member's balance immediately and is recorded as a grant rather than revenue, so lifetime revenue volume stays accurate.

A Customer Hub

The dashboard customer pages got a lot more useful:

  • Add and edit customers from the Customers page, with duplicate-email and duplicate-phone protection. New and edited customers sync to connected platforms like Square within seconds.
  • Orders and Transactions tabs on each customer page, both filterable and sortable.
  • A Linked Accounts card showing the customer's accounts on connected platforms, with the external customer id and reference id, each copyable, plus when each account last synced.
  • The Orders table now links to the customer and shows the linked customer's name rather than a stale order snapshot.

Every order now has a short, stable link at /orders/{id} on the merchant's site. Old checkout links and QR codes resolve to it automatically, and typed or Square order ids redirect to the same canonical URL.

Minor Improvements

  • Stablecoins turn on automatically for new merchants. Newly provisioned merchants have stablecoin payments enabled in both test and live mode, so the method is selectable at checkout immediately. It can still be disabled from the dashboard.
  • Clearer payment errors. Payment failures now show a specific reason when one is available (for example, "Your balance is $0.02 short of the $0.02 required"), and the generic message is friendlier and no longer mentions a point of sale.
  • Richer order details for appointments. Appointment line items now show the booked date, time, and duration, and the payment summary shows which method paid the order.
  • Balance link appears only when ready. The "Balance" link on a merchant site now shows only once an active stored-value program exists, so it no longer leads to an unavailable page.
  • Fewer unexpected sign-outs. Brief network hiccups during a session check no longer sign you out; the app retries automatically and stays signed in.
  • Receipt and layout fixes. Long item names no longer break order tables, appointment durations read naturally ("1 hour 30 mins"), and dashboard pages have more breathing room on mobile.
Read more →

Stored Value Insights, Customer Sync & Faster Dashboard Tables

Clearer Stored Value Revenue

Stored Value program reporting now separates what customers actually paid from what you gave away. The program overview breaks out All time bonus value issued alongside Total value issued since inception and All time customer spend, so bonuses are no longer counted toward revenue you earned. The members table gains a Granted column, and each customer's page shows a relevant card, making it clear at a glance how much free balance each member has received.

Stored Value program metrics in the Decal DashboardStored Value program metrics in the Decal Dashboard

Two-Way Customer Sync

Building on last week's near-real-time point-of-sale sync, your customer records now stay in step across Decal and your connected point of sale, in both directions.

  • Edits flow both ways. When you update a customer in Decal, the change pushes to your connected systems within seconds. When a customer is added or edited in Square, it reflects on Decal just as quickly.
  • Birthdays sync. Customer birthdays now sync between Decal and Square in both directions, including month-and-day-only birthdays (common in Square).
  • More than one system? A customer connected to multiple systems now resolves to a single Decal profile instead of being overwritten.
  • Sync without waiting. "Sync customers now" from your Square integration settings now runs in the background, so importing a large customer base no longer times out, and you can navigate away while it runs.

Membership ID QR Codes

A customer's Membership ID QR now carries the value your point of sale can resolve against your loyalty program. If you already use a membership ID scheme, Decal reads in your existing ID and preserves it, so it's never overwritten. If you don't, Decal assigns one so QR scans work immediately at the register.

Searchable, Paginated Dashboard Tables

Your Transactions, Orders, Customers, Loyalty Members, Stored Value Members, Finance Activity, and Webhooks pages now page through your full history rather than just the most recent records, with filtering, sorting, and search across your entire history, not just the page you're looking at. Your current view (filters, sort, search, page) is captured in the URL, so it survives a reload and can be shared with a teammate. Search now also treats characters like % and _ as literal text instead of wildcards.

Smoother Sign-In on Your Website

Signing in on your customer-facing website is smoother and more reliable. The verification screen now keeps a loading spinner up until the sign-in page is ready instead of flashing a blank panel, and the Cancel button eases in a moment after the step starts rather than appearing instantly, while still giving customers a way out if the page is slow to load.

These improvements carry through to Stored Value sheets (top-up, balance, and checkout add-ons), where already-signed-in members are no longer asked to re-verify, and the account setup screen no longer hangs on a "Setting up your account…" spinner.

Minor Improvements

  • Orders link to the right customer. Orders completed by a signed-in customer, whether on Decal or paid at a connected Square register, are now reliably attributed to that customer.
  • Bonus callouts match your brand. The top-up bonus message now uses your storefront's brand color instead of a fixed green.
  • Cleaner reconnect prompts. When an integration needs reattention, its settings are disabled with a clear Reconnect notice so you can't kick off a sync against a connection that needs reconnecting.
  • More reliable Square sync. A fix to how inbound Square updates are verified restores point-of-sale order and customer sync that could previously stall.
Read more →

More Ways to Get Paid: Cards, Wallets & Docs

Card Payments Are Now Available to Every Merchant

Following last week's card payments work, card payments are now available to every merchant to set up from the payment methods settings page, no longer limited to a small group. The setup flow adapts to where your organization is:

  • Not set up yet? Instead of a dead, disabled button, you'll see a Request card payments dialog. Submitting it lets the Decal team provision your card payment provider and follow up with you.
  • Already provisioned? Enable card payments yourself in one click.
  • Provider still being set up? Enabling is blocked with a clear message rather than quietly turning on a method that would fail your customers at checkout.

To be clear: card payments aren't switched on automatically. Every merchant can now start the setup themselves.

More Wallet Options at Checkout

Customers now have more ways to pay with crypto. MetaMask is available in the wallet connect sheet, and Jupiter is available on mobile, so customers can complete a payment straight from the wallet they already use. New to paying this way? Our guide to crypto and blockchain breaks down the basics.

When a wallet app isn't installed, checkout now detects it and falls back gracefully with a copy-link option instead of getting stuck.

Complete Business Verification In-Dashboard

Merchants can now complete business verification from a dedicated Business section in the dashboard: fill in your business profile, add beneficial owners, upload compliance documents, and submit for review, with a guided step-by-step setup and a clear overview of what's done. The flow tailors itself to your country of incorporation, so you only see the entity types and tax-ID options that actually apply.

This is rolling out in beta for select merchants today. General availability is expected to follow shortly.

Decal Docs Are Now Public

Our documentation site at docs.usedecal.com is open to everyone, with no more access request or email code to get in. Browse guides, concepts, and the full API reference directly.

Faster Point-of-Sale Sync

Sales, customers, and locations from your connected point of sale now sync to Decal in near-real time instead of waiting for a periodic refresh:

  • When you create or update an order on your Square device, it reflects on the matching Decal order within seconds. Customer adds, edits, and removals, and changes to your locations, sync in seconds too.
  • If a customer opens a Decal checkout link but pays at the register instead, the order is reconciled automatically so it isn't left looking unpaid.

This is enabled for a controlled set of merchants while we verify it in production. We're also expanding our Lightspeed Retail integration in beta: connected merchants can sync their outlets as locations and let customers pay open Lightspeed sales with stablecoins through the Decal checkout. And stale, abandoned orders can now be auto-cancelled across both Square and Lightspeed locations so they don't pile up.

Clearer Checkout Messages

When something goes wrong at checkout, customers now see a clear, friendly message instead of a generic server-error page. A temporarily-unavailable point-of-sale connection shows a "Connection Problem" notice, and specific situations, an order that's no longer open or a payment method that's unavailable, each explain what to do next and never expose raw technical details.

Minor Improvements

  • Sign-in is snappier. The email form renders instantly with no flash on load, the verification code field auto-focuses when it appears (even when you switch back to the tab), and the theme toggle no longer flickers.
  • Newly launched merchant sites look right immediately. A brand-new site now goes live with sensible default branding and your organization's name the moment your website is activated, instead of showing a generic "Welcome to Decal" page.
  • Stored Value opens reliably. Merchants with the Stored Value add-on can now open an existing program from the dashboard without hitting a incorrect "not found" error.
  • Cleaner cooldown cards. Removed a redundant status row from in-progress withdrawal claims.
  • Fresh from the blog. Decal was featured by Para (read the press post), and blog posts now sort correctly by date.
Read more →

Treasury Goes GA, Plus Reliable Payouts & Checkout Status

Treasury Is Now Live for Every Merchant

Treasury is out of early access. Every merchant can now earn yield on idle balances directly from the Finances dashboard. The Treasury balance card, Send to Treasury / Send to Balance actions, and the cooldown list are no longer gated to a small set of organizations.

Click the Earn rewards button in the Balance card to see the current rewards rate and immediately deposit your idle balance.

Live Operation Tracking Across the Dashboard

Every Treasury deposit and withdrawal (and wallet payouts) now reports its progress in real time, so you're never left wondering whether a submission is still working:

  • A persistent background-work indicator sits in the bottom-right corner and shows in-flight deposits and withdrawals at a glance. Click it to see what's running and jump straight into any transfer's details. It fades out gently after a transfer finishes, with a green check on success and a red X on failure, with no more identical-looking end states.
  • Completion alerts follow you across the app. After you submit a deposit or withdrawal, a toast fires when it completes or fails no matter which page you're on. Watched transfers persist across page reloads, so slow ones are never lost.
  • Balance, Treasury, and Cooldown cards update instantly the moment a transfer is confirmed, with no multi-second wait while the dashboard re-fetches. Confirmations also land 1 to 3 seconds sooner than before.
  • Cooldowns read as scheduled, not stuck. A withdrawal in its cooldown window now shows a clock and a relative countdown ("Available in ~23h") instead of a perpetual spinner, and a transfer that's genuinely taking too long turns amber with a Check status link.

See Your Real Available Balance Before You Send

The Send to Treasury and Send to Balance dialogs now show your available balance, your total minus anything already committed to a pending transfer, so the Max button reflects what you can actually spend right now. When funds are reserved by an in-flight transfer, a clear notice tells you how much is held and what's left, and the Balance and Treasury cards show an "X of Y available" line. Attempts to send the same dollars twice are now blocked outright instead of silently accepted.

More Reliable Payouts

Payouts got a reliability and UX pass:

  • The New Payout dialog is now always available, including bank and card payouts, which don't require a settlement wallet. The prompt to add a settlement wallet now appears only inside the stablecoin payout step, and only when you don't already have one.
  • A payout request no longer fails when your available funds need to be consolidated first. The system handles the conversion behind the scenes so the payout goes through.
  • Payouts now show reserved funds and block submission when your available balance is zero, matching the Send to Treasury and Send to Balance dialogs, and a duplicate-submission guard prevents the same payout from being sent twice.

Clearer Checkout Session Status

Checkout sessions now expose a typed status (pending, processing, completed, failed, expired, completed_externally) on API responses and checkout.session.* webhook payloads, a precise replacement for the older active boolean (which is preserved but now deprecated). Sessions are reliably marked completed after a payment, and a stale browser tab can no longer re-submit against a finished session.

Stale sessions are also automatically marked expired once their window passes, and merchants subscribed to checkout.session.expired receive a webhook within five minutes. Previously, an abandoned session sat at pending indefinitely. The published checkout and webhook docs have been corrected to match the real response shape end-to-end.

Account Settings & a Personalized Home

Custom websites & apps got several updates!

Account settings now has a proper sidebar (desktop) / picker (mobile) layout, and the Profile page is a stack of per-section cards (Email, name, date of birth, postal code), each with its own Save button, so editing one field no longer overwrites the others.

The merchant home page now adapts to who's viewing it: guests see a branded login form, signed-in customers with a stored value account see their balance and top-up options, and customers who haven't joined yet see an onboarding prompt.

Minor Improvements

  • Confirm before disabling an add-on. Disabling an add-on now opens a confirmation dialog that spells out exactly what changes (e.g. Loyalty programs will be hidden; gift cards stay redeemable when re-enabled).
  • Faster Treasury & Payouts pages. Yield rates now load from a short-lived cache, trimming page load time.
  • Consistent metric cards. Dashboard metric cards now share the same footer treatment, so sibling cards on a page no longer look mismatched.
Read more →

Treasury Deposit Overhaul, Member ID QR Codes & Card Autofill Fixes

Treasury Deposit Overhaul

Sending funds to Treasury now feels like a single guided action instead of a black-box request. The Send to Treasury dialog shows a progress view while the deposit executes, with a clear Done button on success and an inline Retry button if anything fails. A new toast confirms the final amount and discloses any drift if the deposited amount differs from the requested one by $0.50 or more.

When a deposit takes longer than expected or the browser temporarily loses connection, the dialog now shows a "still working" state with a link to the activity feed. Merchants can close the dialog and check back later while the deposit continues in the background. Plans that hang for more than 10 minutes are automatically marked as failed by a periodic sweep, so a stuck dialog can't trap a deposit indefinitely.

Under the hood, transient errors from the yield provider and brief network hiccups now auto-retry up to three attempts before failing the merchant. Most short-lived blips are now invisible.

The amount input is also smarter:

  • Available to deposit is now the system's routable cash, what can actually reach the provider once conversions are applied, with an info popover explaining when small amounts in certain currencies aren't yet convertible.
  • The dialog enforces the provider's minimum (currently $1) with a clear Alert explaining what to add when balance is below threshold.
  • Sub-cent precision drift no longer rejects valid $1.00 deposits or renders $0.99 anywhere in the app. USD amounts now truncate consistently instead of rounding up.
  • When a typed amount would strand a sub-$1 sliver, the dialog upsizes the deposit and explains with a clear message similar to "We'll deposit $1.40. Your remaining $0.39 balance can't be deposited later." The submit button shows the actual amount that will be sent.

Yield Tiers: Basic and Pro

The two yield tiers are now named Basic and Pro across the dashboard, replacing the previous mismatched Protected/Boosted labels. The new names are clearer for merchants weighing the tradeoff between immediate access and higher-rate cooldown access.

Behavior is unchanged. Basic still settles immediately, Pro still has a cooldown window. Only the labels changed consistently across the platform.

Member ID QR on Custom Websites

Custom merchant websites now have a burger menu in the header with quick links to Account, Balance, and a Show Member ID action. Tapping it opens a bottom sheet with a scannable QR code so a customer can identify themselves at the counter, no app required.

The QR encodes the merchant's custom external ID when one is set; otherwise it falls back to the customer's Decal member ID. Both values appear as plain text below the QR for staff who'd rather read than scan.

Card Checkout Upgrades

The card payment form was upgraded and fixes several stubborn issues:

  • Autofill works. Cards saved in the browser or password manager now populate cleanly without rendering glitches or browser crashes.
  • Theme matches the merchant's palette. The card input inherits the merchant's primary, background, input, and text colors from the active theme, including custom palettes.
  • Retry after a failed payment works. Clicking Try Again after a card rejection no longer fails immediately with a "transaction is no longer valid" error; the form now re-initializes a fresh card session on retry.

Card payments are also now supported in the pay app's session checkout (pay.usedecal.com/s/…), matching the existing custom-website card flow.

Critical: Percentage Discount Fix

A bug in percentage discount computation was causing the full item subtotal to be applied as the discount amount instead of the correct percentage. For example, a 10% discount on a $13.00 order was applying $13.00 off instead of $1.30. This has been fixed!

Percentage discount amounts also used to go stale when an order's items changed without the discount being replaced, for example when items were updated via the API or when a top-up line item was added or removed. The recompute now lives inside the order totals path, so every caller gets up-to-date discount amounts against the current item subtotal.

Faster Top-Ups

A few rough edges on the balance top-up flow are smoothed out:

  • The on-page balance now updates immediately after a successful card top-up. The count-up animation runs against the new balance instead of remaining stale until a polling round-trip.
  • Hard-refreshing the balance page right after a top-up now shows the new balance immediately instead of taking up to a minute.
  • The success ("Done!") step of the top-up sheet no longer shows a back button. Users can only close from the success screen.
  • Customer sign-in feels snappier: the "Verifying your account" indicator appears immediately once the email verification code is accepted, instead of waiting for a verification poll.

Custom Website Balance Page

The Balance link in the burger menu and header, and access to /balance, now follows the merchant's stored value toggle in the dashboard. Toggling stored value on or off invalidates the public site's cache and updates nav visibility within seconds.

The link is also now visible to signed-out visitors when stored value is enabled, so they can land on the page and sign in to load funds.

Minor Improvements

  • Login returns you where you came from. After signing in, you're taken back to the page you originally tried to access instead of the dashboard home.
  • Admin-enabled add-ons appear enabled. Add-ons enabled by Decal support for your org now consistently show as enabled across the dashboard instead of an "early access" prompt.
  • Friendlier add-on pages. Add-on pages show a friendly prompt when the feature isn't provisioned yet, instead of a generic 404.
  • Branded error pages in the pay app. Custom error and 404 pages now match the rest of the platform.
  • Mobile sheet/dialog polish. A 1px right border / backdrop bleed on mobile overlays is fixed.
  • Tables no longer flash raw headers. Tables across Finances, Loyalty, Transactions, Orders, Customers, Wallets, and Settlement Wallets no longer flash raw column headers during initial page load.
Read more →

Webhook Visibility, Location Management & Friendlier Errors

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, with 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.
Read more →

Decal Treasury, Finances Overview & the Add-ons Hub

Decal Treasury

The Finances overview is now live. At a glance it shows your idle Balance available to allocate, funds currently in Decal Treasury with a per-tier yield breakdown, and funds available to transfer back to Balance. When funds are sitting idle, the Balance card surfaces a quick action to allocate them to your Treasury account directly, no separate flow required. Tap the yield badge to expand the full tier-by-tier breakdown.

Transferring funds from Treasury to Balance is done from the Payouts page. Timing depends on your tier:

  • Basic-tier funds transfer to Balance instantly.
  • Pro-tier funds enter a ~24-hour unlock window. A live Cash Unlocking callout will display on the Payouts page with a countdown timer and a batch-claim button once the window closes.

The Balance card shows only the portion of your funds that can be allocated to Treasury today, with a secondary line for your "additional balances." Support for those is coming soon for Treasury yield.

Yield is generated through managed treasury strategies and is not guaranteed. Decal is a payments platform, not a bank.

Products & Add-ons

A new Products & Add-ons page gives merchants a single place to discover and enable optional features. Each add-on card shows whether the feature is generally available, in early access, or coming soon. One click enables or disables it.

The dashboard sidebar and pages update automatically: enabling an add-on unlocks its section in the nav; disabling one hides it cleanly without affecting your data.

Website Pages

The website area now includes a Pages view that lists every page your customer website responds to. Alongside the built-in pages (/, /login), any add-on you enable surfaces its pages here. For example, Stored Value adds /balance and /topup. Each row shows the path, title, live status, and a View live link to the page on your primary domain.

Minor Improvements

  • Branding saves no longer auto-publish your custom site. Saving your logo, theme color, or display name no longer accidentally brings a draft site online. Publishing remains an explicit action under Website → Settings.
  • Friendlier domain conflict errors. If a domain is already in use by another organization, the dialog now says so with a clear message instead of a generic failure.
  • Canonical URLs across custom website pages. All public merchant site pages now set correct canonical URLs and page titles for consistent SEO.
Read more →

Invite Your Team, Checkout API Upgrades & Payouts GA

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, with 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. paymentDestination set 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.
Read more →

Checkout Sessions API, Manually Adding Wallets & More

Developer API: Checkout Sessions and Orders

The Checkout Sessions API and Orders API are now available to merchants in closed-beta.

Checkout Sessions let you create a hosted payment page with a single API call. Pass your order details, get back a URL, and redirect your customer. Decal handles the checkout UI, payment collection, and order tracking.

curl -X POST https://api.usedecal.com/v0/checkout/sessions \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{ "name": "Cold Brew", "quantity": 1, "unitPrice": 550 }],
    "successUrl": "https://yoursite.com/confirmed?session={SESSION_ID}"
  }'

The response includes a url to redirect your customer to and the full order object so you have the order ID handy for confirmation.

Orders can also be managed independently: create, retrieve, update, or cancel orders directly without going through a checkout session. Useful for POS integrations or anywhere you're managing order state server-side.

Both APIs:

  • Support taxes and discounts (fixed and percentage)
  • Accept a customer object that will find-or-create a customer record, with externalId support for mapping to your own customer IDs
  • Use test/live mode automatically based on your API key (sk_test_ vs sk_live_)

Webhooks

Checkout sessions now fire a checkout.session.completed webhook to your callbackUrl after a successful payment, before the customer is redirected to your successUrl. This means your server knows about the payment before the customer lands on your confirmation page, eliminating the need to poll for payment status.

Both successUrl and callbackUrl support a {SESSION_ID} placeholder template that gets replaced with the actual session ID at creation time, so you don't need to store the mapping yourself:

{
  "callbackUrl": "https://yoursite.com/webhooks/decal?session={SESSION_ID}"
}

Manual Settlement Wallets

You can now add a settlement wallet by pasting a Solana address directly, without connecting a browser extension. This enables wallet types that can't go through the standard signature flow:

  • Multisig wallets (Squads): add a program-owned address directly
  • Cold storage (Ledger, Keystone, etc): no need to plug in
  • Any externally managed address

Manually added wallets are tagged with a Manual badge in your wallet list, and adding one requires a confirmation checkbox since funds sent to a wrong address can't be recovered.

Manually add a Settlement WalletManually add a Settlement Wallet

Payment Destination Override

When creating an order or checkout session via the API, you can now specify exactly which settlement wallet receives the funds, overriding the default wallet resolution for that transaction:

{
  "items": [{ "name": "Catering Package", "quantity": 1, "unitPrice": 25000 }],
  "paymentDestination": "sw_live_abc1234567890"
}

Accepts either a typed wallet ID (sw_live_...) or a raw Solana address from your verified wallets.

Stored Value Improvements

A few quality of life improvements for Stored Value programs:

  • No settlement wallet required to activate. The activation checklist is now two steps (balance name + launch). The settlement wallet step was a leftover requirement that didn't actually affect how stored value payments route, so it's gone.
  • Default bonus values. New programs now come pre-filled with bonus configurations ($5 bonus on $25+ first load, $5 bonus on $50+ recurring loads) so you're not starting from a blank slate.
  • Better bonus display. When a top-up added to a checkout qualifies for a bonus, the bonus details appear inline before the customer pays. The balance page now shows the correct bonus type automatically (signup vs topup) without being anchored to a preset amount.
  • Smarter low-balance messaging. First-time customers no longer see a misleading "Low balance" warning. Instead they see a first-topup incentive. Returning customers with a low balance continue to see the existing reload nudge.

Embedded Authentication

Customer authentication now uses inline embedded flows instead of pop-up windows. New users enter their OTP code directly in the app, and returning users authenticate via an embedded iframe. Popups are only used as a fallback for passkey (WebAuthn) auth, with automatic popup blocker detection and Safari-specific recovery instructions.

Minor

  • Stablecoin payment setup streamlined. Enabling a stablecoin payment method is now a single click. The prior flow opened a wallet selection dialog linked to the payment method; that's gone. Payment routing now resolves via orchestration wallets at payment time.
  • Better card payment errors. User-actionable payment errors (invalid zip, declined card) are now shown directly to customers instead of a generic failure message.
Read more →

Finances Dashboard & Stored Value Bonuses

Finances Dashboard

The merchant dashboard now has a dedicated Finances section, consolidating everything related to your money in one place. The new section includes:

  • Payouts: Initiate stablecoin transfers from your Decal-managed wallet to your settlement wallet, with real-time balance visibility.
  • Pay-ins: Coming soon.
  • Accounts: Manage your settlement wallets. Bank accounts coming soon.

Settlement wallet management and payouts have moved out of Settings into this new section. Existing bookmarks and links redirect automatically.

Stored Value Bonuses

Merchants can now configure sign-up bonuses and top-up bonuses for their Stored Value program. Both support fixed-amount or percentage-based bonus credits with tiered spend thresholds, for example, "Load $50, get $5 free" or "Load $100, get 15% bonus."

Sign-up bonuses are claimable once per customer. For top-ups, only one bonus tier applies per transaction. Configure both from the Top-Ups tab in your Stored Value program settings.

Non-members and unauthenticated customers now see a signup bonus teaser when viewing a merchant's balance page or the balance top-up addon at checkout. The teaser shows the lowest-threshold bonus tier (e.g. "New member bonus, top up $25 or more to get +$5 free"), giving customers an incentive to join before they reach the amount selection step.

Custom Onboarding Messaging

Stored Value programs now support customizable onboarding content that customers see when signing up. In the dashboard under General > Customer Messaging, merchants can set:

  • A headline shown on the balance page and sign-up sheet (defaults to "Join the {program name} program").
  • A subheadline for a short marketing statement.
  • Up to 6 benefit bullet points highlighting why customers should join.

This gives merchants full control over the first impression their Stored Value program makes.

The Stored Value settings page now also includes a branded phone mock preview, showing a live preview of the customer-facing onboarding screen in merchant brand colors as they edit.

Minor Improvements

  • Organization avatars now display as rounded squares instead of circles, making them visually distinct from user and team member avatars throughout the dashboard.
  • Checkout pages load faster thanks to cached merchant location data, reducing unnecessary database round-trips on repeat visits.
Read more →

Checkout Top-Ups & Stored Value Configuration

Checkout Top-Ups for New Customers

Customers who aren't signed in or enrolled in a merchant's Stored Value program can now tap the balance top-up addon at checkout to sign up and add a top-up in a single inline flow, no navigation away from the order required.

When a customer opens the Stored Value payment sheet with zero or insufficient balance, they now see a contextual top-up amount grid instead of a disabled button. After signing in or completing onboarding, they're correctly registered as a merchant customer and can proceed immediately.

Stored Value Top-Up Configuration

Merchants can now configure custom top-up preset amounts and a low-balance reload reminder for their Stored Value programs. Settings are available in the dashboard under the new Top-Ups tab. The checkout page and balance page respect these settings; programs without custom configuration continue to use platform defaults.

Merchant Branding Fixes

Several branding color issues have been resolved:

  • Merchants using "single" color mode now correctly see their configured scheme regardless of the visitor's OS dark mode preference. Previously, the platform's default dark palette bled through for unconfigured color variables.
  • The branding system now derives and emits all CSS variables used by UI components, eliminating color mismatches caused by variables falling back to dark-mode defaults.
  • The branding editor's phone mock preview now reflects custom colors in real time.
  • Advanced color overrides (primary button text, secondary button text, card background, card text, muted text, input background) are now editable under an "Advanced Colors" toggle.

Minor Improvements

  • Guest customers and unenrolled customers are now protected from inadvertently purchasing balance top-ups at checkout. If a guest attempts to pay an order containing a top-up line item, the item is automatically removed and the customer is shown an updated order.
  • Added checkout auth token for the crypto wallet deep-link wallet flow, preserving top-up items when customers open external wallet apps like Phantom or Solflare.
Read more →

Order Management & Square Integration Settings

Order Management

The merchant dashboard now includes full order management pages. The order listing page supports pagination and filtering by status, payment status, and search by order ID or customer name. Each order detail page shows line items, a financial breakdown, customer info, and timestamps.

Merchants can void open, unpaid orders directly from the dashboard. Cancellation propagates to external POS systems like Square automatically. A stale order detection system alerts merchants when Square locations have lingering open orders, with a bulk void option to clean them up.

Square Integration Settings

The Square integration page now includes a settings panel with toggles for:

  • Location sync. A weekly cron job syncs Square locations, creating new ones, updating metadata, preserving merchant-customized names, and deactivating removed locations. A "Sync now" button is available for on-demand syncing.
  • Customer sync. A daily two-way sync between Decal and Square. Inbound creates or updates Decal customers from Square; outbound pushes new Decal customers to Square. Conflicts resolve via most-recent-update-wins with email-based matching for initial linking.
  • Stale order auto-cancellation. Automatically cancels stale Square orders when enabled. Orders are upserted into Decal first for visibility, then cancelled on Square.

Card Billing Address Configuration

Merchants can now be configured to require either full billing address (address, city, state, zip, country) or minimal card details only for card payments. The checkout form conditionally renders address fields based on the merchant's configuration. Existing merchants default to full address.

Minor Improvements

  • Fixed a critical mode consistency bug where toggling between test and live mode kept the original customer record, allowing a live customer to join a test Stored Value program. Mode toggle now re-resolves the customer in the target mode, with defense-in-depth validation at the database level.
  • Square payments now include the Decal transaction ID as a reference for merchant cross-referencing, with deterministic idempotency keys for retry safety.
  • Fixed card checkout failing with "Order not found" on Square locations due to typed IDs being passed directly to the Square API.
  • Card payment error messages no longer leak internal configuration details. Unknown errors now return a generic fallback message.
  • Fixed tax double-counting when adding a balance top-up to Square orders with additive taxes.
  • Cancelled orders no longer incorrectly trigger the "order details changed" dialog.
  • Empty orders now show a clear "Order Empty" status instead of a broken $0.00 receipt.
  • All open payment sheets close automatically when an order is completed or cancelled via polling.
Read more →

API Keys, Stale Order Protection & Stored Value Management

API Keys

Merchants now have a secure API key system for programmatic access. All keys scoped to your organization.

From the new API Keys settings page, you can create secret keys with an optional name, view existing keys with masked hints and a reveal toggle, see who created each key, and revoke active keys. Keys use the sk_ prefix and include your platform mode (test/live) for safety.

Stale Order Protection

Customers are now protected from paying stale order amounts. The checkout page polls for order changes every second and shows a full-screen dialog when a merchant modifies an order in Square while checkout is open. The dialog highlights exactly what changed: items added or removed and the new total. A server-side fingerprint check also blocks payment if the order data has changed since the customer last reviewed it.

Payment Method Management

Payment method detail pages are now generic and data-driven. Feature flags, setup actions, and settlement wallet management are driven by a single PaymentMethodDefinition config, eliminating method-specific branching. New payment methods work automatically once added to the definitions.

Each detail page now shows the current settlement wallet with a quick action to change it, or fall back to the organization default.

Stored Value Management

Stored Value management has been consolidated into a dedicated dashboard section. The setup wizard, activation checklist, and program editing now live under the Stored Value pages instead of being split across payment method settings.

Minor Improvements

  • OTP verification form now disables on success with a polished animation and redirect message.
Read more →

Card Payments, Integration Health & Improved Authentication

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.
Read more →