Mailroom.
How it works.

Personalized bulk email from your own Gmail. Upload a CSV, write one email with merge tags, and every recipient gets their own tailored copy.


App bulk-gmail.vercel.app

Sign in One-click Google OAuth — any Gmail works (personal or Workspace)

Daily cap 500 free / 2000 Workspace

SendTest, schedule, or send now — with open tracking + unsubscribe footer

Part 1 — Getting started

Sign in, see your dashboard, connect Gmails

01
Mailroom
Sign in
Continue with Google

Sign in with Google

Any Gmail works — personal @gmail.com or Google Workspace.

Open bulk-gmail.vercel.app and click Continue with Google. The same click creates your account AND grants permission to send from your Gmail. Zero setup.

  1. Click Get started with Google on the landing page
  2. Pick your Google account in Google’s popup
  3. First time: you’ll see an “unverified app” screen — click Advanced → Go to Mailroom → Continue. You only do this once, ever
  4. Grant permission to send email on your behalf
02

First time? Trust the scary screen.

Google flags Mailroom as “unverified” on first sign-in. It’s safe — here’s why, and what to click.

Step 1
Choose an account
to continue to Mailroom
A
Aneeka Ishaq
aneeka@yourbiz.com
A
Personal
aneeka@gmail.com
+
Use another account
Pick the Gmail you want to send from.
Step 2 · the scary one
!
App not verified
Mailroom hasn’t finished Google’s review yet. Don’t worry — it’s the same app you just opened.
Back to safety
Click “Advanced”— not “Back to safety”.
Step 3
App not verified
Continue only if you know and trust the developer.
Continue
Click Go to MailroomContinue.
why does this happen?
Google requires “sensitive scope” verification for any app that can send Gmail on your behalf. Verification is a multi-week security review. Mailroom hasn’t been through it yet, so Google shows the warning. The app, the OAuth client, and the code are all the same either way — verification is paperwork, not a security upgrade. You only see the screen once per Google account.
03
Connected Gmail accounts+ Add Gmail
you@company.com
Daily cap: 2000 · Workspace
Your projects+ New project
No projects yet

Your private dashboard

Only you see your Gmails and projects.

You land on a dashboard that’s scoped entirely to you. Every user has their own — nobody sees anyone else’s Gmails, projects, or recipients. Isolation is enforced at the database level.

  1. Your primary Gmail is already connected — shown at the top
  2. Use + Add Gmail to connect more inboxes (send from any of them per project)
  3. Use + New project to start a campaign

Part 2 — Build a campaign

One project = one email send

04
New project
Project name
Summit follow-up
Send from
you@company.com ▾
Create project

Create a project

One campaign = one project.

Name it something you’ll recognize later (e.g. Summit follow-up, Q2 prospects, May newsletter).

  1. Enter a project name
  2. Pick which Gmail to send from (if you have multiple connected)
  3. Click Create project → you go straight to the builder
05
email
first_name
company
sara.khan@acmegroup.com
Sara
Acme Group
tom.rivera@northbay.io
Tom
Northbay
priya@lumenhealth.co
Priya
Lumen Health
james@brightbank.com
James
Brightbank

Prepare your CSV

Any spreadsheet saved as .csv works.

Export from Excel / Google Sheets / Numbers using File → Save As → .csv.

  1. Required: one column named email
  2. Optional: any other columns — they become merge tags
  3. Column names become tags — first_name{{first_name}}
  4. Rows with a blank or missing email are automatically skipped
06
1. Upload recipients
summit-list.csv ✓
4 recipients loaded(email column: email)
Available merge tags: {{email}} {{first_name}} {{company}}

Upload to the project

Drag + drop or click to select.

Mailroom parses the CSV in your browser — your recipient list never leaves your device until you click Send.

  1. Click the file picker in step 1 of the builder
  2. Pick your .csv file
  3. See the count of loaded recipients and the available merge tags
07
2. Compose
Subject
Quick intro — {{first_name}}
Body
Hi {{first_name}}, Saw what {{company}} is doing in the space — impressive. Got 15 mins this week? Best, You

Write your email

Drop merge tags wherever you want personalization.

Write like a normal email. Anywhere you want the recipient’s data, type {{column_name}}. When we send, each person gets their own version — Sara sees “Hi Sara” and “Acme Group”, Tom sees “Hi Tom” and “Northbay”.

  1. Use any {{tag}} matching a CSV column
  2. Unknown tags are flagged in red — fix before sending
  3. Plaintext body by default; you can paste simple HTML if needed
08
Insert template
Cold outreach v3
Quick favor, {{first_name}}?
Newsletter — May
5 things from this week at {{company}}
Re-engagement
Still around, {{first_name}}?
+ Save as template

Saved templates

Stop rewriting your “Hi {{first_name}}” opener.

Save any subject + body as a named template. Next time you start a project, click Insert template and pick one to drop straight into the compose fields.

  1. Compose an email you like, click Save as template, give it a name
  2. On any future project, click Insert template to apply it
  3. Templates are private to you — no shared library
09
Preview for sara.khan@acmegroup.com (1/4)

Subject: Quick intro — Sara

Hi Sara,

Saw what Acme Group is doing
in the space — impressive.

Got 15 mins this week?

Best,
You

Preview every recipient

See exactly what each person will get.

Use ← → to flip through every recipient. Catch typos or weird merges (e.g. a missing first_name) before a single email goes out.

  1. First recipient previews automatically when you upload
  2. Arrow through the list to spot-check
  3. Red highlighting on unknown tags means something won’t render
10
Send test to me

