📋 Event Coordination & Roster Management
IntelliSignup provides a flexible, dual-mode coordination architecture designed to handle everything from physical supplies (potlucks, funeral dinners, equipment) to calendar-bound volunteer shifts (nursery care, booth staffing, cleanup crews).
Events operate under a relational schema linking a single parent SignupEvent to multiple SignupItem child rows. Each item maintains its own independent claim queue (SignupClaim) and overflow waitlist (SignupWaitlistEntry), allowing complex multi-category events to remain cleanly synchronized.
1. Item vs Time-Slot Signups
Organizers configure the format during event creation or mixing within a single signup sheet:
| Format Type | Target Use Case | Data Schema Representation | Claim Behavior |
|---|---|---|---|
| Item-Based | Food items, party supplies, equipment, donations, potluck dishes. | item_kind = 'item', with integer quantity_needed. |
Guests select how many units to provide from a dropdown (1 to remaining). |
| Time-Slot | Shift work, hourly volunteering, interviews, greeting tables, cleanup crews. | item_kind = 'time_slot', with slot_start and slot_end datetimes. |
Single-claim reservation locking the designated time window. |
| Mixed | Large community festivals needing both supplies (ice, coolers) and volunteer shifts (setup crew, ticket collectors). | Combinations of items and time slots within the same event_id. |
Item claims and time slots render with custom contextual action buttons and status pills. |
class SignupItem(db.Model):
id = db.Column(db.Integer, primary_key=True)
label = db.Column(db.String(255), nullable=False)
details = db.Column(db.String(255), nullable=True)
quantity_needed = db.Column(db.Integer, default=1, nullable=False)
item_kind = db.Column(db.String(32), default='item', nullable=False)
slot_start = db.Column(db.DateTime, nullable=True)
slot_end = db.Column(db.DateTime, nullable=True)
event_id = db.Column(db.Integer, db.ForeignKey('signup_event.id'), nullable=False)
@property
def quantity_claimed(self):
return sum(claim.quantity for claim in self.claims)
@property
def quantity_remaining(self):
return max(self.quantity_needed - self.quantity_claimed, 0)
2. Creation & Setup Workflow
Creating an event follows a clean, two-step progressive disclosure flow:
Step 1: Event Metadata (/events/new)
- Title & Auto-Slug: The system automatically computes a unique, URL-safe vanity slug (e.g.,
spring-community-cleanup-2026) using hyphens and numerical de-duplication. - Description & Location: Plaintext or formatted instructions, physical venue address, or online meeting links.
- Event Date & Close Deadline: Organizers can define the actual event date alongside an optional
close_atdeadline. Once this timestamp expires, the public form automatically closes to prevent last-minute alterations. - Attached Custom Questionnaire: Select an optional pre-built
CustomFormto collect additional guest details upon signup. - Notification & Automation Flags:
notify_on_new_claim: Instant email to organizer whenever a participant claims a spot.reminder_enabled&reminder_hours_before: Schedules automated reminder delivery (e.g., 24 hours prior).waitlist_enabled: Activates automated queueing when spots are exhausted.is_published: Toggle between private Draft and live Public availability.
Step 2: Entries & Slots Builder (/events/new/entries)
An interactive client-side entry builder allows rapid item entry. Organizers can quickly add rows, specify quantities, switch individual rows between items and time slots, and define shift intervals without reloading the page.
3. Frictionless Guest Claiming
IntelliSignup prioritizes guest conversion by eliminating all friction:
- No Login Wall: Guests never need to register an account or remember a password.
- Direct Form Submission: Guests enter their Name, optional Email (required for automated confirmations and self-service edit tokens), and optional Notes.
- Dynamic Dropdowns: For item-based entries, the quantity dropdown dynamically caps at
quantity_remaining, preventing accidental over-allocation. - Embedded Questionnaire Answers: If an organizer attached a questionnaire, questions (text, dropdowns, checkboxes) render directly inline above the submit button and validate before claim creation.
4. Participant Self-Service (Edit Tokens)
A critical flaw in legacy signup platforms is that participants who need to change or cancel their commitments must email the organizer manually. IntelliSignup solves this with cryptographic self-service tokens:
Backend generates a 24-byte cryptographically random URL-safe token (edit_token) stored with the claim.
Guest receives confirmation email containing direct link: https://intellisignup.net/claims/{token}.
Guest can update quantity, modify notes, cancel claim, or download their personal .ics calendar invite.
Because secrets.token_urlsafe(24) generates 192 bits of cryptographic entropy, the token cannot be guessed or brute-forced, ensuring only the recipient of the email can modify their claim.
5. Automated Waitlist Engine
When popular items or time slots fill up completely, IntelliSignup's waitlist engine seamlessly activates:
- Inline Waitlist Form: As soon as
quantity_remaining == 0, the standard claim button is replaced by a "Join Waitlist" form. - Queue Ordering: Waitlist entries (
SignupWaitlistEntry) are ordered chronologically by timestamp. - Organizer Manual Promotion: On the event detail page, organizers view a dedicated "Waitlist" drawer with an instant Promote button. Clicking it converts the entry into an active
SignupClaimand triggers an automated notification email to the participant: "A spot opened for [Event]!". - Cancellation Backfill: When an existing participant cancels their claim via their self-service link, the organizer is alerted and can immediately promote the next person in line.
6. Live Updates & Diff Detection
When event details inevitably change (e.g., location moved, time pushed back, new items added), IntelliSignup automatically computes a line-by-line diff comparing the previous state with the new submission using summarize_event_changes():
def summarize_event_changes(previous, current, previous_items, current_items):
changes = []
# Compares Title, Description, Location, and Format
for key, label in {'title': 'Title', 'location': 'Location'}.items():
if previous.get(key) != current.get(key):
changes.append(f"{label}: {previous.get(key)} → {current.get(key)}")
# Detects Datetime Shifts
if previous.get('event_date') != current.get('event_date'):
changes.append(f"Event time: {describe_datetime(previous.get('event_date'))} → {describe_datetime(current.get('event_date'))}")
# Detects Added, Removed, or Reconfigured Slots
for item in added:
changes.append(f"Added entry: {item['label']}")
for item in removed:
changes.append(f"Removed entry: {item['label']}")
return changes
If changes are detected, an automated broadcast email is immediately dispatched to all confirmed participants:
Subject: Updated details for Memorial Luncheon
Hello,
The organizer has updated details for Memorial Luncheon:
- Location: Cultural Hall → Main Fellowship Pavilion
- Event time: Friday, Oct 12 at 12:00 PM → Friday, Oct 12 at 01:00 PM
- Added entry: Ice Cream Tubs (2)
View the updated event here: https://intellisignup.net/events/memorial-luncheon
Manage your commitment here: https://intellisignup.net/claims/x9B2...
7. Printable Rosters & CSV Export
IntelliSignup equips organizers with comprehensive tools to export and execute events in the physical world:
/events/<slug>/print)
An ad-free, high-contrast, printer-optimized layout designed specifically for physical clipboard sign-ins at events. Renders item names, slot times, participant names, quantities, and blank verification check-boxes.
/events/<slug>/export.csv)
One-click download of a structured comma-separated roster containing: Item Label, Item Type, Time Slot Window, Participant Name, Email Address, Quantity, Notes, Claim Timestamp, and all answers to attached questionnaires.
Organizers hosting recurring events (e.g., monthly youth nights, weekly nursery shifts) can save any live event as a SignupTemplate, instantly creating new instances with item structures pre-populated.
A built-in mass communication console allowing organizers to compose a custom announcement and blast it instantly to the inbox of every active participant registered on the roster.