{"id":313938,"date":"2026-06-01T11:17:48","date_gmt":"2026-06-01T11:17:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fungies-for-woocommerce\/"},"modified":"2026-06-01T11:17:30","modified_gmt":"2026-06-01T11:17:30","slug":"fungies-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/sr.wordpress.org\/plugins\/fungies-for-woocommerce\/","author":21132877,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.4.4","stable_tag":"2.4.4","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Fungies for WooCommerce","header_author":"Fungies","header_description":"Connect your WooCommerce store to Fungies.io \u2014 sync products, use Fungies checkout, and keep orders in sync.","assets_banners_color":"","last_updated":"2026-06-01 11:17:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/dukenukemall\/fungies-wp-plugin","header_author_uri":"https:\/\/fungies.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":42,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.4.4":{"tag":"2.4.4","author":"fungies","date":"2026-06-01 11:17:30"}},"upgrade_notice":{"2.4.4":"<p>Fixes the customer email prefill on the Fungies hosted checkout page (was sending the wrong query parameter name). Recommended update.<\/p>","2.4.3":"<p>Plugin Check follow-up: fixes the scope of three slow-query phpcs:ignore annotations from 2.4.2 (single-line ignores didn&#039;t reach the array-key tokens). No runtime changes.<\/p>","2.4.2":"<p>WordPress.org Plugin Check pass: prepared SQL, translator comments, ordered placeholders, and justified phpcs:ignore annotations on direct DB reads. No runtime changes.<\/p>","2.4.1":"<p>WP.org compliance: declares WooCommerce as a <code>Requires Plugins<\/code> dependency and renames the text domain to match the plugin slug. Recommended.<\/p>","2.4.0":"<p>Security hardening (URL validation, image SSRF allowlist), opt-in debug logging, i18n fixes, and cleaner front-end JS. Recommended update.<\/p>","2.3.1":"<p>Coupons are now pushed to Fungies the moment they are saved in WooCommerce, instead of waiting for the hourly cron or a manual sync. Recommended update.<\/p>","2.3.0":"<p>WooCommerce coupon codes applied at checkout are now forwarded to the Fungies hosted checkout, so totals stay in sync after discount.<\/p>","2.2.0":"<p>Adds WooCommerce \u2192 Fungies coupon sync. Run &quot;Sync Now&quot; once after updating to push your existing coupons.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3556654,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3556654,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.4.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3556648,"resolution":"1","location":"assets","locale":"","width":1357,"height":1114},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3556648,"resolution":"2","location":"assets","locale":"","width":1796,"height":1257},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3556648,"resolution":"3","location":"assets","locale":"","width":1659,"height":1259},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3556648,"resolution":"4","location":"assets","locale":"","width":1624,"height":1269},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3556648,"resolution":"5","location":"assets","locale":"","width":1764,"height":1201},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3556648,"resolution":"6","location":"assets","locale":"","width":1758,"height":1198},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3556648,"resolution":"7","location":"assets","locale":"","width":1548,"height":1084}},"screenshots":{"1":"Fungies appearing as a payment option in the WooCommerce Payments settings.","2":"Customer-facing Fungies checkout step launched from WooCommerce.","3":"Fungies checkout completing the purchase with Merchant-of-Record handling.","4":"Fungies for WooCommerce settings tab inside WooCommerce admin.","5":"Fungies dashboard showing products and orders synced from WooCommerce.","6":"Synced products list inside the Fungies dashboard.","7":"WooCommerce order detail view linked to its Fungies order and payment."}},"plugin_section":[262246],"plugin_tags":[3148,5472,1887,286],"plugin_category":[45],"plugin_contributors":[265322],"plugin_business_model":[],"class_list":["post-313938","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-checkout","plugin_tags-digital-products","plugin_tags-payments","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-fungies","plugin_committers-fungies"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/icon-128x128.png?rev=3556654","icon_2x":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/icon-256x256.png?rev=3556654","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/screenshot-1.png?rev=3556648","caption":"Fungies appearing as a payment option in the WooCommerce Payments settings."},{"src":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/screenshot-2.png?rev=3556648","caption":"Customer-facing Fungies checkout step launched from WooCommerce."},{"src":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/screenshot-3.png?rev=3556648","caption":"Fungies checkout completing the purchase with Merchant-of-Record handling."},{"src":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/screenshot-4.png?rev=3556648","caption":"Fungies for WooCommerce settings tab inside WooCommerce admin."},{"src":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/screenshot-5.png?rev=3556648","caption":"Fungies dashboard showing products and orders synced from WooCommerce."},{"src":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/screenshot-6.png?rev=3556648","caption":"Synced products list inside the Fungies dashboard."},{"src":"https:\/\/ps.w.org\/fungies-for-woocommerce\/assets\/screenshot-7.png?rev=3556648","caption":"WooCommerce order detail view linked to its Fungies order and payment."}],"raw_content":"<!--section=description-->\n<p><strong>Fungies for WooCommerce<\/strong> lets you sell digital products through your WooCommerce store while <a href=\"https:\/\/fungies.io\">Fungies.io<\/a> handles payments, taxes, and compliance as your <strong>Merchant of Record<\/strong>.<\/p>\n\n<p>You keep full control of your storefront. Fungies takes care of the hard parts \u2014 payment processing, tax collection, invoicing, and regulatory compliance \u2014 so you can focus on your products.<\/p>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li><strong>Connect<\/strong> \u2014 Paste your Fungies API keys in WooCommerce \u2192 Settings \u2192 Fungies<\/li>\n<li><strong>Sync<\/strong> \u2014 Your Fungies products are automatically imported into WooCommerce<\/li>\n<li><strong>Sell<\/strong> \u2014 Customers browse your store and check out via Fungies hosted checkout<\/li>\n<li><strong>Get Paid<\/strong> \u2014 Fungies processes the payment and sends a webhook to complete the WooCommerce order<\/li>\n<li><strong>Stay in Sync<\/strong> \u2014 Orders, refunds, and subscriptions are kept up to date automatically<\/li>\n<\/ol>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Two-Way Product Sync<\/strong> \u2014 Pull OneTimePayment products from Fungies into WooCommerce AND push WooCommerce products to Fungies as OneTimePayment offers (name, description, price, featured image)<\/li>\n<li><strong>Auto-Sync on Product Save<\/strong> \u2014 Editing a WooCommerce product automatically updates the matching offer in Fungies<\/li>\n<li><strong>Currency Validation<\/strong> \u2014 Detects your Fungies workspace currency and warns if it differs from your WooCommerce store currency<\/li>\n<li><strong>Multi-Item Hosted Checkout<\/strong> \u2014 Carts with multiple products create a Fungies Checkout Element so all line items appear on the hosted checkout page<\/li>\n<li><strong>Detailed Sync Panel<\/strong> \u2014 Clear summary under \"Sync Now\" showing pull\/push counts and per-product errors<\/li>\n<li><strong>Duplicate Protection<\/strong> \u2014 Products pushed from WooCommerce to Fungies will not be re-imported as duplicates on the next pull<\/li>\n<li><strong>Hosted Checkout<\/strong> \u2014 Customers are redirected to a secure Fungies checkout page to complete payment, then returned to your WooCommerce thank-you page<\/li>\n<li><strong>Real-Time Order Sync<\/strong> \u2014 Webhooks keep WooCommerce orders in sync with Fungies payments, including completions, failures, and refunds<\/li>\n<li><strong>Subscription Support<\/strong> \u2014 Handles subscription creation, renewal, and cancellation events from Fungies<\/li>\n<li><strong>Sandbox \/ Staging Mode<\/strong> \u2014 Test the full flow with staging API keys and Stripe test cards before going live<\/li>\n<li><strong>Secure Webhooks<\/strong> \u2014 All incoming webhooks are verified with HMAC-SHA256 signatures and protected against duplicate processing<\/li>\n<li><strong>WooCommerce Blocks Compatible<\/strong> \u2014 Works with both the classic checkout and the new WooCommerce block-based checkout<\/li>\n<li><strong>HPOS Compatible<\/strong> \u2014 Fully compatible with WooCommerce High-Performance Order Storage (custom order tables)<\/li>\n<li><strong>Opt-In Debug Logging<\/strong> \u2014 Toggle verbose request\/response logging in WooCommerce \u2192 Status \u2192 Logs (source: <code>fungies<\/code>). Errors and warnings are always logged; verbose dumps are off by default to keep log files small and avoid storing third-party API payloads unless you're troubleshooting.<\/li>\n<li><strong>Dashboard Widget<\/strong> \u2014 See your sync status at a glance from the WordPress dashboard<\/li>\n<\/ul>\n\n<h4>Why Fungies?<\/h4>\n\n<p>Fungies acts as your Merchant of Record, which means:<\/p>\n\n<ul>\n<li><strong>No payment gateway setup<\/strong> \u2014 Fungies handles Stripe, PayPal, and more<\/li>\n<li><strong>Automatic tax collection<\/strong> \u2014 Sales tax, VAT, and GST handled globally<\/li>\n<li><strong>Invoicing &amp; compliance<\/strong> \u2014 Professional invoices generated for every transaction<\/li>\n<li><strong>Fraud protection<\/strong> \u2014 Built-in fraud detection and chargeback handling<\/li>\n<\/ul>\n\n<h4>Use Cases<\/h4>\n\n<ul>\n<li>Sell software, ebooks, courses, or any digital product<\/li>\n<li>Add a WooCommerce storefront to your existing Fungies catalog<\/li>\n<li>Let Fungies handle payments and taxes while you manage the shopping experience<\/li>\n<\/ul>\n\n<h4>Third-Party Service: Fungies.io<\/h4>\n\n<p>This plugin connects your WooCommerce store to the <strong>Fungies.io<\/strong> platform, an external third-party service operated by Fungies Inc.<\/p>\n\n<p><strong>What data is sent to Fungies:<\/strong><\/p>\n\n<ul>\n<li>During <strong>product sync<\/strong>, the plugin sends your API keys to the Fungies API to retrieve your product catalog.<\/li>\n<li>During <strong>checkout<\/strong>, customers are redirected to the Fungies hosted checkout page. Their email address and country code are passed as URL parameters.<\/li>\n<li>During <strong>webhook processing<\/strong>, Fungies sends order and payment data (order ID, payment status, amounts, subscription details) to your WordPress site.<\/li>\n<\/ul>\n\n<p><strong>Service endpoints used:<\/strong><\/p>\n\n<ul>\n<li>Production API: <code>https:\/\/api.fungies.io\/v0<\/code><\/li>\n<li>Staging API: <code>https:\/\/api.stage.fungies.net\/v0<\/code><\/li>\n<li>Hosted checkout: <code>https:\/\/{your-store}.app.fungies.io<\/code><\/li>\n<\/ul>\n\n<p><strong>A Fungies account is required<\/strong> to use this plugin. You can sign up at <a href=\"https:\/\/fungies.io\">fungies.io<\/a>.<\/p>\n\n<p><strong>Legal documents:<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/help.fungies.io\/legal\/general-terms-of-use\">General Terms of Use<\/a><\/li>\n<li><a href=\"https:\/\/help.fungies.io\/legal\/saas-terms-of-use\">SaaS Terms of Use<\/a><\/li>\n<li><a href=\"https:\/\/help.fungies.io\/legal\/privacy-policy\">Privacy Policy<\/a><\/li>\n<li><a href=\"https:\/\/help.fungies.io\/legal\/cookies-and-tracking\">Cookies and Tracking<\/a><\/li>\n<\/ul>\n\n<h3>Product Sync<\/h3>\n\n<p>Every sync runs two phases on the same triggers:<\/p>\n\n<ul>\n<li><strong>Pull (Fungies to WooCommerce)<\/strong> \u2014 <code>GET \/v0\/offers\/list<\/code>, then for each offer create or update a matching WooCommerce product (name, description, image, price, currency).<\/li>\n<li><strong>Push (WooCommerce to Fungies)<\/strong> \u2014 for each published WooCommerce product, build a OneTimePayment product and offer body, then either <code>PATCH<\/code> an existing one or <code>POST<\/code> a new one.<\/li>\n<\/ul>\n\n<h4>Triggers<\/h4>\n\n<ul>\n<li><strong>Sync Now button<\/strong> in WooCommerce \u2192 Settings \u2192 Fungies<\/li>\n<li><strong>WP-Cron<\/strong>, hourly<\/li>\n<li><strong><code>woocommerce_update_product<\/code> \/ <code>woocommerce_new_product<\/code><\/strong> hooks (push only, debounced 5 seconds)<\/li>\n<\/ul>\n\n<h4>Loop and duplicate prevention<\/h4>\n\n<ul>\n<li><code>_fungies_offer_id<\/code> on a WooCommerce product marks it as Fungies-originated \u2192 skipped during push.<\/li>\n<li><code>_fungies_pushed_offer_id<\/code> on a WooCommerce product marks it as already-pushed \u2192 skipped during pull.<\/li>\n<li>A runtime <code>is_pulling<\/code> flag prevents WooCommerce update hooks from firing while the pull writes to the database.<\/li>\n<li>A 5-second per-product transient lock debounces rapid-fire saves.<\/li>\n<li>If a <code>PATCH<\/code> returns 404 \"Product not found\" (e.g. after switching from staging to production keys), stale IDs are cleared and the product is recreated in the current workspace.<\/li>\n<\/ul>\n\n<h4>Currency handling<\/h4>\n\n<p>The plugin auto-detects the Fungies workspace currency. If your WooCommerce currency does not match, the push phase errors out with a clear message \u2014 products are never pushed at the wrong currency.<\/p>\n\n<h4>Meta keys reference<\/h4>\n\n<ul>\n<li><code>_fungies_offer_id<\/code> \u2014 Fungies offer ID this WooCommerce product mirrors (set on pull).<\/li>\n<li><code>_fungies_currency<\/code> \u2014 currency the offer was priced in (set on pull).<\/li>\n<li><code>_fungies_checkout_url<\/code> \u2014 pre-built single-offer hosted checkout URL (set on pull).<\/li>\n<li><code>_fungies_pushed_product_id<\/code> \u2014 Fungies product ID for a WC-originated product (set on push).<\/li>\n<li><code>_fungies_pushed_offer_id<\/code> \u2014 Fungies offer ID for a WC-originated product (set on push).<\/li>\n<li><code>_fungies_pushed_at<\/code> \u2014 timestamp of last successful push.<\/li>\n<\/ul>\n\n<h3>Checkout URL Generation<\/h3>\n\n<p>When a customer clicks <strong>Place Order<\/strong>, the plugin produces a different Fungies hosted checkout URL depending on how many distinct offers are in the cart.<\/p>\n\n<h4>Step 1 \u2014 Collect offer IDs<\/h4>\n\n<p>For each cart line item, the builder resolves a Fungies offer ID by checking, in order:<\/p>\n\n<ol>\n<li><code>_fungies_offer_id<\/code> (product was pulled <strong>from<\/strong> Fungies).<\/li>\n<li><code>_fungies_pushed_offer_id<\/code> (product was pushed <strong>to<\/strong> Fungies from WooCommerce).<\/li>\n<\/ol>\n\n<p>Each unit (quantity) becomes one entry in the resulting offer-IDs array. Items without either meta key are logged and skipped.<\/p>\n\n<h4>Step 2 \u2014 Build the URL<\/h4>\n\n<p><strong>Single offer<\/strong> (1 distinct offer ID, quantity 1) \u2014 no API call is needed. The plugin redirects directly to:<\/p>\n\n<pre><code>&lt;store_url&gt;\/checkout\/&lt;offer_id&gt;?fngs-customer-email=...&amp;fngs-customer-country=...\n<\/code><\/pre>\n\n<p><strong>Multiple offers<\/strong> (2 or more, or quantity &gt; 1) \u2014 the plugin calls <code>POST \/v0\/elements\/checkout\/create<\/code> with all collected offer IDs, then redirects to:<\/p>\n\n<pre><code>&lt;store_url&gt;\/checkout-element\/&lt;element_id&gt;?fngs-customer-email=...&amp;fngs-customer-country=...\n<\/code><\/pre>\n\n<p>The element ID is also stored on the WooCommerce order as <code>_fungies_checkout_element_id<\/code> for traceability. When the customer lands on the hosted checkout, Fungies promotes the element into a checkout session and the URL becomes <code>\u2026\/checkout-element\/&lt;element_id&gt;\/checkout\/&lt;session_id&gt;<\/code> \u2014 every cart product is visible in the order summary.<\/p>\n\n<h4>Why two URL shapes?<\/h4>\n\n<p>The single-offer URL is stateless \u2014 no API call, no rate-limit cost, no extra latency. The multi-offer flow has to use the Checkout Element endpoint because Fungies' single-offer URL only carries one offer ID. Before v2.1.6, multi-item carts would silently lose every line item except the first.<\/p>\n\n<!--section=installation-->\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Go to <strong>WordPress Admin \u2192 Plugins \u2192 Add New<\/strong><\/li>\n<li>Search for <strong>\"Fungies for WooCommerce\"<\/strong><\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong><\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Download the plugin <code>.zip<\/code> file<\/li>\n<li>Go to <strong>WordPress Admin \u2192 Plugins \u2192 Add New \u2192 Upload Plugin<\/strong><\/li>\n<li>Upload the zip file and click <strong>Install Now<\/strong><\/li>\n<li>Click <strong>Activate<\/strong><\/li>\n<\/ol>\n\n<h4>Setup<\/h4>\n\n<p>After activation:<\/p>\n\n<ol>\n<li>Go to <strong>WooCommerce \u2192 Settings \u2192 Fungies<\/strong><\/li>\n<li>Enter your Fungies API keys (Public Key, Secret Key, Webhook Secret)<\/li>\n<li>Enter your published Fungies Store URL<\/li>\n<li>Configure the webhook endpoint in your <a href=\"https:\/\/app.fungies.io\">Fungies Dashboard<\/a> \u2192 Developers \u2192 Webhooks<\/li>\n<li>Configure the post-purchase redirect URL in Fungies Dashboard \u2192 Settings \u2192 Store \u2192 Checkout tab<\/li>\n<li>Click <strong>Sync Now<\/strong> to import your products<\/li>\n<\/ol>\n\n<p>For detailed setup instructions, see the <a href=\"https:\/\/help.fungies.io\">full documentation<\/a>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20fungies%20store%20need%20to%20be%20published%3F\"><h3>Does the Fungies store need to be published?<\/h3><\/dt>\n<dd><p>Yes. The hosted checkout URL only works when your Fungies store is published. Go to the Fungies Dashboard and make sure your store is not in draft mode.<\/p><\/dd>\n<dt id=\"which%20fungies%20products%20are%20synced%3F\"><h3>Which Fungies products are synced?<\/h3><\/dt>\n<dd><p>Only <strong>OneTimePayment<\/strong> products and their offers are synced into WooCommerce. Other product types (Digital Downloads, Subscriptions, Game Keys, etc.) are not imported. Product names and descriptions from Fungies are used for the WooCommerce product listings.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20alongside%20other%20woocommerce%20payment%20gateways%3F\"><h3>Can I use this alongside other WooCommerce payment gateways?<\/h3><\/dt>\n<dd><p>Yes. Fungies registers as a standard WooCommerce payment gateway. Customers can choose it at checkout alongside any other enabled gateways.<\/p><\/dd>\n<dt id=\"how%20often%20do%20products%20sync%20automatically%3F\"><h3>How often do products sync automatically?<\/h3><\/dt>\n<dd><p>Every hour via WordPress Cron. You can also trigger a manual sync anytime from the Fungies settings page.<\/p><\/dd>\n<dt id=\"how%20do%20i%20test%20without%20processing%20real%20payments%3F\"><h3>How do I test without processing real payments?<\/h3><\/dt>\n<dd><p>Enable <strong>Sandbox Mode<\/strong> in the plugin settings, use staging keys from <a href=\"https:\/\/app.stage.fungies.net\">app.stage.fungies.net<\/a>, and pay with <a href=\"https:\/\/docs.stripe.com\/testing?testing-method=card-numbers\">Stripe test cards<\/a>.<\/p><\/dd>\n<dt id=\"why%20don%27t%20customers%20get%20redirected%20back%20after%20payment%3F\"><h3>Why don't customers get redirected back after payment?<\/h3><\/dt>\n<dd><p>You need to configure the <strong>Instant Redirect URL<\/strong> in Fungies Dashboard \u2192 Settings \u2192 Store \u2192 Checkout tab. Use the Post-Purchase Redirect URL shown on the plugin settings page and add the Order ID and User Email URL parameters.<\/p><\/dd>\n<dt id=\"do%20i%20need%20separate%20api%20keys%20for%20sandbox%20and%20production%3F\"><h3>Do I need separate API keys for sandbox and production?<\/h3><\/dt>\n<dd><p>Yes. Production and staging environments in Fungies are completely separate. API keys, products, and webhooks are independent \u2014 staging keys will not work against the production API, and vice versa.<\/p><\/dd>\n<dt id=\"what%20webhook%20events%20should%20i%20enable%3F\"><h3>What webhook events should I enable?<\/h3><\/dt>\n<dd><p>Enable these events in your Fungies webhook configuration: <code>payment_success<\/code>, <code>payment_failed<\/code>, <code>payment_refunded<\/code>, <code>subscription_created<\/code>, <code>subscription_interval<\/code>, and <code>subscription_cancelled<\/code>.<\/p><\/dd>\n<dt id=\"what%20order%20metadata%20is%20stored%3F\"><h3>What order metadata is stored?<\/h3><\/dt>\n<dd><p>When a payment succeeds, the plugin stores the Fungies order ID, order number, payment ID, payment type, subscription ID (if applicable), invoice URL, processing fee, and tax amount on the WooCommerce order.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20blocks%20checkout%3F\"><h3>Does it work with WooCommerce Blocks checkout?<\/h3><\/dt>\n<dd><p>Yes. The plugin is fully compatible with both the classic WooCommerce checkout and the new block-based cart and checkout experience.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.4.4<\/h4>\n\n<ul>\n<li>Fix: Customer email was not pre-filled on the Fungies hosted checkout page when redirecting from WooCommerce. Root cause: <code>Fungies_Checkout_URL_Builder::build()<\/code> was sending <code>fngs-user-email<\/code> as the prefill query parameter, but per the official Fungies docs the prefill parameter is <code>fngs-customer-email<\/code>. <code>fngs-user-email<\/code> is the <em>outbound<\/em> system parameter Fungies appends to the post-purchase Instant Redirect URL \u2014 not the inbound prefill param. Mixing the two meant the WC billing email was passed but ignored by Fungies, so customers had to retype their email at checkout. The plugin now sends <code>fngs-customer-email<\/code> for prefill while still reading <code>fngs-user-email<\/code> from the return URL (where Fungies appends it) \u2014 both names are now used in their correct directions. No data migration needed; existing orders are unaffected.<\/li>\n<li>Docs: Corrected the URL examples in the readme to match.<\/li>\n<\/ul>\n\n<h4>2.4.3<\/h4>\n\n<ul>\n<li>Lint: Replaced the three <code>phpcs:ignore<\/code> annotations added in 2.4.2 with proper <code>phpcs:disable<\/code> \/ <code>phpcs:enable<\/code> blocks. The slow-query sniff fires on the <code>'meta_key'<\/code> \/ <code>'meta_value'<\/code> \/ <code>'meta_query'<\/code> array-key string tokens <em>inside<\/em> the <code>wc_get_orders()<\/code> \/ <code>get_posts()<\/code> literal, not on the outer call line, so the single-line <code>ignore<\/code> form never reached them. Affects <code>Fungies_Order_Sync::find_order_by_meta()<\/code>, <code>Fungies_Return_Resolver::by_meta()<\/code>, and <code>Fungies_Product_Sync::push_to_fungies()<\/code>.<\/li>\n<li>No runtime behaviour changes.<\/li>\n<\/ul>\n\n<h4>2.4.2<\/h4>\n\n<ul>\n<li>Security\/correctness: Replaced two SQL queries in <code>Fungies_Workspace_Meta::get_all_pushed_offer_ids()<\/code> and <code>Fungies_Product_Sync::cleanup_pushed_duplicates()<\/code> that interpolated class constants directly into the SQL string with fully prepared statements using <code>$wpdb-&gt;prepare()<\/code> + <code>$wpdb-&gt;esc_like()<\/code>. Behaviour is unchanged \u2014 values were already trusted constants, but the new form is what WordPress.org Plugin Check requires and what static analyzers can verify.<\/li>\n<li>i18n: Added the missing <code>\/* translators: ... *\/<\/code> comments above every gettext call that uses placeholders so translators see what each <code>%s<\/code> \/ <code>%d<\/code> refers to. Reworked <code>'Connected to %s API! (%s)'<\/code> into ordered placeholders <code>'Connected to %1$s API! (%2$s)'<\/code> per WP i18n guidelines.<\/li>\n<li>Lint: Added narrow <code>phpcs:ignore<\/code> annotations with inline rationale on the handful of justified direct-DB \/ slow-query \/ nonce-check warnings (e.g. the <code>wc-api=fungies_return<\/code> redirect handler reads <code>$_GET<\/code> for read-only redirect logic and is paired with an HMAC-verified webhook; the direct postmeta lookups are single-row indexed reads). No new ignores were added blindly.<\/li>\n<li>No runtime behaviour changes.<\/li>\n<\/ul>\n\n<h4>2.4.1<\/h4>\n\n<ul>\n<li>Compliance: Added the <code>Requires Plugins: woocommerce<\/code> header introduced in WordPress 6.5. WordPress now refuses to activate the plugin unless WooCommerce is installed and active, and the WooCommerce dependency is shown in the Plugins screen.<\/li>\n<li>i18n: Renamed the plugin text domain from <code>fungies-wp<\/code> to <code>fungies-for-woocommerce<\/code> (matching the plugin slug) across all 97 gettext calls and the plugin header. Required for the WordPress.org translation platform to pick up strings for community translation. Any custom <code>.po<\/code> \/ <code>.mo<\/code> files keyed off the old <code>fungies-wp<\/code> domain must be re-generated.<\/li>\n<li>No runtime behaviour changes.<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Security: Hardened the Fungies Store URL setting \u2014 the field is now an <code>&lt;input type=\"url\"&gt;<\/code> and saves through <code>esc_url_raw<\/code>, plus the runtime read site re-validates with <code>esc_url_raw<\/code> + <code>wp_http_validate_url<\/code> and rejects anything other than <code>http<\/code>\/<code>https<\/code> schemes before building a customer redirect.<\/li>\n<li>Security: Added an HTTPS host allowlist (<code>fungies.io<\/code>, <code>fungies.net<\/code>) before sideloading product images via <code>media_sideload_image<\/code>, mitigating SSRF risk from third-party image URLs. Extensible via the <code>fungies_image_host_allowlist<\/code> filter.<\/li>\n<li>Privacy: Verbose API request\/response logging is now opt-in via a new <strong>WooCommerce \u2192 Settings \u2192 Fungies \u2192 Debug Logging<\/strong> checkbox. Errors and warnings are still logged unconditionally so genuine failures remain diagnosable; verbose dumps are off by default to keep log files small and avoid storing third-party API payloads unless troubleshooting.<\/li>\n<li>i18n: Wrapped two previously-untranslated admin AJAX error strings in <code>__()<\/code> with translator comments and numbered placeholders.<\/li>\n<li>Cleanup: Removed <code>console.log<\/code> \/ <code>console.error<\/code> calls from the front-end Blocks checkout JS so the customer's browser console stays clean.<\/li>\n<li>Docs: Inline rationale comment added above the webhook REST route's <code>permission_callback =&gt; '__return_true'<\/code> explaining the HMAC-SHA256 signature verification, timing-safe comparison, and idempotency replay protection that act as the real auth.<\/li>\n<li>Docs: Older changelog entries (2.1.x, 2.0.x, 1.x) moved to <code>changelog.txt<\/code> per WP.org guidelines, keeping the readme focused on the current and previous major.<\/li>\n<li>Build: <code>.gitattributes<\/code> now <code>export-ignore<\/code>s <code>README.md<\/code>, <code>build.ps1<\/code>, and <code>fungies-*.zip<\/code> so the shipped plugin zip contains only runtime files.<\/li>\n<li>Readme: Removed obsolete <code>Donate link<\/code> and the <code>Screenshots<\/code> section (no screenshot assets shipped).<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Feature: Coupons are now pushed to Fungies <strong>the moment they are saved<\/strong> in WooCommerce, mirroring how products already work. Hook <code>save_post_shop_coupon<\/code> runs <code>Fungies_Coupon_Sync::on_coupon_saved<\/code>, which creates or updates the corresponding Fungies discount immediately \u2014 no need to wait for the hourly cron or click \"Sync Now\". Skipped silently for autosaves and revisions, debounced via a 5-second transient lock per coupon.<\/li>\n<li>Feature: Deleting a coupon (<code>before_delete_post<\/code>) now clears its workspace-scoped <code>_fungies_pushed_discount_id__&lt;hash&gt;<\/code> post meta, so re-creating a coupon with the same code creates a fresh Fungies discount instead of trying to update a stale ID.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Feature: WooCommerce coupon codes applied at checkout are now forwarded to the Fungies hosted checkout via the <code>fngs-discount-code<\/code> query parameter, so the Fungies-side total automatically matches the WooCommerce-side total after discount. The first coupon code on the order is forwarded as-is \u2014 it is expected to match a Fungies discount code already synced via \"Sync Now\". No action needed on the Fungies dashboard side as long as the coupon was synced.<\/li>\n<\/ul>\n\n<h4>2.2.3<\/h4>\n\n<ul>\n<li>Fix: <code>PATCH \/v0\/discounts\/:id\/update<\/code> rejected every coupon update with <code>id: Required<\/code> because the Fungies update schema demands <code>id<\/code> in the request body in addition to the URL path. The API client now injects the discount UUID into the body automatically.<\/li>\n<li>Fix: Coupon diff now correctly normalizes server-side amount storage. Fungies stores fixed-amount discounts in currency minor units (e.g. <code>1<\/code> USD becomes <code>\"100\"<\/code> in responses), so the previous diff always reported \"different\" and triggered an update on every sync. The mapper now multiplies fixed amounts by <code>wc_get_price_decimals()<\/code> before comparing, and converts <code>validUntil<\/code> from milliseconds to seconds before comparing.<\/li>\n<\/ul>\n\n<h4>2.2.2<\/h4>\n\n<ul>\n<li>Fix: Coupon sync no longer aborts when the Fungies <code>GET \/v0\/discounts\/list<\/code> endpoint returns 500 because of pre-existing rows with negative <code>validFrom<\/code> Dates (a known server-side timezone bug). The plugin now falls back to a row-by-row walk that skips broken pages, and primarily relies on the local <code>_fungies_pushed_discount_id<\/code> post meta to decide between create and update.<\/li>\n<li>Fix: If an UPDATE call returns \"not found\" (e.g., the Fungies discount was archived\/deleted manually), the plugin now clears the stale local mapping and creates a fresh discount instead of erroring.<\/li>\n<li>Note for existing installs: any duplicate <code>percent10<\/code> \/ <code>fixed1<\/code> rows already in your Fungies workspace from a v2.2.0 install must be archived manually in the Fungies dashboard \u2014 the plugin can no longer see them through the broken LIST page.<\/li>\n<\/ul>\n\n<h4>2.2.1<\/h4>\n\n<ul>\n<li>Fix: Fungies API rejects <code>validFrom: 0<\/code> with \"Number must be greater than or equal to 0\" even though the spec lists 0 as valid. The coupon now sends the WooCommerce coupon's actual <code>date_created<\/code> timestamp (or current time as fallback) for <code>validFrom<\/code>, which is also more semantically correct.<\/li>\n<li>Fix: <code>purchaseLimit<\/code> was always sent \u2014 its create-schema enum forbids <code>null<\/code>, so coupons without a usage limit failed validation. The field is now only included when the WooCommerce coupon has a usage limit set.<\/li>\n<li>Fix: When <code>GET \/v0\/discounts\/list<\/code> fails on the first page, the coupon sync now returns the API error instead of silently treating the remote index as empty (which could create duplicates on a transient outage).<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Feature: WooCommerce coupons are now synced to Fungies on every \"Sync Now\" run. Each coupon (<code>percent<\/code>, <code>fixed_cart<\/code>, <code>fixed_product<\/code>) is created or updated as a Fungies discount with the same code, amount, amount type, expiration date, and usage limit. The Sync panel reports a third \"Coupons \u2192 Fungies\" line with created \/ updated \/ error counts. Mapping is workspace-scoped (sandbox vs production) so toggling Sandbox Mode does not orphan the link, and re-running Sync skips coupons that are already in sync.<\/li>\n<\/ul>\n\n<p>For changelog entries from earlier releases (2.1.x, 2.0.x, 1.x), see <code>changelog.txt<\/code> in the plugin root.<\/p>","raw_excerpt":"Connect your WooCommerce store to Fungies.io \u2014 sync products, accept payments through Fungies hosted checkout, and keep orders perfectly in sync.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/313938","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=313938"}],"author":[{"embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/fungies"}],"wp:attachment":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=313938"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=313938"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=313938"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=313938"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=313938"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=313938"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}