Basic Holidays Configuration
Block out public holidays, store closures, or any date range where your warehouse will not be picking or shipping orders — the module automatically pushes all affected delivery estimates forward so your customers always see accurate dates.
Available since v4.0.0
Overview
When you run a store, certain days are simply not working days: national public holidays, annual inventory closures, company-wide breaks. If those days are not told to the module, it will treat them as normal processing days and show delivery estimates that your team cannot actually meet.
The Holidays feature lets you define one-off or recurring date ranges and mark them as non-working for delivery purposes. When the module calculates a delivery date and a holiday falls in the window, it advances the estimated date past the holiday — no manual adjustment needed, no customer complaints about promised dates that slip.
You can also control whether a holiday affects the picking side of fulfilment (when the warehouse packs the order), the shipping side (when the carrier collects), or both. And because not every shop in a multi-shop setup has the same calendar, each holiday can be activated or deactivated independently per shop without needing to re-create it.
Configuration
- Go to Modules > Module Manager, find Estimated Delivery, and click Configure.
- Navigate to the Holidays tab.
- Fill in the Add Holiday form at the top of the page and click Save.
Add Holiday Form Fields
| Field | Values | Default | Description |
|---|---|---|---|
| Holiday Name | Text (required) | — | A label for your own reference — for example "Christmas Closure" or "Bank Holiday". Not shown to customers. |
| Start Date | Date (required) | — | The first day of the closure. |
| End Date | Date (optional) | Same as Start Date | The last day of the closure. Leave blank for a single-day holiday. |
| Yearly Repeat | On / Off | Off | When enabled, the holiday automatically recurs every year on the same calendar dates. Useful for fixed public holidays. |
| Scope | Both / Picking only / Shipping only | Both | Controls which part of fulfilment the holiday affects. Both blocks the full delivery window. Picking only delays when the warehouse processes the order. Shipping only delays when the carrier collects it. |
| Shops | Multi-select (multi-shop only) | Current shop | Which shops the holiday applies to. Only shown if your PrestaShop installation has more than one shop. |
When End Date is left blank, the system automatically sets it equal to Start Date, creating a single-day closure.
The Scope field lets you model real-world situations precisely. For example, if your warehouse is closed on a bank holiday but a carrier still collects pre-packed orders, set scope to Picking only so shipments that were already packed are not delayed.
Managing Existing Holidays
The holiday list beneath the form shows all your configured holidays. For each entry you can:
- Toggle active status — Enable or disable the holiday per shop without deleting it. The toggle is non-destructive: the holiday remains in the list and can be re-enabled at any time.
- Toggle yearly repeat — Switch the recurrence on or off for an existing holiday without re-entering the dates.
- Edit — Load the holiday's current values back into the form so you can change any field. See Editing a Holiday below.
- Delete — Permanently removes the holiday and all its shop associations. This action cannot be undone.
Editing a Holiday
Each row in the holiday list has an Edit button (pencil icon) in the Actions column, next to the Delete button. Clicking it loads that holiday's saved values back into the form at the top of the page so you can change any detail without deleting and re-creating the record.
How editing works
- Click the Edit button (pencil icon) in the Actions column for the holiday you want to change.
- The form heading changes from "Add Holiday" to "Edit Holiday" and the submit button changes to "Save Changes".
- All fields are pre-filled with the holiday's current values — name, start date, end date, scope, yearly repeat setting, and (in multi-shop or advanced mode) the selected shops, carriers, and zones.
- Make your changes and click Save Changes. The existing holiday record is updated in place — no duplicate is created.
- To abandon the edit without saving, click Cancel edit. The form returns to Add mode with all fields cleared.
Clicking Edit scrolls the page to the form automatically. You do not need to scroll up manually.
On multi-shop installations, the shop checkboxes in edit mode reflect which shops currently have the holiday active. Unchecking a shop and saving deactivates the holiday for that shop — it does not delete the shop record, only sets it inactive.
What changes when you save an edit
All five core fields are updated on the existing row: name, start date, end date, yearly repeat, and scope. The carrier and zone associations are also replaced in full — any carriers or zones you remove are cleared, and any you add are saved. Shop associations follow the same replace-in-full logic.
Because the update operates on the database row's primary key rather than the unique key (start date + end date + repeat + name), you can freely change any combination of those fields without accidentally creating a duplicate holiday.
How It Works
Date Calculation and Holiday Skipping
When the module calculates a delivery date, it works forward from today using your carrier's transit days and your configured working days. Each time the rolling calculation lands on a date that falls within an active holiday range, the algorithm advances past that holiday — it moves the estimated date to the day after the holiday ends, then continues counting remaining transit days from there.
This means that if a three-day bank holiday falls in the middle of a five-day delivery window, the estimate is pushed forward by three calendar days. The customer sees the accurate later date, not the date the module would have shown if the holiday did not exist.
Yearly Repeat
Yearly-repeat holidays are expanded in memory when the module runs: both the current-year and next-year occurrences are generated automatically and treated identically to one-off holidays during the date check. No cron job or manual re-entry is needed when the year rolls over.
Shop-Level Activation
Each holiday record has a per-shop active flag stored separately from the holiday itself. Toggling a holiday off for one shop does not affect other shops — the holiday data remains shared, only the activation per shop changes. This makes it easy to maintain one central holiday list while switching individual closures on or off for shops in different countries or regions.
Cache Invalidation
Saving a new holiday, deleting a holiday, or toggling the yearly-repeat flag all automatically clear the holidays cache and the result cache for the affected shops. You do not need to clear the cache manually after making holiday changes.
Usage Examples
Example: National public holiday (single day, every year)
Your country observes a national holiday on 1 January every year. Add a holiday with Start Date 2025-01-01, leave End Date blank, and enable Yearly Repeat. Set Scope to Both. Save. The module will skip 1 January in delivery calculations every year without any further action from you.
Example: Summer warehouse closure (multi-day, one-off)
Your warehouse closes for two weeks in August. Add a holiday with Start Date 2025-08-04 and End Date 2025-08-17. Leave Yearly Repeat off unless the closure recurs on exactly the same dates each year. Any order placed before the closure that would have arrived during those dates will show an adjusted delivery estimate landing after 17 August.
Example: Carrier collection stops, but warehouse keeps packing
A carrier does not collect on 26 December, but your team is still in the warehouse packing orders. Add a holiday with Start Date 2025-12-26 and Scope set to Shipping only. The module will still count 26 December as a picking day but will skip it when counting carrier transit days, pushing the estimated arrival date forward by one day without affecting the dispatch date.
Example: Multi-shop setup with regional closures
You run two shops — one in France, one in Germany. French national holidays do not apply to the German shop. Add each holiday and use the Shops selector to assign it only to the relevant shop. Each shop's delivery estimates reflect only the holidays applicable to that country.
Important Notes
- Holidays are applied globally across all carriers for the selected shops unless you use the advanced carrier or zone filter options (available in Advanced Mode). In basic configuration, every carrier is affected equally.
- Deactivating a holiday (toggling it off) is instant and does not require saving the full configuration form. The change takes effect on the next delivery calculation after the cache refreshes.
- Deleting a holiday is permanent. If you plan to re-use the same dates next year, consider enabling Yearly Repeat instead of deleting and re-adding.
- In a multi-shop setup, the holiday record itself is shared, but the active state is per shop. If you delete a holiday, it is removed for all shops simultaneously.
- Supplier closures are a related feature that lets you block dates at the supplier level rather than the store level. They appear in a separate section of the Holidays tab and are described briefly below under Related Features.
- Toggling yearly repeat on an existing holiday clears the result cache immediately, so the next page view will recalculate delivery dates with the updated recurrence in effect.
Troubleshooting
| Problem | Solution |
|---|---|
| A holiday was saved but delivery dates on the front office still ignore it | The cache may be serving a pre-holiday result. Go to Performance > Clear all cache to force a fresh calculation on the next page view. |
| The toggle to activate a holiday is greyed out or unresponsive | Check that you are viewing the correct shop in the Back Office context. Each shop has its own active flag — switching your active shop in the top-right shop selector may reveal the correct toggle state. |
| End Date is set to the same day as Start Date when you expected a range | If you left End Date blank, the system automatically sets it to Start Date. Enter the End Date explicitly to create a multi-day range. |
| A yearly-repeat holiday is showing for the wrong year | Yearly-repeat holidays expand for the current year and next year. If you are viewing estimates very close to year-end, both occurrences should be visible. If neither is being applied, clear the cache and verify the holiday is active for the current shop. |
| After deleting a holiday, delivery dates still reflect the old closure | Clear the cache from Performance > Clear all cache. The delete action clears the holidays cache automatically, but a stale result cache may still be serving the old computed date. Clearing all cache forces a full recalculation. |
| The Edit button shows a spinner but the form does not fill in | The holiday may no longer exist (deleted in another tab or by another admin). Refresh the page to reload the holiday list and try again. |
| After clicking Edit, the form fills in but saving shows "The holiday you are trying to edit no longer exists" | Another session deleted the holiday between the time you clicked Edit and the time you clicked Save Changes. Click Cancel edit, refresh the page, and re-add the holiday. |
Frequently Asked Questions
Can I change the dates or name of a holiday I already saved?
Yes. Click the **Edit** button (pencil icon) in the holiday row's Actions column. The form fills in with the holiday's current values, you make your changes, and clicking **Save Changes** updates the existing record. No duplicate is created, and the cache is cleared automatically.
Can I disable a holiday temporarily without deleting it?
Yes. Use the active toggle in the holiday list. Toggling a holiday off removes it from the delivery calculation immediately without deleting the record — you can re-enable it at any time.
Does the yearly repeat work for multi-day holiday ranges, or only single days?
It works for any date range. If you define a holiday from 24 December to 2 January and enable yearly repeat, the full range recurs each year automatically. Both the start and end dates shift to the same calendar positions in the current and next year.
What happens if a holiday spans the end of December and the start of January?
The module handles year-boundary ranges correctly. A holiday from 28 December to 3 January is stored as entered and the date check covers the full range across the year boundary.
Do holidays apply to all carriers, or can I limit them to specific carriers?
In basic configuration, a holiday applies to all carriers for the selected shops. If you need to limit a holiday to specific carriers — for example a carrier whose depot is closed while others remain open — this requires the carrier filter options available in the advanced carrier settings section.
If I add a holiday today, will it immediately affect delivery estimates already cached?
Yes. Saving a new holiday triggers automatic cache invalidation for the affected shops. Delivery estimates on the next page view will include the new holiday. You do not need to manually clear the cache.
Can different shops have different active holidays even if they share the same holiday record?
Yes. The holiday record is shared (same dates, same name), but the active flag is stored per shop. You can enable a holiday for your French shop and disable it for your German shop from the same entry in the list.
What is the difference between Scope "Both", "Picking only", and "Shipping only"?
"Both" means the date is non-working for the entire fulfilment process — the warehouse will not pack orders and the carrier will not collect. "Picking only" means your warehouse is closed but carriers may still collect pre-packed items; the module delays the dispatch date but not necessarily the carrier transit count. "Shipping only" means the warehouse is open but the carrier will not collect; the dispatch happens normally but the handover to the carrier is delayed by the holiday duration.
Related Features
- Cache System — Holidays automatically invalidate the cache when saved; learn when manual cache clearing is useful.
- Display Builder — Controls how and where delivery estimates appear to customers after dates are calculated.
- Message Templates — Customise the text shown to customers in the delivery widget, including date formatting.