Architecture Overview
Location:app/clients/
Client Hierarchy
Provider Registry
Location:app/clients/__init__.py:26
SMS Providers
MMG Client
Location:app/clients/sms/mmg.py
app/clients/sms/mmg.py:8
Firetext Client
Similar structure to MMG:- International SMS support
- Separate API key for international
- Different response format
SMS Client Features
Location:app/clients/sms/__init__.py:24
Email Provider
AWS SES Client
Location:app/clients/email/aws_ses.py
app/clients/email/aws_ses.py:14
Letter Provider
DVLA Client
Location:app/clients/letter/dvla.py
Sends letters to DVLA print provider:
DvlaRetryableException- Temporary errors, retryDvlaThrottlingException- Rate limited, retry with backoffDvlaDuplicatePrintRequestException- Already sent (idempotent)
Provider Selection
Location:app/dao/provider_details_dao.py
Database Model
Selection Algorithm
- Filter by notification type
- Filter by active status
- Filter by international support (if needed)
- Sort by priority
- Return highest priority provider
Dynamic Provider Weights
Location:app/config.py:222
tend-providers-back-to-middle rebalances every 5 minutes.
Provider Callbacks
SMS Callbacks
MMG and Firetext POST delivery receipts to:/notifications/sms/mmg/notifications/sms/firetext
Email Callbacks
AWS SES sends SNS notifications to/notifications/email/ses:
- Delivery confirmations
- Bounces (permanent/temporary)
- Complaints
Letter Callbacks
DVLA sends status updates to signed callback URL:Delivery Flow
Location:app/delivery/send_to_providers.py
SMS Delivery
Email Delivery
Similar flow with additional:- HTML rendering
- Unsubscribe link injection
- Email file attachments
- Reply-to header
Letter Delivery
- Generate PDF from template
- Upload to S3
- Virus scan
- Send to DVLA with callback URL
Monitoring & Metrics
StatsD Metrics
Logging
Structured logging with provider context:Configuration
Environment Variables
Testing
Simulated Addresses
Related Files
app/clients/- Provider client implementationsapp/delivery/send_to_providers.py- Delivery orchestrationapp/dao/provider_details_dao.py- Provider selectionapp/celery/provider_tasks.py- Delivery tasks