Permalinks - Order paid

We’re currently building a Shopify application and had a question regarding order webhooks.

Previously, our flow relied on order permalinks, but we are no longer using permalinks in our application. We want to ensure that the Order Paid webhook is triggered correctly when a customer completes payment.

Could you please advise on the recommended way to trigger or listen for the Order Paid webhook without relying on permalinks?
If there are any best practices or required configurations we should follow, we’d appreciate the guidance.

A couple of ways:

1. Use the orders/paid webhook topic. This is the most direct approach. Subscribe to the orders/paid webhook, which fires when an order’s payment status changes to “paid”. This doesn’t require permalinks — Shopify triggers it automatically when payment is confirmed. Note that it doesn’t include full transaction details by default, so fetch the order via its ID if needed.

2. Alternative: orders/updated webhook. You can also listen to orders/updated and check the financial_status field in the payload. When it changes to paid, you know payment completed. This gives you more flexibility if you need to track other order changes too.

Either way, you’ll need to register your webhook via the Shopify Admin API or in your app’s shopify.app.toml config.

As for best practices, return a 200 response quickly, then store the webhook payload and process async to avoid timeouts. Verify the HMAC signature, implement idempotency (Shopify may send the same webhook multiple times) and add retry logic on your end to handle failures.