Mailing so simple a monkey could do it

Outreach that sends from your mailbox.

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.

1email you write
personalised copies
0middlemen touching your mail
1sminimum gap — you set the pace
From your mailboxNot a shared sending service. Recipients see your address, and replies come straight back to you.
Paced like a personYou set the seconds between sends. Nothing goes out in a burst unless you deliberately ask it to.
Opt-outs are permanentOnce someone asks out they're out — across every campaign and every list you ever import again.

What's inside

Campaigns

One email, one list. Merge in first names, companies and cities. Preview exactly what the next person receives before a single message moves.

Follow-up sequences

Chain second and third touches with your own delays and send times. Anyone who replies drops out automatically.

Quick send

Up to ten emails without building anything. Same engine, same log, none of the setup.

Messy list cleanup

OWNER and blanks become your fallback greeting. MCDONALD becomes McDonald. Duplicates and bad addresses are dropped on import.

Several mailboxes

Volume comes from adding inboxes, not pushing one harder. Pin a campaign to one address or spread it across all of them.

A real record

Every message logged with time, recipient, sender and result. Every campaign you've ever run, kept in your history.

Three steps to your first send

  1. Make an accountEmail and a password. Your mailboxes, campaigns and history live inside it and nobody else's account can see them.
  2. Connect a mailboxOutlook through Microsoft sign-in, or Gmail with an app password. There's a step-by-step guide inside for both.
  3. Write one email and goDrop in a list or type a few names. Preview it, set the pacing, start sending.

Worth knowing before you start

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
Loading…
0sent today — click to read them
0today's capacity
0queued
0mailboxes — click to manage
0opted out — click to see the list

Sending engine

Runs every campaign marked Running, across every connected mailbox.

Send now

Skips the sending window and the gaps between sends. Daily limits still apply - those are the ones protecting the mailbox.

Sends per day

The last 30 days.

today

Recent activity

Last 100 messages across all campaigns.

TimeToFromSubjectResult
Nothing yet.

Account history

Everything this account has done, newest first. Kept across sign-ins.

WhenWhatDetail
Nothing yet.

Download your send log

Every email Mail Monkey has sent from this account, as a spreadsheet. Leave the dates blank for all of it.

Sent mail

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.

Past campaigns

Every campaign this account has run, including finished ones.

CampaignStatusSentReplied FailedStartedFinished
No campaigns yet.

Connecting a mailbox — the whole thing, step by step

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.

Outlook — one-time setup

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.

Microsoft requires this. There is no way to send through an Outlook account without registering the app first — it's the thing that tells Microsoft "this program is allowed to send mail as this person."

Stage 1 — register the app

  1. Go to entra.microsoft.com and sign in with the work account you want to send from. Not a personal Microsoft account.
  2. In the left sidebar: Entra IDApp registrations+ New registration.
    Don't see App registrations, or it errors? Your company has locked it down. Stop here — you need someone with admin rights. Ask them for: "an app registration with delegated Mail.Send permission so I can run our outreach tool." It takes them five minutes.
  3. Name: type Mail Monkey
  4. Supported account types: leave the first option — Accounts in this organizational directory only.
    Do not pick a multi-tenant option. Single tenant is correct for a tool only your company uses.
  5. Redirect URI: change the dropdown from Select a platform to Web, then paste exactly:
    /oauth/callback
    The /oauth/callback on the end matters. One character off and sign-in fails later with a vague error.
  6. Click Register.

Stage 2 — collect three values

You land on the Overview page. Two of the three are right there.

  1. Application (client) ID — near the top of Overview. Long string with dashes. Copy it.
  2. Directory (tenant) ID — directly underneath it. Also copy it.
    This one is not optional. Without it Microsoft rejects sign-in with AADSTS50194.
  3. Left menu → Certificates & secrets+ New client secret → description Mail MonkeyAdd.
  4. Copy the Value column. Not Secret ID.
    Two columns appear and it is easy to grab the wrong one. Value looks like 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.

    Microsoft shows the Value once and never again. Miss it and you just make another secret.

