The Freshsales product catalog looks deceptively simple in setup: name, code, price, tax. The traps show up six months later when finance changes pricing, marketing launches a regional SKU, or a rep tries to quote a bundle. Design for those three events on day one.
Catalog structure
Three fields decide everything: SKU code, price book, and product family. Treat SKU as immutable; once a deal references it, never edit it. For renames, add a new SKU and mark the old one inactive. This preserves historical deal-line accuracy.
Product family is your reporting axis. Set it once with three to seven values (“Platform,” “Add-on,” “Services,” “Hardware”) and resist adding more.
Price books for regions and segments
A single global price list breaks the moment you sell in two currencies or run a partner discount. Create separate price books per currency and per channel:
- US-Direct (USD, list)
- EMEA-Direct (EUR, list)
- Partner-NA (USD, 25% off list)
- Enterprise-Custom (no preset, manual override)
Reps pick the price book at the deal level, not the line level. A deal cannot mix price books. That is a feature: it forces clean partner versus direct accounting.
Discount rules that hold
Freshsales lets you set discount as percent or amount per line. Lock the field down for reps below a certain role and require approval workflow above 15 percent. The approval is a built-in workflow trigger on discount_percent > 15 that routes to the rep’s manager. Without this, every rep discounts 20 percent by reflex.
Bundles
There is no native bundle object. The pattern is a parent SKU with zero price plus a workflow that adds the child line items when the parent is added. Build the workflow on deal_product.created checking for the bundle SKU. Tag bundle children with a custom field so reports can roll them up.
Tax handling
Tax is per line, applied after discount. If you sell across tax jurisdictions, do not hard-code tax rates in the catalog. Set the line tax rate from a workflow that reads the deal’s billing country and looks up a tax rate from a custom module. This way one tax change does not require editing 800 SKUs.
Price change without breaking history
When list price changes, do not edit the SKU. Create a new effective-dated price entry on the same SKU. Existing deal lines keep their snapshot price. New deals pick up the new price. Freshsales stores the price snapshot at line creation, so a deal opened in January at $100 stays at $100 even if the SKU jumps to $120 in March.
Sync to ERP
The product catalog is the source of truth for sales but not for finance. Build a one-way sync from your ERP (NetSuite, Sage, QuickBooks) into Freshsales using the API. SKUs flow ERP to CRM, prices flow ERP to CRM, the catalog never edits back. This avoids two-way merge conflicts.
What to do this week
Audit your SKU count, mark anything not sold in 12 months as inactive, and confirm at least one price book exists per currency. If reps are editing prices freely, add the discount approval workflow today.