Designed, not built.
There is no calendar in CustomerLedger today. No code, no table, no screen. This page describes a decision we have taken and not yet shipped, and it is here because the reasoning is worth reading before it exists rather than after.
An appointment is an event with a second timestamp.
The intended shape is one calendar across all your businesses, on the same record as the calls and the consent. A booking is not a different kind of object from an event; it is an event that also carries a time in the future and a state that can change. That is why calendar is the next thing rather than a separate product: the timeline already models most of it.
Both directions
What the customer committed to, and what you committed to them. A missed callback is a broken promise you made, and it belongs on the same line as the appointment they missed.
Stamped like everything else
An appointment carries the business that booked it. Your plumbing agent should not be able to see, or move, a booking made by a different business you own.
Why it lands next
It is the smallest of the three remaining surfaces and the most obviously useful the day it ships, because a voice agent that can book is worth more than one that can only take a message.
Booking logic exists inside the After Hours AI product, not in CustomerLedger, and the two do not share a store. Nothing on this page describes running code. When it is built, this page changes state at the top and the release gates will say so before the copy does.
measured 2026-09-02 | reproduce with ledgerctl.py shipstate | state SPEC