# Create and place a draft order Build an editable draft for an assisted sale, then place it once its details are confirmed. Use a draft order when the purchase begins in a trusted operational workflow rather than in a buyer's cart. ## Before you begin Use Admin permissions for draft orders and an existing store with a sellable variant. Choose the currency, price channel, and customer or guest context. Prepare the address, tax, and shipping configuration the order requires. ## 1. Create the draft Admin API ```graphql mutation CreateDraftOrder($input: DraftOrderCreateInput!) { draftOrderCreate(input: $input) { draftOrder { id status currency total { centAmount currencyCode } } errors { __typename ... on UserError { message } } } } ``` Variables ```json { "input": { "storeId": "", "priceChannelId": "", "currency": "EUR", "customerEmail": "buyer@example.com" } } ``` Keep the draft ID. For an existing customer, use an authorized customer relationship rather than treating the typed email alone as authentication. ## 2. Add a catalog variant Admin API ```graphql mutation AddDraftItems($input: DraftOrderLineItemsAddInput!) { draftOrderLineItemsAdd(input: $input) { draftOrder { id total { centAmount currencyCode } } errors { __typename ... on UserError { message } } } } ``` Variables ```json { "input": { "draftOrderId": "", "lineItems": [ { "variantId": "", "quantity": 1 } ] } } ``` Use custom-line operations only for items outside the catalog. Add addresses and shipping through the supported draft operations. Review the returned total after each change. If your workflow uses a price override or manual discount, make it an explicit administrative decision and retain its business reason. ## 3. Review and place Verify the current items, customer, addresses, shipping, discounts, and total with the buyer or operator. Then place the draft: Admin API ```graphql mutation PlaceDraftOrder($input: DraftOrderPlaceInput!) { draftOrderPlace(input: $input) { order { id orderNumber orderState paymentState } errors { __typename ... on UserError { message } } } } ``` Variables ```json { "input": { "draftOrderId": "" } } ``` Persist the returned order ID before starting payment or fulfillment work. If the response is uncertain, inspect the draft and associated order before repeating placement. Use [draftOrderDiscard](/api/admin-graphql/mutations/draft-order-discard) when the draft should not become an order. ## Verify Read the resulting order and compare it with the reviewed draft's intended items and amount. Keep placed or discarded drafts out of editable work queues based on their returned status. See [Draft orders](/concepts/orders/draft-orders) for the lifecycle.