Room 11 · online ordering

Sats 'n Shake

They take sats at the kiosk. This is the online order, with Bitcoin at checkout, so you don't have to get out of the car.

Evening, hon. Where are we picking up? — Patty
  1. Four facts, four lampsOrdered is not paid. Paid is not ready. Ready is not picked up.
  2. One basket, one invoiceThe price holds when you check out. The kitchen never charges twice.
  3. Agents order like peopleSame menu, same checkout, a budget, and your name on the bag.
  4. A code is not a receiptThe pickup code gets the bag. The preimage proves the payment.

Start your order

Which drive-in, hon?

Finding the nearest drive-in…

How do you want it handed over?

When's lunch?

Scheduled orders: at least 15 minutes out, inside the location's hours.

Menu

What'll it be?

Happy hour 2 to 4 pm
  • Lighting the grill…

Checkout · as a guest

Who's it for, and how are you paying?

Check out your basket first. The price is held for ten minutes once you do.

Nobody texts that number. This store is pretend, so it only takes the 555-01xx numbers kept for fiction.

Pay with the part they already have

Your order

Nothing on the grill for you yet, hon. Pay for a basket and your four lamps light up here: received, in the kitchen, ready, picked up.

The counter and the window

Window's open. Code?

For counter and drive-thru orders. Curbside orders check in with I'm here. A code works once. A wrong one is refused, and the window writes down that it happened, never the code. Refunds? Ask at the window.

Send an agent for lunch

Lunch for the office, by car hop

The car hop reads the same menu, builds one basket per person under your budget at the location and order type you pick, and then stops to ask you. Only after you say OK does she pay, one invoice per bag, and put your office's name on every bag.

    The car hop's radio

    1. Quiet on the lot. Send the car hop and you'll hear every step here.

    How this fits an Olo store

    1. The menu, the locations and the order flow stay in Olo. Olo says it connects with the POS a restaurant already uses (olo.com/ordering), so a paid order lands where every other Olo order lands.
    2. Bitcoin is one more tender at checkout. Olo Pay lists credit cards, contactless payments and mobile wallets (olo.com/pay). This page puts Lightning beside them; the card button is the part they already have.
    3. Lightning Enable makes one invoice per order for the held total, confirms when it settles, and hands back a receipt. A basket can't be charged twice: the same basket gets the same invoice.
    4. The handoff doesn't change. Olo lists pickup, delivery, curbside and other handoff modes (olo.com/ordering). Bitcoin changes how the order is paid, not how it's picked up.

    Open question for Olo: their public pages don't say whether a third-party tender can be added to Olo checkout. If it can't, a Lightning checkout page can hand a paid order to Olo through its ordering API, which Olo opens to developers after certification (olo.com/api-usage-terms). Pretend sats here; nothing on this page describes how any real restaurant runs.

    For agents

    Start at the free manifest. It lists the locations and menu URLs, the handoff rules (location, order type, ASAP or a scheduled time inside the hours), the cart and order routes, the 402 contract (one invoice for exactly the frozen total, bound to the cart), the idempotency rule (same cart, same order), and for_agents.ordering_for_people: confirm the order and the total with your person before you pay, and put their name on the bag, not yours.

    GET /api/shake/manifest

    curl -s localhost:4020/api/shake/locations     # three locations, order types, hours, next slots
    curl -s -X POST localhost:4020/api/shake/cart -H "Content-Type: application/json" -d '{"location":"route-402","orderType":"curbside","when":"asap"}'
    curl -s -X POST localhost:4020/api/shake/cart/$CART/items -H "Content-Type: application/json" -d '{"item":"satburger","modifiers":["no-onion"]}'
    curl -s localhost:4020/api/shake/cart/$CART      # hold the price: totalSats, quoteExpiresAt, quoteDigest
    curl -i -X POST localhost:4020/api/shake/orders -H "Content-Type: application/json" -d '{"cartId":"'$CART'","name":"Ada","car":"red"}'   # 402
    # pay (sim): POST /api/wallet/pay { invoice }, then repeat the order with
    #   Authorization: L402 <macaroon>:<preimage>  → 200 orderNumber + pickupCode
    curl -s -X POST localhost:4020/api/shake/orders/42/arrive -H "Content-Type: application/json" -d '{"pickupCode":"SHK-…","stall":7}'   # I'm here
    node scripts/shake-agent.mjs --base http://localhost:4020 --location route-402 --type counter --when asap --budget 3000 --people 4 --name Office

    A preimage proves one invoice settled for one basket. It does not prove the food is ready, that anyone picked it up, or that the fries were hot.

    Sats 'n Shake is a parody. Not affiliated with any restaurant that sounds like it. No food was harmed.