filesoft.Discuss a project
← FileMaker guides

FILESOFT / PRACTICAL WORKFLOWS

Manage a session waiting list in FileMaker: fill a cancelled seat fairly

When a place becomes available, give it to the next person waiting. Keep the registration record through every change.

By Plato · Filesoft · A single-user FileMaker walkthrough

Download the FileMaker example ↓

Free ZIP · 148 KB · No name or email required. Requirements and details

A workshop is full. Sam joins the waiting list, followed by Taylor. When someone cancels, there is a free seat—but it should not go to whichever person happens to click Register next.

The waiting list needs its own saved order, and every route into a seat must respect it. That includes restoring a cancelled registration.

This fictional worked example builds on checking session capacity and preventing duplicate registrations. Filesoft Session Waitlist 0.1.0 adds an explicit Join waitlist action and a Promote next action. The screenshots follow the owner’s walkthrough of the native teaching file.

1. Separate seats, records and queue order.

The file has four fictional participants and two sessions. S01, FileMaker foundations, has two seats. S02, Reporting workshop, has zero capacity and is closed. The participant and session pop-up menus display readable names while storing IDs.

A participant–session pair has one persistent registration record. For example, P03|S01 identifies Sam’s registration for S01. The separate registration UUID identifies that saved record through status changes. Two participants named Alex Morgan have different participant IDs, so their registrations remain separate.

  • Registered occupies one seat.
  • Waitlisted occupies no seat and has a saved queue sequence.
  • Cancelled occupies no seat. The registration record remains.

The screen’s saved-record total includes all three statuses across both sessions. It is different from the selected session’s Registered and Waiting counts. Cancelling someone should reduce the relevant active count without deleting their record.

The queue sequence records joining order. It is not a display position that must be renumbered whenever someone leaves. The next person is the Waitlisted registration with the lowest sequence in the selected session.

2. Fill two seats and queue two people.

Load examples, choose S01, and register P01 and P02—the two Alex Morgan participants. Then select P03, Sam Rivera, and click Join waitlist. Do the same for P04, Taylor Chen.

Two seats are filled; two people are waiting. P03 has sequence 1 and P04 has sequence 2. Waiting does not use a seat. Four registration records are saved.
Two seats are filled; two people are waiting. P03 has sequence 1 and P04 has sequence 2. Waiting does not use a seat. Four registration records are saved. Open full-size screenshot ↗

Sam receives sequence 1 and Taylor receives sequence 2. The session still has only two Registered participants. Four saved records are correct: two have seats and two are waiting.

Repeating Join waitlist for someone already waiting leaves their registration ID and sequence unchanged. A repeated click must not create another record or move that person to the back. Try this in the example: note Taylor’s ID and sequence, click Join waitlist again, and compare both values.

The overview lists participants in its fixed display order. Read the saved sequence and the Next line to understand priority; row position and alphabetical names do not decide who gets the seat.

3. Cancel a place, then promote the next person.

Select P01 and click Cancel. One seat becomes available, but neither waiting participant moves automatically.

Cancellation opens a seat without promoting anyone. P01 remains saved as Cancelled. P03 and P04 are still Waitlisted, and P03 is next.
Cancellation opens a seat without promoting anyone. P01 remains saved as Cancelled. P03 and P04 are still Waitlisted, and P03 is next. Open full-size screenshot ↗

Cancellation saves one decision: P01 no longer occupies a seat. Promotion is a separate decision, made with Promote next. Keeping it explicit makes the change visible and easy to check.

Click Promote next. It uses the selected session’s queue, regardless of the participant currently selected. The action checks that a seat is available and promotes one person from the front. Here that person is Sam, P03.

Promotion changes the existing registration. P03 is now Registered. P04 is next, and the total remains four records. Compare the ID before and after promotion in your own walkthrough.
Promotion changes the existing registration. P03 is now Registered. P04 is next, and the total remains four records. Compare the ID before and after promotion in your own walkthrough. Open full-size screenshot ↗

The screenshot above selects Sam after promotion. To check record preservation yourself, note his registration ID before promotion and compare it afterward. Registered returns to two, Waiting falls to one, and Taylor becomes next. The total remains four saved registrations.

The participant menu does not automatically switch to the promoted person. The result message names the participant who moved. Selecting that person afterward lets you inspect their saved status and ID.

4. Protect priority when someone returns.

Next, cancel P02. There is now one available seat, while Taylor is still waiting. Select the already Cancelled P01 and try Restore.

An available seat does not let Restore bypass the queue. After P02 also cancels, one seat is available. P01 stays Cancelled because P04 is already waiting.
An available seat does not let Restore bypass the queue. After P02 also cancels, one seat is available. P01 stays Cancelled because P04 is already waiting. Open full-size screenshot ↗

Restore is refused because Taylor has priority. A vacant seat alone is not enough: Register and Restore must also check whether anyone is waiting. Otherwise either button could become a shortcut around the queue.

