A professional desktop application for managing school events, ticketing, and fundraising sales. Built for PTAs, schools, and organizations that need efficient participant tracking, label printing, and check-in management.
Ticketing Mode - Traditional event ticketing with check-in
- Generate numbered tickets with unique QR codes
- Real-time check-in with barcode scanner support
- Track attendance and export check-in reports
- Perfect for: school dances, carnivals, raffles, field trips
Sales Mode - Fundraising and order management
- Track bulk orders (e.g., 5 pretzels per student)
- Quantity tracking and order summaries
- Print labels for bag/envelope labeling
- Perfect for: pretzel sales, cookie dough, wrapping paper, school supplies
- Multi-Event Support - Filter and manage multiple events simultaneously
- Envelope Labels - Avery 5160 compatible label printing (30 per sheet)
- CSV/Excel Import - Bulk import participant data
- Custom Fields - Configure which fields to collect (classroom, teacher, grade, etc.)
- Customizable Branding - Set organization name, event name, and accent colors
- Quantity Management - Sales mode shows quantities in tables and on labels
- Check-In System - QR code scanning or manual ticket entry
- Export Reports - CSV export for tickets, check-ins, and order summaries
Coming Soon: Download the installer for your platform:
- Windows:
Event-Sales-Manager-Setup.exe - macOS:
Event-Sales-Manager.dmg - Linux:
Event-Sales-Manager.AppImage
Run the installer and launch the app - no additional setup required!
-
Clone the repository
git clone <repository-url> cd event
-
Install dependencies
npm install
-
Run in development mode
npm start
-
Build installers
npm run build
- Launch the app and go to the Settings tab
- Choose your mode:
- Ticketing Mode for events with check-in
- Sales Mode for fundraising/bulk orders
- Configure organization details:
- Organization Name (e.g., "Lincoln Elementary PTA")
- Event Name (e.g., "Fall Carnival" or "Pretzel Sale")
- Event Code (e.g., "EVT" or "PRETZEL") - appears on ticket codes
- Enable custom fields you need:
- Classroom/Room
- Teacher
- Grade
- Address, Email, Phone (for labels)
- Click Save Settings
Manual Entry:
- Go to Manage tab
- Fill in participant details (first name, last name, custom fields)
- Set quantity (how many tickets/items)
- Click Generate
Bulk Import:
- Prepare a CSV or Excel file (see format below)
- Click Import CSV/Excel
- Select your file
- Review import summary
Tickets (Ticketing Mode):
- Select tickets in the table or use "Print All Unprinted"
- Choose ticket template (Default Layout or custom)
- Click Print Selected or Preview Selected
- Each ticket shows: name, QR code, ticket number, event info
Labels (Both Modes):
- Go to Labels tab
- Select participants or use "Print Labels for All"
- Load Avery 5160 label sheets in printer
- Click Print Labels or Preview Labels
- In Sales Mode, labels show quantity (e.g., "Qty: 5")
- Go to Check-In tab
- Scan QR codes with barcode scanner, OR
- Type ticket code or number and press Enter
- System shows check-in confirmation
- Export check-ins anytime with Export Check-Ins button
The Event Filter dropdown (top of Manage and Labels tabs) lets you work with one event at a time:
- Change Event Code in Settings when starting a new event
- Generate tickets - they'll have the new event code prefix
- Select the event from the dropdown to filter tables
- View only tickets/participants for that specific event
Example:
- Fall Carnival tickets:
FALL-ABC123 - Pretzel Sale orders:
PRETZEL-XYZ789 - Filter dropdown shows: "All Events", "FALL", "PRETZEL"
Minimum required:
Quantity,First,Last
1,Julia,McSweeney
1,Emmett,PottsWith custom fields:
Quantity,First,Last,Classroom,Teacher
1,Julia,McSweeney,101,Ms. Johnson
2,Emmett,Potts,202,Mr. SmithBulk orders:
Quantity,First,Last,Classroom,Teacher
5,Julia,McSweeney,101,Ms. Johnson
12,Emmett,Potts,202,Mr. SmithIn Sales Mode, Quantity = number of items ordered (creates that many ticket records for quantity tracking).
The app recognizes these column names (case-insensitive):
- Quantity:
Quantity,Qty,Count - First Name:
First,First Name,FirstName - Last Name:
Last,Last Name,LastName - Full Name:
Name,Student Name,Full Name(will be split automatically) - Classroom:
Classroom,Room,Class - Teacher:
Teacher,Instructor - Grade:
Grade,Grade Level - Address:
Address,Street Address - Email:
Email,Email Address - Phone:
Phone,Phone Number
Avery 5160 (or compatible)
- 30 labels per sheet (3 columns × 10 rows)
- Label size: 2.625" × 1"
- Available at office supply stores and Amazon
- Avery 5160
- Office Depot/OfficeMax (equivalent)
- Staples (equivalent template)
- Amazon Basics address labels (2.625" × 1")
Ticketing Mode:
- Student name (bold, centered)
- Selected label fields (classroom, teacher, grade, etc.)
- Event name
Sales Mode:
- Student name (bold, centered)
- Selected label fields (classroom, teacher, etc.)
- Quantity ordered (e.g., "Qty: 5")
Note: Labels are deduplicated - one label per student regardless of ticket quantity.
If labels don't line up perfectly with your printer:
- Go to Settings tab
- Scroll to Label Printing Adjustments
- Use presets (Default, Tight, Spaced) or adjust manually:
- Vertical Gap - space between rows
- Horizontal Gap - space between columns
- Top Margin - shift all labels down
- Left Margin - shift all labels right
- Click Save Settings
- Test print on regular paper first!
Ticketing Mode:
- Enables Check-In tab
- Prints QR codes on tickets
- Labels show event name
- Focus on attendance tracking
Sales Mode:
- Hides Check-In tab (not applicable)
- Shows quantity column in tables
- Labels show quantity ordered
- Export order summaries by teacher/classroom
Enable only the fields you need:
- Classroom/Room - Organizes participants by class
- Teacher - Groups orders by teacher (great for sales mode)
- Grade - Track which grades participated
- Address - For mailing labels or parent contact
- Email - Electronic communication
- Phone - Phone contact
- Notes - Special instructions or notes
Label Fields: Choose which fields appear on printed labels.
- Organization Name - Appears on tickets
- Event Name - Appears on tickets and labels
- Event Code - Prefix for ticket codes (e.g., "EVT-ABC123")
- Accent Color - Custom color picker for branding
- Settings: Set mode to "Ticketing", event name "Fall Dance", event code "DANCE"
- Import: Upload student roster CSV
- Print: Print all tickets and envelope labels
- Distribute: Send labels home for families to write names on envelopes
- Day of Event:
- Check-In tab active
- Scan QR codes as students arrive
- Track attendance in real-time
- After Event: Export check-ins for attendance records
- Settings: Set mode to "Sales", event name "Pretzel Sale", event code "PRETZEL"
- Import: Upload order form CSV with quantities (e.g., 5 pretzels, 12 pretzels)
- View Quantities: Manage tab shows "Qty" column with order amounts
- Print Labels: Labels show "Qty: 5", "Qty: 12", etc. for labeling bags
- Sort by Teacher: Filter or export to group orders by classroom
- Distribution: Use labels to mark pretzel bags before sending to classrooms
- Reports: Export order summary CSV grouped by teacher
All data is stored in a SQLite database (pta_tickets.db) located in:
- Windows:
%APPDATA%\event-sales-manager\ - macOS:
~/Library/Application Support/event-sales-manager/ - Linux:
~/.config/event-sales-manager/
To backup your data:
- Close the app
- Copy
pta_tickets.dbfrom the location above - Store in a safe location
To restore:
- Close the app
- Replace
pta_tickets.dbwith your backup copy - Restart the app
To start fresh:
- Close the app
- Delete
pta_tickets.db - Restart the app (creates new database)
Regular CSV exports are recommended:
- Manage tab → Export CSV (all tickets/participants)
- Check-In tab → Export Check-Ins (attendance report)
- Manage tab → Export Order Summary (sales mode - grouped by teacher)
- Test first: Always preview PDFs before printing
- Regular exports: Export CSV regularly to backup participant data
- Multiple events: Use event filter dropdown to work on one event at a time
- Search: Use search box to quickly find specific participants
- Privacy: Tickets show name only (no room numbers)
- Distribution: Use envelope labels for easy sorting by classroom
- Check-In: Barcode scanner should be in "keyboard mode" (acts like keyboard input)
- Manual entry: Check-In accepts ticket codes or numbers if scanner fails
- Bulk orders: Import CSV with quantities (system creates multiple ticket records)
- Quantity display: Tables and labels automatically show order quantities
- Teacher reports: Export order summary to see totals by teacher/classroom
- Label organization: Print labels to mark bags/envelopes before distribution
- Test print: Print on regular paper first to check alignment
- Printer settings: Use "Actual Size" or "100%" scaling (no fit-to-page)
- Label sheets: Buy extra sheets - practice makes perfect
- Adjustments: Use Settings → Label Printing Adjustments if alignment is off
Problem: "Could not detect columns"
- Ensure CSV has headers in first row
- Check column names match expected variations
- Verify file is actually CSV (not .xlsx saved as .csv)
Problem: "Skipped rows during import"
- Quantity must be a number
- At least First/Last name or Full Name required
- Check for blank rows in CSV
Problem: Labels don't line up with sheet
- Go to Settings → Label Printing Adjustments
- Try "Tight" or "Spaced" presets first
- Test on regular paper before wasting label sheets
- Ensure printer settings: "Actual Size", no scaling
Problem: Labels are cut off
- Check printer margins in print dialog
- Some printers can't print to edge - labels may need adjustment
- Try adjusting Top/Left margins in Settings
Problem: Scanner doesn't read QR codes
- Ensure scanner is in "keyboard mode" (check scanner manual)
- Test scanner in a text editor - should type characters
- Try manual entry using ticket code or number
- Check "Include QR Codes" is enabled in Settings
Problem: QR code scans but check-in fails
- Verify ticket code matches format (e.g., "EVT-ABC123")
- Check ticket wasn't deleted
- Try entering ticket number instead of code
Problem: App is slow with many tickets
- Export old events to CSV and start new database for new events
- Use Event Filter to work with one event at a time
- Large imports (1000+) may take a few seconds
- Electron - Desktop application framework
- Node.js - JavaScript runtime
- Better-sqlite3 - Fast, embedded database
- PDFKit - PDF generation for tickets and labels
- HTML/CSS/JS - User interface (no frameworks)
event/
├── src/
│ ├── main/ # Main process (Node.js)
│ │ ├── main.js # App entry point, IPC handlers
│ │ ├── database.js # SQLite database operations
│ │ └── pdf-generator.js # PDF rendering
│ ├── renderer/ # Renderer process (UI)
│ │ ├── index.html # Main UI structure
│ │ ├── app.js # Application logic
│ │ └── designer.js # Template designer (hidden feature)
│ └── preload/ # Preload scripts
│ └── preload.js # IPC API exposure
├── public/
│ └── css/
│ └── styles.css # Application styles
├── package.json
└── README.md
Development:
npm startPackage for distribution:
npm run buildCreates installers in dist/ directory for current platform.
Package for all platforms (requires platform-specific setup):
npm run build:win # Windows
npm run build:mac # macOS
npm run build:linux # LinuxTables:
attendees- Participant informationtickets- Ticket records (one per quantity)settings- Application settings (key-value)templates- Custom ticket/label templates (hidden feature)
Backward Compatible: Electron version uses same schema as original Python version.
Created by Matthew Grilli Email: him@mattgrilli.com
All rights reserved.
Built with ❤️ for PTAs and school organizations everywhere