Two things are worth saying plainly before the steps. The Spaw form helper is a script for pages you control, and Shopify checkout is not one of them: checkout does not load storefront scripts, so the helper cannot check the email field there. And Spaw does not offer a Shopify app. What works is verifying customers after Shopify has created them, through a Zap or a Make scenario, and tagging them so your email tool and your staff know which addresses are real. The same route checks the shipping address on each order once it is placed. Order confirmations still go out the moment the order is placed; the verdict protects everything that comes after.
Verify new customers
- Create a secret API key on the API keys page of your Spaw dashboard.
- In Zapier or Make, start with the Shopify trigger for a new customer. A new-order trigger works too if you only care about buyers rather than account sign-ups.
- Add the verification step: a Webhooks by Zapier POST or a Make HTTP request to
https://spaw.co/api/v1/emailwith the headerAuthorization: Bearer sk_live_…and this body, mapping the customer's email:
{
"email": "[email protected]"
}
The Zapier page and the Make page show the step field by field. When the Spaw apps for those platforms are listed, it becomes a Verify Email action with a saved connection.
- Add the Shopify action that updates a customer and set tags from
data.deliverable, for exampleemail-deliverable,email-riskyoremail-undeliverable. A customer note can carrydata.reasonanddata.did_you_meanfor staff. - Test by creating a customer with
[email protected], a free test address that answers a fixed result and never appears in your history.
If your marketing runs on Klaviyo, the Klaviyo page puts the verdict on the profile instead, where segments and flows can use it directly.
Check the shipping address after the order
The same route checks the address an order will ship to. It runs after checkout, never inside it: the order is already placed by the time the answer arrives, so the result is a tag for whoever packs the parcel, not a gate the customer sees. The decision behind the tag is your account's shipping policy — which signals block, how high the score may go, whether a register must confirm the building — set once on the Spaw dashboard or through the API, so the Zap or scenario only reads the answer and never decides anything itself.
- In Zapier or Make, start with the Shopify trigger for a new order.
- Add a Webhooks by Zapier POST or a Make HTTP request to
https://spaw.co/api/v1/addresswith the sameAuthorization: Bearer sk_live_…header, and map the order's shipping address into the separated parts:
| Shopify shipping address | Spaw field |
|---|---|
address1 |
address_line1 |
address2 |
address_line2 |
company |
organization |
city |
locality |
province |
administrative_area |
zip |
postal_code |
country_code |
country |
{
"address_line1": "1 Spaw Test Street",
"address_line2": "",
"locality": "Springfield",
"administrative_area": "Illinois",
"postal_code": "99999",
"country": "US"
}
Send the parts only, with no address key: when a written line is present the API reads the line and sets address_line1 and address_line2 aside. Leave out the customer's name and phone number as well, because nothing in the check needs them and nothing in the answer is about who lives at the address. The country is required, and Shopify's two-letter country_code is exactly the form the API takes. The region is the other way round: map province, the name, rather than province_code, because Shopify's codes for some countries — JP-13 for Tokyo, MH for Maharashtra — are not a form the postcode directory publishes, and a region it cannot match adds region_mismatch to the score.
- Add the Shopify action that updates the order and set its tags from
data.ok_to_shipanddata.blocked_by:address-okwhenok_to_shipis true, and when it is falseaddress-holdplusaddress-hold-followed byblocked_by, for exampleaddress-hold-placeholderfor a street typed as "asdf" oraddress-hold-invalidfor an address that cannot stand as written. In Zapier the split is a Paths step or two Filters onok_to_ship; in Make it is a router with a filter on each route. An order note can carrydata.formatted, the address the way its country writes it, for the person checking the label. - Test with the order above.
1 Spaw Test Street, Springfield, IL 99999is one of five test addresses that answer a fixed result under your policy, cost no credits and leave no repeat marker, so the ok branch can be wired before any credit is spent.
When the Spaw apps for Zapier and Make are listed, the request step becomes the Validate Postal Address action in Zapier or the Validate a Postal Address module in Make. Both take the street as one written line, so map address1 and address2 into it and the city, province and postcode into their own inputs.
Three things the tag does not say. It does not confirm that post arrives: that answer is licensed and not enabled, so deliverability_checked comes back false and the tag reflects only the open data and your policy. It is not a verdict on the customer: a mailbox shop is a legitimate delivery point for many people, which is why mail_drop passes under the default policy unless you add it. And an address missing from a register is not evidence that it does not exist, except under a register whose coverage is complete. The address lookup documents every field the answer carries.
Clean the existing customer list
Export customers to CSV, run the email column through a bulk verification on the Spaw dashboard or with the bulk endpoint, and import the result back with the verdict column turned into tags. The result CSV keeps your original columns. Undeliverable rows also join your Spaw suppression list, so future runs answer them without a probe.
Marketing consent and the storefront
Shopify's newsletter sign-up forms on the storefront are theme pages, and the form helper can watch those inputs if your theme allows a script tag; the same applies to a contact page. Checkout is the exception. Customers who mistype at checkout are best caught by the tag flow above and a follow-up through another channel, such as SMS or a phone call, with the corrected address.
What to do with the verdict
Use the tags in customer segments. email-deliverable customers get the full marketing program. For email-risky, read the reason: catch_all means a business domain that accepts every address and the mailbox is unconfirmed, role means a shared inbox, disposable means a throwaway address that will not survive to the next campaign. Exclude email-undeliverable customers from marketing sends rather than deleting the record, because the order history matters and data.did_you_mean often names the address the customer meant.
Cost
Each new customer that answers deliverable or risky spends 1 credit; unverified answers and repeats within seven days are free, and undeliverable answers are free within a fair-use allowance. Each order address that answers valid spends 1 credit; invalid addresses, the test addresses and repeats of the same address within seven days are free. Zapier and Make bill their own tasks. Bulk runs bill per processed row and verify duplicates once.