Site: SAAS Integrator — a leading Australian iPaaS platform connecting eCommerce, ERP, POS, CRM, and marketing systems. We build revenue-focused integrations across Shopify, WooCommerce, Acumatica, MYOB, NetSuite, SAP Business One, Retail Express, Lightspeed, and Square.
Summary: Set up real-time pickup availability, custom messaging, and Pickup-Only enforcement on your Shopify store. This guide covers the quick start, installation, configuration, and a developer reference.
Set up real-time pickup availability, custom messaging, and Pickup-Only enforcement on your Shopify store. This guide covers the quick start, installation, configuration, and a developer reference.
Quick start
Five minutes from install to live on your storefront. Follow these in order. Each step links to the full instructions if you get stuck.
Install the app from the Shopify App Store and pick a plan. Every plan starts with a 14 day free trial.
Add the Product Page block to your product template so customers see pickup availability before they add to cart.
Verify each pickup location has a complete address and Shopify's Pickup in store setting is enabled in Settings → Locations.
Configure Store Hours (recommended) for each pickup location so customers see real opening times and pickup days.
✓
You're live. Customers can now find your stores and see pickup availability on the product page.
i
Recommended: enable both App Embeds. Toggle both in Online Store → Themes → Customize → App embeds. They work together — Cart Popup reads its settings (stores, stock display, custom messaging, colours) from the Locations Popup block, so enabling both gives you the full Click and Collect experience.
Locations Popup — holds the bulk of the app's configuration and renders the optional global store selector, header widget, and banner. The popup's auto-open on page load is disabled by default, so the popup only opens when the customer taps the store selector on a product page or in the header. Turn auto-open on in the block settings if you want a site-wide popup that opens for first-time visitors.
Cart Popup — pre-checkout cart validation, custom messaging at each cart line, Pickup-Only Home Delivery blocking. Requires Locations Popup to be on. Especially important if you use custom messaging triggers or have Pickup-Only products.
Must-do checklist
The four tasks below are the strict minimum for the app to work on your storefront. Each task links to its detailed section.
Subscribe to a plan.
The app is unusable without an active plan. All three plans include the full feature set. The 14 day trial is free.
Add a Google API key, or use hard-code mode.
Postcode search and distance ranking require a Google Cloud key with both Distance Matrix and Geocoding APIs enabled. If you have 5 or fewer pickup stores, you can skip the key and list them directly in the Product Page block.
Add the Product Page block.
Without it, customers cannot see pickup availability on the product page. Place it below the buy buttons.
Verify location addresses and Shopify "Pickup in store" setting.
Each pickup location must have a complete address (street, city, state, postcode, country) and Shopify's native Pickup in store toggle enabled. The app reads these directly from Shopify locations.
Optional features
The items below are not required for basic Click and Collect. Enable each one only if you want the specific capability it adds.
Feature
What it adds
When you need it
Locations Popup (App Embed)
Holds the bulk of the app's configuration: store list, stock display, custom messaging triggers, colours, popup behaviour. Also renders the global "select your store" popup, persistent header widget, and store banner.
You want a site-wide store selector, header widget, or banner. Required if you enable Cart Popup (Cart Popup reads its settings from this block).
Cart Popup (App Embed) Requires Locations Popup
Pre-checkout cart validation, custom messaging at each cart line, Home Delivery blocking for Pickup-Only products.
You use custom messaging triggers, you have Pickup-Only products, or you want stock validated against the chosen store before checkout. Requires Locations Popup to be on — Cart Popup is a settings shell that reads its store list, colours, and messaging from the Locations Popup block.
Store Hours
Per-location opening hours, Click and Collect availability schedule, holiday closures.
Recommended for all merchants. Without it, store cards do not show hours and pickup is treated as always available.
Pickup-Only Delivery Customisation(manual setup)
Hides the Home Delivery option at checkout for any cart containing a Pickup In Store Only product. Enforced by a Shopify delivery customisation.
Required if you use Pickup In Store Only. Without it, the Cart Popup blocks delivery before checkout but Shopify checkout itself still offers Home Delivery, so customers can bypass and complete an undeliverable order.
Store Banner (App Block)
Header strip showing the selected store and delivery postcode across the storefront.
You want to reinforce the chosen pickup store on every page.
Checkout Pickup Banner(Shopify Plus only)
Confirms the pickup store the customer chose, rendered in the Delivery section of the checkout page.
You're on Shopify Plus and want to reinforce the chosen pickup store at checkout. Added in the Checkout editor, not the Theme editor.
i
Cart Popup is the most common gap. If you've set up custom messaging or Pickup-Only products and your customers can still checkout with Home Delivery, or your custom messages don't appear before checkout, your Cart Popup embed is off. Open Online Store → Themes → Customize → App embeds and turn it on. Make sure Locations Popup is also on — Cart Popup reads its store list, stock display, and messaging settings from the Locations Popup block.
Installation
Full step-by-step from a fresh install. Should take 10 to 20 minutes for a single-store retailer, 30 to 60 minutes for a multi-location chain that needs Store Hours configured per location.
Prerequisites
Before you start, confirm:
You have a Shopify store. Both Shopify Plus and non-Plus plans are supported.
At least one Shopify location exists, with a complete address (street, city, state / province, postcode, country) and Shopify's native Pickup in store setting enabled. To check, go to Settings → Locations.
(Optional, postcode-search mode only) You have a Google Cloud account. A new project is fine. Billing must be enabled on the project to use Distance Matrix and Geocoding, but free tier limits cover typical small-to-mid traffic.
You can access your Shopify theme editor and add app blocks to your product template.
Screenshot pending. Save as docs-images/shopify-app-store.png
Shopify App Store install page. Shows the Add app button and the requested permissions.
2
Pick a plan
On first load you will see the plan picker. Choose the plan that matches your location count and monthly order volume. All plans include the full feature set, and all plans start with a 14 day free trial. You can change plans later from Billing in the app sidebar.
Screenshot pending. Save as docs-images/plan-picker.png
Plan picker. Three plan cards (Local Retail, Growing Retail, Large Retail Network) with feature lists, current-usage bars, and Select / Cancel buttons.
Step 2. Add your Google API key
Postcode-based store search and distance ranking are powered by Google's Distance Matrix and Geocoding APIs. A single Google API key works for both services.
i
Skipping this step. If you have 5 or fewer pickup stores, you can enter your Shopify Location IDs directly in the Product Page block and skip the Google API entirely. See hard-code mode. Postcode search will not be available in this configuration.
You can enable them from APIs & Services → Library. Search for each by name and click Enable.
3
Create an API key. Go to Credentials → Create credentials → API key. Google will generate the key and show it once.
4
Copy the key and paste it into the app's Google API settings page in Shopify admin (in the app sidebar). Save.
Screenshot pending. Save as docs-images/google-api-settings.png
App Google API settings page. Three fields: Google Geocoding API key, IPinfo API key (optional), Store search radius. Save button.
!
Restrict the key to your storefront domain. In Google Cloud Console, open the key under Credentials → Application restrictions → HTTP referrers and add your shop domain (e.g. https://yourstore.myshopify.com/* and your custom domain). This stops anyone else using the key if it leaks into a public theme file.
Optional: IPinfo for postcode auto-detect
If you want the search input pre-filled with the visitor's postcode based on their IP address, sign up at ipinfo.io and paste the API key into the same settings page. Without IPinfo, the search input opens empty and the customer types their postcode manually. All other features work normally either way.
Step 3. Enable App Embeds (optional)
Two App Embeds are available in your Shopify theme editor. Both are optional features, toggled independently. Skip this entire step if you only need the Product Page block.
Embed
Adds
Enable if
Locations Popup
Holds the bulk of the app's settings (stores, stock display, messaging, colours, behaviour). Also renders the global popup, header widget, and banner.
You want a site-wide store selector, or you plan to enable Cart Popup (which depends on this block for settings).
Cart Popup Requires Locations Popup
Pre-checkout cart validation, custom messaging at the cart, Pickup-Only Home Delivery blocking. Reads its configuration from the Locations Popup block.
You use custom messaging triggers, have Pickup-Only products, or want pre-checkout stock validation. Locations Popup must also be enabled.
1
Open your theme editor
In Shopify admin, go to Online Store → Themes, then click Customize on your live theme.
2
Open the App Embeds panel
In the left sidebar of the theme editor, click the App embeds icon (looks like a small jigsaw piece). You should see Cart Popup and Locations Popup listed under SAAS Integrator CNC.
Screenshot pending. Save as docs-images/theme-app-embeds.png
Theme editor App embeds panel. Shows the App embeds icon in the left sidebar with Cart Popup and Locations Popup toggles for SAAS Integrator CNC.
3
Toggle on Locations Popup
Find Locations Popup (saas-int-cnc-plus) and toggle it on. This activates the global store selector, the persistent header widget that shows the chosen store, and the search-by-postcode flow.
4
Toggle on Cart Popup
Find Cart Popup (saas-int-cnc-plus) and toggle it on. This activates pre-checkout cart validation, displays per-item availability at the selected pickup store, surfaces custom Click and Collect messages, and enforces Home Delivery blocking for Pickup-Only products.
!
If you use custom messaging triggers (described below), leave Cart Popup enabled. Disabling it is the most common cause of customers reaching checkout without seeing your "Available for in-store pickup only" or "Allow 2 to 3 days" messages.
5
Save
Click Save in the top right of the theme editor.
Step 4. Add the Product Page block
The Product Page CNC block displays stock availability and the store selector directly on each product page. Without it, customers cannot see pickup availability before adding to cart.
1
Open your product template in the theme editor
From the top dropdown in the theme editor, choose Products → Default product.
2
Add the block
In the left sidebar, find the product section. Click Add block, then select SAAS Product Page CNC from the list.
Screenshot pending. Save as docs-images/add-block-menu.png
Theme editor product template with Add block menu open. Shows the Add block dropdown with SAAS Product Page CNC highlighted.
3
Position the block
Drag the block to sit below the Add to cart button. This is where customers expect to see pickup availability.
4
Decide on postcode retention
Scroll the block settings to Remember last searched postcode. Decide whether to leave it off (recommended) or turn it on.
Off (default, recommended). The search field is blank by default. It is only auto-filled when an IPinfo API key is configured (set on the app's Google API settings page). The field also clears after each search. Best for stores where customers may be shopping for delivery to different addresses on different visits.
On (legacy behaviour). Restores the customer's last searched postcode each time the popup opens or the product page is revisited. Best when most customers always pick up from the same area. The setting applies in both Popup and Embedded PDP modes.
5
Decide on the Special Hours Alert Window
The block's Special Hours Alert Window setting controls how many days ahead an upcoming holiday closure is shown on store cards. Default is 7 days. Set it higher (e.g. 14 or 30) if you run early-warning campaigns around major holidays. Set it lower if you want closures to appear only when imminent.
The same setting exists on the Locations Popup block. The two operate independently. Set the block you actually display to customers; you can match them for consistency.
6
Save
Click Save in the top right.
The default PDP Store Lookup Mode is Embedded, which renders store search and results inline on the product page. If you prefer the legacy modal behaviour, switch to Popup in the block settings. See Product Page block configuration for the difference.
Step 5. Configure Store Hours
Store Hours are technically optional, but configuring them dramatically improves the customer experience. Customers see when each store is open, when Click and Collect is available, and any upcoming holiday closures. Without configured hours, the storefront falls back to "always available" which can mislead customers.
1
Open the Store Hours page
In the app sidebar in Shopify admin, click Store Hours.
Screenshot pending. Save as docs-images/store-hours-admin.png
Store Hours admin page. Left column lists all locations. Right column shows the selected location's editor with tabs for Store hours, CnC availability, Special hours, JSON preview.
2
Select a location and set regular hours
Click a location in the left column. In the Store hours tab, set the timezone for that location, then tick the days the store is open and enter open and close times. Use the Copy hours button to duplicate a day's schedule to others.
3
Set CnC availability
Switch to the CnC availability tab. This is a separate schedule from regular store hours. Use it when Click and Collect pickup is only available on a subset of trading days, for example a store that's open 7 days but only fulfils pickup orders Monday to Friday.
4
Set special hours
Switch to the Special hours tab to add public holiday closures or one-off hour changes. Special hours override the regular schedule and appear on store cards as alert banners ahead of the date. By default the alert window is 7 days, configurable on either the Locations Popup or the Product Page block via the Special Hours Alert Window setting.
5
Copy to other locations
Once one location is configured, click Copy to locations at the top of the editor to apply the same schedule across multiple stores. Tweak per-location overrides as needed.
Verification
Open your storefront in a private window and walk through the customer journey to confirm everything is wired up.
The Locations Popup opens on first visit. You can search by postcode (search mode) or see your hard-coded stores (hard-code mode).
Each store card shows distance, stock status, and store hours (if configured).
On a product page, the SAAS Product Page CNC block is visible below the buy buttons.
The block shows pickup availability per location, including any custom messaging you configured.
Add a product to the cart, then click the checkout button. The Cart Popup opens and validates stock against the selected pickup store.
If you set up a Pickup-Only product, confirm Home Delivery is hidden in the Cart Popup.
Complete the checkout. The Click and Collect confirmation appears on the checkout page and on the order confirmation email.
Configuration
Primary settings only. Every block has additional appearance and label settings (colours, fonts, button text) that work without explanation. The settings documented below are the ones that change behaviour and customer experience.
Locations Popup
The global store selector embed. Toggle in Online Store → Themes → Customize → App embeds → Locations Popup.
Setting
Default
What it does
Store Location IDs (Global Popup)
Blank
Comma-separated Shopify Location IDs. 1 to 5 IDs activates hard-code mode and hides postcode search. Blank means standard search across all your Click and Collect locations.
Automatically open popup on page load
Off
When off (default), the popup opens only when the customer taps a store-selector trigger (for example the store selector on a product page or in the header). When on, the popup opens automatically on the customer's first page load if no store has been selected; once a store is chosen it does not re-open.
Default to Home Delivery
Off
When on, the popup opens with Home Delivery selected by default. Click and Collect activates if the customer then selects a store. When off, Click and Collect is the default tab.
Distance Unit
Auto
Auto detects from your Shopify store country. US stores show miles, all others show kilometres. Override to force one unit.
Enable Store Hours
On
Show configured hours on each store card. When off, hours are hidden even if configured.
Special Hours Alert Window
7 days
How far in advance to show upcoming holiday-closure banners on store cards.
Hard-code mode
For single-store and small-chain retailers with 5 or fewer pickup locations, you can skip postcode search entirely by entering your Shopify Location IDs in the Store Location IDs field. Behaviour:
What you enter
Resulting behaviour
1 ID
Single-store compact layout. Postcode search is hidden. The store auto-selects.
2 to 5 IDs
Multi-location picker. Postcode search is hidden. The customer chooses from the listed stores.
Blank
Standard postcode-based search across all your Click and Collect locations.
To find a Shopify Location ID, go to Settings → Locations, click a location, and copy the numeric ID from the end of the URL.
Cart Popup
The cart-side validation embed. Toggle in Online Store → Themes → Customize → App embeds → Cart Popup. Surfaces per-item availability at the selected pickup store and enforces Home Delivery blocking for Pickup-Only products.
!
Cart Popup depends on the Locations Popup. Cart Popup is a settings shell. It holds about 18 cart-page-specific settings (delivery method heading, cart items heading, checkout button labels, etc.) but reads everything else — the store list, stock display, custom messaging triggers, colours, and behaviour — from the Locations Popup block. If Locations Popup is off, Cart Popup will not display stores or apply your configured settings. Always enable both together.
Screenshot pending. Save as docs-images/cart-popup-storefront.png
Cart Popup on the storefront. Left: delivery method tabs, postcode search, per-store availability with hours. Right: cart line items with two different custom messaging triggers firing simultaneously ("Allow 2 to 3 days for collection" and "Available for in-store pickup only").
Setting
Default
What it does
Cart items heading
Click & Collect Cart Items
The heading above the line items in the Cart Popup.
"Not available" error message
Not Available at
Red text shown next to a line item when the selected store does not have stock. The store name is appended automatically.
Show "Remove all unavailable items" button
Off
When on, customers can clear all unavailable items in one click instead of removing them individually.
Note text + Make note text bold
Blank, On
Optional shop-wide note displayed at the top of the Cart Popup. Use for promotional or operational messages every customer should see before they check out, e.g. "Come in-store for your free event pass - limited tickets" or "Allow extra time during sale periods". Supports an emoji prefix if you want a visual marker.
Method labels
Click & Collect / Home Delivery
Override the default tab labels for the delivery method toggle.
!
Disabling Cart Popup (or its Locations Popup dependency) breaks Pickup-Only enforcement at the cart. Cart Popup is the cart-side enforcement point that hides Home Delivery for Pickup In Store Only carts. If either Cart Popup itself or Locations Popup (which Cart Popup reads from) is off, customers reach checkout without seeing the restriction.
Cart Popup is one of two enforcement layers for Pickup In Store Only. The second is the Pickup-Only Delivery Customisation, activated in Shopify shipping settings. Both layers are needed for full enforcement: Cart Popup (plus Locations Popup) blocks at the cart, the Delivery Customisation blocks at checkout. A gap in any layer lets an undeliverable order through.
Product Page block
The block that displays pickup availability on each product page. Add it via the theme editor under Online Store → Themes → Customize → Default product → Add block → SAAS Product Page CNC.
Setting
Default
What it does
PDP Store Lookup Mode
Embedded
Embedded renders store search and results inline on the product page (recommended). Popup opens the global Locations Popup when the customer clicks the store link (legacy behaviour for existing stores).
Store Location IDs
Blank
Same hard-code behaviour as the Locations Popup. 1 to 5 IDs lists those stores directly without search. Blank uses postcode search.
Block heading
Click & Collect
The heading above the store selector on the product page.
Remember last searched postcode
Off
When off (recommended), the search field is blank by default and only auto-fills when an IPinfo API key is configured. The field clears after each search. When on, the customer's last postcode is restored each time the popup opens or the product page is revisited (legacy behaviour). Applies in both Popup and Embedded PDP modes.
Enable Store Hours
On
Show configured hours on each store card. When off, hours are hidden even if configured.
Special Hours Alert Window
7 days
How many days ahead to show upcoming holiday-closure banners on store cards. Same setting also exists on the Locations Popup block; they operate independently. Set the block you actually display.
Click & Collect Custom Messaging
—
The three-trigger system for product-specific messaging. See Custom messaging.
Store Hours
Per-location schedules. Set in the app admin, not in the theme editor. Open Store Hours from the app sidebar.
Each location has three independent settings:
Regular store hours
Weekly opening times with timezone. The schedule shown to customers on store cards as "Open · Closes at 5:00 PM" style status lines. Use Copy hours to duplicate a day's schedule across the week.
CnC availability
A separate schedule for when each location accepts Click and Collect pickup. Decoupled from regular hours so you can offer pickup on a subset of trading days. Example: a store open 7 days, fulfilling pickup orders Monday to Friday only.
i
If a location is listed for Click and Collect, configure CnC availability for it. Don't leave it blank. A location with no CnC schedule is treated as "always available", which can mislead customers.
Special hours
One-off variations and public holidays. Use these for Christmas Day closures, Anzac Day half-days, store-specific events. Special hours override the regular schedule for the dates you set. Upcoming closures surface as alert banners on store cards ahead of the date. The default alert window is 7 days, configurable on either the Locations Popup or the Product Page block via the Special Hours Alert Window setting. Set the block you display to customers, or match them for consistency.
Copy to locations
Once a location is configured, click Copy to locations to apply the same regular hours, CnC availability, and special hours to other selected locations.
Custom messaging
Product-specific Click and Collect messaging using Shopify metafields. The Product Page block supports up to three independent triggers built on a single product metafield key. Each trigger has its own value, message, stock-validation mode, and Pickup-Only setting.
The three-trigger system
You configure one metafield key (e.g. custom.stock_override) and up to three triggers. Each trigger watches for a specific value on that metafield. When a product's metafield matches a trigger value, that trigger's message is shown and that trigger's rules apply.
Field
What it does
Metafield Key
The metafield to read, in namespace.key format (e.g. custom.stock_override). The same metafield drives all three triggers.
Trigger Value
The value the metafield must contain for this trigger to activate. Any string works as long as each trigger's value is unique within this block. Common merchant conventions are true, pickup_only, pre_order, but pick whatever fits how your team labels products. Leave blank to disable a trigger.
Custom Message
Free-text message shown to customers when this trigger fires.
Ignore Stock Levels
Three-option select. See below.
Pickup In Store Only
When on, products matching this trigger are restricted to Click and Collect. Home Delivery is blocked.
i
Trigger values are merchant-defined. The app does not require specific values like "Pickup_Only" or "pre_order". You can use any string. The only constraint is that each trigger's value must be different from the other two within the same block, so the app can tell them apart. Match the value to whatever you set on the product metafield in Shopify admin.
Ignore Stock Levels options
Option
Behaviour
Use case
Off
Normal stock validation. Custom message does not appear; standard availability rules apply.
Trigger inactive.
All locations
Custom message shown at every location regardless of stock.
Made-to-order and pre-order products. The message ("Allow 2 to 3 weeks before pickup") appears at every store.
Only locations with no stock
Custom message shown only at stores with zero stock. Stocked locations show standard availability.
Inter-store transfer scenarios. The customer can pick up immediately at a stocked store or wait 2 to 3 days at a store the item is transferred to.
!
If you set Ignore Stock Levels to All locations, make sure the product's inventory is associated with all your Click and Collect locations in Shopify. Otherwise Shopify may block the order at locations where the product is not stocked.
For products without trackable inventory (true made-to-order goods), either enable Shopify's Continue selling when out of stock on the variant, or untick Track quantity entirely.
Common configurations
The trigger values below are examples. Pick any string you want, as long as it's unique within the block and matches what you'll set on the product metafield.
Inter-store transfer. Trigger value e.g. transfer, message "Allow 2 to 3 days for collection", Ignore Stock Levels Only locations with no stock, Pickup In Store Only off.
Pickup-only product. Trigger value e.g. pickup_only, message "Available for in-store pickup only", Ignore Stock Levels All locations, Pickup In Store Only on.
Pre-order or made-to-order. Trigger value e.g. pre_order, message "Pre-order. Ships from 15 June", Ignore Stock Levels All locations, Pickup In Store Only off.
Pickup In Store Only and "Only locations with no stock" are mutually exclusive. Picking the latter automatically disables the former.
!
If you turn on Pickup In Store Only, you also need to activate the Pickup-Only Delivery Customisation in Shopify's shipping settings. Without it, products marked Pickup In Store Only will still show Home Delivery as an option at checkout, because Shopify's checkout has no way to know about the restriction otherwise. See the next section.
Pickup-Only Delivery Customisation
A Shopify delivery customisation that hides the Home Delivery option at checkout for any cart containing a Pickup In Store Only product. The customisation ships with the app and works on every Shopify plan (Plus and non-Plus), but you have to activate it manually once.
!
Required if you use Pickup In Store Only. Without this customisation activated, a customer can add a Pickup-Only product to the cart and Shopify checkout will still offer Home Delivery, even though the Cart Popup blocked it. The Cart Popup and the Delivery Customisation are two enforcement layers and you need both: Cart Popup blocks at the cart, the Delivery Customisation blocks at checkout.
How to activate it
In Shopify admin, go to Settings → Shipping and delivery.
Scroll to Customisations and click Add customisation.
From the list, choose SAAS CNC Pickup-Only Delivery Customisation.
Click Save.
You only need to do this once per store. Once active, the customisation runs automatically against every order that contains a Pickup-Only product.
What it does
When a cart contains a product flagged via your Pickup In Store Only metafield trigger, the customisation removes Home Delivery from the shipping options shown at checkout. Click and Collect becomes the only available fulfilment method for that order. Customers see only the pickup option, with no ability to switch to delivery.
The customisation reads the same metafield key configured on the Product Page block, so changing the metafield key in the block automatically updates what the customisation looks for.
When you can skip this
Skip the customisation only if you do not use Pickup In Store Only on any products. Custom messaging without Pickup-Only restriction (for example, "Allow 2 to 3 days for collection" on inter-store transfer items) does not require this step.
Checkout Pickup Banner
A Checkout UI extension that confirms the pickup store the customer chose. Renders in the Delivery section of the Shopify checkout page, alongside the Ship / Pickup toggle.
!
Shopify Plus only. Checkout UI extensions can only be added to checkout on Shopify Plus stores. Skip this section if you're on a standard Shopify plan. All other Click and Collect features (Product Page block, Cart Popup, Store Hours, Pickup-Only enforcement) work on every Shopify plan.
What the banner shows
When a customer reaches checkout after selecting a pickup store, the banner displays the chosen store's name and address inline in the Delivery section. This reinforces the pickup choice and reduces "wait, am I getting this shipped or picking up?" support contacts after order placement.
How to add it
In Shopify admin, go to Settings → Checkout → Customize.
Open the Checkout editor for your live theme.
In the left sidebar, click Delivery to expand the section.
Click Add block and select checkout-ui-pick-up-banner.
Drag the block to your preferred position within the Delivery section.
Click Save.
Customisation
The banner inherits your checkout's typography and colour scheme automatically. There are no per-block settings to configure beyond placement.
i
Not on Plus? Reinforce the pickup choice using the Cart Popup app embed instead, which surfaces the chosen store immediately before the customer clicks through to checkout. The Cart Popup runs on every Shopify plan.
Developer reference
Integration points for theme developers, Shopify Flow users, and anyone customising the email or notification templates.
Where settings are stored
App configuration is split across four places. Knowing where each setting lives helps when debugging a misconfiguration or planning a migration.
Setting group
Where it lives
How merchants edit it
Bulk of the app's storefront configuration — store list, stock display mode, custom messaging triggers (3), button colours, popup behaviour (auto-open, default to home delivery, distance unit, store hours toggle, special hours alert window), postcode placeholder, store-card styling, close button.
Locations Popup app embed. Stored as theme settings in settings_data.json per theme.
Theme editor → App embeds → Locations Popup.
Cart-page-specific labels and colours only (~18 settings) — delivery method heading, cart items heading, "remove unavailable" button, "not available" message, note text, checkout button labels, method tab labels and active states.
Cart Popup app embed. Stored as theme settings in settings_data.json. The Cart Popup snippet reads these plus window.__CNC__.config published by the Locations Popup block.
Theme editor → App embeds → Cart Popup. Locations Popup must also be enabled.
Per-location store hours, CnC availability, special hours.
App's own database (LocationHours table).
App admin → Store Hours.
Per-product trigger values (the metafield value that activates a custom messaging trigger).
Shopify product metafields. Key is configured on the Locations Popup block; values are set per product.
Shopify admin → Products → product → Metafields. Or bulk via the app's Product Metafields page.
Google Geocoding / Distance Matrix API key, optional IPinfo key, store search radius.
App's own database (GoogleApi table).
App admin → Google API.
Pickup-Only delivery enforcement at checkout.
Shopify delivery customisation function. Reads the same product metafield as the storefront block.
Shopify admin → Settings → Shipping and delivery → Customisations.
i
Why Cart Popup needs Locations Popup. The Cart Popup block only holds cart-page labels and tab styling. Everything else — stores, stock display, custom messaging triggers, colours, behaviour — lives in the Locations Popup block and is published to a runtime window.__CNC__.config object that the Cart Popup snippet reads. If the Locations Popup block is disabled, that config object is never published, so the Cart Popup has nothing to render.
Metafields
The app reads two kinds of metafield data: per-product metafields for custom messaging, and per-location metafields for store hours.
Product metafield (custom messaging)
Namespace and key: Configurable. The merchant sets the key in the Product Page block. Common convention is custom.stock_override.
Type: Single-line text.
Value: A string that matches one of the configured trigger values (e.g. stock_override, Pickup_Only, pre_order).
To set the metafield in bulk, use Shopify's Metafield definitions feature, the bulk editor, or the Admin API. The app auto-registers the definition on first load if it doesn't exist yet.
Location metafield (store hours)
Namespace and key:saas_int_cnc_plus.store_hours (auto-registered on app load).
Type: JSON.
Structure: Contains regular hours, CnC availability, and special hours for the location. Written via the Store Hours admin page.
The location metafield is intended to be edited through the Store Hours admin page rather than directly. Direct edits via the Admin API are supported but the JSON schema is not documented for direct write access in this version.
Liquid examples
Because messaging is driven by native product metafields, you can reference the same data in any Shopify Liquid template (order confirmation, shipping confirmation, ready-for-pickup, Shopify Flow email actions).
Order confirmation email
The Shopify order confirmation email is the most useful place to surface Click and Collect messaging. Customers always read it, and you can tailor it based on the delivery method and product metafields. Go to Settings → Notifications → Order confirmation → Edit code and add the snippets below.
1. Delivery-method-aware greeting
Replace the standard "Thank you for your purchase" greeting with one that adapts to how the customer is receiving the order. Pickup customers get a "ready for pickup" message, shipping customers get a "we'll let you know when it's shipped" message.
liquid · order-confirmation greeting
{% capture email_title %}Thank you for your purchase!{% endcapture %}
{% capture email_body %}
{% if delivery_method == 'pick-up' %}
Hi {{ customer.first_name }}, we're getting your order ready
for pickup. We'll notify you when it's ready to collect.
{% elsif requires_shipping %}
Hi {{ customer.first_name }}, we're getting your order ready.
We'll let you know when it's been shipped.
{% else %}
Hi {{ customer.first_name }}, thank you for your purchase!
{% endif %}
{% endcapture %}
Render it in the email body with <h2>{{ email_title }}</h2> and <p>{{ email_body }}</p> in the existing content section of the template.
2. Special Pickup Notice banner for delayed-collection items
For pickup orders that include items flagged in the product metafield (e.g. made-to-order or transfer-required goods), show a styled banner explaining the additional preparation time. The banner only appears when the order is a pickup order and at least one cart line has the metafield set.
liquid · click-and-collect-pickup-notice
{% assign has_delayed_pickup_items = false %}
{% if delivery_method == 'pick-up' %}
{% for line_item in line_items %}
{% assign stock_override_value = line_item.product.metafields.custom.stock_override | downcase %}
{% if stock_override_value == "true" %}
{% assign has_delayed_pickup_items = true %}
{% break %}
{% endif %}
{% endfor %}
{% endif %}
{% if has_delayed_pickup_items %}
<table class="row section" style="margin: 20px 0;">
<tr>
<td class="section__cell">
<center>
<table class="container">
<tr>
<td style="background-color: #FFF3CD;
border-left: 4px solid #FFC107;
padding: 20px; border-radius: 4px;">
<h3 style="margin-top: 0; color: #856404;">
📦 Special Pickup Notice
</h3>
<p style="color: #856404; line-height: 1.6;">
<strong>Your order contains items that require
additional preparation time.</strong>
</p>
<p style="color: #856404; line-height: 1.6;">
We will notify you via email when your complete
order is ready for pickup. Please allow up to
<strong>3 business days</strong> for preparation.
</p>
<p style="color: #856404; line-height: 1.6;">
<em>Thank you for your patience! We're working to
ensure your items are perfect and ready for
collection.</em>
</p>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
{% endif %}
Paste this block between <p>{{ email_body }}</p> and the View your order button block. The banner uses inline styles for maximum compatibility across email clients (Outlook, Gmail, Apple Mail, mobile).
i
Adapting the metafield check. This example checks line_item.product.metafields.custom.stock_override == "true". If your Product Page block uses a different metafield key (e.g. custom.pickup_only) or different trigger values (e.g. "stock_override", "pre_order"), change the downcase'd value comparison accordingly.
To show different messages for different triggers, replace the boolean flag with a {% case %} statement that branches on the metafield value, the same way the Product Page block does on the storefront.
3. Pickup-only subtotal label
Shopify's default subtotal table shows "Shipping" as the label for all orders. For pickup orders, swap it to "Pickup" so the customer sees terminology that matches their order. Add the conditional inside the existing subtotal-line block:
The same delivery_method == 'pick-up' pattern works in any notification template (shipping confirmation, ready-for-pickup, Shopify Flow email actions). For more detailed checks, use the fulfilment location:
liquid · fulfilment-location
{% if delivery_method == 'pick-up' %}
<p>You'll receive an email when your order is ready for pickup at
{{ order.fulfillment_locations.first.name }}.</p>
{% endif %}
Shopify Flow
The app uses native Shopify metafields and native Shopify locations, so all standard Shopify Flow triggers and actions work without additional integration:
Order created → branch on product metafield. Send a different email or assign to a different fulfilment team based on whether the order contains a Pickup-Only product, a made-to-order product, or a standard stocked product.
Order created → branch on fulfilment location. Route pickup orders to the picking team at the chosen store.
Order created → set a custom tag. Tag pickup-only orders so they're filterable in the orders list.
No Shopify Flow connector needs to be installed. All data is accessible via the standard product, line item, location, and order Flow triggers.
!
Caution with Flow actions that change fulfilment locations. If your store uses a middleware integration that owns order routing (for example, SAAS Integrator or a similar ERP / OMS connector), Shopify Flow actions that reassign or override the fulfilment location may not be supported and can conflict with the middleware's own routing logic. Branching on the location (read-only) is safe. Writing or moving fulfilments via Flow is not. Confirm with your integration provider before adding any Flow action that mutates fulfilment data on a pickup order.
Theme compatibility
The app is built against Shopify Online Store 2.0 themes. Tested compatibility:
Dawn (Shopify reference theme). Full compatibility. No theme changes required.
Other OS 2.0 free and paid themes. Full compatibility for the Locations Popup and Cart Popup app embeds. The Product Page block uses standard {% schema %} block conventions and works in any theme that supports app blocks in section JSON files.
Legacy Liquid themes (pre-OS-2.0).Not supported. The app relies on Online Store 2.0 features (app embeds, JSON section templates, and app blocks) that pre-OS-2.0 themes do not have. To use Click and Collect, upgrade to an OS 2.0 theme. Dawn is free and a common starting point.
Sticky header banner
The optional store and delivery header banner block sits in the header section group. Most themes do not pin app blocks by default. For best results, add sticky positioning to the header section or move the block above the header bar. Speak to your theme developer if you need this customised.
Troubleshooting
Common symptoms and how to diagnose them. If your issue isn't here, see Support.
Postcode search returns no results
Open the app's Google API settings page. Confirm the key is saved.
Confirm the key is not restricted in a way that blocks your shop domain. Check Credentials → your key → Application restrictions.
Confirm each pickup location in Settings → Locations has a complete address. Locations with missing fields are silently skipped.
Custom message not appearing on a product
Open the product in Shopify admin. Confirm its metafield (under Custom data) is set to the exact trigger value, with no whitespace or case mismatch. Pickup_Only is different to pickup_only.
Open the Product Page block in the theme editor. Confirm Metafield Key matches the namespace and key on the product (e.g. custom.stock_override).
Confirm the trigger's Trigger Value matches the metafield value exactly.
Check Ignore Stock Levels. If it's set to Only locations with no stock, the message will appear only at zero-stock stores.
Home Delivery still appears for a Pickup-Only product
Open Online Store → Themes → Customize → App embeds. Confirm Cart Popup is on. Pickup-Only enforcement runs through the Cart Popup. With it off, Home Delivery is not blocked.
Confirm the product's metafield matches the trigger configured with Pickup In Store Only turned on.
Confirm the trigger's Ignore Stock Levels is not set to Only locations with no stock. That mode automatically disables Pickup In Store Only.
Confirm the Pickup-Only Delivery Customisation is activated in Settings → Shipping and delivery → Customisations. The Cart Popup blocks Home Delivery at the cart, but this customisation is what blocks it at checkout itself. Without it, customers can still complete checkout with Home Delivery on a Pickup-Only product.
Hours don't appear on store cards
Open the Store Hours admin page. Confirm the location has at least regular hours configured.
Open the Locations Popup block in the theme editor. Confirm Enable Store Hours is on (it is on by default).
Hard-refresh the storefront to clear any cached theme data.
The Cart Popup never opens at checkout
Confirm BOTH the Cart Popup and the Locations Popup app embeds are on in the theme editor. Cart Popup reads its store list, stock display, custom messaging, and styling from the Locations Popup block. Without Locations Popup enabled, Cart Popup will not display anything.
Open the storefront in a private window. Check the browser console for JavaScript errors. If there are theme-level conflicts (e.g. another app intercepting the checkout button), the Cart Popup may not get a chance to open.
Contact support with a link to your storefront and a short description of the symptom.
FAQ
Quick answers to the questions merchants most often ask. For longer explanations, jump to the linked section.
Do all plans include the same features?
Yes. All three plans include the full feature set. Plans differ only by the number of Shopify locations and total monthly Shopify order volume.
Does this work on Shopify Plus?
Yes, and on non-Plus stores. The app uses Shopify's supported checkout messaging and approved delivery customisation APIs. No Plus-only features required.
Does this app modify Shopify checkout?
The app uses Shopify's approved checkout customisation APIs (delivery customisation functions) to support Pickup-Only fulfilment and surface Click and Collect messaging at checkout. It does not replace the checkout UI, modify the payment flow, or store customer payment data.
Does it work with Shopify POS?
Yes. The app uses native Shopify locations, the same locations your POS is connected to. There are no duplicate location setups, no sync workarounds, and no data drift between channels.
Does this integrate with Shopify Flow and order routing?
Yes. Because the app uses native Shopify metafields and native locations, all standard Shopify Flow triggers work without an additional connector. See Shopify Flow for common recipes.
Is the Cart Popup required?
The Cart Popup is optional as a feature. The app works without it, but you lose three specific capabilities at the cart: pre-checkout stock validation against the selected pickup store, custom messaging at each cart line (for example, "Allow 2 to 3 days for collection"), and Home Delivery blocking for Pickup In Store Only products.
Enable Cart Popup if you want any of those features. If you're running plain in-stock-only Click and Collect with no custom messaging triggers and no Pickup-Only restrictions, you can leave it off.
If you enable Cart Popup, you must also enable Locations Popup. Cart Popup is a settings shell only — it reads its store list, stock display, custom messaging triggers, colours, and behaviour settings from the Locations Popup block. Without Locations Popup enabled, Cart Popup will not display stores or apply your configured messaging.
Is the Locations Popup required?
It depends on what you enable elsewhere. Locations Popup is technically optional, but in practice almost every working configuration needs it.
You can leave Locations Popup off only when all of the following are true:
Your Product Page block is in Embedded PDP Store Lookup Mode (the recommended default).
You're not using the Cart Popup app embed.
You're not using the optional store banner or header widget.
Enable Locations Popup if any of these are true:
You've enabled Cart Popup. Cart Popup reads the bulk of its configuration (stores, stock display, messaging triggers, colours) from the Locations Popup block. Cart Popup will not function without it.
You want a global "select your store" popup that opens on the customer's first visit.
You want a persistent header widget showing the chosen store.
You want the optional store banner.
Your Product Page block is in Popup (legacy) PDP Store Lookup Mode — the PDP delegates store lookup to this popup in that mode.
What counts toward my monthly order limit?
All Shopify orders created in the month count, regardless of fulfilment method.
What happens if I exceed my plan limits?
You'll be prompted to upgrade. There are no automatic overage charges.
Support
For help with installation, configuration, or anything that's not behaving as documented, contact the team directly.
Email support
Get a response within one business day (Brisbane time).