# Send announcements to your Mailgun lists without touching code

> Browse every mailing list, clean new subscribers before they land, and send with a test first and the recipient count right in front of you.

- Workflow type: app
- Services: Mailgun, Google Sheets
- Categories: Marketing, Operations
- Published: 2026-08-31

## What it does

- Shows every mailing list you have with its member count, and opens any one of them into a searchable member browser where you can add, edit and remove people inline, or start a brand new list.
- Pulls candidate subscribers from a Google Sheets tab, checks each address, and shows a preview split into deliverable, risky and undeliverable so only the addresses you approve get added, then writes each verdict back to the spreadsheet so your source stays clean.
- Lets you write a subject and body, send yourself a test first, then send to the list, with a confirm step that always names the list and how many people will receive it.
- Adds a Draft this announcement button that writes subject line options and body copy into the composer using your short brief and the list's recent send history, and never sends anything on its own.

## What you'll need

- A Mailgun account with at least one verified sending domain and your mailing lists set up there
- A Google account with access to the spreadsheet holding the subscribers you want to import
- An email address you want test sends delivered to before the real send goes out

## Prompt

I want an app my team opens to manage our Mailgun mailing lists and send announcements and updates to them, without touching code and without trusting a raw CSV import. It should cover four surfaces: a list overview, a member browser, an import panel backed by address validation, and a compose and send screen with a post-send monitor.

The landing view lists every mailing list on the account using Mailgun List Mailing Lists, showing each list's name, address, description, access level and member count. Clicking a list opens it. A Create Mailing List button on this view creates a new list from a name, address, description and access level using Create Mailing List. Use Get Mailing List to refresh a single list's header after members change so the member count on screen stays honest.

Opening a list shows a member browser backed by List Mailing List Members by Page, paginated rather than loading everything at once, with a search box that filters by address or name. Members can be managed inline: add a single person with Add Mailing List Member, edit a member's name, subscribed state or custom variables with Update Mailing List Member, and remove someone with Delete Mailing List Member behind a confirmation. Show the subscribed and unsubscribed state clearly, because an unsubscribed member still sits in the list.

An import panel pulls candidate subscribers out of a Google Sheets tab. The user gives a spreadsheet, a tab and a range, and the app reads it with Google Sheets Get Values, treats the first row as headers and lets the user map an email column plus an optional name column. Each address then runs through Mailgun Validate Single Address, and the results land in a preview table split into three buckets: deliverable, risky and undeliverable, using the validation result and risk fields, with the specific reason shown per row such as an unknown mailbox, a disposable domain or a role address. Every row has a checkbox with bucket level select all. Deliverable rows are ticked by default and undeliverable rows are not.

Only the approved rows get pushed into the list, using Add Multiple Mailing List Members (JSON) in batches of up to 1000 members. After the push, write the validation verdict and the date it was checked back to the source spreadsheet with Google Sheets Update Values, into a validation column alongside each source row, so the sheet stays clean and nobody re-imports the same bad addresses next month. Finish the import with a summary of how many were added, skipped and rejected.

A compose screen lets the user pick a list and write a subject and body, with both a plain text and an HTML body and a configurable from name and address. The user must send a test to themselves first using Mailgun Send Message, and only after that test has gone out does the real send to the list address unlock, also using Send Message. If the subject or body changes materially after the test, require a fresh test before the send unlocks again. The confirm step always names the list and shows the current recipient count for it, and needs an explicit confirmation, because sending to the wrong list is the one mistake that cannot be undone. Persist each draft's subject, body, selected list, test send timestamp and the returned message id so a send can be reopened later.

After the real send, a post-send panel polls Mailgun List Events for the sending domain, scoped to that send's message id and the window since it went out, and tallies delivered, opened, failed and bounced or complained counts so the user can watch them climb without leaving the app. Refresh it on a short interval with a manual refresh button too, and show the individual events in a table underneath. Keep past sends browsable so someone can reopen last week's announcement and see how it performed.

Add a Draft this announcement button in the composer that kicks off a background agent. The agent takes a short brief typed by the user plus the selected list, pulls that list's recent send history with List Events to see what subjects went out recently and how they were received, then drafts several subject line options and body copy in our voice and writes them back into the composer as an editable draft. The agent must never send: its job ends at filling the composer, and the human still runs the test send and clicks send.

Two things to bake in. Mailgun is keyed by sending domain, so let the user pick or configure which sending domain is used for Send Message and List Events. And Mailgun templates are out of scope here, so compose is a free-form subject and body written in the app rather than a stored template picker.

## How to customize

- Choose which spreadsheet tab and columns the import panel reads from, and which column the validation verdicts get written back into.
- Set who receives test sends, and whether editing the subject or body after a test forces a fresh test before the real send unlocks.
- Decide how the import preview treats risky addresses, either pre-approved with the rest or left unticked until someone opts them in.

## FAQ

### Can this send to the wrong list by accident?

That is the mistake the app is built to prevent. The real send button stays locked until you have sent yourself a test of that exact draft, and the confirm step always names the list and shows exactly how many people will receive it before you commit.

### Do I have to clean up my spreadsheet before importing subscribers?

No. The import panel checks every address for you and sorts them into deliverable, risky and undeliverable with a reason for each one. Nothing is added to the list until you tick the rows you approve.

### Does the drafting assistant ever send email on its own?

Never. It only writes subject line options and body copy into the composer for you to edit. Every send still requires a person to run a test and then click send.

### Can I use saved email templates?

Compose is a free-form subject and body you write in the app, so you can paste in your usual copy or have the assistant draft it, but there is no stored template picker.

### How do I know whether the announcement actually landed?

After a send, a panel keeps refreshing with delivered, opened, failed and bounced counts for that specific send, so you can watch the numbers climb without leaving the app or digging through reports.

Use this prompt in General Input: https://www.generalinput.com/prompts/send-announcements-to-your-mailgun-lists-without-touching-code