Campaigns
One email, one list. Merge in first names, companies and cities. Preview exactly what the next person receives before a single message moves.
Mail Monkey
Mailing so simple a monkey could do it
Connect the inbox you already use. Load a list, write one email, and Mail Monkey drips personalised copies out on a schedule you set. Replies land where they always did — in your inbox, from your name, on your domain.
Invite only while it's in testing. Sends straight from your own mailbox — no mail passes through anyone else.
One email, one list. Merge in first names, companies and cities. Preview exactly what the next person receives before a single message moves.
Chain second and third touches with your own delays and send times. Anyone who replies drops out automatically.
Up to ten emails without building anything. Same engine, same log, none of the setup.
OWNER and blanks become your fallback
greeting. MCDONALD becomes McDonald. Duplicates and bad addresses are dropped
on import.
Volume comes from adding inboxes, not pushing one harder. Pin a campaign to one address or spread it across all of them.
Every message logged with time, recipient, sender and result. Every campaign you've ever run, kept in your history.
Cold email has rules and consequences, and this tool doesn't hide them from you. Every message carries your physical address and an opt-out line, because CAN-SPAM requires both. Daily limits are enforced per mailbox, and the app tells you when you're pushing past what providers tolerate — the penalty for ignoring that isn't a bounced message, it's your mailbox getting restricted from sending anything at all.
Run every purchased list through a verifier before you import it. Stale lists bounce at 10–20%, and providers read that as a scraped list. It's the highest-value thing you can do, and it happens before this app ever sees the addresses.
Mail Monkey
Runs every campaign marked Running, across every connected mailbox.
Skips the sending window and the gaps between sends. Daily limits still apply - those are the ones protecting the mailbox.
The last 30 days.
Last 100 messages across all campaigns.
| Time | To | From | Subject | Result |
|---|---|---|---|---|
| Nothing yet. | ||||
Everything this account has done, newest first. Kept across sign-ins.
| When | What | Detail |
|---|---|---|
| Nothing yet. | ||
Every email Mail Monkey has sent from this account, as a spreadsheet. Leave the dates blank for all of it.
Every email Mail Monkey has actually sent from this account, with the exact text that went out — merge fields already filled in, the way the person received it. Click one to read it.
Nothing sent yet.
Every campaign this account has run, including finished ones.
| Campaign | Status | Sent | Replied | Failed | Started | Finished |
|---|---|---|---|---|---|---|
| No campaigns yet. | ||||||
Pick the one that matches the address you want to send from. Every click is spelled out. If a step doesn't match what you're seeing, stop there and say so — a wrong guess three steps back is what causes the confusing errors later.
You do this once per company, not per mailbox. Once it's done, every Outlook mailbox at your company connects in three clicks forever after.
Mail Monkey/oauth/callback
/oauth/callback on the end
matters. One character off and sign-in fails later with a vague error.You land on the Overview page. Two of the three are right there.
AADSTS50194.Mail Monkey → Add.abC8Q~xYz.9Kv_... — random, with
~ and . in it. Secret ID is a GUID, all dashes in
an 8-4-4-4-12 pattern. If it looks like a GUID, it's the wrong one.
email,
offline_access, openid, profile.Mail.Send — this is the one that
actually matters — and then User.Read.Mail.Read here. It's the permission
that lets Mail Monkey see replies arriving in a Microsoft mailbox, and it's tempting.
But unless you administer your own Microsoft 365, your company almost certainly won't
let you approve an app that reads mail — the sign-in stops dead on “Need
admin approval” and the mailbox then can't connect at all, so it can't send
either. Get the mailbox sending first. If you later want reply detection on it, an
administrator adds Mail.Read and clicks Grant admin consent, and you
tick Let Mail Monkey read replies in Settings.AADSTS50194 — tenant ID missing or not saved.AADSTS7000215 — you pasted the Secret ID instead of the secret Value.redirect_uri mismatch — the URI in Entra doesn't match exactly, or the
Public address field isn't empty.{{first_name}}, {{company}}, {{city}}.People you're working, separate from any campaign list. Set a follow-up date and Mail Monkey emails you a reminder from your own mailbox when it comes due.
No contacts yet.
Short answers you send over and over. They show up as buttons when you reply, and you can still change the wording before it goes.
People who wrote back. Every connected mailbox is checked automatically every five minutes — app-password mailboxes over IMAP, Microsoft sign-in mailboxes over Microsoft Graph — and anyone who replies is dropped from their sequence straight away.
Check everything I've sent goes back a year and looks at every address you have ever emailed, including finished campaigns. The automatic five-minute check only watches people in a campaign that is still running, so this is the one that catches a reply that arrived after a campaign wrapped up. Give it up to a minute per connected mailbox.
Make up whatever labels suit you — Interested, Called, Bad number, anything. Tick never email again and anyone you give that label is added to your opt-out list automatically.
Nothing yet.
Anything you want an email about later. Mail Monkey sends it to you from your own connected mailbox at the day and time you pick.
No reminders yet.
Everyone with an account on this install. You're the administrator because yours was the first account created.
Leave this off and anyone who finds the site can make an account. Turn it on before you put this on a public domain.
Makes the account yourself and hands them the password — no sign-up form, no waiting for approval. Use Free for the people you're letting in for nothing; you can move anyone between plans later without touching their data.
With a password: you pick it and pass it on yourself — it's shown here once and never again. With an invite: they get an email and choose their own, and you never handle it. The invite link lasts seven days.
Everything — accounts, campaigns, contacts, opt-out lists — lives in one file. A copy is taken automatically once a day and the last 14 are kept. Use the button to grab one now and put it somewhere other than this computer.
Failed sends and inbox problems across every account, newest first.
| When | Account | Mailbox | What | Detail |
|---|---|---|---|---|
| Nothing yet. | ||||
Where the Pay again button sends someone whose payment failed — your Stripe or PayPal link. Leave it blank and they're told to contact you instead.
Point an uptime monitor at /api/health — it reports a failure if the sending engine stops, not just if the site goes down.
| Account | Plan | Joined | Last seen | Mailboxes | Campaigns | Sent | Status | |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
Three ways to do it. Pick whichever matches the job — they all use the same mailboxes, the same opt-out list and the same log.
One to 10 emails without building a campaign. Same engine, same log, same opt-out list — just none of the setup.
Emails send from this account, and replies land in it. Pick where your email lives.
Appended to every email. The address is a legal requirement.
The moment a reply is spotted, Mail Monkey emails you from the same mailbox it arrived in, so it lands in the inbox you already watch.
The subject reads YOU RECEIVED A RESPONSE FROM (their name), and the body has who it was, the subject line, and which mailbox it came into. Alerts arrive within about five minutes of the reply, because that is how often the inbox is checked. Bounces and out-of-office autoreplies are filed but never alerted on.
When someone writes back, send them an instant holding reply so they know it landed. Off unless you switch it on.
Your signature is added underneath. Three rules are built in and can't be switched off, because they're what stops an auto-responder wrecking a mailbox: one per person, ever (not one per email), never to a robot (bounces and out-of-office replies are ignored, so two auto-responders can't sit there emailing each other), and never to anyone on your opt-out list.
Added to the bottom of every email, above the address and opt-out line. Links and images are allowed.
From your app registration in the Microsoft Entra admin center. Without these, "Sign in with Microsoft" can't work.
/oauth/callback
Off by default — Mail Monkey sends whenever it has something queued. Switch this on and it only sends during the hours and days you pick. A business email arriving at 3am reads as a machine, which is the impression you're trying to avoid.
Put your own addresses here and they get added to every campaign you start, mixed in with everyone else. You receive the same emails your list does, so you can see whether they're landing in the inbox or the spam folder. A Gmail and an Outlook address tell you the most.
Puts a one-click Unsubscribe link at the bottom of every campaign email. Anyone who clicks it lands on a confirmation page, and the moment they confirm, their address drops into the opt-out list below — nothing queued for them goes out, and no future campaign picks them up.
Skipped permanently, across every campaign and every future import. People who click the unsubscribe link land here on their own; you can also add addresses by hand, one per line.
| Address | Why | When | |
|---|---|---|---|
| Nobody yet. | |||
Nothing has been deleted. Your campaigns, contacts and mailboxes are exactly where you left them — but until this is sorted, sending runs at the free rate of 15 emails a day from one mailbox.
What they wrote
The oldest record is kept. Anything blank on it is filled in from the others, and every note is kept — nothing is thrown away except the duplicate rows. This can't be undone.
You set a follow-up date for this contact.