I built a Claude agent that runs Instagram DM ordering for a 7-location sushi chain

I built an AI agent that took over order-taking for a sushi chain with 7 locations. About 90% of their orders come through Instagram DMs, and until now one person typed every reply by hand.

How it works: code watches incoming messages through the Meta API and hands each one to Claude (Sonnet 4.6) over the API. The model has a knowledge base with the full menu, ingredients, calories, allergens, delivery zones, hours, prep times and promos for all 7 spots. It talks to the customer for real, helps them pick, explains what is in a roll, flags allergens, and upsells when it fits ("that set goes well with X sauce, want it?"). Once an order is confirmed it pushes straight to the kitchen and writes a record into the restaurant CRM and an admin panel where the owner watches how the agent is doing.

Stack: SvelteKit for the site and admin panel, Meta API for the DMs, Claude Sonnet 4.6 for the conversations, pg-boss on Postgres for the job queue, and a CRM integration for the orders.

One detail I am happy with: that whole menu-and-rules block has to go to the model on every message, which would normally be expensive. With prompt caching, about 97% of messages read that block from cache at a tenth of the input price, so running Sonnet on every DM ends up cheap enough that the owner never thinks about it.

What it doesn't do, by choice: calls, voice notes and photos go to a human. A model guessing at a photo of a handwritten order is how you ship something embarrassing. Plain text handoffs almost never happen, basically just "let me talk to a human," and that is rare. The owner's panel keeps every chat plus the agent's reasoning chain per message, so if something breaks I can see exactly how and why.

Still watching quality now that it is live. Happy to answer anything about the caching setup, the Meta API webhook flow, or how the kitchen handoff works.

reddit.com
u/timhartmann7 — 19 hours ago
▲ 452 r/ClaudeAI

Running Sonnet 4.6 on every Instagram DM for a 7-location restaurant. 97% cache hit is the only reason it's affordable

I figured the agent would be the tough part. Turned out the cost was the real story, and that's what closed the deal.

A sushi chain with 7 locations runs about 90% of its orders through Instagram DMs. I put a Claude agent (Sonnet 4.6) on those DMs through the Meta API. It has the full menu, ingredients, calories, allergens, delivery zones, hours, prep times and current promos for all 7 spots. That is a big block of context, and it has to reach the model on every single message, because every reply needs the whole menu sitting in front of it.

Normally that kills you on cost. You pay full input price to reprocess that entire block every time someone types "hi." On paper, Sonnet on every DM looks like a non-starter for a chain doing real volume.

Caching is what flips it. On roughly 97% of messages, that static block gets read from cache instead of reprocessed, and a cache read runs at a tenth of normal input price. So most of what the agent handles comes in at 90% off. The only full-price tokens left are the customer's actual message and the reply, both tiny next to the menu dataset. That is the whole gap between "too expensive to run per message" and "the owner forgot there's an LLM in the loop at all."

What the agent does with all that context: helps people pick, explains what is in a roll, flags allergens, upsells when it fits ("that set goes well with X sauce, want it?"), then pushes the confirmed order to the kitchen and writes a record into the CRM and an admin panel.

What I kept off it on purpose: calls, voice notes and photos go to a human. A model guessing at a photo is how you ship a disaster. Plain text handoffs to a person almost never fire, basically just "get me the manager," and even that is rare.

I split the prompt so the menu and rules sit in one stable prefix and only the live conversation changes, which is what keeps the hit rate up. Anyone pushed past ~97% on a setup like this?

u/timhartmann7 — 12 days ago

I put a Claude agent in charge of taking orders for a 7-location sushi chain. What it owns now, and what it still cant touch

A customer messages a sushi place on Instagram at 8pm wanting to order. Somewhere between that message and the kitchen actually seeing it, the order can just die. The manager's swamped and misses the DM. Or replies an hour later when the guy already ordered somewhere else. Or answers in two dry words because it's the end of a long shift, and the customer feels it. No upsell, no "want a sauce or a drink with that," no real care. That gap was the actual problem at this chain, not the food and not the kitchen.