Stage 3 — permissions

  1. Left menu → API permissions+ Add a permissionMicrosoft GraphDelegated permissions.
  2. Tick all four under OpenId permissions: email, offline_access, openid, profile.
  3. Use the search box to find and tick Mail.Send — this is the one that actually matters — and then User.Read.
  4. Add permissions. You should end up with six listed.
Don't add 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.

Stage 4 — put them in Mail Monkey

  1. Settings → the Microsoft application card.
  2. Paste the Application (client) ID, the client secret Value, and the Directory (tenant) ID.
  3. Public address of this site — see the note below.
  4. Click Save inside that card. Each Settings card has its own Save button.
  5. MailboxesSign in with Microsoft → approve the consent screen.
If something goes wrong
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.
Needs admin approval — your company requires an admin to approve third-party apps once. After they do, everyone can connect.

After a mailbox is connected

  1. Settings → your business address. Required — a campaign will not start without one, because CAN-SPAM requires a physical address on every commercial email.
  2. Settings → Signature. Optional. Links and images work.
  3. Campaigns → create one, drop in a CSV or type contacts by hand.
  4. Write the subject and body. Click the chips to insert {{first_name}}, {{company}}, {{city}}.
  5. Preview. This is the step people skip. It shows the exact From address and exactly what the next person receives — it's where you catch "Hi , I saw over in" because a column didn't map.
  6. Set the pacing — seconds between emails — and a start time if you want one.
  7. Start this campaign, then Dashboard → Start sending.

Contacts

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.

Quick replies

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.

Replies

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.

Your labels

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.

Reminders

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.

Administrator

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.

Add a user

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.

Backups

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.

Things that went wrong

Failed sends and inbox problems across every account, newest first.

WhenAccountMailboxWhat Detail
Nothing yet.

Payments

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.

AccountPlanJoinedLast seen MailboxesCampaignsSentStatus
Loading…

What are you sending?

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.

Quick send

One to 10 emails without building a campaign. Same engine, same log, same opt-out list — just none of the setup.

Connect a mailbox

Emails send from this account, and replies land in it. Pick where your email lives.

More volume comes from more mailboxes, not a higher rate per mailbox. Two inboxes at 100/day each are far safer than one at 200 — reputation damage stays contained instead of taking out your whole sending capacity.

Your business details

Appended to every email. The address is a legal requirement.

Tell me when someone replies

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.

Auto-reply

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.

Signature

Added to the bottom of every email, above the address and opt-out line. Links and images are allowed.

Images are embedded in the message itself, so they work without hosting anything - but many clients block images until the reader clicks "show images", and a heavy logo on a first cold email reads as marketing. Plain text and a link tends to land better.

Microsoft application

From your app registration in the Microsoft Entra admin center. Without these, "Sign in with Microsoft" can't work.

A single-tenant app registration must have this. Without it Microsoft answers AADSTS50194 and refuses the sign-in.
/oauth/callback
Set this once and never again. It is built from the address above, so as long as you always reach Mail Monkey at your own domain, this line never changes — not if the server moves, not if you change hosts.
Leave this off unless you administer your own Microsoft 365. It asks Microsoft for permission to read the inbox, which is what makes reply detection, reply alerts and auto-reply work on a Microsoft mailbox — but most companies do not let an ordinary employee approve an app that reads mail. If yours doesn't, the sign-in stops on “Need admin approval” and the mailbox can't connect at all, which means it can't send either.

To turn it on: an administrator adds Mail.Read under API permissions in the Microsoft Entra admin center and clicks Grant admin consent. Then tick this, disconnect the mailbox and connect it again. Gmail app-password mailboxes ignore this setting entirely — their replies are read over IMAP and always have been.

When emails go out

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.

minutes — applies to new campaigns

Send yourself a copy

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.

Unsubscribe link

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.

Opt-out list

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.

Who's opted out

AddressWhyWhen
Nobody yet.