Solution overview
A simple subscription shop. Customers build a box of anything sold on subscription, choose how often each item arrives, see exactly what they'll be charged and when, and check out on Stripe's secure page.
The customer journey
- Build a boxPick coffees, a cadence for each (e.g., Rosemont Crest every week, a single origin every 4 weeks), and 1–4 bags of each.
- See the scheduleBefore paying, the box shows today's total and each upcoming charge date, with what's included on each date.
- Check out with StripeStripe's hosted checkout collects the email, shipping address and card. The card number never touches our site.
- ConfirmationToday's charge is taken, a receipt is emailed, and the confirmation page shows the real schedule from Stripe.
- Self-serviceCustomers sign in to Stripe's customer portal with an emailed link to update their card or address, view invoices, or cancel.
What it's built on
Stripe is the single source of truth
Products, prices, customers, addresses, cards, subscriptions, invoices and receipts all live in Stripe. The app has no database of its own.
Catalog managed in Stripe
Any active product with a recurring price appears on the site automatically. There's no second catalog to keep in sync.
Stripe-hosted screens
Checkout and the customer portal are built and maintained by Stripe, including card security (PCI), 3-D Secure, Apple Pay and receipts.
Very little to maintain
One small app (a web page plus a few server functions) hosted on Vercel. No plugins, no server, no database.
The catalog: mirrored from today's site
The test catalog matches oakcliffcoffee.com/subscribe. It was imported automatically, and the same import will set up the live catalog.
Blends
Rosemont Crest, Hidden City Espresso, Victor Prosper's Dark Roast, O.C. Decaf. $25 per bag.
Single Origins
Full Roaster's Choice, Sweet Choice, Tangy Choice. $30 per bag.
Every coffee comes in 12oz bags, 1 to 4 per delivery, every 1, 2 or 4 weeks, exactly as today. Bags are a flat price each, plus a flat delivery fee (see Delivery fee below).
Cadences: why everything is in weeks
Stripe can combine items with different cadences into one subscription, as long as each cadence is a multiple of the shortest one in the box. Stripe never combines weekly with monthly. Today's cadences all fit this rule:
So every box becomes a single subscription with one charge on each billing day, even a box that mixes cadences. That's something the current site can't do. If longer cadences are added later, 8, 12 and 24 weeks also work. The only combination that splits into two subscriptions is 8 weeks with 12 weeks and nothing more frequent. "Every 4 weeks" means 13 deliveries a year, not 12. Worth labeling clearly.
Delivery fee
Delivery is a flat $9, and it's charged once per delivery schedule, not once per item and not once per interval.
Shorter and longer schedules ship together
An every-2-weeks or every-4-weeks item can travel in the same package as a weekly item, so it doesn't need a delivery of its own. When a box has a 1-week item and a 2-week item, the customer pays one $9 delivery fee (billed weekly). The 2-week item simply rides along with every other weekly delivery.
Weekly + every 2 weeks
One delivery fee: $9 per week. The 2-week item ships with every second weekly delivery.
Weekly + every 2 + every 4 weeks
Still one delivery fee: $9 per week. Everything lines up with the weekly delivery.
Every 2 weeks + every 4 weeks
One delivery fee: $9 every 2 weeks.
More bags on one schedule
No change. Three bags every week is still one $9 delivery fee.
The fee follows the same rule Stripe uses to combine items into one subscription: a schedule joins another when it's a multiple of the shorter one. In the shop, the box shows "Included with weekly delivery" on the longer schedule, so there's no surprise on the total.
Remaining to-do items
Must = needed before go-live. Should = strongly recommended. Later = nice to have.
- MustDecide how the team sees what to shipThere are no "orders" as in WooCommerce. Each paid charge in Stripe (an invoice) lists the items and shipping address. Options: filter and export paid invoices from the Stripe Dashboard, add a simple password-protected daily packing list or CSV export to this app, or connect a shipping tool.
- MustShipping chargesNo shipping fee is charged today. Either build shipping into product prices or add a recurring shipping line to each subscription.
- MustSales tax approachNo tax is calculated today. Confirm with your accountant (in Texas, coffee beans and candy can be taxed differently). Stripe Tax can be switched on if needed.
- MustMove existing WooCommerce subscribersCurrent subscribers' cards are already stored in Stripe through the WooCommerce Stripe plugin. The plan: recreate each active subscription in Stripe so it starts on its next renewal date, check them, then cancel the WooCommerce versions, so nobody is charged twice or missed.
- MustGo live in StripeRecreate products and prices in live mode, add the live API key, set up the customer portal and its login link, add branding (logo and colors), and turn on customer emails (receipts, failed payments, upcoming renewals).
- MustPayment notification webhookA backup notification from Stripe, so subscriptions are still created if a customer closes their browser right after paying. Takes about 5 minutes to set up.
- MustCustom domain and removing this pageFor example, subscribe.<your domain>, linked from the main website. This overview page and its "?" link get removed.
- ShouldChanging items or cadenceStripe's portal handles cards, addresses, invoices and cancellation, but it can't edit a box with several items. For now, the team makes changes in the Stripe Dashboard, or the customer cancels and builds a new box. A self-service "edit my box" feature can be added later.
- ShouldTerms and cancellation policyLink terms and privacy pages from checkout, and state the cancellation and refund policy.
- MustGift subscriptionsToday's site sells a Roaster's Choice gift subscription for 3 months, 6 months or 1 year. Any subscription can now be marked "This is a gift" in the box (3 months, 6 months or 1 year, with an optional message). It ends on its own, ships to the address entered at checkout, and bills the buyer on each delivery. Still open: whether gifts should be paid up front, and a recipient notification email.
- ShouldSingle-origin flavor quizToday's site offers a short quiz to pick Sweet, Tangy or Full Roaster's Choice. The new shop lists all three with their tasting notes; the quiz could be added if it helps.
- ShouldProduct contentPhotos, tasting notes and prices were imported from the current site. Confirm them, and archive leftover test products in Stripe so only the real menu shows.
- ShouldReturning customersEach new checkout creates a new customer record in Stripe. The portal still finds all of a customer's records by email, but they could be merged into one.
- ShouldMinor polishShow schedule dates in Dallas time (orders placed around midnight can show a date one day off). Stripe's checkout can't collect phone numbers in this setup, so decide whether they're needed.
- LaterSkip a delivery or pause, promo codes, giftingAll possible with Stripe; scope them if wanted.
How to operationalize
Day-to-day tasks, side by side. The left column describes a typical WooCommerce Subscriptions + Stripe setup; adjust anything that differs from how Oak Cliff runs today.
Stripe rates are Stripe's published standard US pricing as of September 2026; negotiated rates may differ.