E-commerce

Fulfilment for a subscription box business

A subscription box ships monthly. Subscribers pick preferences and can skip a month up to a cutoff date. On the cutoff, the system produces the pick list and the shipping labels for that month, and charges only the subscribers who did not skip.

Automatically generated draft

Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.

Section 01 · What has to work

The monthly subscription box engine must correctly compile pick lists and skip billing only for active subscribers before the cutoff date.

Section 03 · Screens

Every screen, and what it is for.

  • ›Subscriber Portal — subscribers manage preferences and skip months, instant preference save.
  • ›Cutoff Dashboard — operators monitor billing readiness and pick list counts, instant tally load.
  • ›Pick List View — warehouse staff pack items by subscriber, instant item check-off.
  • ›Subscription Admin — staff view member status and history, instant record lookup.

Anything not on this list is not in version one. That is what keeps a fixed price fixed.

Section 04 · The data model

What it stores, and who can read a row.

subscriber

id uuid, email text, stripe_customer_id text, created_at timestamptz

Access · Subscribers read own row; operators read all rows.

subscription

id uuid, subscriber_id uuid, status enum(active, paused, canceled), current_period_end timestamptz

Access · Subscribers read own subscriptions; operators read all.

monthly_cycle

id uuid, cutoff_at timestamptz, dispatch_date date, status enum(open, processing, closed)

Access · All authenticated users read open cycles.

skip

id uuid, subscription_id uuid, cycle_id uuid, created_at timestamptz

Access · Subscribers read own skips; operators read all.

fulfillment

id uuid, subscription_id uuid, cycle_id uuid, status enum(pending, skipped, billed, packed, shipped)

Access · Subscribers read own fulfillment; operators read all.

Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.

Section 05 · States

pending → skipped | billed → packed → shipped | failed

Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.

Section 06 · Where this breaks

What bites products like this one.

Stripe webhook failure during mass cutoff billing leaves subscribers charged without fulfillment records.

Idempotent batch processing scripts with reconciliation checks running post-cutoff.

Subscriber updates preferences the exact second cutoff triggers, causing race conditions in pick list generation.

Database row locks on monthly_cycle during the cutoff job execution window.

Section 08 · Deliberately left out

What version one does not do.

  • ×Automated carrier tracking webhooks — adds two days of API setup; manual tracking entry suffices for v1.
  • ×Custom box builder with multi-tier product choices — complexity multiplies edge cases; single-preference selection covers v1.

This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.

Still open

What we would ask before quoting.

  • What exact timezone defines the cutoff deadline for all subscribers?
  • What happens to fulfillment if a subscription payment fails on cutoff night?

Half of this already exists

Renewal Engine

The billing half of this is a solved problem: recurring charges, a retry ladder on failed cards, access cut and restored automatically.

It is one of our pre-built products: the code is handed over to you, adapted to your own wording and rules, and the rest of the specification above is built on top of it rather than from scratch.

Your product, not this one

Get this written for what you are actually building.

Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.

Next step

Find out if your idea fits in 10 working days.

Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.

NDA available on request