Most coupon pages never tell you whether anyone tried the code. On Kuponaut, a small site that lists discount codes and prices for AI and SaaS tools, every code carries a label that says how we know it works, and the strongest label is "applied at checkout": someone entered the code on the brand's own checkout page and saw the discount. So far that is true for more than a hundred codes, each with the date of the test.

Doing that by hand does not scale, so in November 2026 we started handing part of the work to a test bot. This post is about the rules we gave it and the mistakes it taught us, not about the code itself.

Disclosure: Kuponaut earns a commission from partner codes and links on its own site. This post has no partner links or codes.

What the bot does

It follows the same steps a person would:

  1. Open the brand's pricing page and pick a paid plan the code is meant for.
  2. Reach the brand's own checkout (Paddle, Stripe, FastSpring, Chargebee and similar).
  3. Open the coupon field, type the code, press Apply.
  4. Save a screenshot and the totals before and after.

That is the whole job. The interesting part is everything it must not do.

Hard stops

Checkout pages are built to take money, so the bot runs with a short list of actions it can never take:

  • It never types a card number, an email address or a password.
  • It never presses a button that pays, subscribes or starts a trial.
  • It stops at any CAPTCHA instead of trying to get past it.
  • It skips checkouts that insert a one-click wallet step before the coupon field. Those steps can send a login code to an email address, and we do not want a bot anywhere near a saved payment method.
  • For brands that require an account, it uses a session the site owner opened by hand in a separate browser profile, and it stops if that account has a saved card.

If a step is not on the list of allowed actions, the bot stops and reports where it stopped. A stopped test is a useful result: it tells us which checkout needs a human.

Mistake 1: a logged-in account is not a new customer

On the first run, the bot reported several of our own codes as rejected. When we applied the same codes by hand, they worked.

The cause was the session. Many codes are for new customers only, and the bot was testing from an account that had already visited, started a checkout or used a trial. The brand was right to refuse the code for that account; the code was fine.

So "rejected" is now never a final result. A rejection marks the code for a manual re-test, and we only change the page once a person confirms it.

Mistake 2: the country is part of the test

Our tests run from Turkey, and some stores switch to a local price list in Turkish lira. One brand's partner code was refused on that local store although it is valid on the dollar store it was issued for.

A test result now records the country, the currency and the plan next to the date. On the site, every code page says that a test is true for that day, that plan and that country, and asks readers to check the final total on their own order.

Mistake 3: a screenshot is not proof unless it shows the right part

Our first screenshots were full pages: hard to read and full of things that are not the discount. The bot now crops the order summary, so the published image shows the plan, the code and the totals before and after, and nothing else.

What we decided not to automate

  • Finding codes on search results pages. Search engines' terms do not allow scraping results, so we do not do it.
  • Publishing. The bot writes a report; a person decides what goes on the site.
  • Removing codes. A failed test starts a re-test, never an automatic deletion. An API outage or a flaky checkout should not empty the site overnight.

What came out of the first run

On 6 November 2026, the first run had our code accepted at three brands and flagged a handful of others for a manual check. The ones we re-tested by hand were accepted. That is a small result, but every code the bot accepted now has a dated screenshot behind it, and every rejection comes with a reason and a next step.

If you build something similar, start with the list of things your bot must never do. Teaching a bot to press Apply is the easy part; deciding when it must stop is the real work.

The full description of our labels, and the dated list of every code we have applied at checkout, is on the original post.