Udhaar / Dues
Udhaar / Dues is the credit-tracking hub — a running ledger of money you owe your suppliers and money your customers owe you (udhaar), plus a Due Reminders view that surfaces everything overdue or coming due in the next 30 days.
Overview
This page lives at /ledger and has three tabs switched via the URL's ?tab= parameter — Supplier Dues (?tab=suppliers), Customer Dues (?tab=customer-ledger), and Due Reminders (?tab=due-reminders).
Every ledger entry is either a Debit or Credit, and the meaning flips depending on the party: for a supplier, Debit = you paid them, Credit = you owe them (a purchase); for a customer, Debit = they owe you (a credit sale), Credit = they paid you or gave an advance.
The Supplier Dues tab manages the same underlying Supplier records used elsewhere in the app (Suppliers page, Purchase Orders) but focuses purely on their running balance and transaction history.
Due Reminders pulls every ledger entry with a due date into two buckets — Overdue and Upcoming (next 30 days) — with one-tap WhatsApp reminder messages.
Before You Start
- You need Create permission to add suppliers or record ledger entries, Edit permission to mark entries as paid, and Delete permission to remove a supplier.
- WhatsApp reminders require the customer or supplier to have a phone number on file.
Step-by-Step Guide
1 Add or edit a supplier (Supplier Dues tab)
- On the Supplier Dues tab, click Manage Suppliers to go to the full Suppliers page for adding new ones, or click a supplier row to open its detail panel and use the Edit button there.
- Fill in Supplier Name (required), Contact Person, Phone, Email, Address, GSTIN, PAN, Credit Days, Opening Balance (amount you owed at the start, before any BazaarPOS entries), Bank details and Notes.
- Click Update Supplier or Add Supplier to save.
2 Record a supplier ledger entry (a purchase or a payment)
- Click a supplier row to open its side panel, then click Add Entry.
- Choose the Entry Type: Debit (we paid them) or Credit (we owe them / purchase).
- Enter the Amount (required) and an optional Due Date if this is a credit purchase you'll need to pay off later.
- Enter a Description (required, e.g. "Invoice #101 credit sale") and an optional Reference (invoice/PO number).
- Click Add Entry — the supplier's outstanding balance updates immediately.
3 Track and settle customer udhaar (Customer Dues tab)
- Switch to the Customer Dues tab.
- Search or scroll the left-hand customer list — each row shows their outstanding amount (red = they owe you, green = settled/overpaid) with an overdue flag if applicable.
- Click a customer to load their full transaction history on the right.
- Click Add Entry to record a new Debit (credit sale — they now owe you more) or Credit (payment received / advance) entry, following the same Amount/Due Date/Description/Reference fields as the supplier form.
- For any entry with a due date that hasn't been paid, click Mark paid directly in the entry row once the customer settles up.
4 Follow up on overdue and upcoming dues
- Switch to the Due Reminders tab.
- Review the 4 summary cards: number and total value of Overdue entries, and number and total value of entries due in the next 30 days.
- In the Overdue section, each row shows how many days overdue it is; in Upcoming, how many days until it's due.
- Click Paid on any row once that amount is settled — this removes it from the reminders list.
- Click WhatsApp to open a pre-written reminder message (party name, amount, description, due date, days overdue) addressed to that party's phone number via WhatsApp Web/App.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Supplier Name * | Required field identifying the supplier in the ledger. |
Opening Balance | Amount you owed this supplier before you started tracking them in BazaarPOS — added into their running Outstanding total. |
Entry Type (Debit/Credit) | For suppliers: Debit = you paid them, Credit = you owe them. For customers: Debit = they owe you, Credit = they paid/advanced you. |
Amount * | The ledger entry amount; required and must be positive. |
Due Date | Optional date this amount is expected to be settled by; entries with a due date feed the Due Reminders tab. |
Description * | Required free-text description of the transaction (e.g. invoice reference, reason for advance). |
Reference | Optional invoice or PO number tying the ledger entry to a source document. |
Outstanding Balance | Running net of all Debit/Credit entries plus opening balance for that party; red = owed by you, green = owed to you. |
Mark paid | One-click action on any dated ledger entry to record it as settled, removing it from Due Reminders. |
WhatsApp button | Opens a pre-filled WhatsApp message to the party's phone with amount, description and overdue days. |
Overdue / Upcoming (30 days) buckets | The two groupings on the Due Reminders tab; Upcoming only looks 30 days ahead. |
Tips & Best Practices
- Set a Due Date on every credit sale or credit purchase entry, even if informal — it's the only way an entry surfaces in Due Reminders.
- Use the WhatsApp reminder button as your default follow-up method for udhaar customers — it pre-fills a polite, complete message so you don't have to type it out each time.
- Reconcile the Customer Dues outstanding total against the Sales page's "Pending Payments" KPI periodically — both should reflect the same overall credit exposure.
- For suppliers with a long-standing balance from before you started using BazaarPOS, use Opening Balance rather than trying to back-fill years of individual ledger entries.
Troubleshooting & FAQ
I recorded a Credit entry for a supplier but the balance went the wrong direction.
An overdue entry isn't showing in Due Reminders.
WhatsApp button does nothing / shows an error.
Can I delete a supplier that still has an outstanding balance?
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/LedgerPage.jsx
Backend endpoints used:
GET /ledger/suppliersPOST /ledger/suppliersPUT /ledger/suppliers/:idDELETE /ledger/suppliers/:idGET /ledger/suppliers/:idGET /ledger/customer-summaryGET /ledger/entriesPOST /ledger/entriesPATCH /ledger/entries/:id/paidGET /ledger/due-reminders
Related tables (db-core repositories):
SupplierCustomerLedgerEntry
Redux slices:
scope (selectCurrentScope / getScopeQueryParams)
Feature flag key: billing (requires advanced plan tier or above)
The three tabs are independent components (SuppliersTab, CustomerLedgerTab, DueRemindersTab) switched by the tab URL search param via useSearchParams, mirroring the pattern used on the Daily Accounts page. WhatsApp reminders are generated client-side as a wa.me deep link with a URL-encoded message — no WhatsApp Business API integration is involved. "Overdue" vs "Upcoming" bucketing and the 30-day window are computed server-side by /ledger/due-reminders.