Click-and-Collect / BOPIS
Reserve online, pick in store, collection-ready notify and ID check for BOPIS
Click-and-collect is now table stakes for UK retail, but Odoo has no purpose-built BOPIS process — so teams bolt it onto generic deliveries and end up with no slot control, no collection-ready notification and no audit trail. This module turns any sale order into a trackable click-and-collect order with a proper lifecycle: customers reserve online, store staff move the order through picking and ready, the customer is emailed the moment it is collection-ready, and an optional ID check is enforced before handover. Per-store collection points enforce daily capacity and opening hours, booked time slots smooth counter traffic, and no-show plus auto-expiry handling releases staged stock without manual chasing. Lead-time and no-show reporting round it out. Omnichannel retailers running Odoo eCommerce alongside physical stores get a reliable, audited BOPIS workflow their customers and store staff can trust.
Key Features
Per-Store Collection Points
cc.collection.point models each store with a source warehouse, opening and closing times, a daily_capacity and a ready_expiry_days. remaining_capacity counts active orders for a date so a point is never overbooked, and a unique-code constraint keeps points clean per company.
Full Collection Lifecycle
cc.collection.order walks reserved, picking, ready, collected, no-show and cancelled states via action_start_picking, action_mark_ready, action_collect and more — every transition tracked on chatter, with an auto-generated reference and a short collection_code the customer quotes at the counter.
Collection-Ready Notification
action_mark_ready stamps ready_date, sets an expiry_date from the point's expiry days, and _send_ready_notification fires the cc_ready mail template to the customer's email — so shoppers know exactly when to come in and notify_sent records it.
Enforced ID Check at Handover
When a point has requires_id_check set, the order inherits it and action_collect refuses to complete unless id_verified is true. action_verify_id captures the document type, reference and verifier, enforcing proof of identity before goods leave the counter.
Time-Slot Booking with Capacity Guard
cc.collection.slot defines dated time windows with a capacity; _compute_booked derives booked_count, available and is_full, the order's slot domain hides full slots, and book() refuses an overbooked slot — preventing counter queues and overcrowding.
No-Show and Auto-Expiry
action_no_show marks uncollected orders, and the cron_expire_ready_orders scheduled job auto-flags ready orders past their expiry_date as no-show with a chatter note — freeing staged stock and slot capacity without manual chasing.
Sale Order Integration
sale.order gains a Click & Collect flag and a collection point; action_create_collection_order copies the order lines into a new collection order (blocking duplicate active ones), so any quotation becomes a trackable in-store pickup in one click.
Lead-Time & No-Show Dashboard
A built-in Collection Analysis report (Reports menu) provides a bar-chart graph view and pivot table aggregating average lead_time_hours and no-show counts per collection point and time period — so managers can benchmark fulfilment speed and identify high no-show branches at a glance. The cc.collection.wizard drives counter handover — capturing ID details and collector name in a single guided step.
Use Cases
Screenshots
Complete Collection
Collection Orders
Collection Points
Why Choose This Module
A complete in-store collection workflow that turns any sale order into a trackable click-and-collect order. Customers reserve online, store staff pick and stage the goods, the customer is notified the order is collection-ready, and an optional ID / proof check is enforced before handover — with a full audit trail at every step.
Specifications
- Compatible: Odoo 18.0 / 19.0
- License: OPL-1
- Languages: English
- Author: Pokutsoft
- Dependencies: sale_management, stock
- Support: support@pokutsoft.com
Update date: 2026-07-02