In-Store Pickup (Store Pickup) — Complete Guide
Install, configure and run in-store pickup: a dedicated carrier, pickup-point selection on an interactive map (Leaflet/OpenStreetMap, no API key), store management and order tracking for PrestaShop 8 and 9.
Overview
The In-Store Pickup module (datafireflystorepickup) lets your customers collect their order at one of your points of sale instead of having it delivered. On installation, an “In-Store Pickup” carrier is created automatically. At checkout, when the customer selects this carrier, a store list and an interactive map appear: they pick their collection point, and that choice is saved with the order.
The map relies on Leaflet and OpenStreetMap, with no API key required. The module is compatible with PrestaShop 8.x and 9.x and relies solely on native hooks, with no core override.
Installation
- Zip the
datafireflystorepickupfolder (the archive must contain the folder itself, not just its contents). - In the back office, open Modules > Module Manager, click Upload a module and drop the ZIP archive.
- Once installation is complete, click Configure.
On installation, the module automatically performs the following: it creates the “In-Store Pickup” carrier (with its price and weight ranges, all zones and all customer groups), creates the data tables, registers the hooks and initialises the pickup fee at 0.
The carrier is tracked by its reference (id_reference) rather than by its ID alone: you can freely edit it under Shipping > Carriers (name, delay, logo, zones) without breaking the link with the module.
Configuration
Go to Modules > In-Store Pickup > Configure. The page brings together the general settings and store management.
Pickup fee
The Pickup fee (excl. tax) field sets the cost applied to the pickup carrier. Leave 0 for free pickup, or enter a tax-excluded amount. This rate applies regardless of the store chosen.
Store management
The store list shows all your pickup points with their name, address, postcode, city, phone and status. From this list you can add, edit, enable/disable or delete a store.
Each store has the following fields:
- Name (required) — label shown to the customer.
- Address (required) and Postcode.
- City (required).
- Phone.
- Opening hours — free text field, e.g. “Mon-Sat 9am-7pm”.
- Latitude and Longitude (required) — the store position on the map.
- Active — only active stores are offered at checkout.
You don’t need to look up the coordinates manually: click on the map shown below the form to place the point, or use address geocoding. Latitude and longitude are filled in automatically. Geocoding relies on Nominatim / OpenStreetMap.
Customer side (checkout)
At the delivery step, when the customer selects the “In-Store Pickup” carrier, the module displays the list of active stores below the carrier along with an interactive map where each store is shown by a marker. The customer picks their collection point from the list or directly on the map.
Selection is mandatory: until a store is chosen, the delivery step cannot be validated and a message prompts the customer to select their store. The choice is saved in real time (via an AJAX request) and attached to the cart.
If no active store is available, a warning message is shown instead of the map.
Order tracking
Once the order is confirmed, the chosen store is saved as a snapshot attached to the order (name, address, postcode, city, phone and opening hours at the time of purchase). It therefore remains viewable even if the store is later edited or deleted. The pickup point is displayed automatically:
- on the order confirmation page;
- in the order detail of the customer account;
- in the back-office order page, in the side column.
Technical structure
This section is aimed at integrators and developers who want to understand the module’s internals.
Module type
The main class DataFireflyStorePickup extends CarrierModule. The carrier rate is returned by getOrderShippingCost() and getOrderShippingCostExternal(), both based on the DATAFIREFLY_PICKUP_FEE configuration.
Hooks used
actionFrontControllerSetMedia— loads Leaflet (remote CSS/JS) and the module’s front assets on the order page.displayCarrierExtraContent— injects the list and map below the pickup carrier.actionCarrierUpdate— updates the carrier ID when it is edited in the back office.actionValidateStepComplete— makes store selection mandatory at the delivery step.actionValidateOrder— freezes the chosen store into the order.displayOrderConfirmationanddisplayOrderDetail— display the pickup point on the customer side.displayAdminOrderSide— displays the pickup point in the back-office order page.
Carrier recognition
The isPickupCarrier() method identifies the pickup carrier by its reference (id_reference) as well as its current ID, because a PrestaShop carrier’s ID changes every time it is edited in the back office. Two configuration keys are stored for this: DATAFIREFLY_PICKUP_CARRIER_ID and DATAFIREFLY_PICKUP_CARRIER_REF.
Data tables
datafirefly_pickup_store— the stores (name, address, coordinates, hours, status). Managed by theObjectModelDataFireflyPickupStore.datafirefly_pickup_selection— the store chosen per cart (keyid_cart), before the order is validated.datafirefly_pickup_order— the store snapshot per order (keyid_order), kept after purchase.
AJAX selection
The front controller ajax (action selectStore) saves the selected store in datafirefly_pickup_selection for the current cart. When the order is validated, this selection is copied into datafirefly_pickup_order and the cart row is then deleted.
Uninstallation
Uninstalling the module marks the carrier as deleted and disabled, removes the configuration keys (DATAFIREFLY_PICKUP_CARRIER_ID, DATAFIREFLY_PICKUP_CARRIER_REF, DATAFIREFLY_PICKUP_FEE) and drops the module’s three tables. Saved stores are therefore erased.
Known limitations
- The pickup point is not injected into confirmation emails: it remains visible in the back office and the customer account.
- Geocoding relies on Nominatim (OpenStreetMap) — moderate use is recommended to respect the service’s terms of use.
FAQ
Is an API key required for the map?
No. The map uses Leaflet and OpenStreetMap tiles, with no API key or external configuration.
Can the customer validate their order without choosing a store?
No. When the pickup carrier is selected, choosing a store is mandatory to pass the delivery step.
What happens to the pickup point if I delete a store after an order?
The order keeps a snapshot of the store (name, address, hours…) saved at the time of purchase. It remains viewable even after the store is deleted.
Is the module compatible with PrestaShop 9?
Yes, the module is compatible with PrestaShop 8.x and 9.x.