Email-gated downloads: how to put a PDF behind a signup wall
You wrote something good — a research report, a template, a price list — and you'd like to know who reads it. So you put a form in front of it. Name, email, download button. Standard.
Then you export the list a month later and it's full of
[email protected], [email protected], and forty addresses at
domains that stopped existing in 2019. The gate worked exactly as built. It
just wasn't built to do the thing you wanted.
A typed address is not a collected address
Most download gates check one thing: does this string look like an email?
That check is satisfied by [email protected], which is not an email
address anyone will ever read. The gate is a speed bump, and the person on
the other side of it knows that.
The gap between "typed" and "reachable" is wider than it looks. An address can fail you in at least four ways:
- It's nonsense. Someone wanted the file, not the newsletter.
- It's disposable. A ten-minute mailbox that will be gone before your first send.
- The domain can't receive mail. No MX records — a typo in the domain, or a dead company.
- It belongs to someone else. Typed wrong by accident, or on purpose. Now you're mailing a stranger.
A list full of these isn't just useless. It's actively expensive: it drags down your deliverability, so the messages you send to the real addresses are more likely to land in spam. Bad addresses cost you the good ones.
What a download gate actually has to do
Three checks, in increasing order of how much they're worth.
1. Reject disposable domains
Throwaway mailbox services are well known and publicly catalogued. Checking a submitted domain against a maintained list of them removes the largest single category of junk before it ever reaches your database — and it costs a lookup, not a round trip.
2. Check the domain can receive mail at all
A domain with no MX record cannot accept email. Full stop. Resolving MX,
and ideally SPF, catches typos (gmial.com), abandoned domains,
and anything invented on the spot. This is a DNS query, not a probe of the
recipient's server — cheap, and invisible to the person whose address it is.
3. Make them prove they can read it
This is the one that changes the shape of your list. Email a short code, require it before the download unlocks. It's a small amount of friction and it converts the question from "is this string plausible?" to "is this person actually holding this inbox right now?"
The friction is the feature. Yes, some people will abandon at the code step. Those are, almost by definition, the people who were never going to read your email. A smaller list of confirmed readers beats a larger list you can't safely send to — and it beats it on the first send, not eventually.
The other half: the link itself
Once the gate works, the link in front of it becomes the thing you manage. A shared URL has a way of outliving its purpose — forwarded into a group chat, pasted into a public thread, still live eighteen months later.
Useful controls, roughly in the order you'll want them:
| Control | What it's for |
|---|---|
| Expiry date | Time-boxed material — a quarterly report shouldn't still be downloadable next year. |
| Download cap | Sharing with a known, small group. The cap catches onward forwarding. |
| Pause | Something's wrong and you need it off now, without losing the record of who already took it. |
| New URL | The link leaked. Rotate it and the old one stops resolving; you keep the file and the history. |
And on the other side: who subscribed, who downloaded, when, and from where. If the gate is collecting addresses, that data should be yours to export and to push into whatever you already run — a webhook into your CRM beats a CSV you have to remember to download.
Setting one up
In Replilo this is the whole flow:
- Upload the file. You get a short link back immediately.
- Share the link. Anywhere — email, a post, a slide.
- A reader opens it, enters their email, and gets a six-digit code. The address is checked against the disposable-domain list and its DNS before the code is even sent.
- They enter the code, the download starts, and they land on your list as a verified subscriber.
Returning readers skip the code — access is remembered per link, so the second visit is just a download. Expiry, caps, custom URLs and pausing are all there when you need them, and a signed webhook fires the moment an address is confirmed.
Or don't set it up yourself
Increasingly, the person doing this isn't a person. If you write with an AI assistant, the file often already exists in the conversation where it was produced — and having to leave that conversation, open a dashboard and re-upload it is the silly part of the workflow.
Replilo runs an MCP server, the protocol assistants use to work with outside tools. Connect it once:
claude mcp add --transport http replilo \
https://replilo.com/mcp \
--header "Authorization: Bearer rpl_…"
and then the gate is something you ask for rather than something you build:
> share q3-report.pdf behind an email wall,
cap it at 50 downloads, expire it in 30 days
→ https://replilo.com/s/ab3xk9qp
The same account, the same links, the same subscriber list — reachable from a browser or from an assistant, whichever suits the moment. Reading works the same way: "who downloaded the pricing deck this week?" is answered from your own data, not guessed at.
The short version
A download gate that only checks the shape of a string collects strings. A gate that rejects disposable domains, confirms the domain can receive mail, and makes the reader prove they hold the inbox collects readers. The second list is smaller and worth more, and it's worth more on the first email you send — not someday.
Put a wall in front of your next file
Free account, 100 MB of storage, no card. Works from your browser or your assistant.
Start sharing free