Perfex Product Hub documentation

Perfex Product Hub adds a product catalog, multi-warehouse inventory, fulfillment, purchasing, a customer catalog and WooCommerce/Shopify stock publishing to Perfex CRM. Perfex items stay the source of truth: Product Hub links to them by their real IDs and adds its own tables, never columns on Perfex's tables. Every stock movement is a row in an append-only journal; corrections are counter-entries.

Installation

Requirements

Install

  1. Back up the database, files and Perfex's encryption key (store credentials and private files depend on it).
  2. Extract the download perfex-product-hub-1.0.2.zip. Inside are the installable perfex_product_hub-1.0.2.zip, the WooCommerce plugin perfex-product-hub-woo-stock-1.0.2.zip, this documentation, the changelog and the licences.
  3. In Perfex open Setup › Modules, upload perfex_product_hub-1.0.2.zip and activate Perfex Product Hub.
  4. Check that the cron job runs. Product Hub appears in the left menu.

Upgrade

Upload the new zip through Setup › Modules; versioned migrations only add tables and columns. Existing Shopify connections keep their authentication mode and active stock pools stay in place. After the upgrade open Integrity and Background Jobs to check that everything is clean. Never uninstall as a way to upgrade.

First steps

  1. Setup: choose the valuation currency and the costing method — weighted average (default) or FIFO. Both lock after the first stock posting.
  2. Create a physical warehouse.
  3. Products › Adopt Existing Item links your Perfex items, or New Product creates one. Adoption keeps the item ID and imports no stock.
  4. Sales Links › Enable Sales SKU Field adds a visible SKU custom field to Perfex items, so invoice and estimate lines identify the exact product. Old invoice lines are not guessed or rewritten. The SKU is printed on customer documents — do not put secrets in it.
  5. Receive opening stock (Inventory › Receive Stock) or import it.
  6. Set an automation actor and default warehouse. Reservations start switched off and deliveries manual: test with a few invoices before turning automation on.

Permissions

PermissionAllows
View products and stockProducts, stock, reports and the journal.
View Own Products and RecordsOnly products the staff member created.
Create / Edit / ArchiveProducts, warehouses and their details; Archive Products also discontinues and archives.
Approve product lifecycleMove products through review to selling; approve counts, adjustments and catalog sync.
Receive, reserve and dispatch stockReceipts, transfers, reservations, deliveries and returns.
Manage Purchasing / Approve Purchase OrdersSuppliers, purchase order drafts and receipts / their approval.
ConfigureSetup, integrity, background jobs and store connections.
Publish Store Inventory / Import Store PaymentsStock pools and catalog sync / recording reviewed store payments.

Perfex's own rights on items, customers, invoices and estimates still apply on top.

Products and prices

Products are physical goods, services, variants, kits or digital products. A product moves through draft → review → selling → discontinued → archived; with approval switched on an approver activates it. Tracking (none, lot or serial) can change only before the product has stock history. Variant matrices create exact child Perfex items; a kit holds a versioned recipe that can mix services and physical components, and its availability follows its physical components.

Price lists set a price or discount by currency, customer group, minimum quantity, dates and priority. On Perfex's invoice and estimate forms Product Hub searches by SKU, barcode or name, shows stock and price, and Apply Product Hub Price fills the rate — a rate you typed yourself is kept.

Imports and labels

Import Center accepts UTF-8 CSV or the first sheet of an XLSX (up to 500 rows, 40 columns, 2 MB) for products, variants, prices and opening stock. Map the columns or reuse a saved profile, read the dry-run errors, fix rows, then approve. Formulas, macros, external links and entities are refused. Undo uses archives and counter-entries and refuses rows whose stock was already used. Variants need variant_options JSON such as {"Colour":"Blue","Size":"M"}. Read-only imports from earlier warehouse, Omni Sales and Product Lifecycle data are schema-checked; pause the old system during cutover.

Print Code 128, EAN-13 or QR labels on A4 or 58×40 / 80×50 mm rolls. Camera scanning uses the browser's barcode detector over HTTPS; a keyboard scanner or typing works everywhere. Scanning selects a product — receiving, picking and counting still need the confirmed form.

Warehouses and stock

Receive into a physical warehouse with quantity, cost and — when tracked — lot, serial and expiry. Expiring lots are reserved first (FEFO). Bins label locations inside a warehouse; moving a bin label posts no stock. Transfers reserve units into transit; the receiving side records what arrived, and any loss or damage. Open transfers are never returned automatically.

Costing

Weighted average recalculates the unit cost on each receipt; FIFO consumes the oldest layers first. Late landed costs (freight, duty) are allocated to an original receipt or purchase order receipts: the part still in stock is capitalised, the part already sold is expensed separately. Delivered cost of goods is never silently rewritten.

