Orders/paid webhook not triggered for orders created via GraphQL orderCreate

Topic summary

Issue: The orders/paid webhook does not trigger when creating orders via the GraphQL orderCreate mutation, even when displayFinancialStatus is set to PAID. The webhook works correctly for orders placed through the storefront or created in the Shopify admin.

Root Cause: The orders/paid webhook fires in response to a successful payment transaction event, not merely the order status field. When using orderCreate, only the order record is created—no payment transaction is automatically generated.

Solution: After creating an order with orderCreate, explicitly record the payment transaction using the orderMarkAsPaid GraphQL mutation. This simulates the admin “Mark as paid” action, creates the transaction, and triggers the webhook as expected.

Status: Resolved—this is confirmed as expected API behavior requiring a two-step process.

Summarized with AI on October 25. AI used: claude-sonnet-4-5-20250929.

Currently facing an issue with the orders/paid webhook.

I have registered the webhook topic orders/paid, and it works as expected when:

  • A customer places an order through the storefront (status: paid).

  • An admin creates an order in the Shopify admin with status paid.

However, when I create an order using the GraphQL Admin API orderCreate mutation, and the resulting order’s displayFinancialStatus is PAID, the webhook does not get triggered.

Is this expected behavior? Do I need to explicitly capture payment or trigger another action for the orders/paid webhook to fire when using GraphQL?

Thanks in advance for your help!

1 Like

Hi @ongtung2212002

Yes, this is expected behavior.

The orders/paid webhook is triggered by a successful payment event (like a transaction being recorded), not simply by the order’s displayFinancialStatus field being set to PAID.

When you create an order through the Storefront or Admin UI and mark it as paid, Shopify automatically creates a successful transaction in the background. It’s this transaction event that triggers the webhook.

When you use the orderCreate GraphQL mutation, you are only creating the order record itself. Even if you pass fields that result in displayFinancialStatus being PAID, you haven’t actually created an associated payment transaction yet.

So to resolve this, after creating the order with orderCreate, you need to perform an additional step: record the payment transaction for that order via the API. The easiest way to do this is by using the orderMarkAsPaid mutation.

This mutation simulates the “Mark as paid” action from the admin panel, automatically creating a successful transaction and, in turn, triggering the orders/paid webhook.

Cheers,

David

1 Like

Was this a recent change with one of the 2025 Shopify API versions? When we upgraded to 2025-04 the orders/paid webhook stopped firing.

Looking to find more documentation on what we are missing besides the mutation for ordersMarkAsPaid.

I’m not entirely sure about earlier versions, but basically, for the version I’m using (2025-04 and onwards): when you create an order yourself via GraphQL with displayFinancialStatus = PAID, the orders/paid webhook will not trigger automatically. (I think Shopify has always worked this way, not just starting from version 2025-04.)

The correct approach is to create the order with a different status first, then use the orderMarkAsPaid mutation to mark it as paid — that’s when the webhook will fire.