8.5 KiB
8.5 KiB
Helcim Event Ticketing Integration - Implementation Summary
Overview
Successfully integrated Helcim payment processing with Ghost Guild's event ticketing system to support paid events, member pricing, early bird discounts, and capacity management.
What Was Built
1. Enhanced Event Model (server/models/event.js)
Added comprehensive ticket schema with:
- Member tickets: Free/discounted pricing for members with circle-specific overrides
- Public tickets: Standard pricing with early bird support
- Capacity management: Overall event capacity tracking
- Waitlist system: Queue management when events sell out
- Registration tracking: Enhanced with ticket type, price paid, payment status, and refund info
2. Ticket Business Logic (server/utils/tickets.js)
Created utility functions for:
calculateTicketPrice()- Determines applicable price based on member status and early birdcheckTicketAvailability()- Real-time availability checkingvalidateTicketPurchase()- Pre-purchase validationreserveTicket()- Temporary reservation during checkout (prevents race conditions)releaseTicket()- Release abandoned reservationscompleteTicketPurchase()- Finalize purchase and update countsaddToWaitlist()- Waitlist managementformatPrice()- Consistent price formatting
3. API Endpoints (server/api/events/[id]/tickets/)
Four new REST endpoints:
GET available.get.js
- Check ticket availability and pricing for a user
- Returns: ticket type, price, availability, remaining spots
- Supports both authenticated (members) and public users
POST check-eligibility.post.js
- Verify if user qualifies for member pricing
- Returns: member status and circle information
POST purchase.post.js
- Complete ticket purchase with Helcim payment
- Validates availability, processes payment, creates registration
- Handles both free (member) and paid (public) tickets
POST reserve.post.js
- Temporarily reserve ticket during checkout
- Prevents overselling during payment processing
- 10-minute TTL on reservations
4. Frontend Components
EventTicketCard.vue
Reusable ticket display component showing:
- Ticket name and description
- Price with early bird indicator
- Member savings comparison
- Availability status
- Waitlist option when sold out
EventTicketPurchase.vue
Main ticket purchase flow component:
- Fetches ticket availability on load
- Displays appropriate ticket card
- Registration form (name, email)
- Integrated Helcim payment for paid tickets
- Success/error handling with toast notifications
- Shows "already registered" state
5. Enhanced Composable (app/composables/useHelcimPay.js)
Added initializeTicketPayment() method:
- Ticket-specific payment initialization
- Includes event metadata for tracking
- Uses email as customer code for one-time purchases
6. Updated Event Detail Page (app/pages/events/[id].vue)
- Detects if event has tickets enabled
- Shows new ticket system OR legacy registration form
- Maintains backward compatibility
- Handles ticket purchase success/error events
7. Enhanced Email Templates (server/utils/resend.js)
Updated registration confirmation emails to include:
- Ticket type (Member/Public)
- Amount paid
- Transaction ID
- "Member Benefit" callout for free member tickets
How It Works
Free Member Event Flow
1. Member views event → Sees "Free for Members" ticket
2. Fills in name/email → Click "Complete Registration"
3. System verifies membership → Creates registration
4. Sends confirmation email → Shows success message
Paid Public Event Flow
1. Public user views event → Sees ticket price
2. Fills in name/email → Clicks "Pay $XX.XX"
3. Helcim modal opens → User enters payment info
4. Payment processes → System creates registration
5. Sends confirmation with receipt → Shows success
Early Bird Pricing
- Before deadline: Shows early bird price + countdown
- After deadline: Automatically switches to regular price
- Calculated server-side for security
Configuration
Event Setup
To enable ticketing for an event, set in the event document:
{
tickets: {
enabled: true,
currency: "CAD",
member: {
available: true,
isFree: true, // or set price
name: "Member Ticket",
description: "Free for Ghost Guild members"
},
public: {
available: true,
price: 25.00,
quantity: 50, // or null for unlimited
earlyBirdPrice: 20.00,
earlyBirdDeadline: "2025-11-01T00:00:00Z",
name: "Public Ticket"
},
capacity: {
total: 75 // Total capacity across all ticket types
}
}
}
Circle-Specific Pricing Example
{
tickets: {
member: {
isFree: false, // Not free by default
price: 15.00, // Default member price
circleOverrides: {
community: {
isFree: true // Free for community circle
},
founder: {
price: 10.00 // Discounted for founders
},
practitioner: {
price: 5.00 // Heavily discounted for practitioners
}
}
}
}
}
Migration Strategy
Backward Compatibility
- Legacy
pricingfield still supported - Events without
tickets.enableduse old registration system - Existing registrations work with new system
Converting Events to New System
// Old format
{
pricing: {
isFree: false,
publicPrice: 25,
paymentRequired: true
}
}
// New format
{
tickets: {
enabled: true,
member: {
isFree: true
},
public: {
available: true,
price: 25
}
}
}
Testing Checklist
Member Ticket Flow
- Member can see free ticket
- Email pre-fills if logged in
- Registration completes without payment
- Confirmation email shows member benefit
- "Already registered" state shows correctly
Public Ticket Flow
- Public user sees correct price
- Helcim modal opens on submit
- Payment processes successfully
- Transaction ID saved to registration
- Confirmation email includes receipt
Early Bird Pricing
- Early bird price shows before deadline
- Countdown timer displays correctly
- Regular price shows after deadline
- Price calculation is server-side
Capacity Management
- Ticket count decrements on purchase
- Sold out message shows when full
- Waitlist option appears if enabled
- No overselling (test concurrent purchases)
Edge Cases
- Already registered users see status
- Cancelled events show cancellation message
- Past events don't allow registration
- Member-only events gate non-members
- Payment failures don't create registrations
Future Enhancements
Phase 2 Features
- Waitlist Notifications: Auto-email when spots open
- Refund Processing: Handle ticket cancellations with refunds
- Ticket Types: Multiple ticket tiers per event
- Group Tickets: Purchase multiple tickets at once
- Promo Codes: Discount code support
- Admin Dashboard: View sales, export attendee lists
Phase 3 Features
- Recurring Events: Auto-apply tickets to series
- Transfer Tickets: Allow users to transfer registrations
- PDF Tickets: Generate printable/QR code tickets
- Revenue Analytics: Track ticket sales and revenue
- Dynamic Pricing: Adjust prices based on demand
Files Created
server/utils/tickets.js(420 lines)server/api/events/[id]/tickets/available.get.js(150 lines)server/api/events/[id]/tickets/purchase.post.js(180 lines)server/api/events/[id]/tickets/check-eligibility.post.js(50 lines)server/api/events/[id]/tickets/reserve.post.js(80 lines)app/components/EventTicketCard.vue(195 lines)app/components/EventTicketPurchase.vue(330 lines)
Files Modified
server/models/event.js- Enhanced ticket schema + registration fieldsapp/pages/events/[id].vue- Integrated ticket UIapp/composables/useHelcimPay.js- Added ticket payment methodserver/utils/resend.js- Enhanced email with ticket info
Total Implementation
- ~1,400 lines of code across 11 files
- 4 new API endpoints
- 2 new Vue components
- 10+ utility functions
- Fully backward compatible
Support
For questions or issues:
- Check Helcim API docs: https://docs.helcim.com
- Review CLAUDE.md for project context
- Test in development with Helcim test credentials
Status: ✅ Implementation Complete Last Updated: 2025-10-14 Developer: Claude (Anthropic)