Web PlatformsFlores de Alina — floral design studio, Philadelphia · 2025

From Instagram DMs to a studio that runs itself

A floral design studio's complete digital storefront: a luxury portfolio, a live availability calendar that reads the owner's real Google Calendar, a merch store, and a flower subscription — built to run without a technical owner touching it.

Visit the live site

Clients self-serve

Portfolio & gallery

filterable · mobile auto-scroll

Live availability

reads her real Google Calendar

Inquiry form

event, date, venue, budget

Revenue without event labor

Merch store

Stripe Checkout · local pickup

Flower subscriptions

monthly tiers · self-managed billing

The owner's side

Admin dashboard

contacts · sources · CSV export

Zero maintenance

her calendar is the source of truth

System map — how the pieces connect

Screenshots
Flores de Alina home page: a full-bleed hero of blush roses behind the tagline “Floral Design for Life's Most Magical Moments”
The storefront — deliberate restraint, reads as luxury service.
Availability page: an August calendar with booked dates highlighted in pink, one open date outlined, past dates dimmed, and an Available / Booked / Past legend
The flagship — her real Google Calendar, rendered as live availability.
Gallery page: a three-column grid of bouquet, wedding, and event photography beneath the site navigation
The gallery — categorized, filterable, lazy-loaded.
Boutique shop page with a “Cart (0)” control and two apparel products — a $25 t-shirt and a $35 crewneck, each with size and quantity selectors
Branded apparel with card checkout and free local pickup.
Flower subscription tiers side by side: Standard at $40/month and Premium at $50/month wearing a “Most Popular” badge, each with a feature checklist
Two subscription tiers — recurring revenue, billing self-managed through Stripe.
Contact page titled “Let's Create Something Beautiful” with studio contact details beside an inquiry form asking for name, email, event type, event date, and message
The inquiry form that replaced Instagram DMs — every send builds her mailing list.
Gallery on a phone captured mid auto-scroll: a horizontal carousel with a bouquet photo centered and neighboring photos peeking in from both edges
On mobile it auto-scrolls, pauses at a touch, and loops.
The problem

Flores de Alina serves weddings, corporate events, and installations across the Philadelphia area — with a real client base and no digital infrastructure. Every inquiry arrived through Instagram DMs. A couple couldn't see whether their wedding date was free without messaging and waiting, there was nothing to buy, and nothing for Google to index.

The owner is not technical, so whatever got built had to run without her maintaining it. And service work is capped by how many events one designer can take — the business needed revenue that doesn't scale with her hours.

What we built

The marketing site carries the brand with deliberate restraint — this needs to read as a luxury service, not a template. The gallery is categorized and filterable with lazy-loaded images; on mobile it auto-scrolls horizontally, pauses the moment a finger touches it, and loops, because a vertical wall of thirty floral photos is a scroll nobody finishes.

The single highest-leverage feature is the live availability calendar. It reads the owner's actual Google Calendar and marks booked dates unavailable, correctly resolved to Eastern time. Visitors self-serve the “are you free on June 14th?” question — previously her most common message — and she maintains nothing: she books an event in the calendar she already uses, and the website updates.

The inquiry form collects event type, date, venue, and budget, notifies the owner, and silently adds each email to a subscriber list tagged by source — so the mailing list builds itself from real inquiries instead of a popup. Two product lines open revenue that doesn't consume event-day labor: a branded apparel store with cart and local-pickup option, and a monthly flower subscription in two tiers whose subscribers manage their own billing through Stripe's portal.

A password-gated admin dashboard gives the owner every captured contact with source breakdowns, search, filtering, and CSV export — she pulls her own list for a campaign without asking anyone. The build continues: a client portal and automated reminder and update emails are next.

Couples & customers

  • Check date availability instantly — no DM, no waiting
  • Send a qualified inquiry with event type, date, venue, and budget
  • Buy branded apparel with card checkout and free local pickup
  • Subscribe to monthly arrangements and manage billing themselves

The owner

  • Books events in the Google Calendar she already uses — the site updates itself
  • Every contact captured and tagged by source automatically
  • Searches, filters, and exports her list from the admin dashboard
  • Earns recurring subscription revenue independent of event bookings
Engineering decisions worth explaining
Server-authoritative pricing

Checkout never accepts prices from the browser. The client sends a product, size, and quantity; the server validates each against its own catalog and constructs the Stripe line items itself — eliminating the classic hobbyist-store bug where a tampered request buys a $35 sweatshirt for a dollar.

Stripe webhooks that keep working

Stripe signs webhooks against the raw request body, and any JSON parser that runs first silently breaks every signature. The webhook route is registered ahead of the body parser and reads the raw payload — closing off a failure that presents in production as “webhooks mysteriously stopped” and is painful to trace.

SEO pre-rendering without an SSR rewrite

A React SPA ships an empty shell that crawlers can't read — bad for a business found by searching “wedding florist Philadelphia.” Instead of restructuring the app for server-side rendering, a production middleware injects hand-authored metadata and hidden semantic HTML per route. Crawlers get real content on first byte; users get the unchanged app. A sensible trade at eight routes that we'd revisit at fifty.

Honest 404s

The SPA catch-all originally answered every path with HTTP 200, which Google treats as a soft 404 — and which masked a missing favicon so well that search results showed a generic globe. Unknown paths now return a genuine 404, and response content types get checked, not just status codes.

The sale outranks the mailing list

Email capture during checkout is deliberately non-blocking: idempotent inserts, conflicts handled, errors caught and dropped. A mailing-list write must never be able to fail a customer's payment.

Built with

React (SPA)ExpressStripe Checkout + BillingGoogle Calendar APIReact Hook Form + ZodFramer Motion

What changed

  • From Instagram-DM-only to a site that qualifies leads before they reach the owner
  • Her most repetitive question — date availability — now answers itself
  • Two product lines generate revenue independent of event bookings
  • Subscriptions turn a project-based business into one with recurring income

Related service · Workflow & Integration Systems

Need something like this?

Synthos · Custom software & AI automation · Philadelphia