Skip to content

Practical guide

Build a booking request app without code

Build a request-and-confirm booking workflow with dates, capacity rules and clear customer status. Distinguish a submitted request from a confirmed reservation.

1. Choose what a request means

This example collects a request for a meeting room, then lets staff confirm or decline it. Use the web app builder to connect the customer form and staff review interface. A submitted request is not a guaranteed reservation. Tell the customer that clearly in the form, confirmation screen and any email. Use a synthetic room such as Demo room A and a future one-hour interval.

Define the resource, duration, capacity and time zone before building. This guide uses a single resource per request and no payment collection. If instant guaranteed booking is required, you need a verified concurrent allocation mechanism; a calendar-looking interface alone does not provide one.

2. Store resource, time and status explicitly

Create a resources table with a name and enabled state. Create booking requests with resource reference, authenticated requester reference, start instant, end instant and status. Use pending, confirmed, declined and cancelled. Store a consistent time representation and display the relevant time zone beside the fields.

Validate that the resource exists, the end follows the start and the interval is within your policy. Treat adjacent intervals consistently: for example, a booking ending at 11:00 may allow the next to start at 11:00. For overlap checks using half-open intervals, an existing confirmed booking conflicts when its start is before the requested end and its end is after the requested start. Verify this rule against your actual stored types and query behavior.

Unsaved Date field configuration named requested_start
A Date-field illustration for requested_start, prepared in Marketing and discarded without adding a field. Timezone and overlap rules belong in the workflow and require separate checks.

3. Build the request form and staff list

Create a page with a form for resource, requested start/end and an optional purpose. Use clear field names and show the time zone before submission. Page forms collect inputs nested inside the form; check the actual submitted values instead of assuming a label supplies the field name.

For staff, adapt a Records manager starter to show pending requests and their intervals. Keep the customer view scoped to that customer's requests, following the portal guide. A starter's sample records illustrate layout; replace demonstration actions with your reviewed endpoints.

Page function inputs showing Page, Path, Query, Event and Form contexts
The existing local demonstration function exposes $page and $form contexts. Use these controls for form state and input mapping; this capture is not a completed multi-step form or persisted booking.

4. Separate submission from confirmation

The submission endpoint should authenticate the requester, validate the interval and save a pending request. A separate staff-only confirmation endpoint must read the current state and check the applicable resource rules again. Do not trust availability fetched when the customer first opened the page.

Two staff members can confirm overlapping pending requests at nearly the same time. A read followed by an unconditional write is insufficient. Use a concurrency strategy supported by your backend and prove that conflicting concurrent confirmations cannot both succeed. If you have not verified that guarantee, retain a manually reviewed request process and avoid claiming automatic capacity enforcement. The approval guide covers controlled decisions, but scheduling adds interval conflicts.

Existing Marketing auth/me endpoint with Bearer Token authentication
The existing identity endpoint uses Bearer Token authentication. This setting identifies a caller; separate ownership, staff-role and state-transition rules still need implementation and tests. No endpoint setting was changed.

5. Test time boundaries and competing requests

Submit one pending request and verify that the customer sees pending after reload. Confirm it as authorized staff, then test an overlapping request, an adjacent interval, an end before start, a disabled resource and a customer trying to confirm their own request directly. Check signed-out and foreign-customer access too.

Test time-zone conversion around a daylight-saving change where relevant, and run two competing confirmations deliberately. Expected results must match the documented capacity policy. These checks remain acceptance requirements until executed; editor screenshots do not prove conflict prevention. If an interval shifts on display, inspect the stored value and formatting time zone before changing the stored request.

6. Release clear status and cancellation behavior

Define who can cancel a pending or confirmed request and whether cancellation releases capacity immediately. Return the current stored status after each action. If another staff action has already changed it, show that result instead of silently overwriting it.

Publish reviewed versions and repeat one controlled submission, confirmation and cancellation on the released URLs. Add a transactional message only after confirming the save behavior; its wording must distinguish received from confirmed. Use a multi-step form if collecting longer booking details would otherwise overwhelm the initial request.

Go deeper

Supporting documentation

Find the configuration details and reference material behind this page.

From idea to a working flow

Build one useful thing with Twidget

Start with a small workflow, test it with sample data and make it your own.

Preview

Have any questions? Get in Touch

Starting with Twidget is easy, fast and free

It only takes a few clicks to get started

Get started - it's free

No credit card required.


© Copyright 2026 - Twidget.io