P01 can use Join waitlist to return at the back. The original registration UUID stays with the pair, but the new join receives a later sequence. Cancelling a waiting entry removes it from the active queue; rejoining is a new request for priority.

Rejoining goes to the back and keeps the same record. After further cancel-and-rejoin checks, P01 has sequence 4 and P04 has sequence 5. P01 is now next. Four records are still saved.
Rejoining goes to the back and keeps the same record. After further cancel-and-rejoin checks, P01 has sequence 4 and P04 has sequence 5. P01 is now next. Four records are still saved. Open full-size screenshot ↗

This later screenshot follows additional cancel-and-rejoin checks. P01 is waiting at sequence 4. Taylor has cancelled and rejoined at sequence 5, so P01 is now next. Taylor’s UUID still matches the earlier sequence-2 record, and the saved total is still four.

Gaps in sequence numbers are expected. The numbers preserve joining order rather than promising consecutive positions. A fresh run with fewer cancellations will produce different sequence numbers while following the same ordering rule.

S02 provides a separate closed-session check. Its zero capacity closes Register, Restore and Join waitlist; there is no queue to join.

A closed session does not accept a waiting list. S02 has zero capacity. The selected pair remains Not registered, with no registration ID and no waiting entry.
A closed session does not accept a waiting list. S02 has zero capacity. The selected pair remains Not registered, with no registration ID and no waiting entry. Open full-size screenshot ↗

5. Put the rules behind every action.

The example keeps the policy in a read-only helper, Check session queue, and routes Register, Join, Cancel, Restore and Promote through a shared worker, Apply waiting-list action. A button chooses an action; the worker checks the selected IDs and the saved state before changing anything.

The helper checks capacity, known statuses, active registrations and waiting sequences. Invalid data produces an error instead of being treated as an empty queue or a spare seat. A repeated action that already has its intended result returns without another write.

Queue selection filters by session and Waitlisted status, then sorts by the numeric sequence. The registration ID provides a stable tie-breaker:

WHERE "SessionID" = ? AND "Status" = ?
ORDER BY "QueueSequence", "RegistrationID"

This is the selection rule, not a complete paste-in script. The worker also checks query failures and record identity. Inspect the editable file for its full context and error handling.

A new join uses the highest saved sequence for that session plus one, including historical sequences retained on cancelled or promoted records. It does not use the current number of people waiting. Cancel and Promote preserve the historical sequence; only a new join assigns a later value.

Before writing, the worker checks seat and queue eligibility. It checks again inside its transaction and verifies that a promotion still targets the expected queue head. It then changes the existing record—or creates one only when that pair has no record—and checks the save result. Errors revert the attempted transaction and return an explanation.

A successful Commit Transaction saves the grouped changes. The interface reports success after that checked result, then refreshes the counts and selected registration.

This is a single-user teaching example. Transactions and repeated checks do not establish safe simultaneous registration on a hosted file. Two clients can still compete for the same seat or queue sequence. A hosted adaptation needs every relevant action to coordinate on the same session, recount and allocate sequences while that coordination is held, handle lock and commit failures, and pass simultaneous-client tests. Claris documents record locking under Open Record/Request; a complete hosted design is outside this example.

Try the session-waitlist example.

The ZIP contains Filesoft Session Waitlist 0.1.0 and a Read Me. The native database bytes are unchanged from the original empty review archive. Your saved walkthrough copy is separate.

Download ZIP ↓

Free direct download · 148 KB · No name or email required.

  1. Load examples. Register P01 and P02 in S01.
  2. Join the waiting list as P03, then P04. Repeat Join for P04 and compare the ID and sequence.
  3. Cancel P01. Confirm one available seat and two people still waiting. Click Promote next; P03 should become Registered.
  4. Cancel P02. Try restoring P01 while P04 is waiting. Expect a priority refusal.
  5. Join as P01, then cancel and rejoin P04. In this fresh sequence, expect P01 at 3 and P04 at 4, with P01 next.
  6. Try Join waitlist for a participant in S02. Expect a closed-session refusal with no new record.
More checks and starting again

Try missing choices, repeated Register and Cancel, promotion when full, and promotion with an empty queue. Close normally and reopen to check persistence in your environment. Load examples adds missing fixtures without resetting registrations; Clear choices clears only the selections. To start empty again, close the file and extract another copy from the ZIP.

The selected owner screenshots show the queue, promotion, priority, rejoining and closed-session states. Repeat Join and before-and-after promotion ID comparisons are checks to perform in your own walkthrough. They do not establish complete checklist, close/reopen, minimum-version or concurrent-client coverage. The original LOCAL REVIEW 0.1.0 screen label remains.

Transaction steps require FileMaker Pro 19.6.1 or later. Minimum-version, Windows, Go, WebDirect and resizing behavior have not been tested. FileMaker Pro is not included. Use your current FileMaker Pro on macOS for this desktop teaching example.

This independent example is separate from Session Desk. It has no automatic promotion, email, payments, booking portal, priority tiers or queue expiry. It uses no plug-ins, external connections or analytics.

Continue with related workflows.