# Your ZAXBYS: I built a franchise ops platform so the store and the above-store stop living in different spreadsheets

Source: https://www.michaelchurley.com/blog/yourzaxbys-franchise-management-platform  
Published: 2026-08-08  
Author: Michael C. Hurley  
Tags: yourzaxbys, zaxbys, franchise, nextjs, convex, clerk, resend, sentry, martech, ops

![Your ZAXBYS landing hero on Vercel](/blog/yourzaxbys-franchise-management-platform/screenshots/landing.png)

## Who

I kept catching myself watching franchise operators bounce between a POS export, a Steritech PDF, a schedule spreadsheet, and a text thread that somehow became HR.

I wanted the above-store view and the store-level pain in the same repo family: real auth, real email, and an honest note that the custom domain DNS still does not answer from my network. A generic restaurant dashboard template with fake charts would not cut it. Neither would a pitch that says multi-unit without a stores table.

Your ZAXBYS is for multi-unit Zaxby's owners, above-store folks, and GMs who will sit with a CAP form. Operators who treat Clerk + Convex as a product decision. If you run MarTech by day and still care whether a food-safety observation has a written plan, this is for you.

## What

I built a franchise management platform as a Next.js app with a marketing shell and a gated dashboard.

Public surface: hero lander, features, pricing, about, testimonials, blog stub, contact, privacy. Clerk sign-in / sign-up. CTAs now point at `/signup`. That wiring was a March 1 fix, not day-one. Pricing page sells **Starter $99/mo**, **Professional $199/mo**, **Enterprise Custom**, plus add-ons ($25 per extra location, analytics, integrations setup, priority support). FinalCTA still shows a placeholder `(555) 123-ZAXBYS`. That is not a real phone bank.

![Pricing lander on Vercel](/blog/yourzaxbys-franchise-management-platform/screenshots/pricing.png)

Private surface: `/dashboard` with stores, employees, schedule, audits, reports, settings. Convex schema is the spine: `employees` (roles from `franchise_owner` down to `team_member`, `eid` like `ZAX######`, **`ssnLast4` only**), `stores`, `schedules` + `shifts`, `caps` (food safety / RER with observation, solution, plan), `audits` (Steritech, health department, internal, RER), `salesData`, `feedback`, `notifications`. Resend routes send confirmation, invite, and notification mail from `notify@yourzaxbys.com`. Invite copy still names **Zaxby's Waynesville, NC**. The sibling store product is real.

Stack on disk: Next **16.1.6**, React 19, Convex, Clerk, Radix + Tailwind, Sentry (`hustle-launch` / `shipthing`), PostHog provider, Bun lockfile, package **`zaxbys-franchise-management-platform` `1.0.0`**. `proxy.ts` is the Next 16 rename of middleware. Blacksmith `ship.yml` pulls Vercel env and Convex deploy keys.

![Illustrative dashboard composite from schema + routes](/blog/yourzaxbys-franchise-management-platform/screenshots/dashboard-composite.png)

Honesty checks: the lander brags `500+` locations / `25%` cost reduction / `99.9%` uptime / `4.9★`. Those strings live in `app/page.tsx`. They are marketing copy, not a warehouse receipt. Unauthenticated `/dashboard` on the Vercel alias returned 404 at pack time, so there is no logged-in screenshot. README still tells you to clone `michaelmonetized/www.yourzaxbys.com`; the GitHub org is **HurleyUS**. AUTOPSY.md from February roasted a missing navbar and missing SEO files; HEAD has `manifest.ts`, `sitemap.ts`, `robots.ts`. Treat the autopsy as a scar, not the current build report.

## Where

Code: [github.com/HurleyUS/www.yourzaxbys.com](https://github.com/HurleyUS/www.yourzaxbys.com). Public. Empty description. Empty topics. Zero stars.

Live alias that answered HTTP 200 for this pack: [wwwyourzaxbyscom.vercel.app](https://wwwyourzaxbyscom.vercel.app). GitHub homepage field points there. Custom domain `www.yourzaxbys.com` did **not** resolve from the pack hosts (NXDOMAIN). Sibling store app: private [waynesville.yourzaxbys.com](https://github.com/HurleyUS/waynesville.yourzaxbys.com) with its own Vercel alias.

Audience: franchise teams that want one login for labor, audits, and CAP follow-ups, and builders who know a SaaS pricing page without a `protect()` boundary is unfinished.

## When

**2025-03-07 to 03-09.** First `init` commits under Michael Monetized. Fonts. Style passes. The classic "we gotta push to main to see minor changes yuck" loop. Repo created on GitHub 2025-03-08.

**2025-10-02.** Another `init`, reboot marker on the timeline.

**2025-10-15.** The YOLO pivot. Commit message literally: letting CodeRabbit and GPT5 duke out a refactor into a new project idea. Missing deps. Bun trusts. "Updated everything YOLO." "says ready for prod :shrug:" Accessibility vibing. That afternoon is when the franchise platform stopped being a mood and became a tree.

**2025-10-16.** Marketing pages land.

**2025-12-29.** CVE dependency passes.

**2026-01-08.** `PLAN.md`: multi-store dashboard, unified reporting, document library, the above-store wishlist.

**2026-01-31.** Big `chore: sync all changes`.

**2026-02-04.** `Add complete franchise management dashboard`, the product-shaped commit.

**2026-02-06 to 02-21.** Next 16 `proxy.ts` rename. Security: SSN off the wire, `ssnLast4` in schema, encrypt-at-rest notes in changelog, email domain / EID standardization (#11, #12).

**2026-02-28 to 03-09.** TypeScript fix PR. Strip thirteen console statements. Wire CTAs to `/signup`. Bump Next to **16.1.6** for CVEs (#21).

**2026-05-14.** Blacksmith CI gates standardized across a stack of commits. Lazy-init Resend clients. Skip Convex provider when public env is missing so the marketing shell does not die without a deployment.

**2026-08-08.** `fix: set X-Robots-Tag to index, follow on Vercel`. HEAD `705473f`. Forty-six commits on the ledger. Pack day is September 8, 2026.

Font fiddling to a versioned franchise ops platform with a live Vercel alias and a custom domain that still needs DNS honesty.

## Why

I did not want the store and the above-store to keep living in different tabs forever.

So I put employees, stores, schedules, CAPs, and audits in one Convex schema. I put Clerk in front of the dashboard and Resend on the invite path. I left the marketing stats labeled as marketing. I left the Waynesville invite copy as a breadcrumb to the sibling store app. I set package **1.0.0** knowing "1.0" here means the platform shape shipped, not that every `PLAN.md` checkbox is green.

sitrep still says WIP and HIGH client priority. ROADMAP still wants owner UAT. That is fine. The repo has receipts in git: schema, auth, email, CI.

Would you fix `www.yourzaxbys.com` DNS and run a real owner pilot next, or delete the fake 500+ lander stats before anyone quotes them as proof?
