I am developing an online store using React and a headless approach, where I handle the cart and checkout flow myself. However, I’m encountering an issue with Shopify’s workflow: it seems that I cannot generate an order in the Shopify Admin panel without a checkout URL.
I do not want to use a checkout URL because the payments are processed by a third-party service, and I only need to complete the order without payment to have it appear in Shopify’s Admin panel for further processing by the third party.
Has anyone faced this issue while working with headless Shopify? Is there a way to create an order directly in the Shopify Admin panel without needing a checkout URL or bypass the standard checkout process? Any advice or suggestions would be greatly appreciated!
This is a common architecture challenge with headless stores. Here’s the approach I use: The Solution
Create orders directly via Admin API instead of relying on checkoutUrl:
Process payment with your third-party provider (Stripe, Square, etc.)
Verify payment server-side — critical for security
Create order via draftOrderCreate mutation
Complete with draftOrderComplete — marks as paid
The Flow
Payment Provider → Server Verification → draftOrderCreate → draftOrderComplete → Order in Admin
Key Mutations
mutation draftOrderCreate($input: DraftOrderInput!) {
draftOrderCreate(input: $input) {
draftOrder { id }
userErrors { field message }
}
}
mutation draftOrderComplete($id: ID!) {
draftOrderComplete(id: $id, paymentPending: false) {
draftOrder {
order { id name }
}
userErrors { field message }
}
}
What This Gets You
The completed order appears in Shopify Admin exactly like a checkout-created order:
- Customer info and line items visible
- Webhooks fire (orders/create, orders/paid)
- Inventory decrements automatically
- Order available for fulfillment
Important Details
- Always verify payment before creating the order (prevents fraud)
- Store payment reference in order notes for idempotency checks
- Handle errors gracefully — userErrors array tells you what went wrong
If you want to see a complete implementation of this pattern, I've open-sourced one here:
https://github.com/nathanmcmullendev/ecommerce-react
The core logic is in app/routes/api.create-order.ts — includes payment verification, idempotency handling, and error
management. Feel free to use it as reference or fork it.