Subject: [TEST] Quick intro — Sara

Hi Sara,

Saw what Acme Group is doing
in the space — impressive.

Got 15 mins this week?

Best,
You

—
Sent from you@company.com.
Unsubscribe.

✓ Test sent to you@company.com

Test send to yourself

Catch the typo before 1,000 inboxes do.

Click Send test to me. Mailroom uses the first row in your CSV as the merge sample, prepends [TEST]to the subject, and sends one copy to your own Gmail. Reply, forward, or just stare at it — whatever you’d do with the real thing.

  1. Goes to your signed-in Google account’s email
  2. Doesn’t count against your CSV (still pending)
  3. Includes the unsubscribe footer + tracking pixel, just like the real send
11
4. Send

Daily cap: 2000 · Used today: 12 · Remaining: 1988

Ready to send 4 personalized emails.

Send 4 emails

3 sent · 0 failed

Send

Live progress, per-recipient status.

Click Send. A progress bar fills as each email flies out. Emails go out from your Gmail — recipients see your name and your email, not Mailroom. Replies come back to your normal inbox.

  1. Quota check runs first — if your list is too big, we warn you upfront
  2. Each send is spaced ~300ms to stay under Gmail’s per-second rate limit
  3. If any recipient fails (bad address, etc.), you see a failure count + details
12
Or schedule for later
When
Tomorrow at 09:00
Schedule send

Scheduled to send at Tue, 9:00 AM.

Schedule for later

Queue a send for the time your audience is awake.

Pick a date and time, click Schedule send. The project flips to Scheduledand shows up in the dashboard’s Scheduled tab. A cron job runs every five minutes; the moment your scheduled time passes, it locks the project and runs the same send pipeline (suppression list, tracking, footer included).

  1. Pick the local date + time below the Send button
  2. Project status becomes scheduled until it fires
  3. Edit the subject/body until it sends — saved drafts are picked up
  4. Cancel by switching back to Send now on the project page
13
Live activity
Sara Khan opened
2 minutes ago · 2nd time
Tom Rivera opened
5 minutes ago
Priya Singh delivered
8 minutes ago

Open tracking

A tiny pixel tells you who opened.

Every HTML send includes a 1×1 transparent tracking pixel signed with an HMAC. When a recipient’s mail client loads images, Mailroom records the first open and counts every subsequent one.

  1. First open sets opened_at on the recipient row
  2. Every reload increments open_count
  3. Some clients (Apple Mail Privacy Protection, Gmail proxy fetches) trigger the pixel pre-emptively — treat opens as a signal, not gospel
  4. Plaintext-only email clients won’t fire the pixel at all — that’s expected
14

Hi Sara, ...


Sent from you@company.com. Unsubscribe.

Click → permanent suppression. Future projects skip this email automatically.

Unsubscribe & suppression list

One-click out, and they stay out forever.

Every send (real and test) carries a one-click unsubscribe footer in plain text and HTML. The link is HMAC-signed so it can’t be guessed or forged. When a recipient clicks it, Mailroom adds them to your private suppression list, and every future send across any project skips them automatically.

  1. Footer auto-appended — no opt-in required, on by default per project
  2. Suppression list is per-user (your unsubscribes don’t affect other Mailroom users)
  3. Skipped recipients show up as skipped in the project results
  4. Their row stays in the project so you can audit who got what

Part 3 — Details

Limits, privacy, and FAQ

15

Gmail’s daily limits

These are Google’s rules, not ours.

Free Gmail (@gmail.com)

Up to 500 emails per 24 hours. Mailroom defaults to this cap.

Google Workspace

Up to 2,000 per 24 hours. Auto-detected when you connect a Workspace Gmail.

Over the cap?

We refuse the send upfront and tell you how many slots are left. Split the CSV and resume tomorrow.

16

Privacy & isolation

Each user’s data is firewalled from everyone else’s.

Per-user scoping

PostgreSQL row-level security enforces that queries only ever return your rows.

Tokens encrypted

Your Gmail refresh tokens are stored in a column your client can never read — only the server sending on your behalf can.

From your own Gmail

No third-party sending domain. Recipients reply to you directly. No SPF/DMARC hit.

No recipient scraping

Your CSV stays in your browser until you click Send. Nothing is indexed or resold.

17

FAQ

Quick answers.

Who can sign up?

Anyone with a Gmail. Personal @gmail.com or Google Workspace — both work. Sign-in is one click; first-timers see Google’s “unverified app” warning once and click Advanced → Continue.

Can I connect multiple Gmails?

Yes. Click + Add Gmail on the dashboard. Each project picks which Gmail to send from.

Can recipients tell it’s bulk?

No. Each email is sent individually — no BCC, no blast. To the recipient it looks identical to a direct email.

What if a row has a missing tag?

The tag renders as blank in that email. Preview flags rows with missing data before you send.

Can I schedule sends?

Yes. Pick a date + time below the Send button. A cron job picks it up within five minutes of the scheduled moment.

How accurate is open tracking?

Treat it as a signal, not gospel. Apple Mail Privacy Protection and Gmail’s image proxy can fire the pixel without a human seeing the email. Plaintext clients won’t fire it at all.

Can I disable the unsubscribe footer?

Per-project, yes — toggle unsubscribe_footer. We’d strongly recommend leaving it on; it’s table-stakes for deliverability and CAN-SPAM/GDPR compliance.

Does it work on mobile?

The dashboard and guide do. CSV upload + compose is best on desktop.

How do I delete a user?

Tell the admin — accounts and all their data can be wiped from Supabase on request.


Open Mailroom →