Troubleshooting
Common issues with FCHub Multi-Currency and how to resolve them. Covers price projection problems, exchange rate failures, switcher issues, checkout disclosure, and FluentCRM sync.
Prices Not Converting
Check that the master switch is on: FluentCart > Settings > Multi-Currency > General > Enabled. When disabled, no frontend output happens at all — no projection, no switcher, no disclosure.
The plugin needs at least one display currency to do anything useful. Go to the Currencies tab and add currencies. Your base currency should be in the list too if you want visitors to switch back to it.
If rates haven't been fetched yet, the plugin has nothing to convert with. Check the Exchange Rates tab — if the rates table is empty, click Refresh Now or wait for the cron job. If the refresh fails, check your API key and provider settings.
The price projection engine is JavaScript. If another plugin or theme throws a JS error before the projection script runs, it may never execute.
Debug steps:
- Open browser developer tools (F12)
- Check the Console tab for JavaScript errors
- Look for errors before
fchub-mc-projectionloads - Try disabling other plugins temporarily to isolate conflicts
The js_projection feature flag controls whether the projection script is enqueued. Check Diagnostics tab — if js_projection shows false, the script is disabled. This flag is stored in fchub_mc_feature_flags option and can be toggled via wp_options.
If you've switched to EUR but prices still show in USD, the context resolution may be failing. Check:
- Cookie blocked — some caching plugins strip cookies. Verify the
fchub_mc_currencycookie exists in your browser - Full page cache — if your host serves cached HTML, the projection script config may have the wrong currency. Exclude the
fchub_mc_currencycookie from cache key or use a cache-busting URL parameter - REST API blocked — the
POST /fchub-mc/v1/contextcall may be failing. Check the Network tab in dev tools for 403 or 404 responses
Exchange Rate Issues
The rate refresh depends on WordPress cron. If your site has low traffic, WP-Cron may not fire on time.
Fix: Set up a system cron:
*/10 * * * * curl -s https://yoursite.com/wp-cron.php > /dev/null 2>&1Also check that the cron event is scheduled: look for fchub_mc_refresh_rates in a cron inspector plugin like WP Crontrol.
The Refresh Now button calls POST /fchub-mc/v1/admin/rates/refresh. If it returns 500:
- API key invalid — check your rate provider API key in settings
- Provider down — the external API may be temporarily unavailable
- Lock contention — another refresh is already running (120-second lock). Wait and try again
- Empty rates — the provider returned no rates. Check your base currency is supported by the provider
A yellow admin notice appears when any rate exceeds the stale threshold. This means the cron job hasn't successfully refreshed rates recently.
Common causes:
- WP-Cron not running (see above)
- API key expired or rate-limited
- Provider returning errors
- The cron event was unscheduled (try deactivating and reactivating the plugin)
The ECB provider publishes EUR-based rates only. If your base currency is USD, the plugin cross-rates by dividing. This requires the bcmath PHP extension for precision.
Without bcmath, the plugin uses native PHP float division, which can introduce tiny rounding errors (e.g. 0.92139999 instead of 0.92140000). These are usually insignificant for display purposes, but if precision matters, install bcmath.
Also note: ECB rates update once daily around 16:00 CET. A 1-hour refresh interval won't get you fresher data.
Currency Switcher Issues
- Block or shortcode placed? — make sure the Currency Switcher block or
[fchub_currency_switcher]shortcode is in content that actually renders on the current page - Plugin disabled? — the block and shortcode both return empty when the plugin is off
- No display currencies? — the block and shortcode both return empty when no currencies are configured
- Theme conflict — check if another element is overlapping the switcher (z-index issue). The dropdown uses
z-index: 9999
The dropdown is controlled by JavaScript. If the script fails to initialise:
- Check browser console for JS errors
- Look for the
data-fchub-mc-enhancedattribute on the switcher element — if it's missing, the init script didn't run - Try calling
window.fchubMcInitSwitchers()from the console to manually trigger initialisation
After selecting a currency, the page reloads but the old currency appears.
- Cookie blocked — check that the
fchub_mc_currencycookie is being set. Some privacy plugins or browser settings may block it - REST API error — the
POST /contextcall may be failing. Check the Network tab - Cache serving stale HTML — full page cache may serve the old page. Clear cache or exclude the cookie
- Nonce expired — if the page was open for a long time, the WP REST nonce may have expired. Reload the page and try again
The fallback form submits without JavaScript, but it still needs some persistence path.
- Cookies disabled for guests — if guest cookies are disabled in plugin settings, a guest visitor has nowhere to store the preference after the request completes
- Form blocked by aggressive HTML filtering — some builders or security plugins strip
<noscript>or form markup - Nonce caching issue — if your cache serves stale HTML for too long, the fallback nonce can go stale too. Purge cache and reload
The badge uses WordPress's human_time_diff() with the site's configured timezone. If the time seems off:
- Check your WordPress timezone: Settings > General > Timezone
- The
fetched_atcolumn stores timestamps in WordPress site timezone. If your site timezone changed after rates were fetched, the diff may look wrong
Checkout Disclosure Issues
The disclosure only appears when the display currency differs from the base currency. If you're viewing prices in the base currency, there's nothing to disclose.
Also check:
- Setting enabled —
checkout_disclosure_enabledmust beyes - JavaScript running — the disclosure is injected via the projection script. JS errors may prevent it
- FluentCart checkout element present — the script looks for
.fct_summary_boxto inject after
If you've set custom text in settings but still see the generic fallback:
- Verify the text is saved — check the Checkout tab
- The custom text is passed to JavaScript via
fchubMcConfig.disclosureText. Check if this value is populated in the page source - The fallback triggers when
disclosureTextis empty or null
FluentCRM Sync Issues
- FluentCRM active? — the sync only fires when
defined('FLUENTCRM')is true - Sync enabled? — check
fluentcrm_enabledandfluentcrm_auto_create_tagsin settings - Guest user — tag sync only fires for logged-in users. Guests have no FluentCRM contact
- Contact exists? — the plugin looks up the contact by WordPress user ID. If no FluentCRM contact exists for the user, sync is skipped
The custom field keys must exist as FluentCRM custom fields. If the field key doesn't match a configured custom field in FluentCRM, the syncCustomFieldValues() call silently does nothing.
Fix: Go to FluentCRM > Contacts > Custom Fields and create text fields with the exact key names from your settings (default: preferred_currency, last_order_display_currency, last_order_fx_rate).
Performance Issues
The plugin's frontend impact is minimal — two small JS files and one CSS file. If you notice slowness:
- Rate cache miss — without persistent object cache (Redis/Memcached), every page load queries the database for rates. Install a persistent cache for sub-millisecond lookups
- MutationObserver thrashing — if your page has extremely frequent DOM mutations, the 50ms debounce may still cause excessive projection runs. This is very rare in practice
The cron job prunes rows older than 90 days. If the table is still large, you have many currency pairs being tracked.
For example: 10 display currencies × 1 base = 10 pairs. At 4 refreshes per day over 90 days = 3,600 rows. At 30 currencies, that's 10,800 rows — still very manageable.
If you're concerned, you can manually prune:
DELETE FROM wp_fchub_mc_rate_history WHERE fetched_at < DATE_SUB(NOW(), INTERVAL 30 DAY);Debug Tips
Diagnostics Tab
Your first stop for any issue: FluentCart > Settings > Multi-Currency > Diagnostics. It shows plugin version, PHP version, bcmath availability, FluentCart/FluentCRM status, rate count, stale currencies, and feature flags.
General debugging steps:
- Check Diagnostics tab — most status information is there
- Check browser console — JS errors, failed REST calls, cookie issues
- Check browser Network tab — look for failing
/fchub-mc/v1/requests - Verify cron is running — install WP Crontrol and check for
fchub_mc_refresh_rates - Enable WP_DEBUG_LOG — the plugin logs errors to WordPress's debug log via its internal logger
- Check
wp_options— look atfchub_mc_settings,fchub_mc_feature_flags, andfchub_mc_db_version
If you need to report an issue, include:
- Diagnostics tab output
- Browser console errors
- WordPress and PHP versions
- Whether you're using a persistent object cache