Story 5.12: Newsletter Distribution - Wireframe
Epic: Epic 5 - Enhanced Organizer Workflows
Overview
This wireframe defines the organizer interface for distributing newsletters to event attendees. The system provides 3 pre-defined templates (topic announcement, speaker lineup, final agenda) with automated recipient list management.
Key Features:
- 3 pre-defined newsletter templates
- Recipient list pulled from event registrations + newsletter subscribers
- Preview functionality before sending
- Send status tracking (sent/pending)
- Send history log
MVP Scope:
- β AWS SES integration
- β 3 pre-defined templates
- β Pull recipients from registrations + newsletter subscribers
- β Track βsentβ status only
- β No template editor (Phase 2)
- β No open/click tracking (Phase 2)
Screen 1: Event Newsletter Management
Context: Accessed from Event Detail page β βCommunicationβ tab β βNewsletterβ section
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Event: Spring BATbern 2025 - Nachhaltiges Bauen β
β [Event Details] [Speakers] [Agenda] [Registrations] [Communication] β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Newsletter Distribution β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Send Progressive Newsletter β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Template Selection β β
β β β β
β β β Topic Announcement β β
β β Send when: Event created, topics finalized β β
β β Status: β Sent (2025-01-15, 142 recipients) β β
β β β β
β β β Speaker Lineup Announcement β β
β β Send when: Speakers confirmed (1 month before event) β β
β β Status: β§ Pending β β
β β Recipients: 156 (142 registered + 14 new subscribers) β β
β β β β
β β β Final Agenda β β
β β Send when: Agenda finalized (2 weeks before event) β β
β β Status: β§ Pending β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Selected Template: Speaker Lineup Announcement β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Preview β β
β β β β
β β Subject: Unsere Referenten fΓΌr Spring BATbern 2025 β β
β β β β
β β -------------------------------------------------------------- β β
β β β β
β β Liebe Architektinnen und Architekten, β β
β β β β
β β Wir freuen uns, die Referenten fΓΌr unser Spring BATbern 2025 β β
β β Event zum Thema "Nachhaltiges Bauen" bekannt zu geben: β β
β β β β
β β β’ Dr. Anna MΓΌller - Kreislaufwirtschaft im Bauwesen β β
β β β’ Prof. Thomas Schneider - CO2-neutrale Baustoffe β β
β β β’ Dipl.-Arch. Sarah Weber - Energieeffizienz in der Praxis β β
β β β β
β β Event Details: β β
β β Datum: 15. MΓ€rz 2025, 18:00 Uhr β β
β β Ort: Zunfthaus zur Zimmerleuten, Bern β β
β β β β
β β [Jetzt anmelden] β β
β β β β
β β Mit freundlichen GrΓΌssen, β β
β β BATbern Organisationsteam β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Recipients: 156 β
β β’ 142 from event registrations β
β β’ 14 from general newsletter subscribers β
β β
β [View Recipient List] [Send Newsletter] β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Newsletter History β
β β
β ββββββββββββββββ¬βββββββββββββββββββββββββββ¬βββββββββββββ¬βββββββββββ β
β β Date Sent β Template β Recipients β Status β β
β ββββββββββββββββΌβββββββββββββββββββββββββββΌβββββββββββββΌβββββββββββ€ β
β β 2025-01-15 β Topic Announcement β 142 β β Sent β β
β β 14:30 β β β β β
β ββββββββββββββββ΄βββββββββββββββββββββββββββ΄βββββββββββββ΄βββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Interactions:
-
Template Selection
- Radio button selection of one of 3 templates
- Clicking template shows preview
- Status indicator shows if already sent or pending
-
Preview
- Read-only preview of email content
- Subject line and body text displayed
- Template variables replaced with actual event data
-
Recipient List
- Click βView Recipient Listβ to see modal with all recipients
- Shows breakdown: registrations vs subscribers
-
Send Newsletter
- Click βSend Newsletterβ button
- Confirmation dialog appears
- After send, status updates to ββ Sentβ with timestamp and recipient count
-
Newsletter History
- Table shows all previously sent newsletters
- Timestamp, template name, recipient count, status
Screen 2: Recipient List Modal
Context: Clicked βView Recipient Listβ from Newsletter Management screen
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Newsletter Recipients [Close Γ] β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Template: Speaker Lineup Announcement β
β Total Recipients: 156 β
β β
β Source Breakdown: β
β β’ Event Registrations: 142 β
β β’ Newsletter Subscribers: 14 β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Search: [________________] [Filter βΌ] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β ββββββββββββββββββββββββββββββββ¬βββββββββββββ¬βββββββββββββββββββ β
β β β Email β Source β Registration ββ β
β β ββββββββββββββββββββββββββββββββΌβββββββββββββΌββββββββββββββββββ€β β
β β β mueller@architektur-ag.ch β Event Reg β 2025-01-10 ββ β
β β β schneider@bau-gmbh.ch β Event Reg β 2025-01-12 ββ β
β β β weber@planer.ch β Event Reg β 2025-01-08 ββ β
β β β info@batbern-partner.ch β Subscriber β 2024-11-20 ββ β
β β β ... β β ββ β
β β ββββββββββββββββββββββββββββββββ΄βββββββββββββ΄βββββββββββββββββββ β
β β β β
β β Showing 1-50 of 156 [Previous] [1] [2] [3] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β [Export CSV] [Close] β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Interactions:
- Search: Filter recipients by email address
- Filter: Dropdown to filter by source (Event Reg / Subscriber / All)
- Export CSV: Download recipient list as CSV
- Pagination: Navigate through recipient pages (50 per page)
- Close: Close modal and return to Newsletter Management screen
Screen 3: Send Confirmation Dialog
Context: Clicked βSend Newsletterβ button
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Confirm Newsletter Send [Close Γ] β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β You are about to send the following newsletter: β
β β
β Template: Speaker Lineup Announcement β
β Recipients: 156 (142 registered + 14 subscribers) β
β Event: Spring BATbern 2025 - Nachhaltiges Bauen β
β β
β Subject: Unsere Referenten fΓΌr Spring BATbern 2025 β
β β
β β This action cannot be undone. Newsletters will be sent immediately. β
β β
β [Cancel] [Send Newsletter] β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Interactions:
- Cancel: Close dialog without sending
- Send Newsletter:
- Triggers AWS SES send
- Shows loading spinner
- On success: Close dialog, show success toast, update status to ββ Sentβ
- On failure: Show error toast with retry option
Navigation Map
Event Detail Page
β
ββ Communication Tab
β β
β ββ Newsletter Section
β β β
β β ββ Template Selection (Screen 1)
β β β β
β β β ββ View Recipient List β Recipient List Modal (Screen 2)
β β β β
β β β ββ Send Newsletter β Send Confirmation Dialog (Screen 3)
β β β
β β ββ Newsletter History Table
β β
β ββ Other Communication Tools (Future)
API Requirements
GET /api/events/{eventId}/newsletters
Purpose: Retrieve newsletter status and history for an event
Response:
{
"eventId": "evt_12345",
"templates": [
{
"templateId": "tpl_topic_announcement",
"name": "Topic Announcement",
"status": "sent",
"sentAt": "2025-01-15T14:30:00Z",
"recipientCount": 142
},
{
"templateId": "tpl_speaker_lineup",
"name": "Speaker Lineup Announcement",
"status": "pending",
"recipientCount": 156
},
{
"templateId": "tpl_final_agenda",
"name": "Final Agenda",
"status": "pending",
"recipientCount": null
}
],
"history": [
{
"newsletterId": "nwsl_67890",
"templateId": "tpl_topic_announcement",
"sentAt": "2025-01-15T14:30:00Z",
"recipientCount": 142,
"status": "sent"
}
]
}
GET /api/events/{eventId}/newsletters/recipients
Purpose: Retrieve recipient list for newsletter
Query Parameters:
templateId(required): Template IDpage(optional): Page number (default: 1)limit(optional): Results per page (default: 50)source(optional): Filter by source (registration/subscriber/all)
Response:
{
"eventId": "evt_12345",
"templateId": "tpl_speaker_lineup",
"totalRecipients": 156,
"sourceBreakdown": {
"registrations": 142,
"subscribers": 14
},
"recipients": [
{
"email": "mueller@architektur-ag.ch",
"source": "registration",
"registeredAt": "2025-01-10T10:15:00Z"
},
{
"email": "schneider@bau-gmbh.ch",
"source": "registration",
"registeredAt": "2025-01-12T09:30:00Z"
},
{
"email": "info@batbern-partner.ch",
"source": "subscriber",
"subscribedAt": "2024-11-20T14:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 50,
"totalPages": 4
}
}
POST /api/events/{eventId}/newsletters/preview
Purpose: Generate newsletter preview with event data
Request:
{
"templateId": "tpl_speaker_lineup"
}
Response:
{
"templateId": "tpl_speaker_lineup",
"subject": "Unsere Referenten fΓΌr Spring BATbern 2025",
"bodyText": "Liebe Architektinnen und Architekten,\n\nWir freuen uns...",
"bodyHtml": "<html>...</html>"
}
POST /api/events/{eventId}/newsletters/send
Purpose: Send newsletter to recipients via AWS SES
Request:
{
"templateId": "tpl_speaker_lineup"
}
Response:
{
"newsletterId": "nwsl_67891",
"status": "sent",
"sentAt": "2025-02-15T10:45:00Z",
"recipientCount": 156,
"sesMessageId": "0100018d1234abcd-12345678-1234-1234-1234-123456789abc-000000"
}
Error Response (SES failure):
{
"error": "SEND_FAILED",
"message": "Failed to send newsletter via AWS SES",
"sesError": "MessageRejected: Email address is not verified."
}
Validation Rules
-
Template Selection
- At least one template must be selected before preview or send
- Cannot send same template twice (unless manual override by admin)
-
Recipient Count
- Must have at least 1 recipient to send newsletter
- Warning if recipient count < 10 (potential configuration issue)
-
Send Timing
- Topic Announcement: Can send anytime after event created
- Speaker Lineup: Can only send when >= 1 speaker confirmed
- Final Agenda: Can only send when agenda status = βfinalizedβ
-
AWS SES Integration
- Email domain must be verified in AWS SES
- Sender email must be verified
- Respect SES sending limits (14 emails/second in production)
Edge Cases
-
No Recipients
- Show warning: βNo recipients found. Ensure event has registrations or newsletter subscribers.β
- Disable βSend Newsletterβ button
-
SES Send Failure
- Show error toast with retry option
- Log failure to newsletter history with status βfailedβ
- Allow manual retry
-
Template Already Sent
- Show warning: βThis template was already sent on [date]. Send again?β
- Require confirmation to resend
-
Large Recipient List (>1000)
- Show warning: βSending to 1,234 recipients. This may take several minutes.β
- Implement batch sending to respect SES limits
-
Event Registration Changes After Preview
- Recalculate recipient count on send (not from cached preview)
- Show updated recipient count in confirmation dialog
Internationalization (i18n)
FROM MVP LAUNCH (Day 1):
Language Support
- Primary: German (de-CH) - Swiss German locale (default)
- Secondary: English (en-US)
- Language Selector: Header shows
π DE βΌ | ENfor language switching
UI Text Translation
All interface text translated in both languages:
- Newsletter template names
- Status indicators (Sent/Pending)
- Button labels (Send Newsletter, View Recipient List, Export CSV)
- Table headers (Date Sent, Template, Recipients, Status)
- Confirmation dialog text
- Success/error toast messages
Email Templates
- Bilingual AWS SES Templates: All 3 newsletter templates exist in both German and English
- Language Detection: Newsletter sent in recipientβs preferred language (from user profile
preferredLanguagefield) - Fallback: German (de-CH) if no preference set
- Template IDs:
newsletter_topic_announcement_de/newsletter_topic_announcement_ennewsletter_speaker_lineup_de/newsletter_speaker_lineup_ennewsletter_final_agenda_de/newsletter_final_agenda_en
Translation Keys
// Newsletter Management
newsletter.title = "Newsletter Distribution" | "Newsletter-Versand"
newsletter.template.topic = "Topic Announcement" | "ThemenankΓΌndigung"
newsletter.template.speakers = "Speaker Lineup Announcement" | "Referenten-Bekanntgabe"
newsletter.template.agenda = "Final Agenda" | "EndgΓΌltige Agenda"
newsletter.status.sent = "Sent" | "Gesendet"
newsletter.status.pending = "Pending" | "Ausstehend"
newsletter.recipients.total = "Recipients" | "EmpfΓ€nger"
newsletter.recipients.registrations = "from event registrations" | "aus Event-Registrierungen"
newsletter.recipients.subscribers = "from general newsletter subscribers" | "aus Newsletter-Abonnenten"
newsletter.button.send = "Send Newsletter" | "Newsletter senden"
newsletter.button.viewRecipients = "View Recipient List" | "EmpfΓ€ngerliste anzeigen"
newsletter.button.exportCsv = "Export CSV" | "CSV exportieren"
newsletter.confirm.title = "Confirm Newsletter Send" | "Newsletter-Versand bestΓ€tigen"
newsletter.confirm.message = "This action cannot be undone. Newsletters will be sent immediately." | "Diese Aktion kann nicht rΓΌckgΓ€ngig gemacht werden. Newsletter werden sofort versendet."
newsletter.success = "Newsletter sent successfully" | "Newsletter erfolgreich gesendet"
newsletter.error = "Failed to send newsletter" | "Fehler beim Senden des Newsletters"
Implementation
- Framework: react-i18next with i18next-browser-languagedetector
- Translation Files:
/locales/de/newsletter.json/locales/en/newsletter.json
- Dynamic Switching: Language change applies immediately without page reload
- Namespace:
newsletternamespace for all newsletter-related translations - Date Formatting: Use
date-fnswith locale support for βDate Sentβ column- German: β15.02.2025, 14:30β
- English: β02/15/2025, 2:30 PMβ
Recipient Language Preferences
- Per-Recipient Language: Each recipient receives newsletter in their preferred language
- Batch Sending: System sends newsletters in batches grouped by language
- Example: 100 German recipients β
newsletter_topic_announcement_de - Example: 42 English recipients β
newsletter_topic_announcement_en
- Example: 100 German recipients β
- Mixed Language Sends: Single βSend Newsletterβ action triggers multiple SES template sends
- Status Tracking: Newsletter history shows language breakdown:
- βSent to 100 (de), 42 (en)β
Future Enhancements (Phase 2)
- Template Editor: Visual template editor for custom newsletters
- Open/Click Tracking: Integration with AWS SES for open/click metrics
- A/B Testing: Send different subject lines to test engagement
- Scheduled Sends: Schedule newsletter for future send time
- Custom Recipient Lists: Manually select/exclude recipients
- Attachment Support: Attach PDFs (agenda, sponsor materials)
- French Support: Add French language option for bilingual Switzerland
Related Stories
- Story 5.1: Event Type Definition (defines when newsletters should be sent)
- Story 5.10: Progressive Publishing Engine (publishes content used in newsletters)
- Story 5.11: Agenda Finalization (triggers final agenda newsletter)
- Epic 2 Story 2.9: User Registration (provides newsletter subscribers)
- Epic 4 Story 4.6: Event Registration (provides event recipients)
Accessibility Notes
- All interactive elements must be keyboard accessible
- Screen reader support for status indicators (sent/pending)
- Color-blind safe status colors (use icons + text, not just color)
- Preview must be readable with screen readers
- Confirmation dialog must trap focus (cannot interact with background)
Responsive Behavior
- Desktop (>1024px): Full 2-column layout (preview on right)
- Tablet (768-1024px): Single column, preview below template selection
- Mobile (<768px): Stacked layout, preview as collapsible section