Newsletter pre-flight and approval board for Mailjet sends

By General Input

Every newsletter gets read, checked and signed off in one place, so nothing goes out with a broken link or a half-filled greeting.

Integrations

  • Mailjet
  • Slack
  • General Input Database

Type

App

Categories

  • Marketing
  • Operations

Build me a pre-flight and approval board for our Mailjet newsletters, where my marketing team reviews every campaign before it goes out. The app does not author or compose campaigns: marketers build drafts in Mailjet as usual, and this is the surface where those drafts get read, checked, signed off and sent. Today that ritual lives in a spreadsheet and a Slack thread because Mailjet has no reviewer role, and Mailjet's own campaign stats only exist after the send rather than before it.

The main view is a board of campaign drafts grouped by status into three columns: in review, approved, and sent. Pull the drafts with Mailjet List and retrieve campaign drafts, and get each one's sending state with Mailjet Get campaign draft delivery status. Important nuance: Mailjet itself only knows draft, programmed and sent. In review and approved are states this app owns, stored in its own database with General Input Database and keyed by the Mailjet campaign draft id, so a draft that Mailjet considers unsent can still be sitting in our approved column waiting for its scheduled time. Each card shows the draft name, the subject line, the target contact list, whether a pre-flight check has been run, and who it is waiting on.

Clicking a card opens a review pane. On the left, show the campaign as a subscriber will see it: the subject line and the rendered email body, read with Mailjet Get or set campaign draft content. Render the HTML part faithfully and fall back to the text part when there is no HTML. This app only reads content, it never writes campaign content back.

On the right of the review pane, show how the last few campaigns to that same contact list performed, so the reviewer has a sense of what normal looks like before approving. Use Mailjet Get aggregated statistics counters scoped to the contact list for delivered volume, open rate, click rate, unsubscribes and spam complaints, and Mailjet Get top clicked links to show what people actually clicked in those sends. Find the prior campaigns to compare against by filtering Mailjet List and retrieve campaign drafts on the same contact list and taking the most recent sent ones.

From the review pane a reviewer can do four things. Send themselves a test copy with Mailjet Send a campaign draft test, addressed to the signed-in reviewer's own email so nobody has to remember an address. Leave a comment, which the app stores against that draft in its own database with the author's name and a timestamp, shown as a running thread in the pane. Approve and schedule the send for a chosen date and time using Mailjet Manage a campaign draft schedule, with a date and time picker that makes the timezone explicit. Or approve and send right away with Mailjet Send a campaign draft immediately. There is also a request changes action, which moves the card back to in review and requires a comment explaining what needs fixing.

Add a "Run pre-flight check" button on the review pane that starts a background agent for that draft. The agent reads the draft with Mailjet Get or set campaign draft content and walks a fixed checklist: subject line length, flagging an empty subject or one long enough to be truncated in an inbox; links, flagging an email with no links at all, malformed URLs, and placeholder hrefs such as a bare hash or an example domain; unfilled personalization, flagging Mailjet personalization tokens left sitting in the body as literal text or resolving to nothing, which is how a newsletter goes out saying "Hi ,"; unsubscribe language, flagging a missing unsubscribe link or missing physical sender details; and spam-trigger wording, flagging shouted capitals, stacked exclamation marks and the classic trigger phrases. The agent writes a pass or fail checklist back into the app so it appears in the review pane: one line per check with its verdict, and specific line-level notes that quote the offending text rather than describing it vaguely, for example "link 3 points at example.com/placeholder" rather than "some links look wrong".

The approve action is blocked until a pre-flight check has been run on the current version of the draft. Store a fingerprint of the draft's subject and body at the moment each check runs. When the content changes afterwards, mark the existing check out of date, show "content changed since the last check" on the card, and lock approval again until it is re-run. A failing check is not an automatic hard block, because reviewers sometimes have a good reason: show the failures prominently and require the reviewer to leave a comment explaining the override before the approve action unlocks. The agent's verdict is advice, so it must never approve or schedule anything by itself.

Every approval and change request posts to our marketing channel with Slack Send a Message, carrying the draft name, the reviewer's name, and what happened: approved and scheduled for a specific date and time, approved and sent now, or changes requested with the comment quoted. Include the pre-flight verdict in the message. Make the channel a setting rather than hardcoding it.

Keep a clear audit trail. Write every state change to the app's own database: the draft id and name, the person who acted and their identity, the action taken, the timestamp, the pre-flight verdict at the time of approval, and the scheduled send time where there is one. Show that history as an activity list on the review pane, and show the approver's name and approval time on the card itself. These records need to survive independently of Mailjet so the team can answer "who cleared this" months later.

The people using this are marketing reviewers and the marketing manager who owns the sending account, not operators. Make the board scannable so someone can open it, see what is waiting on them, and work down the column. Refresh the delivery status and the comparison stats when the review pane opens so the numbers are current rather than a stale snapshot.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentWin back LiveChat visitors whose chats went unansweredA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsLiveKit live operations console for room moderationChat quality review board for LiveChat support leadsCompetitor LinkedIn ad watchlist with a permanent archiveLiveChat coverage board for planning next week's shiftsPhone routing control panel for LiveKit voice agentsA searchable RFP answer library your bid team drafts from