7 locations, mostly delivery, and roughly 90% of orders come through Instagram DMs. The whole business ran through one person typing replies, and that person was the single point of failure for revenue.

So I'm building a Claude agent to take that seat. Code watches incoming messages through the Meta API and hands them to Claude (Sonnet 4.6) over the API. Claude has the rules, the tone of voice, and a knowledge base with the full menu, ingredients, calories, allergens, delivery zones, hours, prep times and current promos for all 7 spots. It talks to the customer for real. Helps them pick, explains what's in a roll, flags allergens, and upsells when it actually fits ("that set goes well with X sauce, want it?"). Once the order's confirmed it pushes straight to the kitchen and writes a record into both the restaurant CRM and an admin panel where the owner sees analytics on how the agent's doing.

The pitch to the owner wasn't "fire someone." It was: stop losing orders to missed messages and bad-mood replies, and start upselling on every conversation instead of never. Speed is a side effect. The model answers instantly, doesn't have off days, doesn't go home at 11.

Running this on Sonnet 4.6 stays cheap, which caught the owner off guard. The menu, the info for all 7 locations, the conversation rules, all of that is a huge block of context that has to go to the model on every single message. Normally you pay full input price to reprocess the whole thing every time someone says hi. But on about 97% of messages that block gets read from cache instead of reprocessed, and a cache read on the Claude API costs a tenth of the normal input price. So the bulk of what the agent handles comes in at 90% off. The only full-price pieces left are the customer's actual message and the reply, which are tiny next to the full menu dataset. That's the gap between Sonnet being too expensive to run on every DM and being a line item the owner never thinks about.

What it doesn't touch, on purpose: calls, voice messages, and photos still go to a human. Someone sends a voice note or a picture of a handwritten order, that's not the agent's job, and pretending otherwise is how you ship a disaster. So it's less "replace the human" and more that the human stops being the thing that breaks, and handles the weird stuff a model shouldn't.

Beyond those, handing a plain text conversation off to a person almost never happens. It's basically one trigger: the customer types "let me talk to a human" or "get me the manager," and even that's rare. After launch I'm watching quality, and the owner's panel keeps the full chat history plus the agent's reasoning chain for every message, so if something goes sideways I can see exactly how and why in a few seconds instead of guessing.

The agent gets it right something like 98% of the time. At that rate it's cheaper to accept the small risk than to keep bleeding customers over bad service, and the service really was bad. Before I pitched this chain I placed an order myself to see what their managers were like. Dry, confusing replies, the kind where you feel like you're bothering someone by trying to hand them money. If that's the normal experience, plenty of people already left quietly and never said why.

So I'm making a bet a lot of people seem scared to make. I'm not chasing 100% reliability, I'm chasing "clearly better than the human it replaces," and accepting a couple percent of mistakes I can catch in the logs. For anyone running an LLM in a real revenue path: did you hold out for near-perfect before going live, or ship against a weak human baseline and accept the error rate? How did that call age once volume got real?

reddit.com
u/timhartmann7 — 16 days ago
▲ 248 r/AI_Agents

Sold a $700 app to a coffee shop. I didn't write it, Claude did.

I wanted to make some fast cash a few weeks ago. I'm a web dev with a decent amount of experience, so I figured I'd build something small for a local business and sell it. The catch: I didn't write most of it. Claude Code did.

I described the idea and it produced a working SvelteKit demo in about 40 minutes. I deployed it to my own server and gave each coffee shop its own subdomain, and the demo loaded with their logo and name already on it. Then I walked into three shops near my apartment with something they could tap on instead of a pitch deck. The first owner said yes in five minutes. $700.

Since this is ai_agents channel, I'll be straight: the thing I sold isn't an agent. It's a normal web app. The agent in this story is Claude Code, and it did almost all the engineering while I handled the parts it can't, like walking into a shop and reading whether the owner wants this.

