Ready LabsAfterHours Booker

Ready Labs

How later pieces plug in

V1 keeps the booking loop local. These are the intended seams, not live connections.

Google Calendar
Replace the stub slot writer, keep the same request id.

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.

Cal.com
Use Cal.com as the availability source, AfterHours as intake.

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.

Twilio
Same routes. Add signature checks and real numbers.

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.

SMS / email send
Stubs already store the copy.
Swap `queueConfirmationStubs` for Twilio Messaging or Resend. Keep the queued / sent / skipped fields on the booking so the inbox still shows delivery state.
Stripe (test mode)
Locked Starter is $29/mo (2900 cents). No charges in V1.

Create a monthly test Price for $29 in the Stripe dashboard and paste the `price_` id into `STRIPE_STARTER_PRICE_ID`. Use test keys only.