Events
Bookings and deposits for an event venue
An event venue with three rooms takes enquiries, holds a date for seven days, and confirms the booking when a deposit is paid. The calendar shows holds and confirmations differently, and a held date is released automatically when the seven days pass.
Automatically generated draft
Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.
Section 01 · What has to work
The system must successfully take an enquiry for a specific room and date, create a temporary hold, and either confirm it upon payment or automatically release the date after seven days.
Section 03 · Screens
Every screen, and what it is for.
- ›Public Calendar — A customer sees room availability and makes an enquiry; loading date availability must be instant.
- ›Admin Calendar — Staff view all holds and confirmed bookings across all rooms; switching between room views must be instant.
- ›Booking Details — Staff review an enquiry or booking to manage it; loading customer information must be instant.
- ›Deposit Payment — A customer pays the deposit via a secure link; the payment form must load instantly.
Anything not on this list is not in version one. That is what keeps a fixed price fixed.
Section 04 · The data model
What it stores, and who can read a row.
Room
id uuid, name text
Access · All users, including anonymous, can read all rows.
Booking
id uuid, room_id uuid, status enum('enquiry', 'held', 'confirmed', 'expired', 'cancelled'), event_date date, customer_name text, customer_email text, hold_expires_at timestamptz, deposit_amount numeric(10,2), payment_id uuid, secure_link_token text
Access · Staff can read all rows; anyone can read via a valid token.
User
id uuid, email text, hashed_password text
Access · A user can read their own row.
Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.
Section 05 · States
enquiry → held → confirmed | expired
Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.
Section 06 · Where this breaks
What bites products like this one.
Two customers could book the same room and date simultaneously, before the system can lock the resource.
Use a database-level exclusion constraint on the booking table to prevent overlapping date ranges for the same room.
The background job that releases expired holds might fail, leaving rooms blocked indefinitely.
Implement monitoring and alerting for the job scheduler, plus a manual override button for staff to release any stuck hold.
The 7-day hold expires at the wrong time due to timezone ambiguity between the customer, venue, and server.
Store all timestamps as timestamptz (UTC) and define the venue's local timezone as a non-negotiable system setting.
Section 08 · Deliberately left out
What version one does not do.
- ×Automated hold creation — Staff manually approve an enquiry to create a hold, instead of the system doing it automatically. — Allows for human review of initial enquiries, de-risking early operations. Automate when booking volume makes this a bottleneck.
- ×Customer accounts — Customers manage bookings via secure, single-use links sent to their email instead of a login portal. — Vastly reduces build time and security scope. Add customer accounts when managing multiple or repeat bookings becomes a core need.
This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.
Still open
What we would ask before quoting.
- Does an enquiry for an available date automatically create a hold, or must a staff member approve it first?
- Is a booking for a full calendar day, or for a specific start and end time on that day?
- How is the deposit amount calculated? Is it a fixed fee, a percentage, or does it vary per booking?
Your product, not this one
Get this written for what you are actually building.
Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.
Next step
Find out if your idea fits in 10 working days.
Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.