{"id":396028,"date":"2026-11-13T20:27:22","date_gmt":"2026-11-13T20:27:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/cloudffl-finder-for-woocommerce\/"},"modified":"2026-11-13T20:27:13","modified_gmt":"2026-11-13T20:27:13","slug":"cloudffl-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cloudffl-for-woocommerce\/","author":23596425,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.3.4","stable_tag":"2.3.4","tested":"7.1.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"CloudFFL Finder for WooCommerce","header_author":"CloudFFL (Longhorn Web Solutions, LLC)","header_description":"Integrates CloudFFL API with WooCommerce to enable FFL dealer selection during checkout for firearms purchases.","last_updated":"2026-11-13 20:27:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.cloudffl.com\/ffl-api\/plugins\/woocommerce\/","header_author_uri":"https:\/\/www.cloudffl.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":68,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.3.4":{"tag":"2.3.4","author":"cloudffl","date":"2026-11-13 20:27:13","revision":3801119}},"upgrade_notice":{"2.3.2":"<p>Fixes age verification cookie duration. Session only no longer becomes 30 days; old persistent cookies are converted when that setting is active. Stale tab storage no longer bypasses cookie expiration.<\/p>","2.3.1":"<p>Fixes dealer verification, checkout reloads, shipping privacy and payment handling. Dealer selection no longer marks unpaid orders paid. Reconcile historical paid\/processing FFL orders against gateway records; see README.md for upgrade guidance.<\/p>","1.0.0":"<p>Initial release of CloudFFL for WooCommerce.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3801125,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3801125,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.3.4"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3801119,"resolution":"1","location":"assets","locale":"","width":920,"height":790},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3801119,"resolution":"2","location":"assets","locale":"","width":952,"height":250},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3801119,"resolution":"3","location":"assets","locale":"","width":1139,"height":390},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3801119,"resolution":"4","location":"assets","locale":"","width":730,"height":636},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3801119,"resolution":"5","location":"assets","locale":"","width":1279,"height":398},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3801119,"resolution":"6","location":"assets","locale":"","width":1260,"height":1053},"screenshot-7.jpg":{"filename":"screenshot-7.jpg","revision":3801119,"resolution":"7","location":"assets","locale":"","width":623,"height":565}},"screenshots":{"1":"Dealer search with map and selectable FFL details","2":"Selected dealer in Checkout Blocks with Change\/Clear controls","3":"Receiving dealer details in WooCommerce order administration","4":"Search for a replacement dealer from order administration","5":"Mark an individual product as FFL Required","6":"Configure ammunition categories and destination states","7":"Storefront age confirmation prompt"}},"plugin_section":[],"plugin_tags":[182389,292642,198681,292641,286],"plugin_category":[45],"plugin_contributors":[292643],"plugin_business_model":[],"class_list":["post-396028","plugin","type-plugin","status-publish","hentry","plugin_tags-ffl","plugin_tags-ffl-finder","plugin_tags-firearms","plugin_tags-gun-store","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-cloudffl","plugin_committers-cloudffl"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/icon-128x128.png?rev=3801125","icon_2x":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/icon-256x256.png?rev=3801125","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/screenshot-1.jpg?rev=3801119","caption":"Dealer search with map and selectable FFL details"},{"src":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/screenshot-2.jpg?rev=3801119","caption":"Selected dealer in Checkout Blocks with Change\/Clear controls"},{"src":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/screenshot-3.jpg?rev=3801119","caption":"Receiving dealer details in WooCommerce order administration"},{"src":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/screenshot-4.jpg?rev=3801119","caption":"Search for a replacement dealer from order administration"},{"src":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/screenshot-5.jpg?rev=3801119","caption":"Mark an individual product as FFL Required"},{"src":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/screenshot-6.jpg?rev=3801119","caption":"Configure ammunition categories and destination states"},{"src":"https:\/\/ps.w.org\/cloudffl-for-woocommerce\/assets\/screenshot-7.jpg?rev=3801119","caption":"Storefront age confirmation prompt"}],"raw_content":"<!--section=description-->\n<p>CloudFFL Finder for WooCommerce supports dealer selection and order routing for products you configure as requiring an FFL transfer. It looks up dealer records through the CloudFFL API and records the selected dealer on the order. An active CloudFFL API key is required for dealer search and verification. Merchants remain responsible for determining applicable transfer, shipping, age, and other legal requirements; the plugin does not certify legal compliance.<\/p>\n\n<p>The plugin is free and is developed and maintained by CloudFFL, operated by Longhorn Web Solutions, LLC, the provider of the paid CloudFFL API service. API service charges are billed separately by CloudFFL; there is no separate plugin license fee.<\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Easy Setup<\/strong> - Enter your CloudFFL API key and you're ready to go<\/li>\n<li><strong>Product Flagging<\/strong> - Mark individual products as requiring FFL transfer<\/li>\n<li><strong>Category-Level FFL<\/strong> - Flag entire product categories (e.g., Firearms, Suppressors) to require FFL<\/li>\n<li><strong>Ammunition State Restrictions<\/strong> - Configure which states require FFL for ammunition categories<\/li>\n<li><strong>Smart Cart Detection<\/strong> - Automatically detects FFL items and prompts for dealer selection<\/li>\n<li><strong>State-Based Ammo Gate<\/strong> - Dynamically shows FFL finder based on shipping state for ammo<\/li>\n<li><strong>Intuitive Dealer Search<\/strong> - Search by ZIP code, city, or dealer name<\/li>\n<li><strong>Interactive Map<\/strong> - Optional Leaflet\/OpenStreetMap integration (no API key required)<\/li>\n<li><strong>Order Integration<\/strong> - FFL dealer info saved to orders and included in emails<\/li>\n<li><strong>Admin Dashboard<\/strong> - View selected dealer details on every order<\/li>\n<\/ul>\n\n<p><strong>How It Works:<\/strong><\/p>\n\n<ol>\n<li>Mark products as \"FFL Required\" in the product editor, OR configure FFL-required categories in settings<\/li>\n<li>When a customer adds FFL items to their cart, they're prompted to select a dealer at checkout<\/li>\n<li>The customer searches for nearby dealers and selects one<\/li>\n<li>The dealer's address becomes the shipping address<\/li>\n<li>Order confirmation and admin views show the selected dealer details<\/li>\n<\/ol>\n\n<p><strong>Category-Level FFL:<\/strong><\/p>\n\n<p>For stores with large catalogs, you can flag entire categories instead of individual products:<\/p>\n\n<ol>\n<li>Go to WooCommerce &gt; CloudFFL &gt; FFL Required Categories<\/li>\n<li>Select categories that contain FFL items (e.g., Firearms, Suppressors, Receivers)<\/li>\n<li>Any product in those categories will automatically require FFL dealer selection<\/li>\n<li>Child categories are automatically included when a parent is selected<\/li>\n<\/ol>\n\n<p><strong>Ammunition State Restrictions:<\/strong><\/p>\n\n<p>Configure ammunition routing according to your store requirements:<\/p>\n\n<ol>\n<li>Configure which product categories contain ammunition in plugin settings<\/li>\n<li>Select the states for which your store requires FFL shipment for ammunition<\/li>\n<li>When a customer ships to a restricted state with ammo in cart, they must select an FFL dealer<\/li>\n<li>Works alongside product and category flags; review these settings for your catalog and destinations<\/li>\n<\/ol>\n\n<p><strong>Requirements:<\/strong><\/p>\n\n<ul>\n<li>WordPress 5.8 or higher<\/li>\n<li>WooCommerce 6.0 or higher<\/li>\n<li>PHP 7.4 or higher<\/li>\n<li>CloudFFL API key (create a <a href=\"https:\/\/api.cloudffl.com\/auth\/sign-up\">CloudFFL account<\/a>, then open <a href=\"https:\/\/api.cloudffl.com\/dashboard\/api-keys\">API Keys<\/a>)<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<h4>CloudFFL FFL API<\/h4>\n\n<p>This plugin connects from your WordPress server to https:\/\/api.cloudffl.com\/api\/v1 (or the API endpoint configured by the merchant) to search for dealers and verify a selected dealer before saving it to an order. A CloudFFL account and API key are required; service access is governed by your CloudFFL plan.<\/p>\n\n<p>Requests occur when a shopper or administrator searches for dealers, when a dealer selection is verified during checkout or admin assignment, and when an administrator clicks Test Connection. Search requests send the entered ZIP code, city\/state, dealer name or latitude\/longitude, search radius, result limit and active-status filter as applicable. Verification requests send the selected dealer ID. Test Connection sends a fixed ZIP search (90210, radius 5, limit 1). Requests include the merchant's API key for authentication and ordinary server HTTP metadata, including server IP and user agent. These API methods do not send the cart, payment details, or a complete customer billing\/shipping profile. A search ZIP or other location input may originate from the shopper's address.<\/p>\n\n<p>Returned dealer identity, license and address data are used to display results and populate order dealer\/shipping details. See the <a href=\"https:\/\/www.cloudffl.com\/terms\/\">CloudFFL Terms of Service<\/a>, <a href=\"https:\/\/www.cloudffl.com\/terms\/ffl-api\/\">FFL API Addendum<\/a> and <a href=\"https:\/\/www.cloudffl.com\/privacy\/\">Privacy Policy<\/a> for the service's policies. If you configure a different API endpoint, review that provider's policies too.<\/p>\n\n<h4>OpenStreetMap map tiles<\/h4>\n\n<p>When an enabled dealer map is displayed, the visitor's browser requests map images directly from tile.openstreetmap.org. Tile coordinates and zoom identify the viewed area; requests also disclose the visitor's IP address, browser\/user agent and referrer information as permitted by the browser\/site policy. Requests continue when the map is panned or zoomed. This service supplies the base map; dealer records come from CloudFFL. The plugin does not send the CloudFFL API key, order contents or payment data to the tile service.<\/p>\n\n<p>Map data attribution: (c) <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap contributors<\/a>, available under the Open Database License. Keep this attribution visible on maps. Service use is subject to the <a href=\"https:\/\/osmfoundation.org\/wiki\/Terms_of_Use\">OSMF Terms of Use<\/a>, <a href=\"https:\/\/osmfoundation.org\/wiki\/Privacy_Policy\">Privacy Policy<\/a> and <a href=\"https:\/\/operations.osmfoundation.org\/policies\/tiles\/\">Tile Usage Policy<\/a>. Public tile availability is not guaranteed. Disable Map View in plugin settings if you do not want map-tile requests.<\/p>\n\n<h3>Source and Build Instructions<\/h3>\n\n<p>The distribution includes readable Block Checkout source in src\/, Classic\/admin source in assets\/js\/ and assets\/css\/, webpack.config.js, package.json, package-lock.json. Development tests and release\/check scripts remain in the source checkout. BUILDING.txt describes dependency installation, asset compilation and release checks. Leaflet 1.9.4, its readable source, source maps, images and BSD-2-Clause license are bundled in assets\/vendor\/leaflet\/. See THIRD-PARTY-NOTICES.txt for source provenance and licensing.<\/p>\n\n<h3>Copyright and License<\/h3>\n\n<p>Copyright (C) 2026 Longhorn Web Solutions, LLC. Developed under the CloudFFL brand. Original plugin code is GPL-3.0-or-later; see COPYRIGHT.txt and LICENSE.txt. Leaflet retains its original BSD-2-Clause license and copyright notices. Third-party provenance and map attribution are documented in THIRD-PARTY-NOTICES.txt. The hosted API service terms are separate from the plugin's GPL license.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce. Obtain the installable CloudFFL release ZIP.<\/li>\n<li>Go to Plugins &gt; Add New Plugin &gt; Upload Plugin, choose the ZIP, install it, and activate CloudFFL Finder for WooCommerce.<\/li>\n<li>Create a CloudFFL account, complete account confirmation, and open API Keys in the CloudFFL API dashboard. Create a key for this store and copy it when displayed. Key limits and API service access depend on your plan.<\/li>\n<li>Go to WooCommerce &gt; CloudFFL Settings &gt; General, paste the key, save changes, then click Test Connection. Keep the default API endpoint unless instructed otherwise by CloudFFL.<\/li>\n<li>Configure your FFL-required products\/categories and test checkout with your shipping\/payment configuration. Shoppers do not need a CloudFFL account or API key.<\/li>\n<\/ol>\n\n<p>To update a direct ZIP installation, back up and test the store, upload the newer release ZIP through the same Plugins screen, and choose Replace current with uploaded. Do not uninstall first; uninstalling removes plugin settings. This build has no CloudFFL automatic updater. WordPress.org updates require an approved, published release under the matching plugin slug.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20the%20plugin%20free%3F\"><h3>Is the plugin free?<\/h3><\/dt>\n<dd><p>Yes. CloudFFL provides this plugin at no additional charge. Dealer search and verification require a paid CloudFFL API subscription and an active API key. Your API subscription is billed by CloudFFL, separately from your WooCommerce store.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20an%20api%20key%3F\"><h3>Where do I get an API key?<\/h3><\/dt>\n<dd><p>Create a <a href=\"https:\/\/api.cloudffl.com\/auth\/sign-up\">CloudFFL account<\/a>, complete account confirmation, then open <a href=\"https:\/\/api.cloudffl.com\/dashboard\/api-keys\">API Keys<\/a>. Create a named key for your store and copy it when shown. API access follows your CloudFFL plan; the plugin download does not itself activate service. Only the merchant needs the key.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20customer%20has%20both%20ffl%20and%20non-ffl%20items%20in%20their%20cart%3F\"><h3>What happens if a customer has both FFL and non-FFL items in their cart?<\/h3><\/dt>\n<dd><p>The plugin prevents mixed carts. Customers will see a notice explaining they need to complete separate orders for firearms and other items.<\/p><\/dd>\n<dt id=\"does%20the%20map%20require%20a%20google%20maps%20api%20key%3F\"><h3>Does the map require a Google Maps API key?<\/h3><\/dt>\n<dd><p>No Google Maps key is needed. Leaflet is bundled locally; OpenStreetMap supplies map tiles subject to its usage policy and availability. See External Services below.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20dealer%20search%20radius%3F\"><h3>Can I customize the dealer search radius?<\/h3><\/dt>\n<dd><p>Yes, you can set a default search radius (10, 25, 50, or 100 miles) in the plugin settings. Customers can also adjust the radius when searching.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20compatible%20with%20woocommerce%20high-performance%20order%20storage%20%28hpos%29%3F\"><h3>Is this plugin compatible with WooCommerce High-Performance Order Storage (HPOS)?<\/h3><\/dt>\n<dd><p>The plugin declares HPOS compatibility and uses WooCommerce order CRUD APIs. Validate your store and extension combination before deployment.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20variable%20products%3F\"><h3>Does this work with variable products?<\/h3><\/dt>\n<dd><p>Yes, the \"FFL Required\" setting works with simple, variable, and grouped products.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.3.4<\/h4>\n\n<ul>\n<li>Preserve checkout completion when billing names are entered after selecting a dealer.<\/li>\n<li>Package the WordPress.org enqueue corrections for renewed checkout regression testing.<\/li>\n<\/ul>\n\n<h4>2.3.3<\/h4>\n\n<ul>\n<li>Load order license-copy behavior and status styles through WordPress enqueue hooks.<\/li>\n<li>Use HTML template elements for Classic Checkout dealer markup.<\/li>\n<\/ul>\n\n<h4>2.3.2<\/h4>\n\n<ul>\n<li>Honor Session only age verification with a session cookie, including cookies from the previous release.<\/li>\n<li>Keep 7, 30 and 90 day cookie lifetimes and stop stale tab storage from bypassing expiration.<\/li>\n<li>Keep age confirmation working when Web Storage is blocked and restrict cross-tab messages to age-gate notifications.<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Keep dealer markers visible when switching from Classic search results to the map or reopening it.<\/li>\n<li>Accept compact ZIP+4 dealer addresses while rejecting changed destination digits, and show specific admin verification errors.<\/li>\n<li>Preserve quoted dealer-address JSON in HPOS compatibility copies without changing order payment state.<\/li>\n<li>Wrap long dealer text and keep shipping controls within narrow checkout layouts.<\/li>\n<li>Accept equivalent typographic quotes introduced by WooCommerce address formatting while rejecting substantive destination changes.<\/li>\n<li>Keep ammunition dealer choices visible after reload and verify selected dealers across state changes.<\/li>\n<li>Accept valid API expiration timestamps and reject malformed success responses.<\/li>\n<li>Preserve gateway payment state and stock handling while holding paid orders that still need a dealer.<\/li>\n<li>Preserve purchaser names and saved personal addresses; verify the dealer destination before accepting checkout totals.<\/li>\n<li>Restore checkout selection controls and original shipping across reload, clear and pick-later transitions.<\/li>\n<li>Render dealer text safely in lists and maps and improve Classic dialog keyboard handling.<\/li>\n<li>Bundle Leaflet locally with readable source and licensing<\/li>\n<li>Include plugin source, dependency manifests and build instructions in distribution<\/li>\n<li>Add explicit external-service data, terms and privacy disclosures<\/li>\n<li>Require consistent versions and passing lint, focused PHP tests and frontend tests before packaging<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Security: Verify every checkout dealer selection with CloudFFL before saving dealer metadata or FFL shipping details<\/li>\n<li>Security: Ignore browser-provided dealer identity, license, phone, and address fields in Classic and Block Checkout<\/li>\n<li>Security: Reject mismatched, inactive, expired, incomplete, unknown, or unavailable dealer records without silently selecting \"Pick FFL Later\"<\/li>\n<li>Added: Private verification status, timestamp, source, eligibility, and expiration audit metadata<\/li>\n<li>Improved: Preserve the authenticated seven-key WooCommerce REST metadata contract for the Odoo connector<\/li>\n<li>Improved: Use one HPOS-compatible WC_Order CRUD path for Classic, Blocks, session, and admin dealer assignment<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Added: Category-level FFL flagging feature<\/li>\n<li>Added: Configure product categories that always require FFL transfer<\/li>\n<li>Added: Child category inheritance for FFL categories<\/li>\n<li>Improved: Any product in an FFL-required category triggers FFL finder<\/li>\n<li>Improved: Mixed cart detection includes category-level FFL items<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Added: Ammunition state restrictions feature<\/li>\n<li>Added: Configure product categories as ammunition<\/li>\n<li>Added: Select states that require FFL for ammunition shipments<\/li>\n<li>Added: Dynamic FFL finder visibility based on shipping state<\/li>\n<li>Added: State detection for both classic and block checkout<\/li>\n<li>Added: Child category inheritance for ammo categories<\/li>\n<li>Improved: Validation messages for ammo-specific FFL requirements<\/li>\n<li>Improved: Admin settings with multi-select category and state pickers<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>FFL dealer search via CloudFFL API<\/li>\n<li>Product meta for FFL Required flag<\/li>\n<li>Mixed cart detection and blocking<\/li>\n<li>Checkout integration with dealer selection<\/li>\n<li>Leaflet\/OpenStreetMap integration<\/li>\n<li>Order meta and email integration<\/li>\n<li>Admin order view with dealer details<\/li>\n<li>Bulk and quick edit support for products<\/li>\n<li>CSV import\/export support<\/li>\n<\/ul>","raw_excerpt":"Integrates CloudFFL API with WooCommerce to enable FFL dealer selection during checkout for firearms purchases.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/396028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=396028"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/cloudffl"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=396028"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=396028"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=396028"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=396028"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=396028"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=396028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}