Skip to main content
Back
maketheprint preview

maketheprint

Visit store →

Problem

The business needed one system for catalog sales, custom print requests, secure checkout, and reliable order state after payment.

Tech stack

TypeScriptNext.jsStripeSupabaseTailwindCSS

What I built

  • Built the store end to end: catalog, custom orders, checkout, and order updates.
  • Used PostgreSQL with row-level security so accounts only access their own records.
  • Advanced order state from verified Stripe webhook events rather than browser redirects.
  • Launched the live storefront at maketheprint.store.

Decisions

Key technical choices, alternatives considered, and trade-offs.

Supabase with row-level security

Context

A solo-maintained store needed authentication, product data, and order rules without a long custom backend setup before the first sale.

Alternatives

  • Custom API with managed Postgres: more control, but much more setup before launch.
  • Firebase documents: faster to start, weaker relational constraints for pricing, inventory, and order history.

Decision

PostgreSQL through Supabase with row-level security, keeping product and order rules next to the data.

Trade-off

Less control over the server process in exchange for shipping a secure storefront sooner.

Stripe webhooks for payment confirmation

Context

Orders could not be marked paid based only on a success page. Dropped connections and abandoned tabs were expected.

Alternatives

  • Trust the client redirect as payment proof: simple, but incorrect when the browser never returns.
  • Poll Stripe from the client after checkout: workable in demos, but races the UI and wastes rate limits.

Decision

Advance order state only from verified Stripe webhook events, with idempotent handlers for retries.

Trade-off

More implementation work than a thank-you page, with more reliable order state.