- Shipped
- September 11, 2026 at 10:59 PM UTC
- Author
- Kamo
- Commit
- 1895c28
EmailService's CampaignDTO carries a campaign's counters flat (totalCount, sentCount, failedCount, suppressedCount, bouncedCount, queuedCount), but every screen here reads them as campaign.counts. Nothing mapped one to the other. The grid destructures c.counts for each row, so /marketing/email crashed with "Cannot destructure property 'total' of 't.counts' as it is undefined" as soon as an org had a single campaign, and the editor's `c.counts || ZERO_COUNTS` fallback meant it showed zero progress for every campaign. emailCampaignApi now normalizes at the boundary: toCampaign builds counts from the flat fields (a missing counter is 0, never undefined, and a counts object the server sends is kept), and the list and every call that returns a campaign go through it.