Restaurants
A restaurant's website has one job at 18:00: take the table without anyone picking up the phone.
What the booking module actually does
Restaurant mode is one of three the engine ships — the others are rentals and appointments — and it is the one that thinks in covers. A service is a time-slot seating with a party size and a duration; a resource is a table or a run of tables. Availability is generated from weekly rules, then narrowed by the exceptions you add for a closure or a private hire.
When a guest picks a slot, the engine allocates a table that can seat them. Two people booking the same 19:30 do not both get table four.
Holds, approval and deposits
A booking starts as a hold while the guest finishes the form. From there it can confirm outright, wait for your approval if the service asks for it, or go to a payment provider first when you take a deposit. Every one of those states is a real step in the lifecycle, not a status field somebody types in.
What you get on the page
The widget draws at runtime on the published page, so the calendar reflects what is actually free. Around it you write the things a calendar cannot say: how long you hold a table, what happens with a group of ten, whether the terrace is weather-dependent.
The other three.
Every one of these is a different job for a website, and most businesses are a mix of two.
Build the version of this that is yours.
Nothing above needs deciding in advance. Turn a module on when the business actually needs it.