Every part of this was something we needed and could not find, so we wrote it down, argued about it, and shipped it as a default rather than an add-on.
Point the client at a throwaway workspace and let it fail loudly. Nothing you do in there reaches a real record.
We post to your endpoint the moment something moves — queued, started, finished, abandoned — with the payload that caused it.
Every call, its response and the time it took, kept in order and searchable, so a bug report is a link rather than a story.
A failed call backs off and comes round again on its own. You find out it happened from the log, not from a customer.
Opens, clicks and bounces land on the same timeline as the send, so a drop in one is visible next to whatever caused it.
Markdown, a template language or hand-written HTML — whichever you hand us comes out the other side intact.
Render a draft against a set of common clients and read it the way the recipient will, including the ones that ignore half your CSS.
Verify a sending domain once and everything leaves under your own name instead of a shared subdomain nobody trusts.