Every table has a QR code. A guest scans it, the app reads the table number from the code, and they order from their phone. The order shows up in a barista CRM with the table number and items, so nobody waits for a waiter to write it down. Staff get their own logins too, which means a waiter can work five tables in one lap and push each order to the bar instead of walking back to the register every time.

The owner cared most about loyalty. A customer logs in with Telegram, places five orders, and keeps a 20% discount after that. Telegram is the main messenger where I live, and it lets you wrap a web app as a mini app, so I shipped that version too. The discount isn't the point. The shop now owns a customer list and can message those people on their phones. Someone has lunch, joins the program, goes home, and the next morning gets "two lattes for one today" as a notification. A PDF menu doesn't do that. I haven't seen another shop in this city running anything close.

Core build took three days through Claude Code. I spent about another week on fixes and sign-offs, and most of that was me waiting on the owner to reply, not writing code. It's been in production for a while now, serving real customers every day and sending me logs and monitoring. Stable so far.

The $700 isn't the interesting number. The ratio is: a few hours of agent work plus a walk around the block produced a deployed, paid product. Most of my time went to finding the buyer and keeping it running. I also got a permanent 50% discount at the shop, which doesn't hurt. The bottleneck moved off the build.

A question for the people doing the same thing. If you sell these apps to small businesses, do you get a long tail of bug reports coming back at you? I get almost none, but I've been building web apps and shipping products for years, so maybe that's the reason. I'm curious about the people who never wrote code by hand and jumped straight into vibe coding. Does it hold up for them, or does the tail show up?

reddit.com
u/timhartmann7 — 18 days ago
▲ 95 r/foss+1 crossposts

OmnySSH - TUI SSH manager with dashboard, SFTP and snippets (Rust)

i work with 10-20 servers between freelance clients and personal projects, and plain ssh turns into a mess at that scale.

i tried Termius. solid app, but snippets, sftp and multi session sit behind a subscription, and i didn't want a monthly fee for a terminal tool. i spend my day in a terminal, so a GUI was a downgrade for me.

lazyssh and sshs lack a dashboard with server cards and live CPU/RAM/disk numbers. neither has an sftp browser, so i kept typing scp paths from memory. i also wanted saved snippets i can fire at multiple hosts at once.

i wrote OmnySSH in rust to cover all of that. single binary, runs on linux/mac/windows. it reads your existing ~/.ssh/config and never writes to it, because i didn't want to break anyone's ssh setup.

tell me what's missing that would make you switch from your current setup. that's the feedback i want most.

install: `cargo install omnyssh`, or the one-liner / homebrew tap in the readme. apache 2.0. ask me anything.

repo: https://github.com/timhartmann7/omnyssh

u/timhartmann7 — 20 days ago

OmnySSH - TUI SSH manager with dashboard, SFTP and snippets (Rust)

i work with 10-20 servers between freelance clients and personal projects, and plain ssh turns into a mess at that scale.

i tried Termius. solid app, but snippets, sftp and multi session sit behind a subscription, and i didn't want a monthly fee for a terminal tool. i spend my day in a terminal, so a GUI was a downgrade for me.

lazyssh and sshs lack a dashboard with server cards and live CPU/RAM/disk numbers. neither has an sftp browser, so i kept typing scp paths from memory. i also wanted saved snippets i can fire at multiple hosts at once.

i wrote OmnySSH in rust to cover all of that. single binary, runs on linux/mac/windows. it reads your existing ~/.ssh/config and never writes to it, because i didn't want to break anyone's ssh setup.

tell me what's missing that would make you switch from your current setup. that's the feedback i want most.

install: `cargo install omnyssh`, or the one-liner / homebrew tap in the readme. apache 2.0. ask me anything.

repo: https://github.com/timhartmann7/omnyssh

u/timhartmann7 — 21 days ago