# Newsletter pre-flight and approval board for Mailjet sends

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

- Workflow type: app
- Services: Mailjet, Slack, General Input Database
- Categories: Marketing, Operations
- Published: 2026-08-31

## What it does

- Puts every newsletter on one board, grouped into in review, approved and already sent, so the team can see at a glance what is waiting on them.
- Opens each draft in a review pane showing the real email as subscribers will see it, side by side with how your recent sends to that same list performed and what people clicked.
- Runs a pre-flight check that reads the draft and flags long subject lines, broken or missing links, greetings that never got filled in, missing unsubscribe wording and spam-trap phrasing, as a pass or fail checklist with notes pointing at the exact text.
- Keeps approval locked until that check has run on the current version, then lets a reviewer send themselves a test copy, leave a comment, schedule the send for a date and time, or send it straight away.
- Announces every approval and change request in your marketing channel with the newsletter name and reviewer, and keeps a permanent record of who approved what and when.

## What you'll need

- A Mailjet account with newsletter drafts already built, plus your API key and secret key
- A Slack workspace and the channel where approvals should be announced
- The names of the people on your team who are allowed to approve a send
- Your house rules for a good newsletter, such as the subject line length you aim for and the words you avoid

## Prompt

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.

## How to customize

- Change the pre-flight rules: the subject line length you allow, the words you treat as spam triggers, and which findings are serious enough to demand an explanation before approval
- Pick the Slack channel that hears about approvals and how much detail each message carries
- Decide how many past sends to the same list appear in the review pane for comparison

## FAQ

### Do I write the newsletter inside this app?

No. Your marketers build drafts in Mailjet as usual. This is the screen where those drafts get read, checked, approved and sent, so nobody has to chase approvals in a spreadsheet or a Slack thread.

### What does the pre-flight check actually look at?

It reads the draft and checks the subject line length, missing or broken links, personalization greetings that were never filled in, missing unsubscribe wording, and phrasing that tends to trip spam filters. It writes back a pass or fail checklist with notes quoting the exact text it is unhappy about.

### Can someone approve a send without running the check?

No. The approve button stays locked until a check has been run on the current version of the draft. If the content changes afterwards the check is marked out of date and approval locks again.

### Can we schedule a send instead of firing it right away?

Yes. A reviewer can approve and pick the date and time for the send, or approve and send immediately. Both are recorded against the reviewer's name.

### Will we have a record of who signed off on each newsletter?

Yes. Every approval, change request and comment is stored by the app with the reviewer's name and a timestamp, so you can show months later exactly who cleared any given send.

Use this prompt in General Input: https://www.generalinput.com/prompts/newsletter-pre-flight-and-approval-board-for-mailjet-sends