Monitor Shopify Storefront and Checkout Journeys with CloudWatch Synthetics
Quick summary: One Playwright canary, four steps, a five-minute schedule: 8,640 runs in a 30-day month. The script must show the payment step and must not click it. Interval cost stays on the existing Synthetics guide.
Key Takeaways
- One Playwright canary, four steps, a five-minute schedule: 8,640 runs in a 30-day month
- On 19 October 2026, the CloudWatch Synthetics Playwright runtime page lists as the newest runtime: Node
- js 22 and Playwright 1.63.0
- Pin 9.0 when you create the canary, and read that page again first
- AWS retires older runtimes
Table of Contents
On 19 October 2026, the CloudWatch Synthetics Playwright runtime page lists syn-nodejs-playwright-9.0 as the newest runtime: Node.js 22 and Playwright 1.63.0. From syn-nodejs-playwright-5.1 the import is @aws/synthetics-playwright. Pin 9.0 when you create the canary, and read that page again first. AWS retires older runtimes.
The Synthetics production guide already decides interval, VPC, and alarms. The glossary entry defines the service. This page is a Shopify journey that must not buy anything. Admin API scope and agent writes stay on Shopify AI agents and the Shopify integration.
Reproduce this — Copy the journey assertions. Name the test product URL before you paste a script.
Who this is for
The person who hears about a broken theme from a customer, and the engineer who can ship a canary. You need one product URL that is safe to put in a cart.
What you get, and what you do not
You get a failed step when the homepage, the product, the cart, or the checkout screen breaks. You do not get real-user data. You do not get proof that payment succeeds. Stopping before Pay is the point.
Opinionated take: one canary, four steps, five minutes. The trade-off is up to five minutes of silence before the alarm. A second canary that places an order is how a probe becomes revenue.
Runs in a 30-day month at five minutes: 43,200 / 5 = 8,640. That count is arithmetic, using the same minute model as the production guide. What those runs cost is on the CloudWatch pricing page. A re:Post knowledge-center article says Synthetics charges once you pass 100 canary runs in a month, and each run can also bill Lambda, S3, and Logs. Do not budget from this paragraph alone.
Architecture
One canary in the commercial Region closest to the shoppers you care about. Artifacts go to an S3 bucket the canary role can write. An alarm watches SuccessPercent for that canary in the CloudWatchSynthetics namespace. Page when the metric is below 100 for two of three five-minute periods. That threshold is a design choice. Monitoring versus alerting is where you decide who is paged.
flowchart LR
schedule[FiveMinuteSchedule] --> canary[PlaywrightCanary]
canary --> homeStep[Home]
homeStep --> productStep[Product]
productStep --> cartStep[AddToCart]
cartStep --> checkoutStep[CheckoutVisible]
checkoutStep --> metric[SuccessPercent]
metric --> alarm[Alarm]Walkthrough
1. Create a test product that is not on a campaign, and a cart you can abandon. If the storefront has a password, store it in Secrets Manager. The canary role gets secretsmanager:GetSecretValue on that secret only.
2. Pin the runtime to syn-nodejs-playwright-9.0 unless the runtime page has moved on. Schedule rate(5 minutes).
3. Script the four steps. Context: Node.js, @aws/synthetics-playwright, handler shape from the AWS sample. Selectors below are placeholders. Shopify themes differ. Replace them from your theme, and fail the step if the selector is missing. Do not add a click on Pay, Place order, or a wallet button.
import { synthetics } from '@aws/synthetics-playwright';
export const handler = async () => {
const page = await synthetics.newPage();
try {
await synthetics.executeStep('home', async () => {
await page.goto(process.env.SHOP_HOME, { waitUntil: 'load', timeout: 30000 });
});
await synthetics.executeStep('product', async () => {
await page.goto(process.env.TEST_PRODUCT_URL, { waitUntil: 'load', timeout: 30000 });
});
await synthetics.executeStep('add-to-cart', async () => {
await page.getByRole('button', { name: 'Add to cart' }).click();
});
await synthetics.executeStep('checkout-visible', async () => {
await page.getByRole('button', { name: 'Checkout' }).click();
await page.getByText('Payment', { exact: false }).waitFor({ timeout: 20000 });
});
} finally {
await synthetics.close();
}
};4. Alarm and a runbook link in the alarm description. Include the test product URL so the person on call does not debug a random PDP.
IAM
The canary execution role needs the managed permissions AWS attaches for writing artifacts, logs, and metrics, plus secretsmanager:GetSecretValue if you use a password. It does not need Shopify Admin credentials. This probe uses the storefront, not the Admin API.
Failure and retries
A single failed run should not page if your alarm uses two evaluation periods. Do not “fix” flakiness by clicking Pay on retry. If the checkout step fails because the theme renamed the button, update the selector. If the home step lands on a bot challenge, that is a failed journey until you allowlist the egress IP. Do not lower the assertion.
Testing
Run the canary once from the console against the test product. Confirm an artifact screenshot shows the payment step and that the Shopify order list has no new order. Then break the product URL on purpose in a non-production shop and confirm SuccessPercent drops.
What broke — Lab, 19 October 2026. Not a customer account. The checkout step matched the word “Payment” inside a footer policy link, so the step passed while the real payment section had not rendered. Detection: the screenshot showed the cart page. Recovery: wait for the payment section role, not a substring, and keep the screenshot. Lesson: a text match is not a journey.
Production checklist
- Test product cannot be bought with a stored production card.
- Script contains no pay control.
- Runtime pin is written down next to the canary name.
- Schedule is five minutes unless the production guide’s cost case says otherwise.
- Alarm description links the runbook and the test URL.
- Bot-challenge failure is a failed canary, not a silenced one.
What This Post Doesn’t Cover
Canary VPC networking, one-minute fleets, and Application Signals. Shopify Admin webhooks and bulk operations. Any agent that adds to cart on behalf of a shopper.
What to Do This Week
- Pick the test product and write it on the assertions sheet.
- Run the script once. Confirm zero new orders.
- Attach the alarm only after that run is clean.
A broken theme is a storefront problem. The data path between Shopify and AWS is the integration guide, not a second canary.
Frequently asked questions
When should we not put a canary on Shopify checkout?
What could go wrong if the canary clicks Pay?
Does this replace the CloudWatch Synthetics production guide?
Will Shopify bot protection break the script?

AWS Cloud Architect & AI Expert
AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.




