Plugin overview
Overview
General info
- Ingrid's Shopify app is developed and maintained by Code
- Support is handled by Ingrid through support@ingrid.com
- Ingrid's checkout widget is not available due to restrictions in what can be rendered on a checkout page in Shopify, Ingrid creates shipping options via Shopify's CarrierService API and Shopify renders the options in their native shipping checkout
- Requires a Shopify Plus-plan
Functionality
- Shipping option propagation using Shopify's CarrierService API
- Propagation of:
- Product item attributes
- Weight
- Dimensions
- External ID(Shopify's order number)
- Registering of tracking numbers
- A/B testing
- Checkout delivery options folding
- Custom category naming
- Filter rules
- Post filtering rules
- Language localization
- Pricing rules
- Product/Cart availability check
- Delivery time logic (business days only at the moment, to be improved in Q3-Q4 2025)
- Options for shipping date adjustment
- 1-button PDP widget integration install
- 1-button Upsell bar install for checkout and minicart
- 1-button tracking widget install
- Expose full session.complete response in note_attributes[]
- Shopify's pickup point functionality
- Apple pay support (see FAQ)
- Split shipping (see FAQ)
Installation guide
Detailed installation instructions are provided as a part of the installation process once the app has been installed. To install the app:
- Go to https://apps.shopify.com/ingrid
- Click on "Add app"
- Login into your Ingrid Account and obtain the Private Key (base64) from it. Follow the steps below to get your key, the numbers on the image below are related to the steps.
Click on the information icon in the header. - Look for "Private key (base64)" in the fold out.
- Copy the key into your clipboard.
- Login into your Ingrid Account and obtain the Private Key (base64) from it. Follow the steps below to get your key, the numbers on the image below are related to the steps.
- Navigate to the Ingrid App settings and enter your key into the "Ingrid credentials" section. Check with Ingrid if you have a test or live key preview.
- Make sure you have added the Shipping rates in `Shipping and delivery` settings in Shopify.
- Set the ‘Rate type’ to “Use carrier or app to calculate rates:
- You will have to ensure that the shipping location as configured in Shopify matches the warehouse in Ingrid (see below). When these do not match the Ingrid implementation will not work properly.
- Check the address of your warehouse as it is set up in Ingrid.

9. You have to install the Ingrid Carrier Service before your store can work with this app. Please read the requirements and ensure your store meets one of them. You can install the service with the button below.

You have finished the basic setup. You can now start using the app!
Additional settings

Enable Advanced checkout integration - Opt in for functionality that enables Apple Pay(see FAQ)
Toggle this setting to enable the new checkout UI - Opt in for new functionality that enables the new checkout UI and pickup point functionality (see FAQ)
Use billing address for shipping address - This setting helps merchants who want to use their own address (billing) instead of pickup point address when making changes to orders. When enabled, the billing address will override the shipping address.
Sync customer tags to Ingrid - If enabled sends tags place on customer's profiles as cart.attributes which can be used to build price rules and filter rules.
Add `out_of_stock` parameter to cart item attribute when item’s available quantity is zero or negative - Optional setting, “out_of_stock" sent as a string on item.attribute level if enabled.
Register tracking numbers - If enabled registers tracking numbers when a new tracking number is detected on an order in Shopify, requires Ingrid credentials to be configured
Maximum number of pickup options to show - Sets how many pickup points should be offered per carrier options with the type "PICKUP". If set to three and a merchant two different pickup point services enabled, three each will be displayed for a total of six. This can be used to reduce loading time since less options have to be created if the option is set to a lower amount.
Namespace for dimensions metafield - Used for fetching and sending dimensions to Ingrid on variant level
Key for metafield - Used for fetching and sending dimensions to Ingrid on variant level
How to Enable Ingrid Tracking in Shopify
Follow the steps below to install and configure Ingrid’s tracking widget in your Shopify store.
Install the Tracking Widget
- Open your Shopify Admin and navigate to the Ingrid Checkout app.
- Go to Settings and click Install Tracking Widget.
- A new tab will open in the Theme Editor, where the widget will be automatically added to the Page Template. You can select a page in your store where you’d like the tracking widget to be displayed (e.g., a dedicated “Track Your Order” page).
- In the Theme Editor, locate the newly added Ingrid Tracking Widget under Apps.
- Enter your Site ID from the Ingrid Merchant Platform into the settings field.
- Once the site ID has been added the widget will be rendered:
- If you want to link to the tracking page and point to a specific order in your order confirmation or other notifications sent by Shopify you can use this example, the url contains the shop url, the page it's pointing to as well as two parameters:
identifier(Shopify's order number)
contact(The customers email)
<a href="{{ shop.url }}/pages/tracking?identifier={{ order_name | replace: "#", "" }}&contact={{ customer.email }}" class="button__text">Track your order</a>
FAQ
How can the shipping details be extracted from an order?
The additional order details are placed in the note attributes of the order. We have also stored the Shopify order number in Ingrid so that the customer can see for which order the information relates.
// example of Ingrid note attributes stored with the order
Ingrid Transport Order ID: 01JHJG9VWDH4WA4192D4V3RP9N
Ingrid Shipping Method: pnl-mpc
Ingrid External Method ID: P19
Ingrid External ID (Pickup Point ID): 2234137
Ingrid Completed Session Data: {"id":"c5709906-35df-4101-aa81-f179fd762aa5","status":"COMPLETE","cart":{"total_value":62995,"total_discount":0,"currency":"SEK","pre_order":false,"items":[{"sku":"sku-managed-1","name":"The Multi-managed Snowboard","attributes":["Premium","Snow","Snowboard","Sport","Winter"],"out_of_stock":false,"dimensions":{},"quantity":1,"price":62995}]},"selected_shipping_option":{"shipping_method":"pnl-mpc","delivery_type":"pickup","carrier":"PostNord","product":"PostNord MyPack Collect","price":500,"currency":"SEK","location":{"external_id":"2234137","name":"Paketbox Vikingavägen 9","address":{"name":"Paketbox Vikingavägen 9","address_lines":["Vikingavägen 9"],"city":"Handen","postal_code":"13638","country":"SE","coordinates":{"lat":59.17015,"lng":18.14429}},"distance":{"walking":{"value":128,"duration":1},"driving":{"value":128,"duration":1}},"operational_hours":{"mon":"00:00-23:59","tue":"00:00-23:59","wed":"00:00-23:59","thu":"00:00-23:59","fri":"00:00-23:59","sat":"00:00-23:59","sun":"00:00-23:59"},"meta":{"pnl.service_point_box_location":"Outdoor"},"location_type":"LOCKER"},"time_slot":{"id":"NNY4Un9_RbSUJWYb3-Mm9A","expires":"2025-01-15T00:00:00+01:00","start":"2025-01-17T00:00:00+01:00","end":"2025-01-24T00:00:00+01:00"},"external_method_id":"P19"},"external_id":"#1023","shipping_price":500,"expires_at":"2025-01-15T00:00:00+01:00","customer":{"address":{"name":"Firstname Lastname","address_lines":["Vikingavägen 9"],"city":"Handen","postal_code":"13638","country":"SE","coordinates":{"lat":59.1701255,"lng":18.1445262}},"email":"test@ingrid.com"},"search_address":{"name":"Firstname Lastname","address_lines":["Vikingavägen 9"],"city":"Handen","postal_code":"13638","country":"SE","coordinates":{"lat":59.17013031608163,"lng":18.14519968764466}},"tos_id":"01JHJG9VWDH4WA4192D4V3RP9N","result":{"shipping":{"shipping_method":"pnl-mpc","delivery_type":"pickup","carrier":"PostNord","product":"PostNord MyPack Collect","location":{"external_id":"2234137","name":"Paketbox Vikingavägen 9","address":{"name":"Paketbox Vikingavägen 9","address_lines":["Vikingavägen 9"],"city":"Handen","postal_code":"13638","country":"SE","coordinates":{"lat":59.17015,"lng":18.14429}},"distance":{"walking":{"value":128,"duration":1},"driving":{"value":128,"duration":1}},"operational_hours":{"mon":"00:00-23:59","tue":"00:00-23:59","wed":"00:00-23:59","thu":"00:00-23:59","fri":"00:00-23:59","sat":"00:00-23:59","sun":"00:00-23:59"},"meta":{"pnl.service_point_box_location":"Outdoor"},"location_type":"LOCKER"},"delivery_time":{"id":"NNY4Un9_RbSUJWYb3-Mm9A","expires":"2025-01-15T00:00:00+01:00","start":"2025-01-17T00:00:00+01:00","end":"2025-01-24T00:00:00+01:00"},"external_method_id":"P19","supports":{},"warehouse":{"address":{"name":"Netherlands","address_lines":[""],"city":"Stockholm","postal_code":"11152","country":"SE"}}},"category":{"id":"postnord-mypack-collect-3f727f6dfa044713874682039c22d0ff","name":"PostNord MyPack Collect","presented_category_name":"PostNord MyPack Collect"},"pricing":{"currency":"SEK","price":500,"price_components":[{"type":"PRICE_COMPONENT_TYPE_SHIPPING","value":500}]},"selection":"USER_CHOICE","delivery_time":{"pickup_from_merchant":{"earliest":"2025-01-15T00:00:00+01:00","latest":"2025-01-15T00:00:00+01:00"},"customer_delivery_promise":{"earliest":"2025-01-17T00:00:00+01:00","latest":"2025-01-24T00:00:00+01:00"},"carrier_delivery_promise":{"earliest":"2025-01-17T00:00:00+01:00","latest":"2025-01-24T00:00:00+01:00"}}}}
shipping_address: {"name":"Paketbox Vikingavägen 9","address_lines":["Vikingavägen 9"],"city":"Handen","postal_code":"13638","country":"SE","coordinates":{"lat":59.17015,"lng":18.14429}}
A split shipping order looks similar to a regular order except that there are splits present equal to the amount of splits done by Shopify. Something to note here is that the transport order ID and all of the data differs between the splits, here's an example of data saved when an order has two splits.
Ingrid Transport Order ID
01JHG24SYWZAA4ASHB81TGQSVT
Ingrid Shipping Method
pnl-mpc
Ingrid External Method ID
P19
Ingrid External ID (Pickup Point ID)
527470
Ingrid Completed Session Data
{"id":"e045b079-f853-49b5-9f76-145cb6a5f20c","status":"COMPLETE","cart":{"total_value":262995,"total_discount":0,"currency":"SEK","pre_order":false,"items":[{"sku":"sku-hosted-1","name":"The 3p Fulfilled Snowboard","attributes":["Accessory","Sport","Winter"],"out_of_stock":false,"dimensions":{},"quantity":1,"price":262995}]},"selected_shipping_option":{"shipping_method":"pnl-mpc","delivery_type":"pickup","carrier":"PostNord","product":"PostNord MyPack Collect","price":500,"currency":"SEK","location":{"external_id":"527470","name":"Direkten Haninge Spel","address":{"name":"Direkten Haninge Spel","address_lines":["Stores Gränd 12"],"city":"Handen","postal_code":"13646","country":"SE","coordinates":{"lat":59.1697983,"lng":18.1402973}},"distance":{"walking":{"value":365,"duration":4},"driving":{"value":636,"duration":2}},"operational_hours":{"mon":"10:00-19:00","tue":"10:00-19:00","wed":"10:00-19:00","thu":"10:00-19:00","fri":"10:00-19:00","sat":"10:00-18:00","sun":"11:00-17:00"},"meta":{"pnl.service_point_box_location":""},"location_type":"MANNED"},"time_slot":{"id":"uvYMgJYxODru5RTzobFrOg","expires":"2025-01-14T00:00:00+01:00","start":"2025-01-16T00:00:00+01:00","end":"2025-01-23T00:00:00+01:00"},"external_method_id":"P19"},"external_id":"#1022","shipping_price":500,"expires_at":"2025-01-14T00:00:00+01:00","customer":{"address":{"name":"Fredrik Sundell","address_lines":["Nynäsvägen 98"],"city":"Handen","postal_code":"13635","country":"SE","coordinates":{"lat":59.1661959,"lng":18.1373353}},"email":"fredrik.sundell@ingrid.com"},"search_address":{"name":"Fredrik Sundell","address_lines":["Nynäsvägen 98"],"city":"Handen","postal_code":"13635","country":"SE","coordinates":{"lat":59.16725194750265,"lng":18.137428544765854}},"tos_id":"01JHG24SYWZAA4ASHB81TGQSVT","result":{"shipping":{"shipping_method":"pnl-mpc","delivery_type":"pickup","carrier":"PostNord","product":"PostNord MyPack Collect","location":{"external_id":"527470","name":"Direkten Haninge Spel","address":{"name":"Direkten Haninge Spel","address_lines":["Stores Gränd 12"],"city":"Handen","postal_code":"13646","country":"SE","coordinates":{"lat":59.1697983,"lng":18.1402973}},"distance":{"walking":{"value":365,"duration":4},"driving":{"value":636,"duration":2}},"operational_hours":{"mon":"10:00-19:00","tue":"10:00-19:00","wed":"10:00-19:00","thu":"10:00-19:00","fri":"10:00-19:00","sat":"10:00-18:00","sun":"11:00-17:00"},"meta":{"pnl.service_point_box_location":""},"location_type":"MANNED"},"delivery_time":{"id":"uvYMgJYxODru5RTzobFrOg","expires":"2025-01-14T00:00:00+01:00","start":"2025-01-16T00:00:00+01:00","end":"2025-01-23T00:00:00+01:00"},"external_method_id":"P19","supports":{},"warehouse":{"address":{"name":"Netherlands","address_lines":[""],"city":"Stockholm","postal_code":"11152","country":"SE"}}},"category":{"id":"postnord-mypack-collect-3f727f6dfa044713874682039c22d0ff","name":"PostNord MyPack Collect","presented_category_name":"PostNord MyPack Collect"},"pricing":{"currency":"SEK","price":500,"price_components":[{"type":"PRICE_COMPONENT_TYPE_SHIPPING","value":500}]},"selection":"USER_CHOICE","delivery_time":{"pickup_from_merchant":{"earliest":"2025-01-14T00:00:00+01:00","latest":"2025-01-14T00:00:00+01:00"},"customer_delivery_promise":{"earliest":"2025-01-16T00:00:00+01:00","latest":"2025-01-23T00:00:00+01:00"},"carrier_delivery_promise":{"earliest":"2025-01-16T00:00:00+01:00","latest":"2025-01-23T00:00:00+01:00"}}}}
(Split 2) Ingrid Transport Order ID
01JHG24T09KC44Y1SY14NXGWT4
(Split 2) Ingrid Shipping Method
pnl-mph
(Split 2) Ingrid Completed Session Data
{"id":"b55c1678-fa0a-4665-84a6-4baf3d09b0e9","status":"COMPLETE","cart":{"total_value":74995,"total_discount":0,"currency":"SEK","pre_order":false,"items":[{"sku":"51373647724873","name":"The Collection Snowboard: Liquid","attributes":["Accessory","Sport","Winter"],"out_of_stock":false,"dimensions":{},"quantity":1,"price":74995}]},"selected_shipping_option":{"shipping_method":"pnl-mph","delivery_type":"delivery","carrier":"PostNord","product":"PostNord MyPack Home","price":100,"currency":"SEK","time_slot":{"id":"nvDvBGCoieYNUlAeIO48WQ","expires":"2025-01-14T00:00:00+01:00","start":"2025-01-16T00:00:00+01:00","end":"2025-01-17T00:00:00+01:00"}},"external_id":"#1022","shipping_price":100,"expires_at":"2025-01-14T00:00:00+01:00","customer":{"address":{"name":"Fredrik Sundell","address_lines":["Nynäsvägen 98"],"city":"Handen","postal_code":"13635","country":"SE","coordinates":{"lat":59.1661959,"lng":18.1373353}},"email":"fredrik.sundell@ingrid.com"},"search_address":{"name":"Fredrik Sundell","address_lines":["Nynäsvägen 98"],"city":"Handen","postal_code":"13635","country":"SE","coordinates":{"lat":59.1661959,"lng":18.1373353}},"tos_id":"01JHG24T09KC44Y1SY14NXGWT4","result":{"shipping":{"shipping_method":"pnl-mph","delivery_type":"delivery","carrier":"PostNord","product":"PostNord MyPack Home","delivery_time":{"id":"nvDvBGCoieYNUlAeIO48WQ","expires":"2025-01-14T00:00:00+01:00","start":"2025-01-16T00:00:00+01:00","end":"2025-01-17T00:00:00+01:00"},"supports":{},"warehouse":{"address":{"name":"Netherlands","address_lines":[""],"city":"Stockholm","postal_code":"11152","country":"SE"}}},"category":{"id":"postnord-mypack-home-1a0d90944fa342a5bea8218018b631a8","name":"PostNord MyPack Home","presented_category_name":"PostNord MyPack Home"},"pricing":{"currency":"SEK","price":100,"price_components":[{"type":"PRICE_COMPONENT_TYPE_SHIPPING","value":100}]},"selection":"USER_CHOICE","delivery_time":{"pickup_from_merchant":{"earliest":"2025-01-14T00:00:00+01:00","latest":"2025-01-14T00:00:00+01:00"},"customer_delivery_promise":{"earliest":"2025-01-16T00:00:00+01:00","latest":"2025-01-17T00:00:00+01:00"},"carrier_delivery_promise":{"earliest":"2025-01-16T00:00:00+01:00","latest":"2025-01-17T00:00:00+01:00"}}}}
The data can be accessed in the note_attributes[] field on the order object in Shopify's Admin API https://shopify.dev/docs/api/admin-rest/2025-01/resources/order#resource-object
Is Ingrid's data visible on the order page in Shopify?
Yes, here's an example:

What can I do if the shipping options loads slowly?
There is a app setting called "Maximum number of pickup options to show" which limits the amount of pickup options that are created by the carrier service.
If you have enabled the new checkout UI this shouldn't be an issue.
How can I provide dimensions on variant level to Ingrid?
Step 1: In Shopify create a new metafield definition(if there isn't one for dimensions already) by in the store settings going to "Custom data" → "Variant". Then define a namespace and key, in the example below "code" is the namespace and "dimensions" is the key but these could be called anything.

Step 2: Add length, width and height in json-format on each of the variant (weight can be omitted as this is grabbed from the native "weight"-field on the product
Step 3: Add the namespace and key from step 1 to the Ingrid app settings in Shopify:
Step 4: All done!
How can I link directly to a page containing the tracking widget and point to a specific order in for example an order confirmation or shipping confirmation email?
The below html tag can be copy and pasted or modified in order to point to a specific order within the tracking widget.
<a href="{{ shop.url }}/pages/tracking?identifier={{ order_name | replace: "#", "" }}&contact={{ customer.email }}" class="button__text">Track your order</a>
How does Ingrid's app handle sessions?
Ingrid requires a "Ingrid checkout session" in order to be able to produce shipping options, there are two separate flows depending on whether Advanced checkout is enabled or not.
If the advanced checkout setting is disabled then the app creates a new session whenever Shopify's CarrierService sends a callback. The session ID and additional data that's required for Ingrid to be able to store data on a finalised order is set on the shipping options "service_code".
If the advance checkout setting is enabled then the app creates a session as soon as a product is added to the cart and stores Ingrid's session ID on the product as an attribute. This enables the app to retain the session throughout the purchase journey and also enables the app to send updates to the session instead of creating a new session each time the carrier service is called.
How does split shipping work with Ingrid and Shopify?
In order for split shipping to work the "Advanced integration" setting needs to be disabled, the reason for this is that it's not possible to differentiate between which split a callback in Shopify's CarrierService and if a session ID is retained on the product item level that in turn means that the session ID is always re-used which makes it impossible to create two or more separate sessions.
Splits currently do not support free shipping thresholds on the entire order value but is rather calculated on each split, the reason for this is because there is no functionality in Shopify's carrier service to keep track of each split unfortunately. If this was to become available, Ingrid is committed to solve this problem.
How does Apple pay work with Ingrid's app?
It's currently not possible to finalise a purchase directly on the product page unless the user has added something to the cart, but it works on the checkout page and cart page. The reason for why it doesn't work on the product page is because there is no way currently for the app to retain Ingrid's session ID without a product being added to the cart.
How do I enable Apple pay and/or the pickup point UI?
1. Toggle on advanced checkout integration(required for Apple Pay and A/B testing) in the app settings
2. Toggle on the new checkout UI functionality (enables the pickup point functionality)
3. Click on the button next to "Please make sure that you have enabled the Advanced Checkout UI extension"
This will bring up the theme editor where you need to make sure that you have added the app blocks "advanced checkout" under "Express checkout" if you want Apple Pay and A/B testing.
Apple pay will only be displayed if you have enabled Apple Pay under Payment Methods in Shopify.
You will also need to add the app block "pickup-point-location" under Delivery -> Shipping -> Shipping rate
Can the PDP widget be used with the stage environment?
No, it's only available to be used with the production environment.