lettuce.rsvp is one contact in your Messages app for tables, haircuts, spa visits, repairs, tattoo sessions, and more. Say what you need, see real availability, and book.
No app, no account, no card. Businesses run it from the terminal or the dashboard.
Restaurants, hairdressers, salons, spas, mechanics, tattoo shops, and any appointment-based business can share one direct booking path. Open it from a site, map pin, search result, or your saved contact.
“Dinner for four Thursday” or “haircut Friday afternoon.” The agent pulls the service, party, day, and time out of plain language, then asks only for what is missing.
It answers with businesses that can actually take the booking, with live times. No “request sent,” no waiting to hear back.
Pick the spot and the seating, give a name, confirm. You get a code in the thread — text it back to change or cancel.
iMessage today, terminal today, and the same agent behind the web widget. One brain, one reservation ledger.
The same agent, the same ledger, zero dependencies. Arrow-key time picker, real availability, pretty output.
npx lettuce-rsvp
Every table gets a sticker pointing at lettuce.rsvp/t/<tag>/<table>.
The first scan opens a shared tab; everyone else who scans joins it. Add what you want from your own phone —
the bill splits by what each person ordered, or evenly, and everyone pays their own share.
Guests can find a real time, choose what they need, and book directly with the people doing the work. Restaurants, hairdressers, salons, spas, mechanics, tattoo studios, and more all get the same simple booking path.
Restaurants, hairdressers, salons, spas, mechanics, tattoo shops, and other appointment businesses join with a short tag — @rosewater — that becomes their reservation identity everywhere.
You sign in with a Lettuce account, tell us who you are, and we verify the business before the agent starts answering as you.
Run availability, reservations, menus or service catalogs, orders, table QR codes, payouts, and exports in the Lettuce console. Toast and Square are optional connections, never required to operate. Money moves on your own Stripe account, and you keep the guest relationship and data.
Sign in required — submit your business for review before it goes live.
Tags are reviewed before they go live. This takes a minute.
Yes. The phone talks to the same /api/rsvp/agent endpoint the iMessage webhook uses. The restaurants are demo listings, but the hours, capacity and confirmation codes are real — text a code back to release the table.
No. Apple Business Messages is just Messages. You tap a business's Messages button and a normal thread opens — the agent is on the other side.
Each business defines its hours, seating interval, seats per slot and lead time. Availability is computed against confirmed reservations, so a slot disappears the moment it fills.
Apple hands us an opaque ID, not your number. We hash it again before it's stored, so a thread can find its own reservations and nothing else.
The CLI is a thin client over a public REST surface: /api/rsvp/businesses, /api/rsvp/availability, /api/rsvp/reserve, /api/rsvp/reservation, /api/rsvp/menu, /api/rsvp/table, /api/rsvp/order and /api/rsvp/agent. Add --json to any CLI command for raw output.
Reservations and appointment bookings are free. Table and QR ordering is 3% of the food, and pickup is 5%. We never take a cut of tax or tips. Card processing is Stripe's usual rate and is shown separately in every quote.
Yes — Apple Messages for Business supports an Apple Pay request. Until a merchant has an Apple Pay merchant identifier (and for anyone not on Apple Pay), the same order opens on our hosted checkout page, which also offers Apple Pay, Google Pay and cards through Stripe.
One tab per table, not one cart per person. Split by what each person ordered — shared plates and tax are apportioned proportionally — or evenly across any number of people. Remainder pennies are distributed so the shares always add back to the total, and each phone pays its own share.