Version: 2024-10
Allows an app to charge a store for features or services on a recurring basis.
Attaches one or more pricing plans to an app subscription. Only one pricing plan can be defined for each available type.
A descriptive name for the app subscription.
The replacement behavior when creating an app subscription for a merchant with an already existing app subscription.
The URL pointing to the page where the merchant is redirected after approving the app subscription.
Whether the app subscription is a test transaction.
The number of days of the free trial period, beginning on the day that the merchant approves the app charges.
The newly-created app subscription.
The URL pointing to the page where the merchant approves or declines the charges for an app subscription.
The list of errors that occurred from executing the mutation.
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) { userErrors { field message } appSubscription { id } confirmationUrl } }\",\n \"variables\": {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }`,\n \"variables\": {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}, \"interval\"=>\"EVERY_30_DAYS\"}}}]\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 = <<\"Super Duper Recurring Plan\",\n \"returnUrl\" => \"http://super-duper.shopifyapps.com/\",\n \"lineItems\" => [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}, \"interval\"=>\"EVERY_30_DAYS\"}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }`,\n {\n variables: {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n}"
input: { "name": "Super Duper Recurring Plan", "returnUrl": "http://super-duper.shopifyapps.com/", "lineItems": [ { "plan": { "appRecurringPricingDetails": { "price": { "amount": 10.0, "currencyCode": "USD" }, "interval": "EVERY_30_DAYS" } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "appSubscription": { "id": "gid://shopify/AppSubscription/1029266950" }, "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266950/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAZeWT06EmF1dG9fYWN0aXZhdGVU--353b847ab561a829e9db3d95f0ff5a23a4f690be" } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) { userErrors { field message } appSubscription { id lineItems { id plan { pricingDetails __typename } } } confirmationUrl } }\",\n \"variables\": {\n \"name\": \"Super Duper Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails\n __typename\n }\n }\n }\n confirmationUrl\n }\n }`,\n \"variables\": {\n \"name\": \"Super Duper Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails\n __typename\n }\n }\n }\n confirmationUrl\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"Super Duper Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [{\"plan\"=>{\"appUsagePricingDetails\"=>{\"terms\"=>\"$1 for 100 emails\", \"cappedAmount\"=>{\"amount\"=>20.0, \"currencyCode\"=>\"USD\"}}}}]\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 = <<\"Super Duper Usage Plan\",\n \"returnUrl\" => \"http://super-duper.shopifyapps.com/\",\n \"lineItems\" => [{\"plan\"=>{\"appUsagePricingDetails\"=>{\"terms\"=>\"$1 for 100 emails\", \"cappedAmount\"=>{\"amount\"=>20.0, \"currencyCode\"=>\"USD\"}}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails\n __typename\n }\n }\n }\n confirmationUrl\n }\n }`,\n {\n variables: {\n \"name\": \"Super Duper Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails\n __typename\n }\n }\n }\n confirmationUrl\n }\n}"
input: { "name": "Super Duper Usage Plan", "returnUrl": "http://super-duper.shopifyapps.com/", "lineItems": [ { "plan": { "appUsagePricingDetails": { "terms": "$1 for 100 emails", "cappedAmount": { "amount": 20.0, "currencyCode": "USD" } } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "appSubscription": { "id": "gid://shopify/AppSubscription/1029266949", "lineItems": [ { "id": "gid://shopify/AppSubscriptionLineItem/1029266949?v=1&index=0", "plan": { "pricingDetails": {}, "__typename": "AppPlanV2" } } ] }, "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266949/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAVeWT06EmF1dG9fYWN0aXZhdGVU--0f11019bf0fe7edcdb89347c432a14109c53f618" } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) { userErrors { field message } appSubscription { id } confirmationUrl } }\",\n \"variables\": {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n },\n \"interval\": \"ANNUAL\"\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }`,\n \"variables\": {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n },\n \"interval\": \"ANNUAL\"\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}, \"interval\"=>\"ANNUAL\"}}}]\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 = <<\"Super Duper Recurring Plan\",\n \"returnUrl\" => \"http://super-duper.shopifyapps.com/\",\n \"lineItems\" => [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}, \"interval\"=>\"ANNUAL\"}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }`,\n {\n variables: {\n \"name\": \"Super Duper Recurring Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n },\n \"interval\": \"ANNUAL\"\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n}"
input: { "name": "Super Duper Recurring Plan", "returnUrl": "http://super-duper.shopifyapps.com/", "lineItems": [ { "plan": { "appRecurringPricingDetails": { "price": { "amount": 10.0, "currencyCode": "USD" }, "interval": "ANNUAL" } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "appSubscription": { "id": "gid://shopify/AppSubscription/1029266947" }, "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266947/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBANeWT06EmF1dG9fYWN0aXZhdGVU--f6a58f222ad78948c56c070cc490ecf8dbb7048c" } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) { userErrors { field message } appSubscription { id lineItems { id plan { pricingDetails { __typename } } } } confirmationUrl } }\",\n \"variables\": {\n \"name\": \"Super Duper Recurring and Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n },\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails {\n __typename\n }\n }\n }\n }\n confirmationUrl\n }\n }`,\n \"variables\": {\n \"name\": \"Super Duper Recurring and Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n },\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails {\n __typename\n }\n }\n }\n }\n confirmationUrl\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"Super Duper Recurring and Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [{\"plan\"=>{\"appUsagePricingDetails\"=>{\"terms\"=>\"$1 for 100 emails\", \"cappedAmount\"=>{\"amount\"=>20.0, \"currencyCode\"=>\"USD\"}}}}, {\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}}}}]\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 = <<\"Super Duper Recurring and Usage Plan\",\n \"returnUrl\" => \"http://super-duper.shopifyapps.com/\",\n \"lineItems\" => [{\"plan\"=>{\"appUsagePricingDetails\"=>{\"terms\"=>\"$1 for 100 emails\", \"cappedAmount\"=>{\"amount\"=>20.0, \"currencyCode\"=>\"USD\"}}}}, {\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails {\n __typename\n }\n }\n }\n }\n confirmationUrl\n }\n }`,\n {\n variables: {\n \"name\": \"Super Duper Recurring and Usage Plan\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n },\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n lineItems {\n id\n plan {\n pricingDetails {\n __typename\n }\n }\n }\n }\n confirmationUrl\n }\n}"
input: { "name": "Super Duper Recurring and Usage Plan", "returnUrl": "http://super-duper.shopifyapps.com/", "lineItems": [ { "plan": { "appUsagePricingDetails": { "terms": "$1 for 100 emails", "cappedAmount": { "amount": 20.0, "currencyCode": "USD" } } } }, { "plan": { "appRecurringPricingDetails": { "price": { "amount": 10.0, "currencyCode": "USD" } } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "appSubscription": { "id": "gid://shopify/AppSubscription/1029266953", "lineItems": [ { "id": "gid://shopify/AppSubscriptionLineItem/1029266953?v=1&index=0", "plan": { "pricingDetails": { "__typename": "AppRecurringPricing" } } }, { "id": "gid://shopify/AppSubscriptionLineItem/1029266953?v=1&index=1", "plan": { "pricingDetails": { "__typename": "AppUsagePricing" } } } ] }, "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266953/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAleWT06EmF1dG9fYWN0aXZhdGVU--4314ad97c411fa9da47834a7893463df148d23f1" } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) { userErrors { field message } confirmationUrl appSubscription { id } } }\",\n \"variables\": {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 40.0,\n \"currencyCode\": \"USD\"\n },\n \"discount\": {\n \"value\": {\n \"amount\": 5.0\n },\n \"durationLimitInIntervals\": 2\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }`,\n \"variables\": {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 40.0,\n \"currencyCode\": \"USD\"\n },\n \"discount\": {\n \"value\": {\n \"amount\": 5.0\n },\n \"durationLimitInIntervals\": 2\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>40.0, \"currencyCode\"=>\"USD\"}, \"discount\"=>{\"value\"=>{\"amount\"=>5.0}, \"durationLimitInIntervals\"=>2}, \"interval\"=>\"EVERY_30_DAYS\"}}}]\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 = <<\"30 Day Recurring Plan\",\n \"returnUrl\" => \"https://review-app.shopifyapps.com\",\n \"lineItems\" => [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>40.0, \"currencyCode\"=>\"USD\"}, \"discount\"=>{\"value\"=>{\"amount\"=>5.0}, \"durationLimitInIntervals\"=>2}, \"interval\"=>\"EVERY_30_DAYS\"}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }`,\n {\n variables: {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 40.0,\n \"currencyCode\": \"USD\"\n },\n \"discount\": {\n \"value\": {\n \"amount\": 5.0\n },\n \"durationLimitInIntervals\": 2\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n}"
input: { "name": "30 Day Recurring Plan", "returnUrl": "https://review-app.shopifyapps.com", "lineItems": [ { "plan": { "appRecurringPricingDetails": { "price": { "amount": 40.0, "currencyCode": "USD" }, "discount": { "value": { "amount": 5.0 }, "durationLimitInIntervals": 2 }, "interval": "EVERY_30_DAYS" } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266948/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAReWT06EmF1dG9fYWN0aXZhdGVU--ca2d9875a571449437b370eb58ed91e535a67e43", "appSubscription": { "id": "gid://shopify/AppSubscription/1029266948" } } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!, $trialDays: Int) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems, trialDays: $trialDays) { userErrors { field message } appSubscription { id } confirmationUrl } }\",\n \"variables\": {\n \"name\": \"Super Duper Recurring Plan with a Trial\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"trialDays\": 7,\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!, $trialDays: Int) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems, trialDays: $trialDays) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }`,\n \"variables\": {\n \"name\": \"Super Duper Recurring Plan with a Trial\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"trialDays\": 7,\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!, $trialDays: Int) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems, trialDays: $trialDays) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"Super Duper Recurring Plan with a Trial\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"trialDays\": 7,\n \"lineItems\": [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}}}}]\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 = <<\"Super Duper Recurring Plan with a Trial\",\n \"returnUrl\" => \"http://super-duper.shopifyapps.com/\",\n \"trialDays\" => 7,\n \"lineItems\" => [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>10.0, \"currencyCode\"=>\"USD\"}}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!, $trialDays: Int) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems, trialDays: $trialDays) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n }`,\n {\n variables: {\n \"name\": \"Super Duper Recurring Plan with a Trial\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com/\",\n \"trialDays\": 7,\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 10.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!, $trialDays: Int) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems, trialDays: $trialDays) {\n userErrors {\n field\n message\n }\n appSubscription {\n id\n }\n confirmationUrl\n }\n}"
input: { "name": "Super Duper Recurring Plan with a Trial", "returnUrl": "http://super-duper.shopifyapps.com/", "trialDays": 7, "lineItems": [ { "plan": { "appRecurringPricingDetails": { "price": { "amount": 10.0, "currencyCode": "USD" } } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "appSubscription": { "id": "gid://shopify/AppSubscription/1029266952" }, "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266952/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAheWT06EmF1dG9fYWN0aXZhdGVU--427058b56d1c8ee21519d6d84fe79589400563c9" } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) { userErrors { field message } confirmationUrl appSubscription { id } } }\",\n \"variables\": {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 40.0,\n \"currencyCode\": \"USD\"\n },\n \"discount\": {\n \"value\": {\n \"percentage\": 0.2\n },\n \"durationLimitInIntervals\": 10\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }`,\n \"variables\": {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 40.0,\n \"currencyCode\": \"USD\"\n },\n \"discount\": {\n \"value\": {\n \"percentage\": 0.2\n },\n \"durationLimitInIntervals\": 10\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>40.0, \"currencyCode\"=>\"USD\"}, \"discount\"=>{\"value\"=>{\"percentage\"=>0.2}, \"durationLimitInIntervals\"=>10}, \"interval\"=>\"EVERY_30_DAYS\"}}}]\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 = <<\"30 Day Recurring Plan\",\n \"returnUrl\" => \"https://review-app.shopifyapps.com\",\n \"lineItems\" => [{\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>40.0, \"currencyCode\"=>\"USD\"}, \"discount\"=>{\"value\"=>{\"percentage\"=>0.2}, \"durationLimitInIntervals\"=>10}, \"interval\"=>\"EVERY_30_DAYS\"}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }`,\n {\n variables: {\n \"name\": \"30 Day Recurring Plan\",\n \"returnUrl\": \"https://review-app.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 40.0,\n \"currencyCode\": \"USD\"\n },\n \"discount\": {\n \"value\": {\n \"percentage\": 0.2\n },\n \"durationLimitInIntervals\": 10\n },\n \"interval\": \"EVERY_30_DAYS\"\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n}"
input: { "name": "30 Day Recurring Plan", "returnUrl": "https://review-app.shopifyapps.com", "lineItems": [ { "plan": { "appRecurringPricingDetails": { "price": { "amount": 40.0, "currencyCode": "USD" }, "discount": { "value": { "percentage": 0.2 }, "durationLimitInIntervals": 10 }, "interval": "EVERY_30_DAYS" } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266951/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAdeWT06EmF1dG9fYWN0aXZhdGVU--97200e8aec46abce1cc3737c2e286e892edeb3e1", "appSubscription": { "id": "gid://shopify/AppSubscription/1029266951" } } } }
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/2024-10/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) { appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) { userErrors { field message } confirmationUrl appSubscription { id } } }\",\n \"variables\": {\n \"name\": \"Subscription for Module A and Module B\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails for Module B\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n },\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 35.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n }\n}'\n" Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n data: {\n \"query\": `mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }`,\n \"variables\": {\n \"name\": \"Subscription for Module A and Module B\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails for Module B\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n },\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 35.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }\nQUERY\n\nvariables = {\n \"name\": \"Subscription for Module A and Module B\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com\",\n \"lineItems\": [{\"plan\"=>{\"appUsagePricingDetails\"=>{\"terms\"=>\"$1 for 100 emails for Module B\", \"cappedAmount\"=>{\"amount\"=>20.0, \"currencyCode\"=>\"USD\"}}}}, {\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>35.0, \"currencyCode\"=>\"USD\"}}}}]\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 = <<\"Subscription for Module A and Module B\",\n \"returnUrl\" => \"http://super-duper.shopifyapps.com\",\n \"lineItems\" => [{\"plan\"=>{\"appUsagePricingDetails\"=>{\"terms\"=>\"$1 for 100 emails for Module B\", \"cappedAmount\"=>{\"amount\"=>20.0, \"currencyCode\"=>\"USD\"}}}}, {\"plan\"=>{\"appRecurringPricingDetails\"=>{\"price\"=>{\"amount\"=>35.0, \"currencyCode\"=>\"USD\"}}}}],\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 AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n }`,\n {\n variables: {\n \"name\": \"Subscription for Module A and Module B\",\n \"returnUrl\": \"http://super-duper.shopifyapps.com\",\n \"lineItems\": [\n {\n \"plan\": {\n \"appUsagePricingDetails\": {\n \"terms\": \"$1 for 100 emails for Module B\",\n \"cappedAmount\": {\n \"amount\": 20.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n },\n {\n \"plan\": {\n \"appRecurringPricingDetails\": {\n \"price\": {\n \"amount\": 35.0,\n \"currencyCode\": \"USD\"\n }\n }\n }\n }\n ]\n },\n },\n);\n\nconst data = await response.json();\n" Graphql query: "mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {\n appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {\n userErrors {\n field\n message\n }\n confirmationUrl\n appSubscription {\n id\n }\n }\n}"
input: { "name": "Subscription for Module A and Module B", "returnUrl": "http://super-duper.shopifyapps.com", "lineItems": [ { "plan": { "appUsagePricingDetails": { "terms": "$1 for 100 emails for Module B", "cappedAmount": { "amount": 20.0, "currencyCode": "USD" } } } }, { "plan": { "appRecurringPricingDetails": { "price": { "amount": 35.0, "currencyCode": "USD" } } } } ] }
response: { "data": { "appSubscriptionCreate": { "userErrors": [], "confirmationUrl": "https://billingshop.myshopify.com/admin/charges/166357/1029266954/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBApeWT06EmF1dG9fYWN0aXZhdGVU--8502272f2d30cfc1b77e3f1521764c17c11f003b", "appSubscription": { "id": "gid://shopify/AppSubscription/1029266954" } } } }