← Blog

When the order confirmation never arrives

The customer typed gmial.com. They will not notice until the parcel is late, and by then the cheapest moment to fix it — while they were still looking at the form — is gone.

Contents

The most expensive checkout error is not a declined card. It is an order that completes perfectly and then goes quiet, because the confirmation went to an address that does not exist.

The customer waits. They cannot find a tracking number. They open a ticket, or they file a chargeback, or they simply never buy again — and none of those outcomes tells you the actual cause, which was four characters typed wrong while the customer was already looking at the form.

Catch it while they are still on the page

The cheapest moment to fix a bad address is the second before the order submits. After that, every path back to the customer runs through the address that does not work.

One call to POST /v1/verify/email returns, without sending anything:

  • valid_syntax — the address is well-formed. Catches the typo class outright.
  • mx_found — a live DNS lookup confirming the domain publishes mail servers. Catches dead and mistyped domains, which is where gmial.com dies.
  • disposable — the address is on a maintained list of throwaway providers.
  • role_account — it is support@ or orders@ rather than a person.

For a storefront, the first two are the whole game.

Suggest, do not block

A hard block at checkout is almost always the wrong response. You will be wrong sometimes, and being wrong at the payment step costs you the order.

The pattern that works: when mx_found is false or the syntax fails, surface an inline "did you mean" prompt and let the customer correct it. Keep the submit button live. A customer who insists their address is right is usually right, and a lost order costs more than a bounced receipt.

Role accounts are worth knowing about and never worth blocking — plenty of legitimate business orders come from purchasing@.

What this cannot tell you

Validation removes the avoidable failures. It does not promise the message lands.

smtp_mailbox and catch_all come back in checks.not_performed on every response, and that is a real boundary, not a caveat. Confirming a specific inbox exists requires an SMTP conversation with the receiving server, which is slow, frequently answered dishonestly, and damaging to the sending reputation of whoever runs it. A well-formed address at a domain with live mail servers can still belong to nobody.

Spam filtering is likewise invisible from outside. If confirmations are reaching valid addresses and still not being seen, the problem is deliverability — your sending domain's authentication and reputation — and no amount of address validation will move it.

There is no app to install

Boundstone is an HTTP API. There is no Shopify app, no plugin listing, no one-click install. Validation is a request from your own checkout backend or storefront code, and the response names every check it ran and every one it did not.

If you need a drop-in store integration today, that is honest information to have before you read further. If you are already writing checkout logic, it is one call.

Phone numbers, if you collect them

The same argument applies to SMS delivery notifications. POST /v1/verify/phone returns line_type, and sending a shipping notification to a fixed_line spends the message on a phone that cannot display it. Route those to email instead.

valid: true means the number is well-formed and sits in an allocated range — not that a handset will receive anything. carrier_lookup, ported_status and hlr_liveness are not_performed unless you request a live dip with hlr:true.

The short version

  • A silent order is worse than a declined card. The customer waits, then opens a ticket or charges back, and neither tells you the cause.
  • The cheapest fix is before submit. Afterwards, every path back runs through the broken address.
  • Syntax plus a live MX lookup catches the avoidable share — typos and dead domains — without sending anything.
  • Suggest, never block, at the payment step. A lost order costs more than a bounced receipt.
  • smtp_mailbox and catch_all are not_performed. A valid address at a live domain can still belong to nobody.
  • Spam filtering is invisible from outside. If confirmations reach valid addresses unseen, that is a deliverability problem, not a validation one.
  • There is no Shopify app. It is an HTTP call from your own checkout code.

Frequently asked questions

Why do customers not receive order confirmation emails?

The most common cause is mundane: a typo in the address at checkout, or a domain that no longer accepts mail. Both are detectable at the moment of entry — a syntax check catches malformed input and a live MX lookup catches a domain with no mail servers. Neither requires sending anything. The remaining causes are spam filtering and mailbox-level problems, which no external check can see, so treat validation as removing the avoidable share rather than solving the whole category.

Can you verify an email address at checkout without sending anything?

You can verify a great deal without sending. Syntax validation catches typos, a live MX lookup confirms the domain publishes mail servers and can therefore receive mail at all, and a disposable check flags throwaway providers. What you cannot confirm without sending is that the specific mailbox exists — Boundstone reports smtp_mailbox and catch_all as not_performed, because an SMTP probe is unreliable and damages the reputation of whoever runs it.

Does Boundstone have a Shopify app?

No. Boundstone is an HTTP API, so validation happens from your own checkout backend or storefront code with a single call — there is no app to install and no plugin listing. If you need a drop-in store integration today, this is not that; if you are already writing checkout logic, it is one request with a response that names every check it ran and skipped.

Thomas Tsui

Founder of Boundstone — building phone, email and IP validation you can actually verify.

One honest API for email, phone and IP — every response lists what it checked and what it didn't claim to. Free tier: 250 credits/month, no card, credits never expire.

More from Boundstone — API documentation · Benchmark methodology · The benchmark series · Buyer's checklist