Email & Notifications
Emails are the closing punctuation on every flow: confirmations, receipts, reminders, warnings. They have to be reliable (90 %+ inboxing), fast (under 30 seconds of action), and branded (look like ABc, not a generic SaaS template).
What we send
| Trigger | To | Template | Channel |
|---|---|---|---|
| Sign-up | User | welcome_owner / welcome_public | |
| OTP request | User | otp_phone / otp_email | SMS / Email |
| Password reset | User | password_reset | |
| KYC submitted | Owner | kyc_submitted | |
| KYC approved / rejected | Owner | kyc_decision | |
| Property live | Owner | property_published | |
| Booking confirmed | Guest + Owner | booking_confirmed_guest, booking_confirmed_owner | Email + SMS |
| Payment received | Guest | payment_receipt (PDF attached) | |
| Balance due tomorrow | Guest | balance_due_tomorrow | Email + SMS |
| Pre-stay reminder T−1d | Guest | pre_stay_reminder | Email + SMS |
| Booking cancelled | Guest + Owner | booking_cancelled | |
| Refund processed | Guest | refund_processed | |
| Post-stay review request | Guest | review_request | |
| Team invite | Invitee | team_invite | |
| Login from new device | User | security_new_device | |
| OTA new booking | Owner | ota_booking_in | |
| OTA sync failed | Owner | ota_sync_failure | |
| Payout settled | Owner | payout_summary |
Confirmation email — preview
Template gallery — more previews
The same brand shell, different jobs. Each template has a hand-written plain-text fallback and is rendered in EN + HI based on the user's profile language.
Template engine
We use MJML as the authoring format and ship HTML + plain-text variants on every send. Each template has:
- Subject line (with variables, e.g.
Your stay at {{property.name}} is confirmed) - Pre-header (visible in the inbox preview)
- HTML body (responsive, branded)
- Plain text fallback
- Locale (English + Hindi initially)
- Test-render endpoint that fills with realistic sample data
Delivery pipeline
Provider — Postmark
| Why | Detail |
|---|---|
| Transactional focus | Built for receipts, OTPs & alerts — not marketing. Bounce/complaint thresholds suited to our use. |
| Separate streams | Transactional + broadcast streams kept apart so a marketing campaign can't drop our OTP deliverability. |
| Strong deliverability tools | SPF/DKIM/DMARC setup wizard, inbox-placement reports, bounce categorisation. |
| Webhooks back | delivery, bounce, complaint, open, click — feeds into our audit log. |
| Fallback | If Postmark down > 5 min, queue auto-fails over to SES with a different from-domain. |
SMS & WhatsApp
Email isn't enough in India — OTPs and last-minute alerts go by SMS, post-confirmation comms (richer media) go by WhatsApp.
SMS — MSG91 / Gupshup
DLT-registered headers, transactional templates for OTP + booking confirmation. Per-region pricing tracked.
V1WhatsApp Business API
Pre-approved templates for confirmation, balance reminder, pre-stay info. Guest must have opted in.
V1.1Push (mobile app)
FCM / APNs when the mobile app ships.
V2Failure modes & retries
| Outcome | What we do |
|---|---|
| Soft bounce | Retry after 30 min, 2 hr, 6 hr (3 attempts), then mark soft_bounced. |
| Hard bounce | Mark recipient email_blocked; alert user via SMS / in-app banner to update email. |
| Complaint (spam) | Auto-unsubscribe; flag for manual review. |
| Postmark down | Queue holds for 5 min then fails over to SES with alt from-domain. |
| SMS gateway 5xx | 3 retries with exponential backoff; alert on persistent failure for OTP traffic. |
Brand & tone
- Subject lines under 50 chars where possible. Lead with what changed, not the brand.
- Friendly but not flippant — "You're booked" rather than "🎉🎉🎉 BOOKING!!!!".
- Always include a one-line "what to do next" near the top.
- Hindi versions when the user's profile language is hi-IN; never auto-translate inline.
- Plain-text fallback is hand-written, not stripped HTML.
Compliance
- SPF, DKIM and DMARC configured on day one for the sending domain.
- Unsubscribe footer on every marketing email (transactional emails are exempt).
- DLT registration for all SMS sender IDs (Indian requirement).
- WhatsApp opt-in stored as a verifiable consent record.
- No personal data in email subject lines (privacy on shared phones).