# Cravees: I built a catering martech agency site with dual pricing honesty

Source: https://www.michaelchurley.com/blog/cravees-catering-martech-agency-site  
Published: 2026-08-08  
Author: Michael C. Hurley  
Tags: cravees, catering, martech, marketing-agency, nextjs, convex, clerk, stripe, roi-calculator, hospitality, local-seo, catppuccin

![Cravees home. Turn hungry searches into booked tables](/blog/cravees-catering-martech-agency-site/screenshots/home.png)

## Who

I got tired of watching catering businesses buy generic agency retainers that treat a wedding buffet like a SaaS landing page.

Catering is feast-or-famine. Wedding season starts when venues book. Corporate lunch messaging is not private-event messaging. Deposit timing matters. A Google Business profile can become tasting appointments, or a photo graveyard.

Cravees is for caterers and restaurant catering arms who need demand this month: inquiry lift, reorder lists, review velocity. Operators who want a vertical agency site on a real stack (Next, Convex, Clerk, Stripe) with lead status enums that survive a failed Resend delivery. Builders who will admit the public pricing cards and the Stripe `planSlug` ladder are not the same numbers yet.

If you have ever explained to a marketing generalist why plated service and buffet are different offers, this is for you.

## What

I built **Cravees**, package name `cravees`, version **0.1.0**, private under **HurleyUS/cravees.com**. Metadata line: *Marketing Agency for the Catering Industry*. Hero line: **Turn hungry searches into booked tables, events, and repeat orders.**

Stack facts from the lockfile and tree, not the stale sitrep: **Next.js 16.2.6**, **React 19.2.6**, **Tailwind 4.3**, Bun, **Convex** schema + mutations, **Clerk** auth surfaces, **Stripe** checkout/portal/webhook, Catppuccin Mocha with peach primary, Resend/Sentry/PostHog/GA wired. Seventy-three commits. HEAD `ab0c4cb`.

![Pricing. Starter Growth Premium](/blog/cravees-catering-martech-agency-site/screenshots/pricing.png)

Surfaces that exist in `app/`: `/` marketing with demand cockpit + case studies + testimonials + FAQ + ROI embed, `/about`, `/pricing` with comparison table, `/blog` + three SEO posts, `/contact` enhanced form (business type + service interests), `/book` Calendly, `/roi-calculator`, four `/services/*` landings, Clerk catch-alls, private `/dashboard` (+ messages, assets), newsletter + Stripe API routes.

Convex tables: `leads`, `subscribers`, `clients`, `subscriptions`, `addOnPurchases`. Lead pipeline: **new to contacted to qualified to proposal to won | lost**. Public packages: Starter **$299**, Growth **$599**, Premium **$999**. Stripe definitions in `lib/billing.ts`: Bronze **$499**, Silver **$999**, Gold **$1,999** (+ annual labels). Add-ons: extra social post $49, rush design $199, additional listing $99.

That dual ladder is not a typo in this write-up. It is the product honesty.

![ROI calculator](/blog/cravees-catering-martech-agency-site/screenshots/roi-calculator.png)

## Where

Code lives at [github.com/HurleyUS/cravees.com](https://github.com/HurleyUS/cravees.com). **private**. GitHub homepage points at [cravees-com.vercel.app](https://cravees-com.vercel.app). Custom domain [www.cravees.com](https://www.cravees.com) also **200** at pack time. Apex redirects to www. Auth-gated `/dashboard` and `/sign-in` returned **500** without living Clerk keys. marketing stays up because May commits taught the app to tolerate missing auth/env.

Audience sits next to restaurant marketing shops, with a catering-only pitch: inquiry funnels, seasonal search pages, winback email for lapsed brunch guests. Sibling operator furniture is present. `.hustlemc`, Blacksmith ship workflow, Vitest/Playwright, Stripe type-safe webhooks.

![About. catering-only positioning](/blog/cravees-catering-martech-agency-site/screenshots/about.png)

## When

**2026-01-08.** `8b80d36` Initial commit: Next.js, Convex, Tailwind. Same morning OPPORTUNITIES. Afternoon PLAN. Market thesis lands day one: ~12k dedicated caterers, $60B+ industry framing, Starter/Growth/Premium sketch.

**2026-01-31 / 2026-02-05.** Sync. Prod build ready. Tailwind v4 globals `@import` fix.

**2026-02-13.** Catppuccin Mocha default. Routes, contact, pricing, about. Four service landing pages. Replace a real business name with fictional **Copper Kettle Catering**. quiet ethics commit.

**2026-02-21–24.** The agency week. Zod schemas shared across form + API. XSS sanitize on contact HTML email. Clerk middleware. Convex lead storage. FAQ. Testimonials. Pricing comparison table. Blog section. Calendly booking. PostHog. ROI calculator page. Portfolio/case-study cards. Newsletter + Resend double opt-in. Protected client portal scaffold.

**2026-03.** SEO robots/sitemap/GA. Stripe type-safety and event guards. Enhanced contact form. Interactive ROI on the homepage.

**2026-05-14–22.** Blacksmith CI and deploy verification. Keep public site up without auth env; disable Clerk UI for dummy keys; tolerate invalid Resend sender. Redesign commits. Merge blacksmith migration PR #64.

**2026-08-08, 06:54 ET.** `ab0c4cb` set X-Robots-Tag to index, follow on Vercel. HEAD. Seventy-three commits total.

**Pack day 2026-09-08.** Draft and assets only. Live marketing 200 on vercel + www. `sitrep.md` still claims purpose unclear and last commit February 5. treat it as drift, not truth.

![Blog index. three catering posts](/blog/cravees-catering-martech-agency-site/screenshots/blog.png)

## Why

I did not want another hospitality brochure with stock plate photography and a contact form that emails into the void.

I wanted lead status enums next to subscription sync. I wanted an ROI calculator that routes into the same contact pipeline as the pricing CTA. I wanted newsletter double opt-in and a client portal sidebar even while `/dashboard` still 500s without Clerk. I wanted the public $299/$599/$999 story and the Stripe bronze/silver/gold amounts to be visible in the same repo so nobody pretends they already match.

So the February issue board became the agency: close FAQ, social proof, pricing table, blog, book, analytics, ROI, newsletter, portal. March hardened SEO and Stripe. May made the public site survive missing secrets. August flipped robots headers on a site that actually answers.

Would you ship the public Starter/Growth/Premium ladder first, or make the Stripe bronze/silver/gold amounts match the pricing page before the next catering discovery call?
