Service map
pdf-lib (PDF generation) and adm-zip (archive creation) run in-process and are not external services.Hosted infrastructure
Cloudflare R2 (file storage)
Stores uploaded files: employee size profile CSVs, order documents, and bulk import files.- Accessed through
@aws-sdk/client-s3against R2’s S3-compatible API - Credentials in
R2_ACCOUNT_ID,R2_ACCESS_KEY_ID,R2_SECRET_ACCESS_KEY,R2_BUCKET_NAME - No CDN or public access; all file access goes through the backend API
- No file size limits at the R2 level; the 20MB Express body limit is the practical ceiling
- No lifecycle policies; uploaded files persist indefinitely
Brevo (email delivery)
Delivers transactional email: staff invitations, password resets, order notifications.- The
EmailServiceinbackend/src/notifications/email.service.tshandles all sending - Production uses Brevo’s HTTPS REST API (
BREVO_API_KEY+BREVO_SENDER_EMAIL); development falls back to nodemailer SMTP (e.g. Gmail) - Brevo works on Render free because it uses HTTPS, not SMTP ports (25/465/587 are blocked on Render free)
- Requires authorizing Render’s egress IP in Brevo’s authorized-IP list
- Templates are defined in code; every attempt is recorded in the
EmailLogtable - No email queue; emails are sent during the request cycle (failures logged, never blocking)
- No delivery-status webhooks and no unsubscribe mechanism (transactional email only)