Counts and adjustments

Stock Control › Start Stock Count freezes a warehouse against conflicting movements. Enter counted quantities, review differences, approve and post once. Adjustments always need a reason and approval. Integrity compares balances with the journal and reports differences without changing anything.

Fulfillment

Perfex invoices and accepted estimates are reconciled in the background by the exact SKU on each line. Choose whether stock is reserved on invoice creation or on an accepted estimate, and whether delivery is manual or follows a policy (for example only when the invoice is fully paid; a store's status alone is not proof of payment). Sales Fulfillment handles partial deliveries, carrier and tracking, delivery PDFs and grouped delivery notes. Editing an invoice after delivery goes to review; cancelling releases only what was not shipped. Returns are received at original cost after inspection — a credit note alone does not prove a physical return.

Margins

Each delivered line freezes its net revenue and cost of goods. Margin reports use those snapshots; deliveries made before revenue snapshots existed show the margin as unavailable. Currencies are never added together.

Purchasing

Create a supplier and a purchase order draft, approve it, send the supplier PDF by e-mail from the queue, then receive full or partial quantities against the exact order lines. Min/max levels, lead time and 30/90-day demand produce reorder suggestions; choosing a supplier and warehouse creates a draft, never an order sent by itself. A compatible installed Purchase module can be adopted read-only after you confirm that Product Hub does the receiving.

Customer catalog and downloads

Switch on the catalog and publish selling products. Signed-in contacts see their account prices, send quote requests, reorder from past purchases and download paid digital products. A quote request reserves nothing; staff can reprice it and prepare one unsent Perfex estimate. Paid digital invoices create entitlements per unit: upload the files or an encrypted licence-key pool first. Downloads use short-lived one-use links from the customer's Downloads page; changing or cancelling the invoice withdraws access.

Store connections

Store connections live under Commerce. Credentials are encrypted with Perfex's key and never shown again: leave a secret field empty to keep the saved value. Saving changes the connection revision, which blocks work queued for the old settings. Check Connection runs in the background and shows the result and, for Shopify, the granted scopes.

Shopify setup (Dev Dashboard app — recommended for your own store)

New Shopify custom apps are created in the Dev Dashboard. They do not show a fixed access token: Product Hub exchanges the app's Client ID and Client secret for a token that lasts about 24 hours, and refreshes it itself. This works when the app and the store belong to the same Shopify organization.

  1. In Shopify Partners create a development store (or use your live store).
  2. Open dev.shopify.com › Apps › Create app. The App URL can stay at its default (or point to your Product Hub page). Untick Embed app in Shopify admin, leave the redirect URLs empty and do not tick Use legacy install flow.
  3. Scopes (comma separated): read_products,write_products,read_inventory,write_inventory,read_locations,read_orders,write_orders. Orders older than 60 days also need read_all_orders, which Shopify must approve — optional.
  4. Webhooks API version: 2026-10 (the version Product Hub uses).
  5. Release the version, then open Distribution › Custom distribution and enter your store domain (name.myshopify.com). This choice is permanent. Without it the install screen says "This app can't be installed yet".
  6. Open the generated install link and press Install. Shopify then redirects to the App URL (example.com by default) — that is expected; the app is installed (check Settings › Apps in the store admin).
  7. In the app's Settings copy the Client ID and Client secret. In Product Hub › Commerce › Save Connection choose Shopify, mode Dev Dashboard App (Client ID and Secret), enter https://name.myshopify.com, the Client ID and the Client secret, save, then Check Connection. The granted scopes appear on the connection.
  8. For test orders, switch on Shopify's Bogus Gateway in the development store.

The Client secret also verifies Shopify webhooks for this mode. Never put secrets in URLs, tickets or screenshots.

Shopify OAuth install (a client's store in another organization)

Client credentials only work inside one organization. To connect a store owned by someone else, use the mode OAuth Install (Authorization Code). It needs Perfex on a public HTTPS address.

  1. In the Dev Dashboard app add the redirect URL shown on Product Hub's Commerce page (https://your-crm/admin/perfex_product_hub/shopify_callback) and set the same scopes. Make sure the app's distribution lets it be installed on that store.
  2. Save the connection in mode OAuth Install with the store domain, Client ID and Client secret.
  3. Press Authorize Shopify Installation. Shopify asks the store owner to approve; you return to Product Hub, which stores an expiring offline token and its refresh token, both encrypted, and queues a connection check.

The authorization link is single-use, bound to your Perfex session and valid for ten minutes. If a refresh fails or the store revokes the app, Product Hub asks you to authorize again; existing stock holds stay in place.

Legacy admin token

A store that already has an admin-created app with a shpat_ token can use mode Legacy Admin Token with that token and a separate webhook secret. Product Hub does not renew static tokens. Connections created before 1.0.1 stay in this mode after the upgrade.

WooCommerce and the companion plugin

  1. In WooCommerce create REST API keys with read/write access and enter the store URL, consumer key and consumer secret in a WooCommerce connection.
  2. On the WordPress site upload perfex-product-hub-woo-stock-1.0.2.zip under Plugins › Add New › Upload Plugin and activate Perfex Product Hub Stock Bridge.
  3. Open WooCommerce › Product Hub Stock Bridge and save a random shared secret of 32–128 characters. Enter the same value as the stock bridge secret in the Product Hub connection.
  4. Back up the WordPress authentication salt and the plugin's two command tables with the site; they protect against changing stock twice. Uninstalling the plugin removes only the saved secret.

The plugin supports managed, whole-unit simple products and variations with backorders off. It never writes an absolute stock total: it adds or removes a pool with WooCommerce's atomic stock functions, and a removal fails without effect if a checkout changed the stock in between. It ships a translation template (languages/pph-stock.pot).

Publishing stock pools

  1. Map the exact store product or variant, SKU, inventory item and location to a Product Hub product; start from zero available stock in the store.
  2. Give a responsible staff member View, Receive/reserve/dispatch, Configure and Publish Store Inventory.
  3. In Store Stock Publishing accept the exclusive stock ownership note and enable the policy. Keep one stock writer per SKU and location: no other sync plugin, no backorders.
  4. Allocate a pool by hand, or set a target pool size for automatic refill (capped by free, non-expired stock).

Every store change has a durable command key stored before the request. A timeout never becomes a new change: Retry the Same Store Command resends the original. Withdraw a Published Stock Pool removes the remaining pool with the observed store quantity as a guard and releases local units only after the store confirms. Cron also withdraws pools with lots expiring within a day and of discontinued products. Pausing a policy does not remove stock already published.

Store orders and payments

Signed order webhooks are verified and recorded under Commerce › Webhook Events. An order is read again from the store, mapped to an existing customer and imported as an unsent Perfex invoice draft; its units move from the store pool to the invoice. Complex, edited, refunded or tax-inclusive orders fail closed for manual handling. Payments are recorded only from reviewed evidence under Store Payments; Product Hub never charges a gateway. Webhooks need the public endpoint shown on each connection; without a public URL keep webhooks off and use the background checks only.

Price and description sync

Store Stock Publishing can preview a single field (name, description or price) in either direction. An approver accepts ownership of the field; the background worker checks both sides again before one write. WooCommerce simple products support name, description and price; variations description and price; Shopify variants price export. Promotions, other currencies and tax-inclusive prices are refused.

Assets and equipment

Version 1.1 adds an equipment register under Assets (its own menu entry and a section in Product Hub). Give staff the new permission group Product Hub Assets: View Assets, Manage Assets, Check Out and In, Maintenance and Audits; any of them includes reading the register. Customer and project holder names follow Perfex visibility.

Ask AI Staff

With Perfex AI Staff 1.1 or newer active, the assistant gets four read tools from Product Hub. Ask in plain words, for example:

QuestionToolWhat it answers
Top 5 products this monthProduct Hub SalesUnits and revenue by product, variant, category, customer, warehouse or sales channel, top N.
Profit this month by categoryProduct Hub ProfitRevenue, cost of goods sold, gross profit and margin % by product, variant, category, order or customer.
What is our stock worth in each warehouse?Product Hub Stock ValueOn hand, reserved, available and value per warehouse.
Which products have not sold for 90 days?Product Hub Stock MoversBest sellers, slow movers, days of cover and dead stock.

Integrations

Cron and background jobs

Run Perfex cron at least every five minutes. Workers use small batches, database locks, back-off and visible errors. Check Background Jobs, Sales Fulfillment, Stock Control, Import Center, Digital Delivery and Store Stock Publishing for anything waiting.

Deactivate and uninstall

Deactivating keeps all data. Uninstalling removes the module folder and keeps the data unless Setup has delete-on-uninstall switched on, which requires typing DELETE PRODUCT HUB DATA. Perfex items and their SKU field always stay. Withdraw published store pools first.

Troubleshooting

Changelog

Current version 1.1.0 (25 Oct 2026). Release notes of every version, newest first: perfexcrm.app/product-hub/changelog/.

1.1.0

1.0.5

1.0.4

1.0.3

1.0.2

1.0.1

1.0.0

The full list is in changelog.txt in the download.