Version: 2025-01
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2025-01/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation CalculateDraftOrder($input: DraftOrderInput!) { draftOrderCalculate(input: $input) { calculatedDraftOrder { customer { id email firstName numberOfOrders defaultAddress { id firstName lastName address1 address2 city provinceCode zip countryCodeV2 } taxExempt } billingAddressMatchesShippingAddress totalPriceSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } lineItems { appliedDiscount { amountSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } value valueType description } discountedTotalSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } product { id title } quantity requiresShipping sku taxable title variantTitle variant { id } weight { value unit } } totalTaxSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } totalDiscountsSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } shippingLine { id custom shippingRateHandle title originalPriceSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } } presentmentCurrencyCode } userErrors { field message } } }\",\n \"variables\": {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [\n {\n \"appliedDiscount\": {\n \"description\": \"Promo\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"customAttributes\": [],\n \"originalUnitPrice\": 10,\n \"quantity\": 1,\n \"requiresShipping\": true,\n \"sku\": \"draft-151\",\n \"taxable\": true,\n \"title\": \"151cm\",\n \"variantId\": \"gid://shopify/ProductVariant/43729076\",\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1\n }\n },\n {\n \"appliedDiscount\": null,\n \"customAttributes\": [],\n \"originalUnitPrice\": \"10.0\",\n \"quantity\": 2,\n \"requiresShipping\": true,\n \"sku\": null,\n \"taxable\": true,\n \"title\": \"Spring Promo Item\",\n \"variantId\": null,\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1.2\n }\n }\n ],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n customer {\n id\n email\n firstName\n numberOfOrders\n defaultAddress {\n id\n firstName\n lastName\n address1\n address2\n city\n provinceCode\n zip\n countryCodeV2\n }\n taxExempt\n }\n billingAddressMatchesShippingAddress\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n shippingLine {\n id\n custom\n shippingRateHandle\n title\n originalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }`,\n \"variables\": {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [\n {\n \"appliedDiscount\": {\n \"description\": \"Promo\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"customAttributes\": [],\n \"originalUnitPrice\": 10,\n \"quantity\": 1,\n \"requiresShipping\": true,\n \"sku\": \"draft-151\",\n \"taxable\": true,\n \"title\": \"151cm\",\n \"variantId\": \"gid://shopify/ProductVariant/43729076\",\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1\n }\n },\n {\n \"appliedDiscount\": null,\n \"customAttributes\": [],\n \"originalUnitPrice\": \"10.0\",\n \"quantity\": 2,\n \"requiresShipping\": true,\n \"sku\": null,\n \"taxable\": true,\n \"title\": \"Spring Promo Item\",\n \"variantId\": null,\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1.2\n }\n }\n ],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n },\n },\n});\n" Ruby example: "session = ShopifyAPI::Auth::Session.new(\n shop: \"your-development-store.myshopify.com\",\n access_token: access_token\n)\nclient = ShopifyAPI::Clients::Graphql::Admin.new(\n session: session\n)\n\nquery = <<~QUERY\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n customer {\n id\n email\n firstName\n numberOfOrders\n defaultAddress {\n id\n firstName\n lastName\n address1\n address2\n city\n provinceCode\n zip\n countryCodeV2\n }\n taxExempt\n }\n billingAddressMatchesShippingAddress\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n shippingLine {\n id\n custom\n shippingRateHandle\n title\n originalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }\nQUERY\n\nvariables = {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [{\"appliedDiscount\"=>{\"description\"=>\"Promo\", \"value\"=>5, \"valueType\"=>\"FIXED_AMOUNT\"}, \"customAttributes\"=>[], \"originalUnitPrice\"=>10, \"quantity\"=>1, \"requiresShipping\"=>true, \"sku\"=>\"draft-151\", \"taxable\"=>true, \"title\"=>\"151cm\", \"variantId\"=>\"gid://shopify/ProductVariant/43729076\", \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1}}, {\"appliedDiscount\"=>nil, \"customAttributes\"=>[], \"originalUnitPrice\"=>\"10.0\", \"quantity\"=>2, \"requiresShipping\"=>true, \"sku\"=>nil, \"taxable\"=>true, \"title\"=>\"Spring Promo Item\", \"variantId\"=>nil, \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1.2}}],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n}\n\nresponse = client.query(query: query, variables: variables)\n" PHP example: "use Shopify\\Clients\\Graphql;\n\n$client = new Graphql(\"your-development-store.myshopify.com\", $accessToken);\n$query = <<<QUERY\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n customer {\n id\n email\n firstName\n numberOfOrders\n defaultAddress {\n id\n firstName\n lastName\n address1\n address2\n city\n provinceCode\n zip\n countryCodeV2\n }\n taxExempt\n }\n billingAddressMatchesShippingAddress\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n shippingLine {\n id\n custom\n shippingRateHandle\n title\n originalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }\nQUERY;\n\n$variables = [\n \"input\" => [\n \"appliedDiscount\" => [\n \"description\" => \"Loyalty\",\n \"value\" => 5,\n \"valueType\" => \"FIXED_AMOUNT\",\n ],\n \"billingAddress\" => [\n \"address1\" => \"123 Amoebobacterieae St\",\n \"address2\" => \"\",\n \"city\" => \"Ottawa\",\n \"company\" => \"\",\n \"countryCode\" => \"CA\",\n \"firstName\" => \"Bob\",\n \"lastName\" => \"Bobsen\",\n \"phone\" => \"\",\n \"provinceCode\" => \"ON\",\n \"zip\" => \"K2P0V6\",\n ],\n \"customerId\" => \"gid://shopify/Customer/544365967\",\n \"lineItems\" => [{\"appliedDiscount\"=>{\"description\"=>\"Promo\", \"value\"=>5, \"valueType\"=>\"FIXED_AMOUNT\"}, \"customAttributes\"=>[], \"originalUnitPrice\"=>10, \"quantity\"=>1, \"requiresShipping\"=>true, \"sku\"=>\"draft-151\", \"taxable\"=>true, \"title\"=>\"151cm\", \"variantId\"=>\"gid://shopify/ProductVariant/43729076\", \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1}}, {\"appliedDiscount\"=>nil, \"customAttributes\"=>[], \"originalUnitPrice\"=>\"10.0\", \"quantity\"=>2, \"requiresShipping\"=>true, \"sku\"=>nil, \"taxable\"=>true, \"title\"=>\"Spring Promo Item\", \"variantId\"=>nil, \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1.2}}],\n \"presentmentCurrencyCode\" => \"CAD\",\n \"shippingAddress\" => [\n \"address1\" => \"\",\n \"address2\" => \"\",\n \"city\" => \"\",\n \"company\" => \"\",\n \"countryCode\" => \"CA\",\n \"firstName\" => \"Bob\",\n \"lastName\" => \"Smith\",\n \"phone\" => \"\",\n \"provinceCode\" => \"AB\",\n \"zip\" => \"\",\n ],\n \"shippingLine\" => [\n \"price\" => \"0.0\",\n \"title\" => \"Free shipping\",\n ],\n \"taxExempt\" => false,\n ],\n];\n\n$response = $client->query([\"query\" => $query, \"variables\" => $variables]);\n" Remix example: "const { admin } = await authenticate.admin(request);\n\nconst response = await admin.graphql(\n `#graphql\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n customer {\n id\n email\n firstName\n numberOfOrders\n defaultAddress {\n id\n firstName\n lastName\n address1\n address2\n city\n provinceCode\n zip\n countryCodeV2\n }\n taxExempt\n }\n billingAddressMatchesShippingAddress\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n shippingLine {\n id\n custom\n shippingRateHandle\n title\n originalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }`,\n {\n variables: {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [\n {\n \"appliedDiscount\": {\n \"description\": \"Promo\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"customAttributes\": [],\n \"originalUnitPrice\": 10,\n \"quantity\": 1,\n \"requiresShipping\": true,\n \"sku\": \"draft-151\",\n \"taxable\": true,\n \"title\": \"151cm\",\n \"variantId\": \"gid://shopify/ProductVariant/43729076\",\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1\n }\n },\n {\n \"appliedDiscount\": null,\n \"customAttributes\": [],\n \"originalUnitPrice\": \"10.0\",\n \"quantity\": 2,\n \"requiresShipping\": true,\n \"sku\": null,\n \"taxable\": true,\n \"title\": \"Spring Promo Item\",\n \"variantId\": null,\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1.2\n }\n }\n ],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n customer {\n id\n email\n firstName\n numberOfOrders\n defaultAddress {\n id\n firstName\n lastName\n address1\n address2\n city\n provinceCode\n zip\n countryCodeV2\n }\n taxExempt\n }\n billingAddressMatchesShippingAddress\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n shippingLine {\n id\n custom\n shippingRateHandle\n title\n originalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n}"
input: { "input": { "appliedDiscount": { "description": "Loyalty", "value": 5, "valueType": "FIXED_AMOUNT" }, "billingAddress": { "address1": "123 Amoebobacterieae St", "address2": "", "city": "Ottawa", "company": "", "countryCode": "CA", "firstName": "Bob", "lastName": "Bobsen", "phone": "", "provinceCode": "ON", "zip": "K2P0V6" }, "customerId": "gid://shopify/Customer/544365967", "lineItems": [ { "appliedDiscount": { "description": "Promo", "value": 5, "valueType": "FIXED_AMOUNT" }, "customAttributes": [], "originalUnitPrice": 10, "quantity": 1, "requiresShipping": true, "sku": "draft-151", "taxable": true, "title": "151cm", "variantId": "gid://shopify/ProductVariant/43729076", "weight": { "unit": "KILOGRAMS", "value": 1 } }, { "appliedDiscount": null, "customAttributes": [], "originalUnitPrice": "10.0", "quantity": 2, "requiresShipping": true, "sku": null, "taxable": true, "title": "Spring Promo Item", "variantId": null, "weight": { "unit": "KILOGRAMS", "value": 1.2 } } ], "presentmentCurrencyCode": "CAD", "shippingAddress": { "address1": "", "address2": "", "city": "", "company": "", "countryCode": "CA", "firstName": "Bob", "lastName": "Smith", "phone": "", "provinceCode": "AB", "zip": "" }, "shippingLine": { "price": "0.0", "title": "Free shipping" }, "taxExempt": false } }
response: { "data": { "draftOrderCalculate": { "calculatedDraftOrder": { "customer": { "id": "gid://shopify/Customer/544365967", "email": "bob@example.com", "firstName": "Bob", "numberOfOrders": "25", "defaultAddress": { "id": "gid://shopify/MailingAddress/544365967?model_name=CustomerAddress", "firstName": "Bob", "lastName": "Bobsen", "address1": "123 Amoebobacterieae St", "address2": "", "city": "Ottawa", "provinceCode": "ON", "zip": "K2P0V6", "countryCodeV2": "CA" }, "taxExempt": false }, "billingAddressMatchesShippingAddress": false, "totalPriceSet": { "presentmentMoney": { "amount": "28.05", "currencyCode": "CAD" }, "shopMoney": { "amount": "22.44", "currencyCode": "USD" } }, "lineItems": [ { "appliedDiscount": { "amountSet": { "presentmentMoney": { "amount": "6.38", "currencyCode": "CAD" }, "shopMoney": { "amount": "5.1", "currencyCode": "USD" } }, "value": 5.0, "valueType": "FIXED_AMOUNT", "description": "Promo" }, "discountedTotalSet": { "presentmentMoney": { "amount": "6.61", "currencyCode": "CAD" }, "shopMoney": { "amount": "5.29", "currencyCode": "USD" } }, "product": { "id": "gid://shopify/Product/108828309", "title": "Draft" }, "quantity": 1, "requiresShipping": true, "sku": "draft-151", "taxable": true, "title": "Draft", "variantTitle": "151cm", "variant": { "id": "gid://shopify/ProductVariant/43729076" }, "weight": { "value": 1.0, "unit": "KILOGRAMS" } }, { "appliedDiscount": null, "discountedTotalSet": { "presentmentMoney": { "amount": "25.98", "currencyCode": "CAD" }, "shopMoney": { "amount": "20.78", "currencyCode": "USD" } }, "product": null, "quantity": 2, "requiresShipping": true, "sku": null, "taxable": true, "title": "Spring Promo Item", "variantTitle": null, "variant": null, "weight": { "value": 1.2, "unit": "KILOGRAMS" } } ], "totalTaxSet": { "presentmentMoney": { "amount": "1.84", "currencyCode": "CAD" }, "shopMoney": { "amount": "1.47", "currencyCode": "USD" } }, "totalDiscountsSet": { "presentmentMoney": { "amount": "12.76", "currencyCode": "CAD" }, "shopMoney": { "amount": "10.21", "currencyCode": "USD" } }, "shippingLine": { "id": null, "custom": true, "shippingRateHandle": null, "title": "Free shipping", "originalPriceSet": { "presentmentMoney": { "amount": "0.0", "currencyCode": "CAD" }, "shopMoney": { "amount": "0.0", "currencyCode": "USD" } } }, "presentmentCurrencyCode": "CAD" }, "userErrors": [] } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2025-01/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation CalculateDraftOrder($input: DraftOrderInput!) { draftOrderCalculate(input: $input) { calculatedDraftOrder { purchasingEntity { ... on Customer { firstName } } totalPriceSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } lineItems { appliedDiscount { amountSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } value valueType description } discountedTotalSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } product { id title } quantity requiresShipping sku taxable title variantTitle variant { id } weight { value unit } } totalTaxSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } totalDiscountsSet { presentmentMoney { amount currencyCode } shopMoney { amount currencyCode } } presentmentCurrencyCode } userErrors { field message } } }\",\n \"variables\": {\n \"input\": {\n \"presentmentCurrencyCode\": \"CAD\",\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [\n {\n \"appliedDiscount\": {\n \"description\": \"Promo\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"customAttributes\": [],\n \"quantity\": 1,\n \"requiresShipping\": true,\n \"sku\": \"draft-151\",\n \"taxable\": true,\n \"title\": \"151cm\",\n \"variantId\": \"gid://shopify/ProductVariant/43729076\",\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1\n }\n },\n {\n \"appliedDiscount\": null,\n \"customAttributes\": [],\n \"originalUnitPrice\": \"10.0\",\n \"quantity\": 2,\n \"requiresShipping\": true,\n \"sku\": null,\n \"taxable\": true,\n \"title\": \"Spring Promo Item\",\n \"variantId\": null,\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1.2\n }\n }\n ],\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n purchasingEntity {\n ... on Customer {\n firstName\n }\n }\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }`,\n \"variables\": {\n \"input\": {\n \"presentmentCurrencyCode\": \"CAD\",\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [\n {\n \"appliedDiscount\": {\n \"description\": \"Promo\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"customAttributes\": [],\n \"quantity\": 1,\n \"requiresShipping\": true,\n \"sku\": \"draft-151\",\n \"taxable\": true,\n \"title\": \"151cm\",\n \"variantId\": \"gid://shopify/ProductVariant/43729076\",\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1\n }\n },\n {\n \"appliedDiscount\": null,\n \"customAttributes\": [],\n \"originalUnitPrice\": \"10.0\",\n \"quantity\": 2,\n \"requiresShipping\": true,\n \"sku\": null,\n \"taxable\": true,\n \"title\": \"Spring Promo Item\",\n \"variantId\": null,\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1.2\n }\n }\n ],\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n },\n },\n});\n" Ruby example: "session = ShopifyAPI::Auth::Session.new(\n shop: \"your-development-store.myshopify.com\",\n access_token: access_token\n)\nclient = ShopifyAPI::Clients::Graphql::Admin.new(\n session: session\n)\n\nquery = <<~QUERY\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n purchasingEntity {\n ... on Customer {\n firstName\n }\n }\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }\nQUERY\n\nvariables = {\n \"input\": {\n \"presentmentCurrencyCode\": \"CAD\",\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [{\"appliedDiscount\"=>{\"description\"=>\"Promo\", \"value\"=>5, \"valueType\"=>\"FIXED_AMOUNT\"}, \"customAttributes\"=>[], \"quantity\"=>1, \"requiresShipping\"=>true, \"sku\"=>\"draft-151\", \"taxable\"=>true, \"title\"=>\"151cm\", \"variantId\"=>\"gid://shopify/ProductVariant/43729076\", \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1}}, {\"appliedDiscount\"=>nil, \"customAttributes\"=>[], \"originalUnitPrice\"=>\"10.0\", \"quantity\"=>2, \"requiresShipping\"=>true, \"sku\"=>nil, \"taxable\"=>true, \"title\"=>\"Spring Promo Item\", \"variantId\"=>nil, \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1.2}}],\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n}\n\nresponse = client.query(query: query, variables: variables)\n" PHP example: "use Shopify\\Clients\\Graphql;\n\n$client = new Graphql(\"your-development-store.myshopify.com\", $accessToken);\n$query = <<<QUERY\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n purchasingEntity {\n ... on Customer {\n firstName\n }\n }\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }\nQUERY;\n\n$variables = [\n \"input\" => [\n \"presentmentCurrencyCode\" => \"CAD\",\n \"appliedDiscount\" => [\n \"description\" => \"Loyalty\",\n \"value\" => 5,\n \"valueType\" => \"FIXED_AMOUNT\",\n ],\n \"billingAddress\" => [\n \"address1\" => \"123 Amoebobacterieae St\",\n \"address2\" => \"\",\n \"city\" => \"Ottawa\",\n \"company\" => \"\",\n \"countryCode\" => \"CA\",\n \"firstName\" => \"Bob\",\n \"lastName\" => \"Bobsen\",\n \"phone\" => \"\",\n \"provinceCode\" => \"ON\",\n \"zip\" => \"K2P0V6\",\n ],\n \"customerId\" => \"gid://shopify/Customer/544365967\",\n \"lineItems\" => [{\"appliedDiscount\"=>{\"description\"=>\"Promo\", \"value\"=>5, \"valueType\"=>\"FIXED_AMOUNT\"}, \"customAttributes\"=>[], \"quantity\"=>1, \"requiresShipping\"=>true, \"sku\"=>\"draft-151\", \"taxable\"=>true, \"title\"=>\"151cm\", \"variantId\"=>\"gid://shopify/ProductVariant/43729076\", \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1}}, {\"appliedDiscount\"=>nil, \"customAttributes\"=>[], \"originalUnitPrice\"=>\"10.0\", \"quantity\"=>2, \"requiresShipping\"=>true, \"sku\"=>nil, \"taxable\"=>true, \"title\"=>\"Spring Promo Item\", \"variantId\"=>nil, \"weight\"=>{\"unit\"=>\"KILOGRAMS\", \"value\"=>1.2}}],\n \"shippingAddress\" => [\n \"address1\" => \"\",\n \"address2\" => \"\",\n \"city\" => \"\",\n \"company\" => \"\",\n \"countryCode\" => \"CA\",\n \"firstName\" => \"Bob\",\n \"lastName\" => \"Smith\",\n \"phone\" => \"\",\n \"provinceCode\" => \"AB\",\n \"zip\" => \"\",\n ],\n \"shippingLine\" => [\n \"price\" => \"0.0\",\n \"title\" => \"Free shipping\",\n ],\n \"taxExempt\" => false,\n ],\n];\n\n$response = $client->query([\"query\" => $query, \"variables\" => $variables]);\n" Remix example: "const { admin } = await authenticate.admin(request);\n\nconst response = await admin.graphql(\n `#graphql\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n purchasingEntity {\n ... on Customer {\n firstName\n }\n }\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n }`,\n {\n variables: {\n \"input\": {\n \"presentmentCurrencyCode\": \"CAD\",\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"123 Amoebobacterieae St\",\n \"address2\": \"\",\n \"city\": \"Ottawa\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Bobsen\",\n \"phone\": \"\",\n \"provinceCode\": \"ON\",\n \"zip\": \"K2P0V6\"\n },\n \"customerId\": \"gid://shopify/Customer/544365967\",\n \"lineItems\": [\n {\n \"appliedDiscount\": {\n \"description\": \"Promo\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"customAttributes\": [],\n \"quantity\": 1,\n \"requiresShipping\": true,\n \"sku\": \"draft-151\",\n \"taxable\": true,\n \"title\": \"151cm\",\n \"variantId\": \"gid://shopify/ProductVariant/43729076\",\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1\n }\n },\n {\n \"appliedDiscount\": null,\n \"customAttributes\": [],\n \"originalUnitPrice\": \"10.0\",\n \"quantity\": 2,\n \"requiresShipping\": true,\n \"sku\": null,\n \"taxable\": true,\n \"title\": \"Spring Promo Item\",\n \"variantId\": null,\n \"weight\": {\n \"unit\": \"KILOGRAMS\",\n \"value\": 1.2\n }\n }\n ],\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n calculatedDraftOrder {\n purchasingEntity {\n ... on Customer {\n firstName\n }\n }\n totalPriceSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n lineItems {\n appliedDiscount {\n amountSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n value\n valueType\n description\n }\n discountedTotalSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n product {\n id\n title\n }\n quantity\n requiresShipping\n sku\n taxable\n title\n variantTitle\n variant {\n id\n }\n weight {\n value\n unit\n }\n }\n totalTaxSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n totalDiscountsSet {\n presentmentMoney {\n amount\n currencyCode\n }\n shopMoney {\n amount\n currencyCode\n }\n }\n presentmentCurrencyCode\n }\n userErrors {\n field\n message\n }\n }\n}"
input: { "input": { "presentmentCurrencyCode": "CAD", "appliedDiscount": { "description": "Loyalty", "value": 5, "valueType": "FIXED_AMOUNT" }, "billingAddress": { "address1": "123 Amoebobacterieae St", "address2": "", "city": "Ottawa", "company": "", "countryCode": "CA", "firstName": "Bob", "lastName": "Bobsen", "phone": "", "provinceCode": "ON", "zip": "K2P0V6" }, "customerId": "gid://shopify/Customer/544365967", "lineItems": [ { "appliedDiscount": { "description": "Promo", "value": 5, "valueType": "FIXED_AMOUNT" }, "customAttributes": [], "quantity": 1, "requiresShipping": true, "sku": "draft-151", "taxable": true, "title": "151cm", "variantId": "gid://shopify/ProductVariant/43729076", "weight": { "unit": "KILOGRAMS", "value": 1 } }, { "appliedDiscount": null, "customAttributes": [], "originalUnitPrice": "10.0", "quantity": 2, "requiresShipping": true, "sku": null, "taxable": true, "title": "Spring Promo Item", "variantId": null, "weight": { "unit": "KILOGRAMS", "value": 1.2 } } ], "shippingAddress": { "address1": "", "address2": "", "city": "", "company": "", "countryCode": "CA", "firstName": "Bob", "lastName": "Smith", "phone": "", "provinceCode": "AB", "zip": "" }, "shippingLine": { "price": "0.0", "title": "Free shipping" }, "taxExempt": false } }
response: { "data": { "draftOrderCalculate": { "calculatedDraftOrder": { "purchasingEntity": { "firstName": "Bob" }, "totalPriceSet": { "presentmentMoney": { "amount": "28.05", "currencyCode": "CAD" }, "shopMoney": { "amount": "22.44", "currencyCode": "USD" } }, "lineItems": [ { "appliedDiscount": { "amountSet": { "presentmentMoney": { "amount": "6.38", "currencyCode": "CAD" }, "shopMoney": { "amount": "5.1", "currencyCode": "USD" } }, "value": 5.0, "valueType": "FIXED_AMOUNT", "description": "Promo" }, "discountedTotalSet": { "presentmentMoney": { "amount": "6.61", "currencyCode": "CAD" }, "shopMoney": { "amount": "5.29", "currencyCode": "USD" } }, "product": { "id": "gid://shopify/Product/108828309", "title": "Draft" }, "quantity": 1, "requiresShipping": true, "sku": "draft-151", "taxable": true, "title": "Draft", "variantTitle": "151cm", "variant": { "id": "gid://shopify/ProductVariant/43729076" }, "weight": { "value": 1.0, "unit": "KILOGRAMS" } }, { "appliedDiscount": null, "discountedTotalSet": { "presentmentMoney": { "amount": "25.98", "currencyCode": "CAD" }, "shopMoney": { "amount": "20.78", "currencyCode": "USD" } }, "product": null, "quantity": 2, "requiresShipping": true, "sku": null, "taxable": true, "title": "Spring Promo Item", "variantTitle": null, "variant": null, "weight": { "value": 1.2, "unit": "KILOGRAMS" } } ], "totalTaxSet": { "presentmentMoney": { "amount": "1.84", "currencyCode": "CAD" }, "shopMoney": { "amount": "1.47", "currencyCode": "USD" } }, "totalDiscountsSet": { "presentmentMoney": { "amount": "12.76", "currencyCode": "CAD" }, "shopMoney": { "amount": "10.21", "currencyCode": "USD" } }, "presentmentCurrencyCode": "CAD" }, "userErrors": [] } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2025-01/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation CalculateDraftOrder($input: DraftOrderInput!) { draftOrderCalculate(input: $input) { userErrors { field message } } }\",\n \"variables\": {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"lineItems\": [],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n userErrors {\n field\n message\n }\n }\n }`,\n \"variables\": {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"lineItems\": [],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n },\n },\n});\n" Ruby example: "session = ShopifyAPI::Auth::Session.new(\n shop: \"your-development-store.myshopify.com\",\n access_token: access_token\n)\nclient = ShopifyAPI::Clients::Graphql::Admin.new(\n session: session\n)\n\nquery = <<~QUERY\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n userErrors {\n field\n message\n }\n }\n }\nQUERY\n\nvariables = {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"lineItems\": [],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n}\n\nresponse = client.query(query: query, variables: variables)\n" PHP example: "use Shopify\\Clients\\Graphql;\n\n$client = new Graphql(\"your-development-store.myshopify.com\", $accessToken);\n$query = <<<QUERY\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n userErrors {\n field\n message\n }\n }\n }\nQUERY;\n\n$variables = [\n \"input\" => [\n \"appliedDiscount\" => [\n \"description\" => \"Loyalty\",\n \"value\" => 5,\n \"valueType\" => \"FIXED_AMOUNT\",\n ],\n \"billingAddress\" => [\n \"address1\" => \"\",\n \"address2\" => \"\",\n \"city\" => \"\",\n \"company\" => \"\",\n \"countryCode\" => \"CA\",\n \"firstName\" => \"Bob\",\n \"lastName\" => \"Smith\",\n \"phone\" => \"\",\n \"provinceCode\" => \"AB\",\n \"zip\" => \"\",\n ],\n \"lineItems\" => [],\n \"presentmentCurrencyCode\" => \"CAD\",\n \"shippingAddress\" => [\n \"address1\" => \"\",\n \"address2\" => \"\",\n \"city\" => \"\",\n \"company\" => \"\",\n \"countryCode\" => \"CA\",\n \"firstName\" => \"Bob\",\n \"lastName\" => \"Smith\",\n \"phone\" => \"\",\n \"provinceCode\" => \"AB\",\n \"zip\" => \"\",\n ],\n \"shippingLine\" => [\n \"price\" => \"0.0\",\n \"title\" => \"Free shipping\",\n ],\n \"taxExempt\" => false,\n ],\n];\n\n$response = $client->query([\"query\" => $query, \"variables\" => $variables]);\n" Remix example: "const { admin } = await authenticate.admin(request);\n\nconst response = await admin.graphql(\n `#graphql\n mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n userErrors {\n field\n message\n }\n }\n }`,\n {\n variables: {\n \"input\": {\n \"appliedDiscount\": {\n \"description\": \"Loyalty\",\n \"value\": 5,\n \"valueType\": \"FIXED_AMOUNT\"\n },\n \"billingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"lineItems\": [],\n \"presentmentCurrencyCode\": \"CAD\",\n \"shippingAddress\": {\n \"address1\": \"\",\n \"address2\": \"\",\n \"city\": \"\",\n \"company\": \"\",\n \"countryCode\": \"CA\",\n \"firstName\": \"Bob\",\n \"lastName\": \"Smith\",\n \"phone\": \"\",\n \"provinceCode\": \"AB\",\n \"zip\": \"\"\n },\n \"shippingLine\": {\n \"price\": \"0.0\",\n \"title\": \"Free shipping\"\n },\n \"taxExempt\": false\n }\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation CalculateDraftOrder($input: DraftOrderInput!) {\n draftOrderCalculate(input: $input) {\n userErrors {\n field\n message\n }\n }\n}"
input: { "input": { "appliedDiscount": { "description": "Loyalty", "value": 5, "valueType": "FIXED_AMOUNT" }, "billingAddress": { "address1": "", "address2": "", "city": "", "company": "", "countryCode": "CA", "firstName": "Bob", "lastName": "Smith", "phone": "", "provinceCode": "AB", "zip": "" }, "lineItems": [], "presentmentCurrencyCode": "CAD", "shippingAddress": { "address1": "", "address2": "", "city": "", "company": "", "countryCode": "CA", "firstName": "Bob", "lastName": "Smith", "phone": "", "provinceCode": "AB", "zip": "" }, "shippingLine": { "price": "0.0", "title": "Free shipping" }, "taxExempt": false } }
response: { "data": { "draftOrderCalculate": { "userErrors": [ { "field": null, "message": "Add at least 1 product" } ] } } }