← Portfolio
Live Demo · Fundraiser + Catering Platform

Dozens Donuts

Drew runs a Phoenix donut delivery business with three revenue streams — events, catering, and school fundraisers. He'd hit Squarespace's ceiling. We replaced it with a custom Next.js platform built around how his business actually works.

The Business

Three revenue buckets

🎪

Events / Pop-ups

Physically selling donuts at community events. Quick cash — up to $3,500 in 4 hours at best — but weather-dependent and not the core model.

🚚

Catering Delivery

$12.99/dozen + delivery. The core scalable model. Cheapest fresh-baked donuts in the valley, delivered in a two-hour window.

🏫

School Fundraisers

$22/box. The school earns $10 per box, risk-free. Groups of 20 kids have raised $2,000+ in a week. Custom landing pages, flyers, and tracking for each school.

The Problem

Where Squarespace hit the ceiling

01

One checkout page. For every school.

Squarespace allows exactly one checkout page across the entire site. Each school fundraiser has different pickup days and times — so Drew builds separate forms per school, but every customer lands on the same generic checkout with no school-specific options. Pickup choice is lost.

02

Duplicate submissions. Manual matching.

When customers navigate back to change their pickup option, Squarespace logs a new form submission — but only one payment. Drew manually cross-references multiple spreadsheets to match submissions to payments. At 8 simultaneous fundraisers, he called it "unmanageable."

03

Every catering order lands in his inbox.

Customers can't pay upfront — Drew has to review each order first to filter out bad fits (wrong zone, too small). That means manual email review → manual Stripe payment link → wait for customer to pay. It works. It doesn't scale.

The Solution

Built around how the business actually works

🏫

Per-school checkout pages

Each school gets a dedicated URL with its own pickup options, deadline, and student rep list baked in. No shared pages. No lost context.

Form data lives in Stripe

There is no separate form-then-pay flow. The customer fills one form → lands in Stripe Checkout with all their data in metadata. Payment and order are permanently linked. Zero matching.

🗺️

Zone-aware order filtering

Catering orders auto-validate ZIP code against delivery zones before reaching checkout. Wrong zone or too few dozen? They're told instantly — no email back-and-forth.

Live Demos

Try it yourself

Built With

Next.js 15TypeScriptTailwind CSSStripe Checkoutreact-leafletFramer Motion