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

Treasury deposit reliability and UX get a major sweep, customers can now show a member-ID QR at the counter, card checkout gets autofill and retry fixes, and a percentage-discount bug is fixed.
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 & 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.