Plugin overview
Overview
General info
- Ingrid's Shopify app is developed and maintained by Code
- Support is handled by Code via support@code.nl
- 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
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 Q1 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"
- Follow the instructions inside the app
App 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)
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. (Currently not working as intended, will be fixed in Q1 2025)
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 product level
Key for metafield - Used for fetching and sending dimensions to Ingrid on product level
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 product 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"(or "Product"). 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 product/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 code snippet above to point to a specific order in for example an order confirmation or shipping confirmation?
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="/pages/tracking?identifier=&contact=" 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.
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