dfomnibus — EU Omnibus Directive Compliance for PrestaShop
Installation, configuration, cron, calculation modes, dashboard and troubleshooting for the dfomnibus module — EU Omnibus Directive compliance.
The dfomnibus module brings your PrestaShop store into compliance with European Directive 2019/2161 known as Omnibus, in force across the entire European Union since May 28, 2022. It continuously builds each product’s price history and, as soon as a promotion is active, displays the lowest price recorded during the 30 preceding days.
Compatibility: PrestaShop 8.0 to 9.x. PHP 7.4 to 8.3. Multi-shop, multi-currency and multi-combination supported natively. No third-party components, no CDN, GDPR-friendly.
Installation
Installation takes less than five minutes.
- Download the
dfomnibus_v1.0.1.zipfile from your DataFirefly customer area. - In the PrestaShop back office, go to Modules → Module Manager → Upload a module.
- Upload the ZIP. PrestaShop creates the tables, generates a cron token and registers the required hooks.
- Click Configure to open the settings screen.
Two tables created: ps_dfomnibus_price_history for snapshots and ps_dfomnibus_compliance_log for compliance events (reserved for future use). The ps_ prefix is automatically replaced with yours.
Scheduling the daily cron
The cron seeds your catalog history and guarantees the continuity of daily snapshots, even for products whose price never changes. Without an active cron, the module still works but its history is limited to products modified manually.
Retrieving the token
Open the module configuration screen. The cron token displayed is unique to your installation. You obtain a URL of the form:
https://your-store.com/modules/dfomnibus/cron.php?token=YOUR_TOKEN
Scheduling via Unix cron
Add the following line to your crontab, adjusting the time based on your traffic (ideally during off-hours):
15 3 * * * curl -s "https://your-store.com/modules/dfomnibus/cron.php?token=YOUR_TOKEN" > /dev/null
Scheduling via CLI
If you prefer to avoid any HTTP exposure, run the cron directly from the command line:
php /path/to/your-store/modules/dfomnibus/cron.php token=YOUR_TOKEN
Token security: the module uses hash_equals() to compare tokens, which protects against timing attacks. Never share this token and regenerate it if you suspect a compromise (Regenerate token button in the configuration).
Configuration options
Display activation
The Enable display toggle controls the insertion of the compliance notice under the product price. You can disable it temporarily to keep collecting history without displaying the notice on the storefront (useful during a switchover or during testing).
Calculation mode
Two modes are available:
- Strict: the reference price is the minimum recorded during the 30 days preceding the effective start of the current promotion. Matches the letter of the directive.
- Conservative (default recommended): the reference price is the minimum over the trailing 30 days. More unfavorable interpretation for the merchant but more defensive in case of an inspection.
Which mode to choose? If your store has a clear promotional policy with well-tracked start and end dates, strict mode is a perfect fit. When in doubt, or if your SpecificPrice rules are modified frequently without a sharp discontinuity between promo and non-promo periods, conservative mode is safer.
Reference period
The period is fixed at 30 days by default, in accordance with the directive. You can extend it (60, 90 days) to be even more cautious, but the minimum value remains 30 days.
Exclusion of recent products
The Exclude products younger than X days option hides the display for products that are too recent. Default value: 30 days. This is consistent with the spirit of the directive, which only applies to products with a meaningful price history.
EU restriction
If you sell both inside and outside the EU, tick Restrict display to the European Union. The module detects the customer’s country in this order:
- Delivery address of the logged-in customer
- Current cart address
- Shop default country
If none of this information is available, the display is active by default to avoid any risk of unintentional non-compliance.
Hide when price is equal
The Hide if price is identical option removes the notice when the current price matches exactly the lowest price of the last 30 days. Useful to avoid displaying information that adds no value to the consumer.
Real discount
Enable Show real discount to append the percentage calculated against the Omnibus reference price rather than the crossed-out price. Example: a product listed at €89, on sale at €59, with an Omnibus price of €65, will display -9.2% real discount instead of the -33% calculated against the crossed-out price. It’s more honest, but each merchant is free to choose.
Chart
The 30-day chart can be displayed in a dedicated product tab or inline under the price. It is lazy-loaded via IntersectionObserver and only triggers when it enters the viewport, which guarantees zero impact on your product page Core Web Vitals.
Combination tracking
Tick Track combinations if your products have different prices per combination (for example XL sizes with a surcharge). The history is then segmented by id_product_attribute and the Omnibus notice adapts to the price of the selected combination.
Retention
The default retention duration is 365 days. Beyond that, history is automatically pruned on cron execution. The minimum value is 60 days to guarantee a safety margin over the 30-day legal window.
Compliance dashboard
Accessible via Modules → DataFirefly Omnibus Dashboard, the dashboard shows:
- The number of tracked products
- The total snapshots recorded
- The date and time of the last cron run
- The list of products with, for each one, the first-capture date, the last-capture date, the lowest price of the last 30 days, and an active-promotion indicator
For each product, three actions are available:
- View history: displays up to 1000 timestamped snapshots
- Manual snapshot: forces an immediate capture
- Delete history: resets tracking for this product (use with caution)
CSV export
From the history view of a product, the Export to CSV button generates a file with all timestamped columns (date, tax-excl price, tax-incl price, currency, shop, combination, promo flag, capture source). Format ready to archive or hand to an inspector.
Storefront behavior
On the product page, as soon as a promotion is active, the following notice is displayed automatically under the price:
Lowest price of the last 30 days: €65.00
The message is translated based on the shop’s language (French, English, Spanish, German). Display uses the standard displayProductPriceBlock hook and works with all themes that respect PrestaShop standards (Classic, Hummingbird, Warehouse, Transformer, Panda).
Single render per page: the module includes a static $rendered guard that ensures the notice appears only once per page, even if the displayProductPriceBlock hook is called multiple times (summary blocks, sticky, etc.).
Multi-shop and multi-currency
History is stored per unique tuple (id_product, id_product_attribute, id_shop, id_currency). Each shop in your installation therefore keeps its own history, and each active currency has its own price curve. No on-the-fly conversion: the amounts displayed correspond exactly to what was recorded at capture time.
Troubleshooting
The notice does not appear on the product page
Check in order:
- Is the Enable display option ticked in the configuration?
- Has the cron been run at least once? If not, no history exists.
- Is the EU restriction enabled while you test from a non-EU country?
- Is the Hide if price is identical option enabled and does the current price match the minimum?
- Is the product less than 30 days old (with the new-product exclusion option active)?
The chart does not load
Open the browser console. The module expects an AJAX endpoint exposed by the pricehistory front controller. Check that no cache system or firewall is intercepting this route. If you use a CDN, explicitly allow the /module/dfomnibus/pricehistory URLs.
The cron returns a 403 or 401 error
The token in the URL does not match the one registered. Go back to the module configuration and copy the current token. If you suspect a leak, click Regenerate token and update your Unix cron.
SQL error during snapshot
If you are on version 1.0.0, update to 1.0.1. The initial version had a defect on three Db::getRow() queries that added a manual LIMIT 1 while PrestaShop already adds one automatically, producing an invalid LIMIT 1 LIMIT 1 SQL. See the changelog.
FAQ
Is the module mandatory for my store?
Yes, if you sell to consumers established in the European Union and you display reduced prices, promotions, promo codes, sales, or any mention referring to a reduction. The Omnibus Directive applies with no minimum turnover threshold.
What is the difference with CartRules?
The module tracks only prices coming from PrestaShop SpecificPrice records (product discounts, quantity discounts, customer group discounts). Cart rules (CartRule) apply at checkout and do not modify the unit price displayed on the product page: they fall outside the directive’s scope.
How exactly does strict mode work?
The module looks in the history for the last non-promo snapshot, then the first promo snapshot that follows. That date is the start of the current promotion. The reference window is then the 30 days preceding that date. If no non-promo to promo transition can be detected, the module automatically falls back to conservative mode.
Can I hide the notice on some products?
The module applies globally, but the new-product exclusion and the hide-if-equal option cover the majority of cases where the display adds no useful information.
Compatible with tax-excluded / tax-included prices?
Yes. The module records both amounts (price_tax_excl and price_tax_incl) at each snapshot and displays the one used by the shop. If you switch from one mode to the other, the history remains usable.
Changelog
1.0.1 — May 14, 2026
- Fix: removed manual
LIMIT 1from threeDb::getRow()queries that produced an invalidLIMIT 1 LIMIT 1SQL. Affected the record idempotency guard and the strict-mode promo-start detection.
1.0.0 — May 14, 2026
- Initial release
- Automatic price history capture via hooks and daily cron
- Lowest-price-in-30-days display on product page
- 30-day chart in vanilla canvas, lazy-loaded, ~3 KB
- Compliance dashboard with statistics and CSV export
- Strict and conservative calculation modes
- Multi-shop, multi-currency, multi-combination support
- Configurable EU restriction, exclusion of new products, hide-if-equal option
- Translations in FR, EN, ES, DE