The confirmation email is the very first message a fighter receives after registering — it sets the tone for their entire experience.
Fighters immediately know their registration was received and their payment processed. No uncertainty, no follow-up questions to your team.
Each fighter gets a unique QR code in their confirmation email for fast check-in at the event. No printed lists, no manual look-ups.
Use your own logo, sanctioning branding, rules links, and custom messaging. Make it feel like it came from your organization, not a generic platform.
From creating the template to the fighter's inbox.
CustomConfirmationEmails.tsxsanctioning_bodies doc
EditEventForm.tsxRegistrationNew.tsxsendFighterConfirmationEmail()Confirmation email templates can be configured at two levels, each serving a different workflow.
Where: Sanctioning Page → "Confirmation Email" button
Component: CustomConfirmationEmails.tsx
Saves to: sanctioning_bodies/{id}.emailConfirmationHTML
Use case: Set one master template that all events under this sanctioning body inherit. The HTML is written to the sanctioning body document in Firestore. When a new event is created, it can pull this template.
Features:
Where: Edit Event Form → "Email Template" section
Component: EditEventForm.tsx → embeds CustomConfirmationEmails
Saves to: events/{id}.emailConfirmationHTML
Use case: Override the sanctioning-level template for a specific event. Useful for events with special messaging, different branding, or unique registration fields.
Features:
Priority order: When a fighter registers, the system checks: Does the event have emailConfirmationHTML? Use it. Otherwise, is this a PMT event? Use the PMT template. Otherwise, generate a default template from the fighter data.
What the fighter sees in their inbox after registering.
Your registration has been successfully processed.
Event: {{eventName}}
Fighter ID: {{fighterId}}
Present at event for quick check-in
Hello Fighter Name,
Your registration for Event Name has been successfully processed!
Quick check-in at the event
Only shows fields the fighter actually provided (gym, gender, age, weight, height, phone, coach, etc.)
Use these placeholders in your custom HTML template. They are automatically replaced with actual fighter data when the email is sent.
| Placeholder | Replaced With | Category |
|---|---|---|
| {{firstName}} | Fighter's first name | Essential |
| {{lastName}} | Fighter's last name | Essential |
| {{email}} | Fighter's email address | Essential |
| {{eventName}} | Event name | Event |
| {{eventId}} | Event ID | Event |
| {{fighterId}} | Fighter's unique ID | Event |
| {{qrCode}} | QR code image URL | Event |
| {{gym}} | Fighter's gym name | Form |
| {{gender}} | Fighter's gender | Form |
| {{age}} | Fighter's age | Form |
| {{dob}} | Date of birth | Form |
| {{weightClass}} | Weight class | Form |
| {{heightFoot}} | Height (feet) | Form |
| {{heightInch}} | Height (inches) | Form |
| {{phone}} | Fighter's phone | Form |
| {{coach}} | Coach name | Form |
| {{coachPhone}} | Coach phone | Form |
| {{city}} | Fighter's city | Form |
| {{state}} | Fighter's state | Form |
| {{customFieldKey}} | Any custom field from your registration form | Custom |
Dynamic custom fields: When you create a custom registration form with CreateRegistrationForm, every field with a fieldKey automatically becomes an available placeholder. The editor detects these and shows them as clickable copy buttons.
Create a master confirmation email template for all your events.
Go to /sanctioning/[sanctioningId]. You must be logged in as an admin or sanctioning body member.
This opens the CustomConfirmationEmails dialog with the HTML editor and preview tabs.
Use the HTML editor tab. Insert placeholders from the sidebar. Or click "Use Default Template" to get a starter template with all available fields.
Switch to the Preview tab to see the email rendered with sample data (John Doe, Champions MMA, etc.).
Click Save. The HTML is written to sanctioning_bodies/{id}.emailConfirmationHTML in Firestore.
Override the confirmation email for a specific event.
Navigate to your event page and click Edit to open the EditEventForm.
Scroll to the email section in the form. It shows whether a custom template or default is active.
This embeds the same CustomConfirmationEmails component, but in context="event" mode. It's aware of the event's custom registration fields, so dynamic placeholders are generated.
Use placeholders. Custom registration fields (select, checkbox-group, text, etc.) automatically appear as available placeholders.
When you save the event form, the emailConfirmationHTML is saved alongside all other event data in a single API call.
PMT events: For PMT-sanctioned events, the email template section shows a read-only preview of the standard PMT template. PMT templates are hardcoded and cannot be customized per-event because they include mandatory elements (rules link, refund policy).
The complete sequence inside handleRegistrationSubmit().
RegistrationNew.tsxThe system selects the right template automatically based on what's configured.
When: emailConfirmationHTML exists on the event document.
Source: Created via the HTML editor in CustomConfirmationEmails.
How: All {{placeholders}} are replaced with actual fighter data, including custom registration fields. Unreplaced placeholders are stripped.
When: No custom HTML, but sanctioning is PMT.
Source: Hardcoded in generatePMTConfirmationEmail().
Includes: PMT logo, competition rules link, QR code, registration details, refund policy.
When: No custom HTML and not PMT.
Source: generateDefaultConfirmationEmail().
Features: Auto-generated from available fighter data. Only includes fields that have values. Supports English and Spanish (locale).
The "from" address changes based on the sanctioning body.
| Sanctioning | Sender Name | Sender Email |
|---|---|---|
| PMT | Point Muay Thai | info@pointmuaythaica.com |
| PBSC | Point Boxing Sparring Circuit | borntowincsc@gmail.com |
| All Others | TechBouts | techbouts@nakmuay.foundation |
Built-in Spanish support for the registration flow and confirmation emails.
When eventData.locale === 'es', all form labels, validation messages, success/error alerts, and payment instructions switch to Spanish.
Currency also converts to MXN with live exchange rates.
The default template auto-generates in Spanish: greeting, intro, field labels, and closing text all switch based on locale.
Custom HTML templates are language-agnostic — whatever you write is what gets sent.
What happens when things go wrong — payment taken but registration fails.
failed_registrations/{paymentIntentId}Error categorization: The categorizeAndFormatError() function classifies errors into user-friendly messages: payment failed, network error, server error, Stripe error, timeout, or validation error. Each has localized messages in English and Spanish.
Files and their roles in the confirmation email system.
When a custom template is NOT set, a separate notification is sent to the promoter.
The sendPromoterNotificationEmail flag in RegistrationNew.tsx controls this:
sendPromoterNotificationEmail: !eventData.emailConfirmationHTML
Logic: If the event has a custom email template, the promoter is assumed to have their own notification system. If there's no custom template, the system sends a separate email to all promoterEmails with the fighter's registration details (name, weight, gym, gender, DOB, age, height, phone, coach).
Endpoint: POST /api/emails/promoterNotificationEmail