How later pieces plug in
Booking storage stays local. Stripe test checkout is wired for the 7-day trial. Calendar and live Twilio send are still seams.
Set `STRIPE_SECRET_KEY` to an `sk_test_` key. Checkout creates a subscription with `trial_period_days` 7 and `payment_method_collection` always, so a card is on file. Unless the shop cancels, Stripe converts it to the locked $29/month Starter price, or to $290/year when the shop chose annual. Each business email has its own trial window and booking count. Checkout, the card statement (`WASHBOARD LABS LLC`), and the invoice footer identify Washboard Labs LLC. The operator line also stays in the header, footer, and Terms.
One trial per business email or phone (contact identity only — not a live after-hours line). Intake stops at 25 bookings with an upgrade link. Optional `STRIPE_PRICE_ID` must be that same $29/month test price. `STRIPE_WEBHOOK_SECRET` verifies `POST /api/stripe/webhook`.
After OAuth for the business calendar, map `PendingSlot.windowStart` / `windowEnd` to an event with status `tentative` and extended property `afterhoursBookingId`.
Confirm in the inbox should PATCH the event to `confirmed`. Decline should cancel it. Use a Google service account or Calendar API user tokens stored per location — not in this repo.
Call the Cal.com booking API with the captured attendee and a slot from their availability endpoint. Store `calBookingId` next to `slotId`. Incoming Cal.com webhooks can flip inbox status if a customer later reschedules on Cal.
Buy a number, set Voice URL to `https://afterhoursbooker.com/api/twilio/voice` and Messaging URL to `/api/twilio/sms`. Verify `X-Twilio-Signature` with `TWILIO_AUTH_TOKEN` before calling `ingestTwilioEvent`. Gather speech or keypad input, then return the existing TwiML helper.