dfomnibus-woo — Omnibus Directive Compliance for WooCommerce
Installation, reference price engine, automatic capture, settings, defense dashboard, freeze planner, import and troubleshooting for the dfomnibus-woo plugin.
The DataFirefly Omnibus Compliance for WooCommerce plugin brings your store in line with European directive 2019/2161, known as the Omnibus directive, applicable since 28 May 2022. It captures price history from the moment it is activated, computes the legal reference price using the rules almost nobody implements, and gives you the file to hand over if an inspection ever asks.
Compatibility: WordPress 6.2 minimum, WooCommerce 8.0 minimum, PHP 8.0 minimum (compatible with 8.1, 8.2 and 8.3). HPOS compatibility declared. Simple and variable products, multi-currency, WPML and Polylang. No external dependency, no CDN.
Installation
- Download the
dfomnibus-woo-1.0.0.ziparchive from your DataFirefly customer area. - In the WordPress admin, go to Plugins, Add New Plugin, Upload Plugin, then activate. WooCommerce must be active.
- Capture starts immediately: three tables are created and a first snapshot is scheduled within minutes of activation.
- Open WooCommerce, Omnibus Compliance to configure the display and activate your license.
Three tables created: wp_dfwomni_price_history for price records, wp_dfwomni_display_log for the journal of served reference lines, wp_dfwomni_license_cache for the license cache. The wp_ prefix is replaced with yours automatically.
The reference engine
Reference price computation lives in an engine with no WordPress dependency, covered by unit tests. Rules are evaluated in this order.
1. Series of successive reductions
When promotions chain without the product ever returning to a non-reduced price, the legal reference remains the price charged before the first reduction of the series. It is never recomputed at each new promotion. The plugin detects these chains, freezes the reference and explains it in the back office, for example “reference frozen since 12 October, successive promotions in progress”.
A series is bounded in time. Beyond 60 days by default, adjustable from 30 to 120 days, the reduced price is considered to have become the product’s normal price: the general 30-day rule applies again and the compliance report flags a permanent promotion.
2. Normal case, anchored window
The reference price is the lowest price charged over the interval running from 30 days before the start of the reduction up to the start of the reduction. The window is anchored at the beginning of the promotion: it does not slide day after day while the promotion runs, unlike a rolling minimum that would eventually absorb the promotional price itself.
3. Recently marketed product
For a product marketed for less than 30 days, the reference is the lowest price since it went on sale, and the storefront line discloses the real marketing duration, as the regulation requires.
4. Insufficient data
If captured history does not cover the legal window for a product that is not recent, no reference is returned and nothing is displayed. A reference that was never actually captured must never be displayed or rebuilt after the fact.
Practical consequence: install the plugin before your promotional season, not on the day itself. History cannot be rebuilt retroactively. It is your evidence and it can only be accumulated in advance.
Automatic capture
Two mechanisms run in parallel.
- Daily snapshot: the
dfwomni_daily_snapshottask walks the catalog and records the state of prices. If the last run is more than 24 hours old, a one-off catch-updfwomni_catchup_snapshotis scheduled automatically. - Event capture: every real price change is recorded, whether it comes from the product editor, a quick or bulk edit, a CSV import, a REST or CRUD update, a repricing tool, or the start and end of scheduled sales.
One history row means one actual price change, duplicates are discarded. Prices are stored raw with their tax context and currency, never the already rendered price.
Making cron reliable on a low-traffic store
WP-Cron only runs when a visitor hits the site. On a quiet store, configure a real system cron:
*/15 * * * * wget -q -O /dev/null "https://your-store.com/wp-cron.php?doing_wp_cron"
The dashboard raises a warning when the last snapshot is more than 48 hours old.
Settings
The Settings tab of the WooCommerce, Omnibus Compliance page.
- Show the reference on: discounted products only, which is the legal minimum, or all products with captured history, a transparency mode reserved for the Pro license.
- Position of the line: right under the price, or after the price block in the product summary. Pick the second option if your theme rewrites the price markup.
- 30-day chart: offers the price curve on the product page, as a native canvas of roughly 3 KB with no external script. Pro feature.
- Custom texts: two templates, the standard line with the
{price}placeholder and the recent product line with{price}and{days}. Leave them empty to use the translated wording shipped in French, English, German, Spanish and Italian. Pro feature. - Exclusions: product and category IDs that never show the line, useful for negotiated or B2B prices.
- Audit thresholds: number of days after which a promotion is flagged as permanent, 60 by default, and maximum age of a successive-reductions series, 60 by default.
- On uninstall: a checkbox to also delete the captured price history. Unchecked by default, deliberately.
Dashboard
The Dashboard tab gathers three blocks.
Capture health
Number of captured price rows, number of products tracked and the date of the last daily snapshot, with the warning mentioned above when cron stops running.
Compliance report
An audit computed live on your most recent data, listing products whose current display could be challenged during an inspection. Four statuses:
- Missing reference: the product is on sale with no captured reference, so the discount is displayed without a defensible prior price.
- Permanent promotion: the promotion has been running too long, the reduced price has become the normal price and the announced discount is contestable.
- Recent product: informational, the display correctly discloses the real marketing duration.
- Frozen reference (series): successive promotions in progress, the reference will not be recomputed until the product returns to a non-reduced price.
Timestamped exports
Two CSV exports generated as a stream, named with the domain and a UTC timestamp:
- Price history: every captured record.
- Display journal: which reference was actually served, when, and on which product page.
The compliance report, the exports and the display journal are part of the Pro license. Capture itself is never gated.
Price history
The Price history tab shows records product by product, with variation, currency, regular price, sale price, effective price and the source of the record. When a reference is frozen, the freeze date and reason are shown.
Freeze planner
Your first promotion locks the reference of the next one: any price charged in the 30 days before a key date lowers the discount you will be able to announce that day. The planner works backwards.
Pick a key selling date from the built-in list (Black Friday, Cyber Monday, Christmas, winter and summer sales, Valentine’s Day, Mother’s and Father’s Day) or enter a custom date. The planner tells you the latest date your last promotion may end to keep the discount you are aiming for, and the period during which every price you charge feeds the legal window. A subscribable calendar gathers all deadlines. Pro feature.
Importing existing history
If another extension already recorded your prices, that data is irreplaceable. The Import tab scans the structure of the tables in your database, without relying on the extension name, and spots those holding a product identifier, a price and a date, with optional detection of a variation column. WooCommerce and Action Scheduler system tables are skipped.
The table lists each candidate, the detected columns and the row count. The import is idempotent: duplicates and unusable rows are counted separately and never pollute your history. Pro feature.
License
The License tab shows the current plan, the masked key and the date of the last verification. Enter the key received by email after purchase, in the DFWOM-PRO-XXXX-XXXX-XXXX-XXXX format, then click Activate.
One-time purchase, 12 months of updates, 30-day refund, unencrypted source code, one store per license. If the license server is unreachable, the plugin keeps all features for 7 days then falls back to Free without ever breaking your store. Price capture never stops, whatever the plan.
What the Pro license unlocks
- Display on all products with captured history, not only on discounted ones
- Custom wording for the reference line
- 30-day price chart
- Defense dashboard, compliance report and display journal
- Timestamped CSV exports
- Freeze planner
- Import of an existing price history
Always active whatever the license: full history capture, the reference line on discounted products, and history browsing in the back office.
Troubleshooting
No reference line is displayed
Check in this order:
- Is the product actually discounted? By default the line only appears on reduced products.
- Does captured history cover the required window? On a recent install the answer is often no, and that is the intended behaviour.
- Are the product or its category listed in the exclusions?
- Does the dashboard report a stale snapshot? If so, make cron reliable.
The line appears in an unexpected place
Switch the position to after the price block in the product summary. Some themes rewrite the price markup and swallow the insertion made right under it.
The last snapshot is more than 48 hours old
WP-Cron depends on traffic. Set up the system cron shown above, or check that the DISABLE_WP_CRON constant is not enabled without a system cron replacing it.
The chart does not appear
The chart is part of the Pro license and must be enabled in the settings. Also check that the product history holds enough points over the last 30 days.
The import detects no table
Detection is structural: a candidate table must hold a product identifier column, a decimal price column and a date column. Native WooCommerce and Action Scheduler tables are deliberately skipped.
FAQ
Is the reference recomputed at every new promotion?
No, and this is the most misunderstood part of the rule. As long as the product does not return to a non-reduced price, the reference stays the price charged before the first reduction of the series.
Are variable products supported?
Yes. The reference is computed per variation rather than at parent level, and the line refreshes when the visitor switches variation.
What happens on uninstall?
Settings, the license cache and its table are removed. Price history and the display journal are kept by default, since that data cannot be rebuilt. Tick the purge option in the settings explicitly if you want everything erased.
Does the plugin slow the store down?
No. Capture writes one small row per actual price change, display reads a short indexed range with a cache, and the chart is roughly 3 KB of native code with zero external request.
Is multi-currency handled?
Yes. Every record carries its currency, so history is never converted after the fact.
Changelog
1.0.0 – 10 August 2026
- Initial release
- Dual capture: daily snapshot with catch-up and event capture of price changes
- Reference price on a 30-day window anchored at the start of the reduction
- Successive-reductions rule with the reference frozen on the pre-series price
- Dedicated wording for recently marketed products, disclosing the real marketing duration
- Freeze planner and calendar of deadlines
- Defense dashboard, compliance report, timestamped exports and display journal
- Structural import of an existing price history
- Per-variation reference, multi-currency records
- FR, EN, DE, ES, IT translations, WPML and Polylang compatibility, HPOS compatibility