What you need
- An Outcrawl API key in
OUTCRAWL_API_KEY. - An inbox connected as the
agentmailintegration, so the agent can create a throwaway address and read the verification email. Any inbox service with an MCP server works; change the name in the code. - A GitHub token that can write issues, in
GITHUB_TOKEN, and your repository asowner/nameinGITHUB_REPO. - Something that runs a command every hour: cron, a GitHub Actions schedule (shown below), or your own job runner. Outcrawl schedules monitors, which watch a URL; a task like this one is started by your code.
How it works
1
Your scheduler starts the program
Once an hour the program submits one agent run per country. Two run at a time, below your plan’s browser count, and a run refused with
ConcurrencyLimitError waits 20 seconds for a slot and tries again.2
Each run signs up from a different country
exit: { country } sends the run through a residential exit in that country, so it sees the language, currency, consent banners and phone formats a local customer sees.3
The agent creates an inbox and verifies the address
The run may call the
agentmail integration because it is named in integrations. It creates a new inbox, signs up with it, waits for the verification email and opens the link. Rules keep it on your domain and stop it paying for anything.4
The result comes back as data
A schema makes every run answer the same shape: each step, pass or fail, how long it took, and the exact error text the page showed.
5
Failures become issues, successes stay quiet
A failed step files a GitHub issue with the run’s replay link. The same step failing again from the same country adds a comment to that issue instead of opening another.
The program
enum in the schema, so an issue title like Signup fails from DE at verification-email is identical from one hour to the next and the dedupe by title holds.
Only use yourproduct.com. is an enforced rule: it blocks navigation to any other host, subdomains of yourproduct.com excepted. If your email provider wraps links in a click-tracking domain, name it in the same rule, for example Only use yourproduct.com and links.mailprovider.example., or the run fails at verify-link.
Run it every hour
.github/workflows/signup-qa.yml
signup-qa.mts so it runs as a module with top-level await. It exits 1 when any country failed, so the workflow run turns red as well.
What you get back
A quiet hour prints three lines and files nothing:de: FAILED at verification-email, filed an issue and opens this issue:
What it costs
An agent run is billed for the model’s usage, browser time and proxy usage, per pricing. A typical run costs about 15 credits a minute all in, including the data through the residential exit. That is an estimate: the real figure depends on the task, and a heavy signup page costs more.- A passing signup takes about 75 s, so about 19 credits per country.
- Three countries every hour: about 57 credits an hour, 1,368 a day, about 41,040 a month. That fits the Pro plan’s 50,000.
- A run that waits the full 3 minutes for an email that never comes adds about 3 credits of browser time, plus the model’s usage each time it checks the inbox. Each run’s
caps.budgetis 100.
Make it yours
- Test the paths people pay for: sign up, pick the paid plan, and stop at the card form.
Never make a payment.is an enforced rule, so the run cannot submit it. - Add countries by adding codes to
COUNTRIES. RaisePARALLELonly while it stays below your plan’s browser count. - Delete the test accounts: have your backend remove any account created from your inbox provider’s domain after an hour.
- Post the failure to Slack as well as GitHub with one more
fetchto an incoming webhook.
Related
Agents
Tasks, caps, schemas and exits.
Integrations
Connect the inbox the agent reads.
Rules
Which rules are enforced and which are guidance.
Sessions and replay
The replay link in every issue.