Skip to main content
Signup breaks quietly: a verification email that stops arriving, a form that rejects a Brazilian phone number, a consent banner in Germany that covers the submit button. Unit tests do not catch it and nobody on the team signs up to their own product every hour. This program does, from three countries at once, with a fresh inbox each time, and files one GitHub issue per broken step with the replay of the run attached.

What you need

  • An Outcrawl API key in OUTCRAWL_API_KEY.
  • An inbox connected as the agentmail integration, 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 as owner/name in GITHUB_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

The step names are an 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
Save the TypeScript program as 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:
An hour where German signups stopped receiving the verification email prints de: FAILED at verification-email, filed an issue and opens this issue:
The replay shows the whole run, so whoever picks up the issue watches the failure instead of reproducing it.

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.budget is 100.
Run it every six hours instead of every hour and the same three countries cost about 6,840 credits a month, inside the Builder plan.

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. Raise PARALLEL only 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 fetch to an incoming webhook.

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.