Intellidwell Logo Docs
IntelliSignup App ↗

📋 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).

💡 Core Architecture Highlight

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.
Python (SQLAlchemy Model Excerpt)
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_at deadline. Once this timestamp expires, the public form automatically closes to prevent last-minute alterations.
  • Attached Custom Questionnaire: Select an optional pre-built CustomForm to 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:

1. Claim Submission
Token Generation

Backend generates a 24-byte cryptographically random URL-safe token (edit_token) stored with the claim.

➔ Transactional Email
2. Email Delivery
Private Edit Link

Guest receives confirmation email containing direct link: https://intellisignup.net/claims/{token}.

➔ Self-Service Portal
3. Participant Action
Modify or Cancel

Guest can update quantity, modify notes, cancel claim, or download their personal .ics calendar invite.

🔒 Zero-Password Security

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 SignupClaim and 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():

Python (Diff Summarizer Excerpt)
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:

Email Notification Example
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:

📄 Printable Sign-in Sheet (/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.

📊 Roster CSV Export (/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.

📑 Save as Reusable Template

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.

📢 Participant Broadcast Tool

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.