Skip to main content

Build delivery profiles

You can use delivery profiles to manage advanced shipping information in Shopify. Shops that use delivery profiles gain the ability to create shipping rates per product variant and location.

This guide shows you how to manage delivery profiles for pre-orders and Try before you buy (TBYB).


Note
  • Most subscriptions, pre-order and try before you buy apps need to request API access through the Partner Dashboard. We give API access to apps that are designed according to our [principles for subscriptions, pre-order and TBYB apps] (/docs/apps/selling-strategies/purchase-options#shopifys-principles).
  • Public apps that use subscriptions, pre-order or TBYB need to meet specific requirements to be published on the Shopify App Store.
  • Custom apps created in the Shopify admin can't use subscriptions, pre-order or TBYB because these apps can't use extensions or request access to protected scopes. If you're building a solution for a single store, then build your custom app in the Partner Dashboard.

Anchor to Step 1: Create delivery profilesStep 1: Create delivery profiles

A delivery profile is a set of shipping rates scoped to a set of products or variants that can be shipped from selected locations to zones. You can associate the DeliveryProfile with the SellingPlanGroup object to do the following tasks:

You can set free shipping for all orders with a pre-order or TBYB. The following example uses the deliveryProfileCreate mutation to set free shipping.

POST https://{shop}.myshopify.com/api/{api_version}/graphql.json

GraphQL mutation

mutation {
deliveryProfileCreate(
profile: {
# Set the `sellingPlanGroupsToAssociate` field with the `SellingPlanGroup` ID to associate the delivery profile with pre-orders and TBYB.
sellingPlanGroupsToAssociate: ["gid://shopify/SellingPlanGroup/1"]
name: "Pre-orders free shipping"
# Defines the locations that will be grouped together for the included zones.
locationGroupsToCreate: {
locations: "gid://shopify/Location/1"
# Defines the countries for the zone and the delivery method.
zonesToCreate: {
name: "All Countries"
countries: { restOfWorld: true }
# Method definitions represent delivery methods within the context of a delivery profile, location group, and zone. Each method definition includes a `name` property, representing the name of the delivery method that is displayed to the customer at checkout.
methodDefinitionsToCreate: {
# Set the rate definition to `amount: 0`.
rateDefinition: { price: { amount: 0, currencyCode: CAD } }
name: "Free Shipping"
}
}
}
}
) {
profile {
id
# Profile location groups represent groupings of origin locations that have common shipping properties within a delivery profile.
profileLocationGroups {
# The `locationGroupZones` object represents one or more delivery zones where products can ship to. Each profile location group can have multiple location group zones.
locationGroupZones(first: 1) {
edges {
node {
zone {
id
name
countries {
code {
restOfWorld
}
}
}
methodDefinitions(first: 1) {
edges {
node {
id
name
# The rates that are displayed at checkout. Shopify supports two types of rates: `DeliveryRateDefinition` (Static rates, stored within Shopify) and `DeliveryParticipant` (Dynamic rates, retrieved with the CarrierService API).
rateProvider {
__typename
... on DeliveryRateDefinition {
price {
amount
currencyCode
}
}
}
}
}
}
}
}
}
}
}
}
}

JSON response

{
"data": {
"deliveryProfileCreate": {
"profile": {
"id": "gid://shopify/DeliveryProfile/1",
"profileLocationGroups": [
{
"locationGroupZones": {
"edges": [
{
"node": {
"zone": {
"id": "gid://shopify/DeliveryZone/1",
"name": "All Countries",
"countries": [
{
"code": {
"restOfWorld": true
}
}
]
},
"methodDefinitions": {
"edges": [
{
"node": {
"id": "gid://shopify/DeliveryMethodDefinition/1",
"name": "Free Shipping",
"rateProvider": {
"__typename": "DeliveryRateDefinition",
"price": {
"amount": "0.0",
"currencyCode": "CAD"
}
}
}
}
]
}
}
}
]
}
}
]
}
}
}
}

Anchor to Restrict shipping to specific countriesRestrict shipping to specific countries

You can restrict pre-orders and TBYB shipping to specific countries regardless of which delivery zones you have configured in the Shopify admin. The following example restricts shipping to North America (Canada, United States, Mexico):

POST https://{shop}.myshopify.com/api/{api_version}/graphql.json

GraphQL mutation

mutation {
deliveryProfileCreate(
profile: {
# Set the `sellingPlanGroupsToAssociate` field with the `SellingPlanGroup` ID to associate the delivery profile with pre-orders and TBYB.
sellingPlanGroupsToAssociate: ["gid://shopify/SellingPlanGroup/2"]
name: "Pre-orders to North America"
locationGroupsToCreate: {
locations: "gid://shopify/Location/1"
# Create a delivery zone.
zonesToCreate: {
name: "North America Shipping"
# Add countries to the delivery zone.
countries: [
{ code: CA, includeAllProvinces: true }
{ code: US, includeAllProvinces: true }
{ code: MX, includeAllProvinces: true }
]
methodDefinitionsToCreate: {
name: "Free Shipping"
# Sets the rate definition for the delivery zone.
rateDefinition: { price: { amount: 0, currencyCode: CAD } }
}
}
}
}
) {
profile {
id
profileLocationGroups {
locationGroupZones(first: 1) {
edges {
node {
zone {
id
name
countries {
name
}
}
methodDefinitions(first: 1) {
edges {
node {
id
name
rateProvider {
__typename
... on DeliveryRateDefinition {
price {
amount
currencyCode
}
}
}
}
}
}
}
}
}
}
}
}
}

JSON response

{
"data": {
"deliveryProfileCreate": {
"profile": {
"id": "gid://shopify/DeliveryProfile/2",
"profileLocationGroups": [
{
"locationGroupZones": {
"edges": [
{
"node": {
"zone": {
"id": "gid://shopify/DeliveryZone/2",
"name": "North America Shipping",
"countries": [
{
"name": "Canada"
},
{
"name": "United States"
},
{
"name": "Mexico"
}
]
},
"methodDefinitions": {
"edges": [
{
"node": {
"id": "gid://shopify/DeliveryMethodDefinition/2",
"name": "Free Shipping",
"rateProvider": {
"__typename": "DeliveryRateDefinition",
"price": {
"amount": "0.0",
"currencyCode": "CAD"
}
}
}
}
]
}
}
}
]
}
}
]
}
}
}
}

Anchor to Set a flat shipping rate by countrySet a flat shipping rate by country

You can set a flat shipping rate by delivery zone for all orders with pre-orders and TBYB. The following example defines free shipping to Canada and defines a $15.00 flat shipping rate for the rest of the world:

POST https://{shop}.myshopify.com/api/{api_version}/graphql.json

GraphQL mutation

mutation {
# Create a delivery zone where you want to apply a flat shipping rate, and add countries to the delivery zone.
deliveryProfileCreate(
profile: {
# Set the `sellingPlanGroupsToAssociate` field with the `SellingPlanGroup` ID to associate the delivery profile with pre-orders and TBYB.
sellingPlanGroupsToAssociate: ["gid://shopify/SellingPlanGroup/3"]
name: "Pre-orders To Canada and International"
locationGroupsToCreate: {
locations: "gid://shopify/Location/1"
# Create a delivery zone for the rest of the delivery destinations, and add countries to the delivery zone.
zonesToCreate: [
{
name: "Canada Shipping"
countries: [{ code: CA, includeAllProvinces: true }]
methodDefinitionsToCreate: {
name: "Free Shipping"
# Set the rate definition for the delivery zone.
rateDefinition: { price: { amount: 0, currencyCode: CAD } }
}
}
{
name: "Rest of World"
countries: { restOfWorld: true }
methodDefinitionsToCreate: {
name: "International Shipping"
# Set the rate definition for the delivery zone.
rateDefinition: { price: { amount: 15, currencyCode: CAD } }
}
}
]
}
}
) {
profile {
id
profileLocationGroups {
locationGroupZones(first: 2) {
edges {
node {
zone {
id
name
countries {
name
}
}
methodDefinitions(first: 1) {
edges {
node {
id
name
rateProvider {
__typename
... on DeliveryRateDefinition {
price {
amount
currencyCode
}
}
}
}
}
}
}
}
}
}
}
}
}

JSON response

{
"data": {
"deliveryProfileCreate": {
"profile": {
"id": "gid://shopify/DeliveryProfile/4",
"profileLocationGroups": [
{
"locationGroupZones": {
"edges": [
{
"node": {
"zone": {
"id": "gid://shopify/DeliveryZone/4",
"name": "Canada Shipping",
"countries": [
{
"name": "Canada"
}
]
},
"methodDefinitions": {
"edges": [
{
"node": {
"id": "gid://shopify/DeliveryMethodDefinition/4",
"name": "Free Shipping",
"rateProvider": {
"__typename": "DeliveryRateDefinition",
"price": {
"amount": "0.0",
"currencyCode": "CAD"
}
}
}
}
]
}
}
},
{
"node": {
"zone": {
"id": "gid://shopify/DeliveryZone/5",
"name": "Rest of World",
"countries": [
{
"name": "Rest of World"
}
]
},
"methodDefinitions": {
"edges": [
{
"node": {
"id": "gid://shopify/DeliveryMethodDefinition/5",
"name": "International Shipping",
"rateProvider": {
"__typename": "DeliveryRateDefinition",
"price": {
"amount": "15.0",
"currencyCode": "CAD"
}
}
}
}
]
}
}
}
]
}
}
]
}
}
}
}

Anchor to Step 2: Retrieve delivery profilesStep 2: Retrieve delivery profiles

You can use the deliveryProfiles query to retrieve a list of delivery profiles.

The following query returns a delivery profile with its ID, name, and default setting. Product variants stay in the default profile until they are added to another delivery profile. The example response indicates that the default profile is returned.

POST https://{shop}.myshopify.com/api/{api_version}/graphql.json

GraphQL query

query {
deliveryProfiles (first: 1) {
edges {
node {
id
name
default
}
}
}
}

JSON response

{
"data": {
"deliveryProfiles": {
"edges": [
{
"node": {
"id": "gid://shopify/DeliveryProfile/4227128",
"name": "Default",
"default": true
}
}
]
}
},
...
}

Anchor to Step 3: Update delivery profilesStep 3: Update delivery profiles

You can use the deliveryProfileUpdate mutation to update existing delivery profiles. The following example adds the United States delivery zone:

POST https://{shop}.myshopify.com/api/{api_version}/graphql.json

GraphQL mutation

mutation {
deliveryProfileUpdate(
# Specify the delivery profile ID to update.
id: "gid://shopify/DeliveryProfile/3"
profile: {
locationGroupsToCreate: {
locations: "gid://shopify/Location/1"
# Create a new delivery zone.
zonesToCreate: [
{
name: "United States"
countries: { code: US, includeAllProvinces: true }
methodDefinitionsToCreate: {
# Set the rate definition for the delivery zone.
rateDefinition: { price: { amount: 0, currencyCode: CAD } }
name: "Free Shipping"
}
}
]
}
}
) {
profile {
id
profileLocationGroups {
locationGroupZones(first: 5) {
edges {
node {
zone {
id
name
countries {
id
name
provinces {
id
name
code
}
}
}
}
}
}
}
}
}
}

JSON response

{
"data": {
"deliveryProfileUpdate": {
"profile": {
"id": "gid://shopify/DeliveryProfile/4",
"profileLocationGroups": [
{
"locationGroupZones": {
"edges": [
{
"node": {
"zone": {
"id": "gid://shopify/DeliveryZone/6",
"name": "United States",
"countries": [
{
"id": "gid://shopify/DeliveryCountry/3",
"name": "United States",
"provinces": [
{
"id": "gid://shopify/DeliveryProvince/14",
"name": "Alabama",
"code": "AL"
},
{ ... },
{
"id": "gid://shopify/DeliveryProvince/71",
"name": "Wyoming",
"code": "WY"
}
]
}
]
}
}
}
]
}
}
]
}
}
},
"extensions": {
"cost": {
"requestedQueryCost": 33,
"actualQueryCost": 17
}
}
}

Anchor to Step 4 (Optional): Remove a delivery profileStep 4 (Optional): Remove a delivery profile

You can asynchronously remove a delivery profile by using the deliveryProfileRemove mutation, and passing in the ID of the delivery profile that you want to remove. The response returns a job ID that you can use to check on the job status and determine whether the operation is complete:

  • If done is true, then the removal of the delivery profile has completed.
  • If done is false, then removal of the delivery profile is still in progress.

POST https://{shop}.myshopify.com/api/{api_version}/graphql.json

GraphQL mutation

mutation removeDeliveryProfile {
deliveryProfileRemove(
id: "gid://shopify/DeliveryProfile/46528069654")
{
job{
id
done
}
userErrors {
field
message
}
}
}

JSON response

{
"data": {
"deliveryProfileRemove": {
"job": {
"id": "gid:\/\/shopify\/Job\/eec46dd1-0d4b-4c38-a09e-7d1fa84ba328",
"done": false
},
"userErrors": []
}
}
}


Was this page helpful?