=== FFL Monkey Data Feed for WooCommerce ===
Contributors: fflmonkey
Tags: woocommerce, firearms, inventory, dropshipping, distributors
Requires at least: 6.8
Tested up to: 7.1
Requires PHP: 7.2
Stable tag: 0.11.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Automate WooCommerce firearm inventory, distributor product imports, pricing and stock updates. Connect RSR, Lipsey's, Sports South and more.

== Description ==

= 🏪 Turn Your WooCommerce Store Into a Fully Stocked Online Gun Shop =

**Stop uploading spreadsheets. Start selling from your distributors' catalogs automatically.**

**FFL Monkey Data Feed for WooCommerce** is a WooCommerce firearms distributor integration built for FFL dealers, gun shops and online firearms retailers. Connect your existing distributor accounts and automatically publish firearms, ammunition, optics, accessories and outdoor products in your WordPress store, complete with product images, descriptions, specifications, categories and your own selling prices.

When distributor inventory or costs change, Data Feed updates your WooCommerce catalog automatically. You control which products appear, how they are priced and which distributor wins when multiple distributors carry the same UPC.

🎁 **New stores get a 15-day free trial on the yearly plan at [FFLMonkey.com](https://fflmonkey.com/). Plans start at $17.99/month.**

== 🎯 Why Gun Stores Choose FFL Monkey ==

* 📦 **Expand your online catalog without manually listing thousands of products.** Import eligible products from the distributors you already work with.
* ⚡ **Keep firearm inventory and prices current.** Receive pushed stock and price changes as they happen, with an hourly catch-up check for missed updates.
* 📈 **Protect your margins.** Set percentage or dollar markups by product, brand, category or distributor, with a default rule for everything else.
* 🔗 **Avoid duplicate listings.** Multiple distributors carrying the same UPC become one WooCommerce product, with the lowest-priced eligible source selected after your rules.
* 🎛️ **Control what you sell.** Include or exclude products by distributor, brand, category, type, UPC, SKU, inventory level or cost.
* 🏬 **Manage your own inventory too.** Add in-store stock manually, through CSV or via API, alongside distributor inventory.
* 🖼️ **Keep your website lean.** Product images load from FFL Monkey's CDN rather than filling your WordPress media library.

== 🚚 WooCommerce Distributor Integrations ==

Connect supported distributors using **your own existing dealer accounts**:

* **RSR Group WooCommerce integration**: firearms, ammunition, optics and shooting accessories.
* **Lipsey's WooCommerce integration**: firearms, exclusive models and NFA-related products.
* **Sports South WooCommerce integration**: firearms and shooting-sports inventory.
* **Davidson's WooCommerce integration**: firearms and related merchandise.
* **Chattanooga Shooting Supplies integration**: shooting-sports products.
* **Zanders integration**: firearms and accessories.
* **Kinsey's integration**: archery, outdoor gear, firearms and ammunition.
* **Amchar integration**: firearms and law-enforcement-oriented products.
* **Orion integration**: distributor catalog inventory.

No more maintaining separate spreadsheets for every distributor. FFL Monkey brings supported distributor catalogs into one WooCommerce storefront. Distributor accounts and ordering arrangements remain yours.

== ⚙️ Powerful Firearms Inventory Automation ==

= 📥 Automatic Product Imports =

Publish real WooCommerce products with images, descriptions, attributes, categories, cost, MAP and MSRP. Your first catalog import starts during setup, and you can follow its progress inside WordPress. Products removed from the feed are moved to draft rather than deleted.

= 🔄 Real-Time Inventory and Price Sync =

Stock and price changes are pushed to your store as they happen, rather than relying solely on a nightly bulk import. An hourly reconciliation check catches missed changes when your site was unavailable.

= 🏷️ Flexible Markups and MAP Pricing =

Create percentage-based and fixed-dollar markup rules for brands, categories, distributors or individual products. Combine markup types, use a default margin, apply optional .99-style rounding and enable a Minimum Advertised Price (MAP) floor. You remain responsible for configuring pricing appropriately for your business and distributor agreements.

= 🧩 Smart Multi-Distributor Product Matching =

If the same UPC is available from several connected distributors, shoppers see one product rather than duplicate listings. FFL Monkey selects the lowest-priced source after your configured rules.

= 🏬 In-Store and Distributor Inventory Together =

Track inventory you physically stock using manual entry, CSV import/export or API keys for your POS or other systems. Your in-house stock can compete with distributor stock under the same source-selection logic.

= 🛒 Built for WooCommerce Gun Stores =

Choose FFL Monkey's product categories or map products to your existing WooCommerce categories. Product updates use an optimized path for large catalogs, and the plugin only manages products it created, leaving your independently created products, pages and media untouched.

= 🤝 Compatible With FFL Checkout by FFL Monkey =

Data Feed marks firearms that require delivery to an FFL and NFA products requiring an SOT dealer. The separate **FFL Checkout by FFL Monkey** plugin can use these classifications to guide dealer selection at checkout. Data Feed itself does not replace your legal compliance responsibilities.

== 🧭 Simple Setup: From Installation to Live Catalog ==

1. Install and activate WooCommerce and FFL Monkey Data Feed for WooCommerce.
2. Open **FFLMonkey.com → Data Feed** in your WordPress dashboard.
3. Create an account and select a subscription (new stores get a **15-day free trial** on the yearly plan).
4. Select your supported distributors and configure your pricing and catalog rules.
5. Let FFL Monkey import products and keep inventory and pricing updated automatically.

No manual CSV feed uploads, cron setup or copying license keys required.

== 💳 Straightforward Pricing ==

**$17.99/month or $179.99/year** (save $35.89 compared with monthly billing).

* ⏱️ **15-day free trial** for new stores on the yearly plan
* 🛡️ **30-day money-back guarantee**
* 🚚 Access to all supported distributors
* ♾️ Unlimited pricing and product restriction rules
* 🔄 Automatic inventory and price updates

The WordPress plugin is free, GPL-licensed software. An active FFL Monkey subscription is required to receive distributor catalog data and updates.

== 📣 Start Selling More of Your Distributors' Inventory ==

Your distributors already have the products. **FFL Monkey helps put them in your WooCommerce store**, with your pricing, your product selection and automatic inventory updates.

👉 **Get started:** [FFLMonkey.com](https://fflmonkey.com/)

📨 Questions? Email **support@fflmonkey.com** or open a support ticket directly in the plugin.

== Installation ==

1. Install and activate WooCommerce.
2. Install and activate FFL Monkey Data Feed for WooCommerce.
3. Open **FFLMonkey.com → Data Feed** in your WordPress admin.
4. Sign in or create an account on that page, then choose a licence for the store and a plan. Payment is on Stripe's checkout page, in a new tab, and the plugin's page carries on by itself once it has gone through. You never copy or paste a key.
5. Pick your distributors. The catalog imports by itself, and the same page shows its progress.

== Frequently Asked Questions ==

= Do I need an FFL Monkey account? =

Yes. Data Feed is the WordPress side of FFL Monkey, a subscription service that gathers your distributors' catalogs and prices them for your store. You create the account on the plugin's own page, and the first 14 days are free. The plugin itself is free GPL software with nothing locked in it: the subscription pays for the catalog data.

= Do I need my own dealer accounts with the distributors? =

Yes. Data Feed lists their catalogs in your store; you still order from them on your own dealer account, as you do today.

= Can I choose which products show up? =

Yes. Hide products by distributor, category, brand, product type, UPC, SKU, stock level or cost, or show only the ones you pick.

= How does pricing work? =

Set a default margin, then add rules for the categories, brands, distributors or products that need a different markup: a percentage, a fixed dollar amount, or both. Round prices (for example to .99), and turn on the MAP floor to keep every price at or above MAP. When several distributors carry the same item, the cheapest after your rules wins.

= Can I sell my own stock alongside? =

Yes. Add your in-house items by hand, import them from a CSV, or keep them current from your point of sale through the API. Your own stock competes on price and wins whenever it's the cheapest source.

= Does it work with FFL Checkout? =

Yes. Data Feed marks every firearm that must ship to an FFL, and every NFA item that needs an SOT dealer. FFL Checkout by FFL Monkey reads those marks at checkout.

= Will it change or delete products I created myself? =

No. Data Feed marks every product it creates and only ever writes to those. Your own products, pages and media are left alone.

= What happens when a product leaves the catalog? =

It's set to draft, never deleted, so nothing breaks and nothing is lost.

= Where are the product images stored? =

On FFL Monkey's CDN, `cdn.fflmonkey.com`, not in your media library, so a catalog of tens of thousands of products doesn't fill your hosting storage.

= Will it slow down my store? =

No. Price and stock changes are written straight into WooCommerce's product tables rather than through a full product save, so other plugins don't reindex on every price movement. If a plugin on your site needs `save_post` to fire on price changes, add `define( 'FFLMONKEY_FAST_LANE', false );` to `wp-config.php`.

= What if my site is down when prices change? =

Nothing is lost. Changes wait on FFL Monkey's side, and an hourly check fetches whatever your store missed.

= What happens if I cancel? =

Your store stops receiving catalog updates, the products Data Feed created are set to draft and their images released, and your own products are untouched. Subscribe again and everything comes back.

= Is the source code available? =

Yes. The plugin is GPLv2 or later and its full source is in the download. The admin screens are compiled JavaScript; their TypeScript source ships under `source/portal-sdk/`, with a `package.json` that rebuilds them.

== External services ==

Data Feed is the client for FFL Monkey's service, so it talks to FFL Monkey's servers. This is what goes where.

**1. FFL Monkey API: `https://backend.fflmonkey.com`**

Supplies the catalog: products, prices, stock, categories and image addresses.

* *When:* when you open the plugin's page; when you sign in, create an account and go through setup; on the hourly check; when the plugin fetches products it has been told have changed; a minute after you change your product categories; when a shop manager opens an order that holds catalog products; when a shop manager opens one of FFL Monkey's products for editing, to list the distributors that carry it and its log; and when you deactivate the plugin or disconnect the store, if the store is connected.
* *What is sent:* at sign-in, your email and password; at sign-up, your name, email and password; your site's address and name, and an identifier for this installation. During setup, the licence and plan you choose. Once connected, the licence key and API token, the plugin and WordPress versions, the IDs of the products being fetched or reported on, and your product categories (ID, name, slug, parent, product count, and which is the default) so you can map ours into them.
* *Order sourcing,* for a connected store, when a shop manager opens an order that holds catalog products: the catalog IDs and quantities of those lines, whether each goes to a dealer, to the buyer or to your store, and the US state of the dealer, of the shipping address and of your store; when the shop manager picks another distributor for a line, which distributor. No names, street addresses or contact details.
* *Order compliance,* for a connected store, when a shop manager opens an order that holds catalog products: the catalog IDs of those products and the US state the order ships to, to ask which of them that state's law restricts. The answer is kept for 15 minutes. No names, street addresses or contact details.
* *Problem reports,* for a connected store: when the plugin can't reach FFL Monkey or an import fails, your site address, licence key, plugin and WordPress versions, and the error. At most once an hour for each kind of problem.
* *Subscribing again,* for a connected store whose licence has stopped (a failed payment, an ended trial or free period, a cancelled subscription): when you open the plugin's page, the licence ID and API token, to ask whether a subscription restores it; when you choose a plan, that plan, to open Stripe's checkout.
* *Deactivation,* for a connected store: when you deactivate the plugin, your site address, the licence key and the plugin version, so FFL Monkey holds your product updates until the plugin is switched back on. Activating the plugin sends nothing.
* *Disconnecting,* for a connected store: when you disconnect the store or start a reconnect, the same three things, so FFL Monkey holds your product updates until the store connects again.
* *Support tickets:* what you write and any files you attach, from your browser, with the name and email of the WordPress user who sends it, your site's address, and your plugin, WordPress, WooCommerce and PHP versions. Never your licence key or any password. While you are in wp-admin, your server also asks whether a reply is waiting for you, at most once a minute, with the store's licence ID and API token.

FFL Monkey also sends your store signed webhooks with catalog changes, at a REST endpoint the plugin registers. Each one is verified against a shared secret before it is applied.

**2. FFL Monkey in your browser: `https://backend.fflmonkey.com`**

The plugin's page loads the setup screen's distributor logos and product photos from this host, an order's sourcing box loads the distributors' logos from it, and once the store is connected, the Data Feed screens load your account's data from it with a short-lived token. After you pay, Stripe returns that browser tab to a page on this host. Each of these sends this host your IP address and browser details. Nothing is embedded in a frame.

**3. FFL Monkey image CDN: `https://cdn.fflmonkey.com`**

Product photos on your storefront load from this host, so your visitors' browsers send it their IP address and browser details.

FFL Monkey's terms and privacy policy cover all three:

* Terms of service: https://fflmonkey.com/legal/terms
* Privacy policy: https://fflmonkey.com/legal/privacy

**4. Stripe Checkout: `https://checkout.stripe.com`**

Choosing a paid plan during setup, or to subscribe again once the licence has stopped, opens Stripe's checkout in a new tab, where you pay. FFL Monkey creates the checkout; the plugin sends nothing to Stripe itself, and your card details never touch your site.

* Terms: https://stripe.com/legal
* Privacy policy: https://stripe.com/privacy

== Credits ==

The merchant screens bundled in this plugin show department icons from Game
Icons (https://game-icons.net), by Lorc, Delapouite and contributors, licensed
under CC BY 3.0 (https://creativecommons.org/licenses/by/3.0/).

== Changelog ==

= 0.11.0 =
* Order sourcing: the box on an order opens on the cheapest way to buy it with shipping. Open an item to see every distributor that carries it and what the order would cost with each.
* Setup and billing: the payment wait and the payment and licence pages share one clear card, and every error ends with a reference to quote.
* Settings: a licence that works without a plan says Free access and offers no plan.
* Support works like an inbox, with replies and reactions.
* Exclusions can keep products nobody has in stock, Pricing rules pick products the way exclusions do, and shoppers can filter by calibre, capacity and more.
* The product page has one FFL Monkey box, in two columns with a log.
* Missing values read "None" or "Not known" instead of a dash.

= 0.10.0 =
* Setup: "Waiting for payment" can open the payment page again, the register screen asks how you found FFL Monkey (optional), and Sign out carries an icon.
* Product feed: open a product in WordPress from its page, a narrower list, "Available from" lists your own stock, and a search typed while the list loads now runs.
* Support shows how to reach us before the store is connected, opens on the plugin you came from, and its new-ticket form fits a phone.
* The Dashboard box counts only what you can fix and shows the products updated in the last 24 hours.
* The first import starts as soon as your distributors' prices arrive. Disconnecting holds your updates, and a paying store is never switched off by an old licence notice.
* Leaving a screen with unsaved changes asks first, store-wide pricing saves with no default margin, and edits in the In-house inventory spreadsheet save again.

= 0.9.0 =
* Activating the plugin sends nothing, and there is no dialog when you deactivate it. A connected store still tells FFL Monkey when the plugin is deactivated, with its licence key, site address and plugin version only, so its product updates are held until the plugin is back on.
* Every setting, table and product field the plugin stores starts with fflmonkey, as WordPress.org requires. A store that ran an earlier build connects again. The reconcile command is wp fflmonkey-feed reconcile.

= 0.8.1 =
* Renamed to FFL Monkey Data Feed for WooCommerce.
* The licence, background-work and WooCommerce-missing notices show on the Dashboard, the Plugins screen and the Data Feed page only, not on every screen.

= 0.8.0 =
* Orders show every distributor you selected that carries each item, with its cost, stock and whether it drop-ships, and the cheapest way to buy the order with shipping, including your own shipping on to the dealer when a distributor will not drop-ship.

= 0.7.0 =
* Categories are set up from a short form: keep yours, add FFL Monkey's beside them or replace yours, then change the proposal before you save.
* A store already on FFL Monkey's categories opens on them.
* A department you sell with no category in your store is pointed out on the Categories tab, on Home and in the Dashboard widget.
* Exclusions start with a switch for each department; advanced exclusions are made in a dialog.
* Departments show their icons.
* New create-account and sign-in screens, with Continue with Google and Apple, and no licence to choose.
* A simpler first page and plan page in setup; leaving Stripe's checkout shows the plans again.
* Support is a chat, and files upload as you attach them.
* Check connection says what it found in plain words.
* In Spanish when WordPress is set to Spanish.

= 0.6.1 =
* The plugin's link in your Plugins list opens the Data Feed page on fflmonkey.com.

= 0.6.0 =
* Setup asks for your price ending (.99, .95, .90 or .00) and shows a Glock worked through your markup.
* The first import starts as soon as your products are priced.
* The Product feed opens on the newest products, with an Added column.
* Products a distributor adds after the first import now appear.
* The first import finishes on hosts with a short PHP time limit, and restarts itself if it stops.
* The setup's welcome greets your store by its name.
* Support takes screen recordings (MP4, MOV, WebM), up to 50 MB a file.

= 0.5.0 =
* Setting up after you subscribe opens as a full-page window, and if no distributor is chosen yet, its last screen says so and takes you back to choose one.
* No "Your store is connected" notice after connecting: the Data Feed screens open straight away.
* Create account on the setup page works again.
* WooCommerce no longer lists Data Feed as incompatible with High-Performance Order Storage or the Checkout block.
* Tested with WordPress 7.1 and WooCommerce 11.2.
* The Data Feed page opens on FFL Monkey's sign-in and setup screens, drawn on the plugin's own page, with no Connect button in front of them. Paying opens Stripe's checkout in a new tab.
* No more notice asking to share the store's details.
* Support opens on the Data Feed, and shows each file you attach before you send it.
* API keys have their own tab, for the keys your own systems use to read and update your in-house inventory.
* The default margin, rounding and the MAP floor sit together at the top of Pricing rules, with an example price worked through them.
* Settings opens on whether your store is getting its updates, and what to do if not.
* An empty In-house inventory offers its first item, and Add row will not save a price of $0.00.

= 0.4.1 =
* A store name containing an ampersand or quotation marks no longer leaves the Data Feed page blank.
* With WooCommerce switched off, the plugin stays completely dormant until it is back.
* Tested with WordPress 7.1 and WooCommerce 11.2.
* The plugin's scripts and styles load as files, as WordPress.org requires.

= 0.4.0 =
* Choose how products are organised: FFL Monkey's categories, or your own WooCommerce categories, on the Categories mapping tab and during setup. Products already in your store move to match.
* The plugin's screens run on your own WordPress page, so Safari works, the page scrolls normally and Back goes back.
* Connecting your store happens on the FFL Monkey website, and you come straight back connected.
* Switching the plugin off holds your product updates instead of breaking them.
* Runs on PHP 7.2 and newer.
* Products that leave the catalogue are found and set to draft.

= 0.3.2 =
* First public release.
