Customer service and order packaging on your phone 📦

- Current NBP Exchange Rates in Your PrestaShop Store
- Current NBP exchange rate on orders
- Manual exchange rate—the price visible to the customer
- All exchange rate-related operations in one place
- Background automation — one token, two options
- Security
- Who is PrestaShop NBP for?
- Developer-Friendly Features
- PrestaShop hooks
- Technical Requirements
Exchange rates straight from the NBP—the official feed
By default, PrestaShop retrieves exchange rates from its own external source pegged to the EUR—which is not affiliated with the National Bank of Poland. Our module replaces these with the official, public NBP exchange rate table.
Background automation—URL link and CRON
A single, secure token supports CRON—it works for both shared hosting and servers with SSH access.
Additional, manual exchange rate for product price conversion—a ready-to-use solution for invoices
Regardless of the NBP exchange rate, you can set an additional exchange rate used to convert product prices. This rate is not visible to the customer. Every order in a foreign currency is assigned the actual NBP exchange rate from the date of purchase.

Compliance with the NBP
Exchange rates are retrieved directly from the official, public API at api.nbp.pl —Table A (major currencies, daily) or Table B (other currencies, weekly).
The store’s default currency is never altered—its exchange rate always remains 1, in accordance with PrestaShop requirements.
Control over the exchange rate for price conversion
Set your own fixed exchange rate for any currency—for example, for promotions or testing—with a live conversion preview in your browser.
The NBP reference exchange rate continues to be tracked in the background, regardless of the manually set exchange rate.
Zero manual work on invoices
Every order in a foreign currency is assigned the NBP exchange rate from the date of purchase or the business day preceding the date of purchase.
This is the only feature of its kind among PrestaShop exchange rate modules.
- When an order is placed in a foreign currency, the module retrieves the current exchange rate from a previously downloaded NBP reference rate—the checkout does not connect to the NBP, so an NBP outage does not affect the order placement process.
- The current exchange rate overwrites the `conversion_rate` field in the PrestaShop order, which is used by reports and statistics.
- The amount paid by the customer never changes—the data is locked in at the time the order is created.
- A complete set of data is stored in a separate table: the exchange rate from checkout, the actual NBP exchange rate, the NBP table and date, and the gross/net amounts converted to the store’s default currency.
Sometimes a store wants to show customers prices that differ from those resulting from a non-market exchange rate conversion—for promotional purposes, rounding, or testing.
- You can enter the same exchange rate as the NBP or any other rate.
- Live conversion preview in the browser, even before saving.
- Clearing the field restores automatic conversion from the NBP.
- The NBP reference exchange rate is always visible and updated next to it—regardless of the manually set exchange rate.
- Two exchange rates are included in the order: the NBP rate—for accounting purposes—and the manually set rate—for price calculations.
The module panel displays each store currency in a single row: the current NBP exchange rate (reference rate), the manually set exchange rate—visible to the customer—and a clear status.
- Current exchange rate —an independent, constantly updated NBP exchange rate, visible even for currencies with a manually set exchange rate.
- Rate visible to the customer —this is what is actually passed to PrestaShop’s `conversion_rate` and determines prices on the front end.
- Status – Default, Updating, Manual Rate, Excluded, or Inactive.
- The “Update Now” button always works, regardless of background automation.

- Option 1 — URL link — for control panels such as home.pl, OVH, nazwa.pl, or cron-job.org, which run cron jobs simply by calling the URL.
- Option 2 — crontab — a ready-to-use command line for servers with SSH access.
- You can revoke the token at any time and generate a new one with a single click.

Random, regeneratable token
The link for automatic updates contains a secret token—without it, the server returns a 403 Forbidden response. The token can be revoked at any time, and a new one can be generated with a single click in the dashboard.
Random, regeneratable token
The link for automatic updates contains a secret token—without it, the server returns a 403 Forbidden error. The token can be revoked at any time, and a new one can be generated with a single click in the dashboard.
One endpoint, no duplicates
Both cron options (URL link and crontab) point to exactly the same, secure location—there is no separate script that could bypass token verification.


