Repository navigation
[Epic]: V1→V2 parity — Email Pipeline #673
Description
Domain epic under the V1→V2 feature-parity umbrella (#136). Full audit: 06-email.md (2026-07-18 parity audit, v1 prep/v180 vs v2 develop).
Summary: The most mature domain audited — 9 features fully working (compose modal, editable body, queued dispatch, templates CRUD, merge-tag engine). The gaps are specific and mechanical: PDF/uploads never attached, status transitions never applied on send, CC captured but crashes and is never actually sent, and the EmailTemplateType enum contains custom-field types instead of document types (blocking all typed-template work).
Cross-domain note: #400 (automatic email on recurring-invoice generation) is attached under the Recurring Invoices epic (#644) since it's fundamentally a recurring-invoice trigger; it depends on this domain's #526/#527/#529 plumbing and is cross-referenced here.
Sub-issues
- [Core]: Fix EmailTemplateType enum — document types, not field types #667 — Fix EmailTemplateType enum (document types, not field types) — blocks [Quotes]: Send quotes via email for client approval #164, [Invoices]: Send invoice reminders for overdue invoices #480, status-aware selection
- [Invoices]: Status-aware email template selection (default / paid / overdue) with template picker in the compose modal #668 — Status-aware email template selection
- [Core]: Expand email merge-tag catalogue to v1 parity (document, client, user, custom-field tags; single engine) #669 — Expand merge-tag catalogue to v1 parity, single engine
- [Core]: Honor "BCC all outgoing emails to admin" (send_all_emails_bcc) #670 — Honor "BCC all outgoing emails to admin"
- [Payments]: Implement the "Email receipt" payment action #671 — Implement the "Email receipt" payment action
- [Quotes]: Email the company when a quote is approved or rejected in the client portal #672 — Email company when a quote is approved/rejected (blocked by [Clients]: User Accounts for Customers (Client Portal) #392)
- [Core]: Add CC email addresses per client for invoice emails #394 — Per-client CC addresses (reopened — captured but crashes and never sent)
- [Invoices] Attach invoice PDF automatically when sending an invoice email #526 — Attach invoice PDF automatically when sending (improved)
- [Invoices] Change invoice status to "Sent" when emailed from Draft #529 — Change invoice status to "Sent" when emailed (improved)
- [Invoices] Create/update MailQueue record to log email delivery (timestamp, recipient, status) #527 — Create/update MailQueue record to log delivery (improved)
- [Quotes]: Send quotes via email for client approval #164 — Send quotes via email for client approval (improved)
- [Invoices]: Email Template Tags — add payment method variable #366 — Payment method email template variable (improved)
- [Invoices] Email action opens modal pre-filled with recipient, subject, and body from email template #522, [Invoices] Disable "Email Invoice" action with tooltip when customer has no email address #530, [Invoices] Handle invoice email send failures gracefully — show error notification, no status change #531, [Settings]: Email — Default Email Sender #266, [Settings]: Email — SMTP Configuration #265, [Core]: SMTP OAuth authentication (Microsoft 365 / Google) #378, [Invoices]: Send invoice reminders for overdue invoices #480, [Core]: Email template rendering issue with style tags #377, [Core]: Email CC types in Enum can be a method #606, [Clients] Creating/editing a client crashes -- email_cc TagsInput bypasses RelationService, hits nonexistent column #636 — already-adequate tracked issues
Specific
Reach email-pipeline feature parity with v1: PDF/upload attachment, correct status transitions on send, working per-client CC, a document-typed template system, and the full v1 merge-tag catalogue.
Measurable
All sub-issues closed; sending an invoice or quote email attaches the right files, transitions status correctly, applies all configured CC/BCC, and every v1-style merge tag renders.
Achievable
#667 (enum fix) unblocks the largest cluster (#164, #668, #400, #480); #526/#527/#529 are independent service-layer additions that #400/#164/#671 all reuse.
Relevant
Email is the primary delivery mechanism for invoices and quotes; today customers get body-text-only emails with no attachment, and CC configuration silently does nothing.
Time-Bound
#667 (enum): immediate, small. #526/#527/#529: 1 sprint. Remaining issues: 1-2 sprints after, several blocked on #392 (portal).
Activity