The problem
TryStuffs sells products in a category where customers want to hold the thing before they keep it. Mainline checkout flows assume the sale is final at swipe; this one needed a window where the customer could try and then either keep the order or send it back without the platform pretending nothing had happened.
Off-the-shelf “buy now, pay later” plugins came close on the money side and missed entirely on the inventory side. The shop needed both halves to stay in sync — money held, stock reserved, the shipping label tied to a reversible ticket.
What we built
An Astro storefront for the public-facing pages and a small React island that owns the cart and the try-window state. Stripe holds the auth, releases the charge when the try-window closes, and refunds the held amount when the customer ships back. Inventory is decremented at order time and restored at receipt of return — no accounting orphans.
The pages are static where they can be (catalog, product detail, about) and server-rendered where they must be (cart, account, order timeline). That’s the right shape for a small catalog with frequent visits and infrequent updates: most pages cache forever, the few that matter stay live.
The admin is intentionally small. The owner needs to see the orders that are still in their try-window, the orders that have closed, and the returns that need a label. Everything else is reporting that the owner can pull out of Stripe.
How we shipped it
Eight-week build, paired closely with the owner on the try-window mechanics. We ran the same order through Stripe’s test mode end-to-end every Friday — happy path, return path, expired-auth path — until all three paths were boring.
We picked Astro because the public catalog is mostly static and we wanted Lighthouse 100 without fighting the framework for it. We picked React for the cart because the cart is the one place the page can’t be static.
Outcome
TryStuffs ships orders, holds money, and reverses both cleanly when a customer returns. The owner runs the shop from one admin and pays Stripe per transaction — no monthly platform fee.
[OWNER TO CONFIRM — sentence on traction or retention: orders processed since launch, average try-window outcome, customer feedback themes.]