A photo-scanning service, end to end
Shipped scan + ship pipeline, spreadsheet-driven pricing, admin + partner tools.
TriState Photo Legacy digitizes physical photos, slides, VHS, and film for families across the Cincinnati tri-state. The site had to feel personal, explain a technical service to non-technical customers, take payments, and give Michael + his partner Pamela a set of tools they could actually run the business from.
What was going on
TPL started with a hand-built landing page and a Google Sheet. It needed: a real storefront, accurate pricing that reflected a long rate card, a way for customers to estimate jobs without picking up the phone, and an operations layer so orders could be tracked from intake to shipping.
How I worked it
- 01
Spreadsheet as single source of truth. All pricing lives in a Google Sheet. A nightly Python job syncs it to the database so Pamela can edit rates without engineering help.
- 02
tRPC end-to-end types. From the pricing model through the order form through the admin console, everything is a single TypeScript graph — no surprises at the boundary.
- 03
A chatbot that actually helps. Claude Haiku handles the "how much would this cost?" questions, with the real pricing data injected into the system prompt. Off-topic prompts decline politely.
- 04
Admin API first. The admin console is a thin UI over a JSON API — Michael can script around it, and a future "Pamela App" can reuse the same endpoints.
The parts worth naming
- Pricing pipeline
Sheet → pricing job → MySQL → tRPC → UI. One edit anywhere flows everywhere.
- Order console
Status timeline, shipping label printing, partner handoff notes.
- Chatbot prompt
System prompt embeds actual rate card + FAQs; versioned + reviewable.
What shipped
The site is live and taking orders. The pricing pipeline works. The internal team uses the admin tools daily.
- Launched
- Production · DigitalOcean droplet
- Admin-editable pricing rows
- [todo] {{TODO: confirm with Michael — 2026-04-23}}
- Average order value
- [todo] {{TODO: confirm with Michael — 2026-04-23}}
- Avg chatbot response
- < 2s · streamed
What it was built with
- React 19
- TypeScript
- tRPC
- Express
- MySQL
- Tailwind
- DigitalOcean
- Stripe
- Claude API