🏭 Wholesaler / Distributor Guide
This guide covers everything specific to wholesale and distribution businesses using Ledgr — party credit limits, salesman + commission, the sales-order-to-GRN flow, customer PO references, and the reports that matter for B2B receivables.
Why Ledgr for wholesalers?
Wholesale is a different beast from retail. The customer is another business, the order is large, the payment is on credit, and a salesman walks the books. Generic billing software treats wholesale like retail — Ledgr's wholesale preset doesn't:
- "Party" terminology — wholesalers call customers "parties". Ledgr swaps "Customer" → "Party" everywhere (invoice forms, contact list, reports). Subtle but matters when training new staff.
- Party credit limit + block-over-credit — set a max outstanding per party. When they're at limit, Ledgr can hard-block new invoices/SOs (toggleable per company).
- Salesman entity — separate database table for sales reps with territory, commission %, optional link to employee record for payroll.
- Sales Order → Delivery Note → GRN flow — three distinct documents. SO is what the party ordered; DN is what you shipped; GRN is what they received. Each tracks a partial-fulfilment lifecycle.
- Customer PO No. + Date — every invoice references the buyer's PO. Auto-flows into the Indian e-invoice
RefDtls.OrdDtls. - Quantity-break pricing — slabs in the price list (1-9 = ₹100, 10-49 = ₹95, 50+ = ₹90).
- Recurring invoices — for monthly retainers or repeat-order parties.
- Profit by party — per-customer revenue/cost/margin/margin% over a date range.
- Salesman performance + salesman-wise outstanding — accountability for collections.
party_credit + salesman_management feature flags are auto-enabled. POS is OFF by default (wholesalers rarely need a counter); enable in Settings → Modules if you also do counter sales.Initial setup
1. Pick the Wholesale niche
During onboarding, select Wholesaler / Distributor. Ledgr enables:
- Billing, Estimates, Purchases, Credit Notes, Recurring, CRM, Inventory, Accounting, Banking
- 2 feature flags —
party_creditandsalesman_management - "Party" / "Parties" terminology in 11+ places
- Wholesale-friendly stock units: pcs, box, carton, case, pack, bag, bundle, drum, roll, dozen, pair, set, kg, g, ltr, ml, mtr, qtl, tonne
2. Configure block-over-credit policy
Settings → Company → Block invoice when party over credit limit:
- Off: shows a warning banner but lets you save the invoice anyway. Use this when you trust the cashier to make exceptions.
- On: hard-blocks save until party pays down or credit limit is raised.
3. Set up your Chart of Accounts
Wholesalers typically need:
- Sundry Debtors (already seeded by COA) — sub-ledgers per party
- Discount Allowed (income-side) and Discount Received (expense-side) — for the rampant volume discounting
- Freight & Forwarding (expense) — passed through from logistics
- Salesman Commission (expense) — for accruing commission per invoice
Setting up parties (B2B customers)
The party form
CRM → + New Contact, set type = customer. Wholesale-specific fields (visible because of the niche):
| Field | What it does |
|---|---|
| GSTIN (India) | Click Look up — Ledgr pulls legal name + trade name + address from GSTN. PAN auto-extracts (chars 3-12). |
| Credit Limit | Max outstanding allowed. Combined with block_over_credit setting drives hard/soft blocking. |
| Payment Terms | net_15 / net_30 / net_45 / net_60 / due_on_receipt. Used to compute due dates and aging buckets. |
| Salesman | Default salesman for this party. New invoices auto-fill this. Drives Salesman Performance and Salesman-wise Outstanding reports. |
| Opening Balance | Use this to load existing receivables when migrating from another system. Ledgr posts the journal automatically. |
Salesmen — the entity that ties it all together
Adding a salesman
- CRM → Salesman tab (visible only when
salesman_managementfeature is on). - Click + New Salesman. Fill name, code (e.g. SR-01), phone, email, territory ("Mumbai West", "Delhi NCR South"), commission % (e.g. 2.5%), optional notes.
- (Optional) Linked Employee dropdown — pick from the staff module if this salesman is also a payrolled employee. Auto-fills name/phone/email if blank.
- Save.
Salesman ↔ Employee linking
Why link? So you can run payroll and commission for the same person from one record. The link works both ways:
- From CRM → Salesman: pick an Employee from the dropdown.
- From Staff → Employees: click the briefcase icon (🧰) on any employee row → opens "New Salesman" form pre-filled with their employee_id.
The salesman's commission becomes part of payroll calculations: their commission_due is computed from their assigned invoices using the salesman's commission %, and you can settle it through the salary run.
Pricing — quantity-break slabs
Wholesalers offer volume discounts. Ledgr supports this via Price Lists with quantity slabs.
How to set up
- Settings → Price Lists → New (e.g. "Premium Distributors").
- Add line items per product with min_qty / max_qty / price slabs:
- Product = "Widget A", min_qty=1, max_qty=9, price=100
- Product = "Widget A", min_qty=10, max_qty=49, price=95
- Product = "Widget A", min_qty=50, max_qty=999999, price=90
- On a Party's contact form, set Default Price List = "Premium Distributors".
When you add 25 widgets to that party's invoice, Ledgr auto-picks the ₹95 slab (because 25 falls in 10-49 range).
Customer PO + previous-outstanding banner
Every B2B invoice references the buyer's PO. Two fields capture it (always visible on InvoiceForm):
- Customer PO Number — free text (every party has their own format)
- Customer PO Date — ISO date
These flow through to:
- Invoice form — visible next to Subject
- Printed invoice — shows in Bill To block as "Buyer PO: PO-2026-0042 dated 12-Jun-2026"
- IRP e-invoice — populates
RefDtls.OrdDtls.OrdNo+OrdDtautomatically when both are present (NIC rejects partial OrdDtls)
Previous outstanding banner
InvoicePreview auto-fetches the buyer's receivables-aging row and shows an amber banner: "Previous outstanding (other bills): ₹45,000 · including this bill: ₹68,500". Standard Indian wholesale practice — the bill itself becomes a payment reminder. Renders on screen and in print.
Sales Order → Delivery Note → GRN flow
Three documents, one fulfilment chain. Useful when:
- The party orders today but you ship over multiple days
- Stock is partial — you fulfil what you have, raise PO for the rest
- You want a paper trail: party signs the DN on receipt; you generate GRN from your end at warehouse-out
The flow
- Sales Order (SO) — Sales → Sales Orders → New. Pick party, add lines with
ordered_qty. SO is a commitment, no journal entry, no stock movement. - Delivery Note (DN) — From the SO, click "Convert to DN". Edit qty if you're shipping partial (the rest stays open on the SO). DN reduces stock but no invoice yet.
- GRN (Goods Receipt Note) — From the DN, click "Generate GRN". This is your proof-of-delivery doc. Send the printed GRN with the truck; party signs and you keep a copy.
- Invoice — Convert SO/DN to Invoice when ready to bill. Invoice triggers journal entries (Sundry Debtors / Sales / GST).
The Order Book report shows you which SOs are partially fulfilled, which are still open, and which are fully invoiced.
Recurring invoices (B2B retainers)
For monthly retainers, AMC, or repeat-order parties:
- Sidebar → Recurring.
- New Recurring Invoice → pick party, frequency (weekly / monthly / quarterly), start + end dates, line items.
- Auto-generates the actual invoice on each due date — auto-numbers it, posts journal, sends email if configured.
Reports that matter for wholesale
Salesman Performance
Per-salesman: invoice count, gross sales, taxable, commission_due (computed from commission_pct × taxable). Date range filter + CSV. Use this for monthly settlement.
Salesman-wise Outstanding Aging
Per-salesman 0-30 / 30-60 / 60-90 / 90+ aging buckets. Helps you tell each salesman exactly which parties to chase. Invoices without an assigned salesman fall into "(Unassigned)".
Profit by Party
Per-party revenue / cost (using product cost_price) / margin / margin %. Sort by margin% descending to find your best parties. Sort ascending to find loss-leaders you should renegotiate or drop.
Order Book
All open Sales Orders with ordered_qty − delivered_qty still pending. Useful for warehouse planning and for promising delivery dates to parties.
Daily Sales
Per-day totals (filtered by salesman if needed). Quick view for daily standup.
Common workflows
Onboarding a new party
- CRM → New Contact, type=customer.
- Paste GSTIN → Look up → name + address auto-fill.
- Set credit limit (start cautious, increase after 3-6 months of clean payments).
- Pick salesman from dropdown.
- Pick price list (Standard / Premium / Distributor).
- Save → ready for first invoice.
Monthly salesman commission settlement
- Reports → Salesman Performance, set date range = last month.
- Note
commission_dueper salesman. - If salesman is also an employee: open Staff → Payroll → Create salary run for the period.
- The commission line auto-appears in their salary slip if you configured a "Salesman Commission" component on their salary structure.
- If salesman is NOT an employee: pay them directly via Quick Entry (Dr. Salesman Commission expense / Cr. Cash) or a dedicated payment voucher.
Receiving payment on multiple invoices
- Sidebar → Accounting → Payments → Receive Payment.
- Pick party. Ledgr lists all unpaid invoices.
- Allocate the received amount across invoices (FIFO by default — adjust manually as needed).
- Save → journal posted (Dr. Cash / Cr. Sundry Debtors), invoices marked paid/partially-paid, receivables aging updates.
Handling a party return
- From the original invoice → "Create Credit Note".
- Pick line items being returned, adjust qty.
- Save → journal posted (Dr. Sales Return + Tax / Cr. Sundry Debtors), stock returned to inventory.
- Apply credit note against next invoice OR refund as cash payment.
FAQ — Wholesale specific
Can I track salesman activity beyond just invoices? Like "visited but no order"?
Use the CRM Follow-ups feature. Each follow-up has a salesman_id, party_id, date, outcome notes. Salesman Performance currently aggregates only invoices, but follow-ups give the day-to-day activity log.
Can a salesman have a salary + commission?
Yes. Link the salesman to an employee record (briefcase icon on EmployeeList). On the employee's salary structure, add Basic + HRA + ... + Salesman Commission components. Commission gets computed from their invoice attribution and added to the salary run.
How do I handle scheme-based discounts (e.g. "buy 100, get 10% off + 5 free")?
Per-line discount is supported on every invoice line. Free-qty (the 5 free) is also a per-line field — appears on the invoice but doesn't add to the bill total. The scheme rules themselves aren't auto-applied yet (that's a future "promotions" feature) — for now, the cashier enters them manually based on the order qty.
What about ECommerce — can Ledgr generate B2B invoices for sales done on Amazon/Flipkart B2B?
Yes — manually. Each marketplace order becomes one invoice in Ledgr. We don't have direct Amazon/Flipkart importers yet (roadmap item), but their B2B order export CSVs can be imported via the import feature.
Can I see "this salesman's outstanding" on the salesman's dashboard?
The Salesman-wise Outstanding report shows aging per salesman. There's no per-salesman dashboard yet (Ledgr is single-tenant, single-user-view), but if a salesman has Login access (Settings → Users → role = Sales), they see only their own assigned invoices in the invoice list.
Multi-warehouse — can different warehouses ship the same SO?
Yes. The SO has lines, each line can be fulfilled from any warehouse via separate Delivery Notes. The Order Book tracks remaining qty per line.
Migrating from Tally / Marg / Busy?
We'll help with party-master + opening balance import. 1-hour onboarding call to set up your salesman commission structure.