Accounting firms and store accounting
Ready-to-use, documented data for invoices in foreign currencies, compliant with the requirement to use NBP exchange rates—no need to manually look up the exchange rate from the order date.

Test and development stores
Full control over the exchange rate displayed to the customer, independent of the actual NBP exchange rate tracked in the background—convenient for testing prices and conversions.
Developer-Friendly Features
- All exchange rate logic is contained in independent services (NbpClient, CurrencyRateUpdater, OrderRealRateApplier)—easy to extend and reuse.
- Dedicated ps_pshownbp_order_rate table (one row per order)—minimal database load, ready to be read by your own invoice generator.
- Covered by PHPUnit unit tests—safe for implementing your own modifications.
PrestaShop hooks
- actionValidateOrder – saves the current NBP exchange rate and invoice data when an order is placed.

-----
* Fix: `OrderRealRateApplier::apply()` now checks the excluded-currencies list — an excluded
currency is left completely untouched, including a rate that was cached before it got excluded.
* Fix: excluding a currency (or leaving its manual-rate field blank on submit) no longer silently
discards a previously-saved manual rate for a *different*, still-excluded currency.
* Fix: `saveManualRates()` now validates the cached reference rate (numeric, > 0) before writing
it to `Currency::conversion_rate`, matching the same guard already used elsewhere.
* Fix: `Db::insert()`/`Db::update()` now pass `$null_values = true` — an empty
`nbp_effective_date` was being stored as `''` instead of `NULL`, which fails under strict SQL
mode against the `DATE NULL` column and silently dropped the whole audit write.
* A failed cron sync (NBP unreachable, or no default currency configured) is now logged via
`PrestaShopLogger` and answers with a non-200 HTTP status, instead of a silent HTTP 200 —
previously nothing told the seller the cron had stopped working while orders kept getting an
increasingly stale cached rate.
* Replaced `PSHOWNBP_LAST_SYNC_SUMMARY` (a pre-rendered, already-translated string) with
`PSHOWNBP_LAST_SYNC_STATS` (raw numbers) — the "last sync" summary is now built in the current
viewer's admin language every time the page renders, instead of being frozen in whichever
language was active when the sync ran (an issue for cron-triggered syncs).
* Source strings for `trans()`/`{l s=}` are now English (translated PL/EN via the usual
`translations/*.php` files), matching the convention used by the module's other language files.
* `composer.json`'s `test` script no longer depends on PHPUnit (not present in the CI's
`--no-dev` build) — added `tests/run.php`, a dependency-free integration test that
actually runs in CI, covering `CurrencyRateUpdater::run()` and `OrderRealRateApplier::apply()`.
The PHPUnit suite stays available for local development via `composer run test:unit`
(equivalent to the existing `composer run phpunit`).
* Fixed a PHP 7.4-only typed property in a test file that failed to parse on the declared PHP 7.1
minimum.
* Fix: `Currency::resetStaticCache()`, used to make the new multistore sync loop below work
correctly, doesn't exist before PrestaShop 1.7.4.0 — calling it directly would fatal on the
1.7.0.0–1.7.3.x range this module declares support for. Now guarded with `method_exists()`.
* Multistore: a single cron hit now syncs every active shop, not just whichever shop's domain
received the request — `conversion_rate` and the reference-rate cache are per-shop, so one
shop's sync could otherwise never refresh another's. Excluded currencies and manual rates are
also independent per shop. The cron secret, the "auto update" switch and the NBP table choice
remain a single, installation-wide setting. `Order`-side behaviour is unaffected —
`OrderRealRateApplier::apply()` already runs in the placing order's own shop context, so it
always reads that shop's own reference rate. The "Update now" button is unchanged — it still
only syncs the shop currently selected in the admin, matching the rates table shown right below
it on the same page.
## 1.2.1 - 2026-09-04
-----
* Fix: `pshownbp_order_rate.nbp_effective_date` now stores the actual NBP-published date of the
applied rate table, instead of the date the sync happened to run on — the two could differ
after a weekend/holiday or when cron fires before NBP's daily publication.
* Checkout is now resilient to any unexpected error while recording the real-rate audit data
(e.g. a database hiccup) — the order is always saved normally; the error is only logged.
* The suggested crontab example moved from 8:30 to 13:00 — NBP typically publishes Table A by
12:15, so an earlier cron run was silently fetching the previous business day's rate.
## 1.2.0 - 2026-09-02
-----
* New: when an order is placed in a currency other than the shop's default one, the module
overwrites `Order::conversion_rate` with the real NBP reference rate (never the seller's manual
display rate) and records a full audit trail in the new `pshownbp_order_rate` table — checkout
vs. real rate, NBP table/date, and gross/net totals converted to the default currency, ready for
invoicing. The amount the customer paid never changes.
* Checkout never makes a live call to NBP — the real rate is read from the already-cached
reference rate kept fresh by "Update now"/cron, so a slow or unavailable NBP cannot affect
checkout time.
* Both cron delivery options (URL link and real crontab) now hit the exact same token-protected
front controller — no separate standalone script to keep in sync.
* Extracted all remaining inline CSS/JS from admin templates into dedicated files.
* In-admin manual (PL/EN) and README updated to document the new feature.
## 1.1.0 - 2026-08-19
-----
* New "Rate visible to customers" column on the main "Currency rates" table: type your own rate
(e.g. "4.5" for EUR, meaning 1 EUR = 4.5 PLN) and it's converted live, in the browser, to the
PrestaShop `conversion_rate` that actually applies on the storefront.
* The "Current rate" column now also shows the reciprocal (1/rate) next to the raw PrestaShop
value, so it reads in both directions at a glance.
* The automatic NBP sync (button and cron) keeps tracking the real market rate as a reference
even for currencies with a manual rate set — it just stops overwriting the applied rate for
those, until the manual rate is cleared.
* Extracted the last remaining inline `` blocks (main page, in-admin manual) into
dedicated CSS files — no CSS/JS left inline in templates.
* Added a module sanity test suite (`ModuleTest`) matching the other PrestaShow modules.
## 1.0.0 - 2026-08-18
-----
* init module
* Fetch currency exchange rates directly from the official NBP (Narodowy Bank Polski) API,
replacing PrestaShop's default EUR-anchored external feed.
* Manual "Update now" button plus optional cron/HTTP automation with a secret-token link.
* Per-currency exclusion list; default shop currency is never touched (its rate always stays 1).
* Status table showing every shop currency's current rate and update state.
* PL/EN in-admin manual and translations.
Technical requirements
Technical Requirements
- PHP 7.1 - 8.x
- Server extension ionCube Loader
- PrestaShop Importer only: PHP libxml version > 2.9.3
- PrestaShop Facebook Integrator only: PHP 7.2 or higher
- PrestaShop VAT Validator only: PHP SOAP
Support = Updates + HelpDesk
You get 90 days (3 months) access to the complete PrestaShow support package.
Module updates
Modules will inform you about available updates. Read the changelog and perform a 1-click module update directly from your store.
HelpDesk panel
This is the panel where we will provide you with help. On HelpDesk you can report problems, order free module installation and updates, and order modifications and custom programming work.
Extend support
After support expires, you can use the module without any restrictions. You can extend your support access at any time you need it.
Knowledge Base & FAQ
Free forever
The knowledge base is available to everyone. You will find module documentation as well as instructions, videos and answers to frequently asked questions.
Lifetime license for the module
- You can use the module without limitation in 1 store = 1 domain.
- You can use an additional domain, e.g. for developer copy.
- For a small fee you can change the domain for the module yourself.
Additional domains for Multistore
- All our modules support PrestaShop Multistore.
- Supporting unlimited domains for PrestaShop Multistore requires purchasing multistore support for the module.
Modifying the code
- The module code related to the integration with the store and the design (.tpl, .css, .js) has open source code and you can modify it freely.
- The module's source code (.php) is encrypted with ionCube, and modifying it will void the warranty.
Demo
Demo - test the module
- This module does not have a demo store
No entries yet.










No customer reviews for the moment.