You send the launch email to 340 waitlist signups. Within the hour, four of them reply with some version of "please take me off this." One marks it as spam. Now you have to answer a question you never planned for: where does a "no" get written down?
If your answer is "I will delete them from the dashboard," you have fixed the wrong list. The address is also sitting in whatever tool sent the email, and that is the list the next send will use.
OperatorStack stores your waitlist but does not send email, so it has no unsubscribe link or opt-out field. Record every opt-out in your sending tool, and keep a plain suppression file of opted-out addresses that you filter against before any re-import. An opt-out means stop emailing, not delete the signup.
Where the Opt-Out Has to Live
Signups flow one way: from your site into OperatorStack, then out to your email tool. Opt-outs flow the other way: someone clicks unsubscribe in your email tool, and nothing travels back.
The contact export from the dashboard makes this concrete. Its columns are:
email,name,source,referral_code,referrals_count,created_at
There is no status column, no opt-out column, nothing that says "do not mail." That is not an oversight to work around. A tool that never sends email has no business deciding who may receive it, and the sender is the only place that sees the unsubscribe click.
The same applies in the other direction. Removing a contact from OperatorStack does not remove them from a list you already copied elsewhere. The sync post covers that failure for deletions; opt-outs have the identical shape.
Three Different Requests That Sound Alike
Not every "remove me" is the same request, and the right response differs.
- Opt out of email. They still want to be counted as a signup, or do not care, but they want no more mail. Record the opt-out in your sender. Leave the waitlist record alone.
- Delete my data. An erasure request. Delete the contact record, then delete the address from every copy you made. The GDPR post covers the full sequence.
- Spam complaint. They did not click unsubscribe, they clicked the spam button. Your sender records this as a suppression automatically, and you should treat it as an opt-out everywhere else too.
The first one is by far the most common, and it is the one people over-handle by deleting records they did not need to delete. Deleting a signup who only wanted fewer emails lowers your demand count for no benefit to them.
Step 1: Send From a Tool That Honors Unsubscribes
Use an email tool that adds an unsubscribe link and enforces it. Mailchimp, Loops, Resend broadcasts, and Buttondown all do. Sending the launch email from your own inbox with the list in BCC works for a few dozen friends, and it is the one setup where nothing records an opt-out for you.
There is also a deliverability reason. Gmail's bulk sender rules ask for a spam complaint rate below 0.3 percent, with 0.1 percent as the number to aim for. On a list of 340, a single spam click is already 0.29 percent. One complaint is survivable. Three is not, and an unsubscribe link that works is the cheapest way to turn an annoyed reader into a quiet opt-out instead of a spam click.
Pick the sender before launch day. Create the audience, import the waitlist export, and send yourself a test so you see the unsubscribe link that will go to everyone.
Step 2: Keep a Suppression File
Your sending tool is the source of truth for who opted out, but you will re-import from OperatorStack more than once: a second wave, a beta invite batch, a tool switch. Each import resurrects every opt-out, because the export knows nothing about them.
So keep one file, suppressed.txt, one address per line. After each send, export the unsubscribed and complained addresses from your sender and append them.
grace@example.com
katherine@example.com
Step 3: Filter Every Export Against It
Before any import, run the dashboard export through the suppression file. This script reads the contacts CSV, drops suppressed addresses, and writes a clean file.
// filter-suppressed.js (Node 18+, no dependencies)
import { readFileSync, writeFileSync } from "node:fs";
const suppressed = new Set(
readFileSync("suppressed.txt", "utf8")
.split("\n")
.map((e) => e.trim().toLowerCase())
.filter(Boolean),
);
const [header, ...lines] = readFileSync("contacts.csv", "utf8").trim().split("\n");
const keep = lines.filter((line) => {
const email = line.split(",")[0].replace(/"/g, "").trim().toLowerCase();
return !suppressed.has(email);
});
writeFileSync("sendable.csv", [header, ...keep].join("\n") + "\n");
console.log(`${lines.length - keep.length} suppressed, ${keep.length} sendable`);
Two details matter. The comparison lowercases both sides, because Grace@Example.com and grace@example.com are the same person and the export keeps whatever case they typed. And email is the first column in the export, so splitting on the first comma is safe even when a name contains one.
Do not hand-edit the export to remove opted-out people and call it done. The next export puts them back. The suppression file is the part that persists.
Step 4: Answer the Person
A short reply closes it and prevents the follow-up. Confirm what you did, and say it plainly.
Done, you are off the list and will not get any more launch emails from me.
If you also want your signup record deleted, reply "delete" and I will do that too.
The second sentence matters. It separates the opt-out from the erasure request and lets the person choose, instead of you guessing.
What Not to Do
- Do not re-add someone who unsubscribed because they signed up again. A fresh form submission from an opted-out address is not consent to resume mailing. Check the suppression file first.
- Do not send a "are you sure?" email after an unsubscribe. It is one more email to someone who just asked for fewer.
- Do not track opt-outs only in your head or your inbox. The first time you re-import, they are gone.
Frequently Asked Questions
Does OperatorStack have an unsubscribe link for waitlist emails?
No. OperatorStack stores the waitlist and does not send email, so there is no unsubscribe link, no opt-out flag on the contact, and no opt-out column in the CSV export. The opt-out has to be recorded in whatever tool does the sending.
If someone unsubscribes, should I remove them from the waitlist?
Not automatically. An unsubscribe from the launch email means stop mailing me, not forget I signed up. Keep the record if they only opted out of email, because their signup still counts toward your demand numbers. Remove the record only when they ask you to delete their data.
What if I re-import my waitlist into my email tool later?
Anyone who opted out will be on the list again, because the export does not know about the opt-out. Keep a suppression file of opted-out addresses and filter the export against it before every import.
Do I need an unsubscribe link if I only email my waitlist once?
Yes. Send from an email tool that adds the link and honors it automatically. A single launch email without one invites spam complaints, and spam complaints hurt your sending domain on the day you most need it to work.