Bhumija Elevate
ERP User Manual
← Back to login

This is the complete guide to every screen in the Bhumija Elevate ERP. Inside the ERP itself, click the ❓ button on any page for just that page's section. This copy is public — safe to share with anyone who needs to learn the system before they have a login.

🔐 Login & Account

Logging In

The ERP login page is separate from the customer/farmer login. You sign in with your mobile number and password — there is no email/username login. Tick "Remember me" if you want the browser to keep you signed in longer between visits.

  • If your mobile number or password is wrong, or your account has been deactivated by an Admin, you'll see: "Incorrect mobile number or password, or the account is not active." The message is intentionally the same for both cases, so it does not reveal whether a mobile number exists in the system.
  • The first time you log in after a session change, the page always loads fresh — if you ever see a "Page Expired" error right after logging in, simply reload the page and log in again.
If you were logged out mid-way through something (e.g. filling a form), logging back in will normally take you straight back to the page you were on.

Requesting ERP Access (New Staff)

New staff do not get an account automatically. On the login page, click "Request ERP Access" and fill in:

  • Full Name
  • Mobile Number — this becomes your login ID once approved, so double-check it.
  • Email (optional, but strongly recommended — it's needed later for "Forgot Password")
  • Reason for Access (optional) — e.g. "Joining as sales executive, need order & CRM access"

After submitting, the request goes to an Admin for approval. You will not be able to log in until it is approved and credentials are shared with you. A few things to know:

  • You cannot submit a second request for a mobile number that already has an account, or one that already has a pending request waiting on approval — the form will tell you if either is the case.
  • Nothing is emailed or texted automatically when you submit the request — the Admin needs to be told separately (call/message) that a request is waiting, and will share your login details with you directly once approved.

Forgot Password

If you've forgotten your password, use "Forgot Password?" on the login page. This is a two-step process:

  1. Step 1 — Enter your mobile number. The system looks up the active account for that number and emails a 6-digit OTP to the email address registered on that account.
  2. Step 2 — Enter the OTP and choose a new password. You'll land on a page showing a masked version of your email (e.g. ab***@domain.com) so you can confirm the OTP was sent to the right place. Enter the 6-digit code plus your new password (minimum 6 characters, entered twice to confirm).
Forgot Password only works if an email address is on file for your account. If you see "No email address is registered on this account. Please contact your Admin," an Admin will need to add your email first (via the Executives section) or reset your password for you directly.

The OTP is valid for 10 minutes. After that it expires and you'll need to request a new one. You also can't request a fresh OTP more than once per minute — if you request too quickly you'll see "An OTP was already sent. Please wait 1 minute and try again."

Changing Your Password (while logged in)

Once logged in, click your name in the top-right corner to open the account panel. Under "Change Password" you can update your password any time by entering:

  • Current Password
  • New Password (minimum 6 characters)
  • Confirm New Password

If the current password you enter is wrong, the update is rejected with an error — nothing changes until the current password is verified correctly.

Completing Your Profile

The first time you log in, a "Complete Your Profile" popup appears and cannot be dismissed until you fill it in — it will keep reopening on every login until it's done. This is a one-time company-records requirement. It asks for:

  • Full Name, Email, Contact Number
  • Designation (Post) and Department
  • Date of Birth
  • Two Emergency Contact Numbers
  • Permanent/Parental Address
  • Aadhaar Number (12 digits)
  • A passport-size photo (upload)
  • A copy of your Aadhaar card (image or PDF upload)

If your name matches an entry in the public website's "About Us" team listing, the form will auto-fill your Designation (and offer to reuse that same photo, if one exists there) — you're free to change either.

Once your profile has a photo and Aadhaar copy on file, later edits to this form don't require re-uploading them — you only need to upload a new file if you want to replace what's already there.

Double-check your Contact Number here matches exactly what you use to log in. Any extra spaces or dashes are stripped automatically before saving, so "92017 99510" and "9201799510" both save the same way — but if the number itself is wrong, you could end up unable to match it at login.

After the first save, you can still reopen this form any time from the account panel ("Edit My Profile") to update your details — it's just no longer forced on you once the required fields are filled in.

🏠 Dashboard

The Dashboard is the first page you land on after logging in. It is an analytics command-center: order counts, revenue, RTO rate, leads, top farmers, and a sales map, all for whatever date range and (if you're allowed to see other executives' data) executive you choose.

What You See Depends on Who You Are

  • Regular executives only see their own orders and leads — the numbers on this page are scoped to what you personally booked/handled.
  • Admins and anyone whose role can "see all orders" (e.g. Warehouse) can filter by Executive using the dropdown in the filter bar, including an "All Executives" option.
  • Super Admin additionally sees a breakdown showing "Actual Sales (Gross Booked)" minus "RTO" = "Net Sales" — everyone else only sees the final Net Sales figure.

Choosing a Date Range

By default the Dashboard shows "This Month" — the 1st of the current month through today. You can change this several ways:

  • Quick-range buttons at the top: Today, Yesterday, 7 Days, 30 Days, This Month, This Financial Year, or All (from the very first order ever placed).
  • The Start / End date fields in the filter bar, then click Apply.
  • The Quick Month picker to jump straight to a specific calendar month.

Click Reset to return to the default "This Month" view. Admins also get Export CSV, Export Excel, and Download PDF Report buttons here to take the current range's data out of the system.

The Four Tabs

Below the top summary cards, four tabs switch what the page shows (the date range and executive filter you picked stay applied across all of them):

  • Overview — order counts (total, dispatched, RTO, delivered, pending), revenue, total farmers, the Sales Funnel (how orders move stage-to-stage), an Executive Performance table, Top Products, a Low Stock Alert (products at 5 units or fewer), and an interactive India Sales Map you can drill into by State → District → Pincode.
  • Day-wise — a bar chart plus table of orders and revenue for each individual day in the selected range.
  • RTO Orders — every order in the range that came back as RTO (Return to Origin), with the COD amount lost and the RTO reason, and a link to view each order.
  • 🌾 Farmers — repeat-customer analysis: which farmers have placed 2 or more orders, their delivered/RTO counts, and a separate table of "RTO-Risk Repeat Customers" (repeat farmers who have at least one RTO on record, sorted by RTO rate). Each shows the Top 10 by default — click "Show All" to see the complete list.
A farmer's "repeat customer" status is based on their mobile number, not their name — orders are grouped by a normalized version of the mobile number so the same farmer is recognized even if their name was typed slightly differently across different orders.

Other Things on This Page

  • Lead Overview card — total, contacted, and converted lead counts, plus a breakdown by source. Click "Full CRM" to go to the complete CRM module.
  • Delivered Orders Report card — click "Order-wise details + CSV download" to see exactly which order was delivered on which day, by which executive, for how much.
  • If you have WhatsApp access, a "Create WhatsApp Campaign" button appears in the filter bar.
"Revenue" on this page reflects dispatched orders in the selected date range — not every order ever booked. RTO orders are subtracted automatically the moment they're marked RTO, and cancelled orders are excluded entirely from Net Sales. If a number here looks off, check first whether your date range actually covers the orders you're expecting to see.

📦 Orders & New Order

New Order

Use New Order to book a fresh order for a farmer. The recommended order to fill the form in is: Farmer Name → Mobile (wait a moment after typing) → Pincode (wait for auto-fill) → Village → Products → Discount/Advance → Remark.

  • Mobile number — the moment you leave this field, the system checks whether this farmer has ordered before. A badge (or a popup, if they have cancelled/RTO orders) shows their past orders — this is only informational and never blocks you from continuing. It may also auto-fill address fields from their last order into whatever is still empty (it never overwrites anything you've already typed) — always double-check the auto-filled details are still correct.
  • Products & price — pick one or more products; each shows its standard rate, but the rate is editable. If you and the farmer agreed on a different price, change it before submitting.
  • Advance (prepaid) amount — if the farmer already paid something (UPI/bank transfer/cash/cheque), enter it under "Advance"; "Final COD" (what to collect on delivery) updates automatically. The moment you enter any Advance amount, you must also select the payment mode, enter the transaction/UTR number, and upload a screenshot of the payment — the order cannot be submitted without all three.
  • Must-fill fields — Farmer Name, Mobile (10 digits), Pincode, Village, and at least one Product. The form will not submit without these.
When does a new order need admin approval first? This is separate from the informational badge above. When you actually click "Create Order," if this same farmer already has another order currently sitting at placed/shipped/out-for-delivery/RTO, your new order is not created immediately — it's sent to a Super Admin for approval instead, and you'll see "Sent for admin approval." There's no fixed turnaround time for this (it happens whenever a Super Admin checks the Approval Queue), so let the farmer know confirmation may take a while.

Similarly, if this mobile number's past orders mostly belong to a different executive than the one booking now, the order is routed to admin approval as a "conflict" instead of being created right away.

Above the form, "Find & Edit an Existing Order (Before Dispatch)" lets you search by Order ID, mobile number, or farmer name to pull up and edit an order that hasn't been dispatched yet. Once an order is dispatched, further changes go through the Orders page instead.

Orders List

The Orders page lists every order you (or, if your role allows it, every executive's) orders, with tabs across the top for each pipeline stage: All Orders, Pending, Booking & Induction, In Transit & Sorting, Destination Arrival, Out for Delivery, Kept in Deposit, Final Delivery, Return Process (RTO), Item Delivered (RTO Complete), and Failed/Lost. Each tab shows a live count next to its name.

From a row's action buttons you can:

  • ⚡ Dispatch — open the dispatch panel for an approved, not-yet-dispatched order (see "Dispatching an Order" below).
  • ⏸ Hold / ▶ Release Hold — visible to Admin and Warehouse only, for a pending, already-approved order that hasn't been dispatched. Puts the order on hold with a reason (stock unavailable, waiting on farmer confirmation, etc.) and a note — this pauses the "pending dispatch" reminder and swaps it for a reminder tied to that specific reason instead. "Release Hold" clears it once resolved.
  • Status-change actions (once dispatched) to move an order through Shipped → Out for Delivery → Delivered, or mark it Cancelled or RTO.
Cancel vs RTO: Only Admin can cancel an order, and only while it has no logistics/tracking ID yet — cancelling deletes the order entirely and restores any stock that was taken. Once a tracking ID exists, the order is already in the courier's pipeline and can no longer be cancelled — it can only end up delivered or RTO from there. Marking an order RTO (Admin or Warehouse only) keeps its full record — only its payment trace is cleared — and requires selecting an RTO reason.

Order Detail Page

Click into an order to see its full detail: status, payment status, COD amount, courier charge (an "Estimate" fetched live at dispatch time, or "Reconciled" once Finance uploads the actual courier invoice — reconciled always wins), and a link to 📜 History/Tracking for that farmer. Admin can refetch or manually override the courier charge here. Once payment has been received, a 🧾 Generate Invoice button becomes available (it's disabled until then).

If an order was rejected during verification, its rejected status and reason show here; a Super Admin can undo the rejection and re-approve it directly from this page.

Dispatching an Order

An order must be verification-approved before it can be dispatched — otherwise the system blocks it with "Order must be verification-approved before it can be dispatched." To dispatch, choose the Courier, and (where applicable) enter the Tracking ID, weight, and dimensions.

  • For most couriers, dispatching immediately moves the order to Shipped and deducts stock.
  • Self Collected and Bus / Train couriers go straight to Delivered instead — there's no courier to track and payment is typically collected on the spot.
  • Post Office (India Post) orders stay at "Placed" (shown as "Ready to Ship") until a real tracking scan event comes in — this is normal, not stuck.
A tracking ID can only ever be used once — the system blocks assigning a tracking ID that's already on another order, or one that was used and later cancelled/blocked. If dispatch fails with a "already used" error, double-check the number you're entering.

Farmer History Lookup

Use the 📜 History/Tracking link (available from an order row or the order detail page) to pull up everything for a given farmer — search by mobile number, order/tracking number, or farmer name. This shows every past order for that farmer, their order stats, and monthly order pattern — useful for confirming a customer's track record (repeat orders, past RTOs/cancellations) before committing to a new order or a courier decision. If a name search matches more than one distinct mobile number, you'll be shown a picker to choose the right person.

📷 Scan / RTO Receiving

The Scan Parcel page is a mobile-friendly page for looking up an order by scanning its barcode/QR — used both for checking an order's status on the ground and, importantly, for confirming when an RTO (Return to Origin) parcel physically arrives back at the office/warehouse.

Finding an Order

  • Tap "📷 Scan Parcel Barcode / QR" to open your phone's camera and point it at the barcode already printed on the India Post label (or any QR code the ERP generated for that order) — no separate sticker is needed.
  • Or type the Order Number, Tracking ID, or Mobile Number into the box and tap "Find."
  • A flashlight button appears automatically if your device's camera supports one — useful for scanning in dim light.
Camera scanning needs a secure (https) connection to work. If you see a camera error, you can still type the Order Number/Tracking ID/Mobile manually — the lookup works exactly the same either way.

Once found, the order card shows status, payment status, farmer name, mobile (tap to call), address, COD amount, courier, tracking ID, and the product list. If the order was shipped via India Post, live tracking history from India Post is shown right below it.

Confirming an RTO Parcel Has Physically Arrived

When an order's status is RTO, a dedicated "📦 RTO — Physical Receipt" card appears. This exists because the courier marking an order as RTO (a tracking event) is not the same moment as someone at the office actually holding the returned parcel in their hands — this card is that second, physical confirmation step.

  1. Scan or look up the RTO order on this page.
  2. If any item in the parcel came back physically damaged, enter the damaged quantity next to that product (leave it at 0 for items that are fine). This is capped at the quantity originally in that order — you can't enter more than was shipped.
  3. Tap "📦 RTO Parcel Received — Confirm" and confirm the prompt.
Why the damaged quantity matters: when an RTO parcel is confirmed received, its stock is restored automatically — but only the undamaged units go back into sellable stock. Any quantity marked damaged is excluded from the stock restore, so it doesn't get counted as available-to-sell inventory. Get this number right at the time of receiving — it can't be easily corrected later.

Once confirmed, the card shows a green "✅ Received at office/warehouse" with the date/time and who confirmed it, and the damaged-quantity form disappears — it can only be confirmed once per order.

Manually Marking an Order as RTO (Admin only)

If an order's courier tracking already shows it moving back to origin (delivery status "Returning to Origin" or "Returned to Origin") but no one has updated its status in the ERP yet, Admins will see a "↩️ Mark as RTO" card here. Select a Reason (required), optionally add remarks, and confirm — this only appears for orders that aren't already RTO, Delivered, or Cancelled.

✅ Verification & Approvals

This section covers the three screens where staff check and sign off on things before they go further: Order Verification (every order gets checked before dispatch), Approval Queues (special cases that need a Super Admin's okay), and Invoice Approvals (sending delivery invoices over WhatsApp in a controlled batch).

Order Verification

Every order placed in the ERP lands here with a status of Pending before it can move toward dispatch. This is the checkpoint where Admin/Warehouse staff confirm an order is genuine and correct — wrong address, price disputes, out-of-stock items, and similar problems get caught here instead of after the courier has already been booked. Staff assigned to the "confirmation" desk see only this screen for their queue; a plain Executive who doesn't have full order visibility won't see other executives' orders.

The page has tabs — Pending, Approved, Rejected, Hold, Sent Back, and All — with a live count next to each. If you're an Admin/Warehouse user who can see everyone's orders, an Executive dropdown filter also appears so you can narrow the list to one executive's orders.

On each order card/row you get four action buttons (visible only while the order is Pending or on Hold):

  • ✅ Approve — the order is correct. It moves forward toward dispatch.
  • ❌ Reject — the order has a real problem. You must pick a reason (e.g. price dispute, stock unavailable) from a dropdown. Rejecting does not delete or cancel the order — it just sits in the "Rejected" tab and is never dispatched.
  • ⏸ Hold — you need more time or information before deciding. Pick a reason, add a remark, and optionally set a follow-up date/time to remind yourself. The order stays in your queue under the "Hold" tab — it does not go back to the executive.
  • ↩ Send Back — the executive who placed the order needs to fix something (wrong address, wrong item, etc.). Type what needs correcting; they'll see your note and can fix and resubmit it.

Clicking any of these opens a small popup where you fill in the reason/remark (and follow-up date for Hold) and hit Confirm.

An order marked "Sent Back" is waiting on the executive who placed it, not on you — it needs them to correct it and click 🔁 Resubmit, which drops it straight back into the Pending queue for you to look at again.
Reversing a Reject is a bigger deal than a normal decision. Only a Super Admin can undo a Reject (the order gets an "✅ Approve (Undo Reject)" button that only Super Admin sees) — this is deliberate, so a warehouse-level mistake on a genuine reject can't be casually overridden by just anyone.

Approval Queues

This screen (only visible to Super Admin) is where special-case requests wait for a human decision before they take effect. It has five tabs, each handling a different kind of request:

  • 🧑‍🌾 CRM Pending — new farmer/CRM records submitted by an executive that need review before being created.
  • 📜 History Approvals — a new order for a farmer who already has another order currently placed/shipped/out-for-delivery/RTO. The system won't create it automatically (to avoid double-booking the same farmer) — check the shown history, then Approve to create it anyway, or Reject/Send Back if it looks like a mistake.
  • ⚡ Conflict Queue — this farmer's mobile number's past orders mostly belong to a different executive than the one submitting this new order. It's held so the same farmer doesn't end up served/credited to two different executives by accident. Approve to let the new executive have it anyway, or Reject/Send Back to keep it with the original executive.
  • 🧑‍💼 ERP Access Requests — someone has requested a new ERP login. Approving creates the account and generates a mobile number (login ID) and password on the spot — these are shown only once, so copy and share them with the person immediately.
  • ⏱️ Stale Lead Reassignment — a lead (from WhatsApp, Facebook, or any auto-assigned source) that its assigned executive hasn't touched (no call, note, status, or follow-up change) within 3 hours of assignment. Approving hands it to the proposed executive — picked the same way new leads are normally distributed, i.e. whoever currently has the fewest.

For most tabs you have three actions per request: Approve, ↩ Send Back (asks the executive to correct something specific, without closing the request — a popup lets you type what needs fixing), and Reject (asks for a reason via a prompt). ERP Access Requests only offer Approve/Reject.

Below the pending list, a Sent Back panel shows requests currently waiting on an executive to correct and resubmit, and a Recently Resolved table shows the last 50 approved/rejected requests with who resolved them and any note left.

If you approve a Stale Lead Reassignment or a History/Conflict order and the underlying record has already changed (someone else acted on the lead, or the order is no longer valid) since the request was filed, the approval will fail safely with an explanation instead of silently overwriting what changed.

Invoice Approvals

Delivered orders don't get their invoice sent to the farmer over WhatsApp automatically — this screen is a deliberate manual checkpoint (Super Admin only for the actual send) where you review the list of delivered-and-paid orders that haven't had their invoice sent yet, then approve a batch to send.

By default the list shows only today's deliveries. Use the From/To date filters to reach older delivered orders that are still pending an invoice (the backlog doesn't show by default so it doesn't clutter this screen).

To send invoices: tick the orders you want (or use Select All), then click ✅ Approve & Send Selected. Once confirmed, the WhatsApp invoice messages are queued and sent automatically — there's no further per-order confirmation step after this.

Up to 75 orders can be approved in a single batch. If you select more, only the first 75 (still eligible at the moment you click Approve) are queued — approve the rest in a follow-up batch.
An order only shows up here if it's Delivered, has a payment status recorded, and hasn't already had this exact invoice message sent before — so an order can't accidentally get its invoice sent twice from this screen.

🤝 Referrals

What this page is for

The Referrals page tracks farmers who bring in new customers, and the commission they earn for each order placed through their referral. Every referral gets a unique Ref ID, and every order linked to that referral creates a commission record with its own Log ID.

Adding a new referral

  1. Open Farmer Referrals and fill in the Add New Referral form at the top: Farmer Name and Mobile are required; Father Name, Aadhar, Village/Area, District, State, Pincode, Referral Promise, Product Interest and Notes are optional but recommended.
  2. "Referral Promise" is a free-text field for whatever was promised to the farmer for referring (e.g. a discount, a gift, a cash incentive) — record it here so there's no dispute later.
  3. Click Save Referral. The system generates the next Ref ID automatically and stamps today's date as the referral date. The referral is recorded against the executive who is logged in when it is saved.

How commission gets added

Commission is not entered from this page. When a farmer places an order and the order is linked to a referral (done from the order entry screen by selecting the referral), a commission record is created automatically with the order's COD value and the commission amount entered at that time. It then shows up here against the referral, with its own Log ID and a link to the order.

Referral List and the summary cards

  • The three cards at the top show Total Referrals recorded, Orders via Referral (count of all commission entries), and Total Commission Paid across all referrals.
  • The list shows each referral's Ref ID, farmer, village/district, the executive who logged it, how many orders it has generated, and the commission total for that referral.
  • Click View on any row to open the full referral detail, including the farmer's address, referral promise, product interest, notes, and the complete order/commission history for that referral.
Commission totals only count orders that are still active. If an order tied to a referral is later cancelled or comes back as RTO, its commission is excluded from every total on this page — it still appears in the order history on the referral detail screen, but marked "Not payable" and greyed out, since the sale never actually completed.

Editing and deleting referrals

Editing a referral's details (name, mobile, village, district, state, pincode, referral promise, notes) and deleting a referral are admin-only actions. Regular executives can add new referrals and view the list, but cannot edit or delete existing ones.

Deleting a referral is permanent and removes it from the list entirely — there is a confirmation prompt before it goes through. Use this only for genuine mistakes (duplicate entries etc.), not to hide a referral that simply hasn't ordered yet.

💬 Team Chat

What this page is for

Team Chat is the ERP's internal messaging tool for staff — separate from the WhatsApp features used to talk to farmers/customers. It supports a Team Group (everyone), one-to-one Direct Messages, and custom Groups you create with selected teammates.

Rooms panel (left side)

  • Team Group — one shared room every active executive can see.
  • Direct Messages — every other active teammate is listed automatically; click a name to open a private 1-to-1 chat with them.
  • Groups — custom rooms you created or were added to. Click + New Group, give it a name, tick the teammates to include, and click Create. You are added to the group automatically along with whoever you selected.

Sending messages

  1. Open a room, type in the message box at the bottom, and press Send (or Enter).
  2. To attach a file, click the 📎 icon next to the message box and pick a file. It uploads immediately and appears in the chat as a message — images show as a thumbnail preview, other files (PDF, docs, etc.) show as a downloadable attachment. Files up to 10 MB are accepted.
  3. To reply to a specific message, click ↩ Reply under it — a preview of what you're replying to appears above the message box. Click the ✕ on that bar to cancel the reply before sending.

Reactions and deleting messages

  • Click the 👍 under any message for a quick "thumbs up" reaction, or click an existing reaction chip to add/remove your own reaction to it. Reaction counts are shown next to each emoji.
  • You can delete your own messages using the 🗑 icon (only appears on your own messages). A deleted message is replaced with "Message deleted" for everyone — it isn't fully removed from the thread.
Only the person who created a Group can delete it (the Delete Group button only shows for the group's creator, on that group's chat screen). Deleting a group removes it entirely for all members.
New messages appear automatically every few seconds while a chat room is open — there's no need to refresh the page. Opening a room also marks it as read for you, which is what clears any "unread" indicator elsewhere in the ERP.

👤 CRM / Leads

What this page is for

The Farmer CRM is where every lead/farmer record lives — from a fresh WhatsApp/Facebook lead to someone who has ordered many times. It's the main working screen for executives: search, filter, call, update status, set follow-ups, and jump straight to placing a New Order for that farmer.

What Status and Interest mean

These are two separate, independent fields on every lead:

  • Status — where the lead is in the pipeline, i.e. whether anyone has worked it yet: New Lead (just came in, untouched) → Contacted (called/messaged at least once) → Active (an ongoing conversation) → then either Converted (placed an order) or Lost (said no, stop chasing). Cold means not responding right now but still worth trying again later.
  • Interest — what the farmer actually said when spoken to, regardless of Status: High (ready to buy soon), Medium (interested but deciding), Low (mild interest), Not Interested (explicitly said no to the product).

Farmer list, search and filters

  • The five cards at the top (Total Farmers, New Leads, Active/Converted, Cold, Lost) reflect whatever filters are currently applied — not just the visible page.
  • Search box matches name, mobile, or lead code. Filters are available for Status, Interest, Source, Crop, and (for admins) which Executive a lead is assigned to, including an "Unassigned (Pool)" option.
  • The Order History filter narrows to farmers who Never Ordered, Have Ordered, are Repeat Customers (2+ orders), have a Delivered order, an order In Transit, or an RTO.
  • Sort by Newest First, Most Orders First, or Call Priority First (a system-calculated score shown as a badge — hover it to see why a lead was scored that way).
  • Each row shows the farmer's Orders/Delivered/RTO counts, last call time and total call count, and quick actions to Call, open WhatsApp, view Order History, Edit, or start a New Order.

Adding a new farmer

Use the Add New Farmer form at the top of the page. Name and Mobile are required; everything else (address, crop, land area, sales info, notes) is optional. Typing a Pincode auto-fills Division/District/State and offers a Post Office dropdown. Admins get an Assign To dropdown — a Super Admin leaving it blank keeps the new farmer unassigned (in the pool) rather than owned by anyone; a regular executive's new farmers are always assigned to themselves.

Editing a lead

  1. Click Edit on any row/card to open the Edit Farmer popup — this covers name, contact, full address, crop/land, Purchased/Product/Amount, Status, Interest, (admins only) reassignment, Follow-up Date/Time, and Notes.
  2. Click Save Changes to save everything in one submit — Status, Interest, follow-up, and notes can all be updated together without needing to visit a separate page.
  3. The 📋 Full Profile / Call Log → link on the popup opens the complete profile page with full order history, monthly order stats, and this farmer's call log.
A regular executive can only view/edit leads assigned to them — opening someone else's lead directly is blocked. Admins and Super Admin can see and edit every lead. Only admins can reassign a lead to a different executive, and a lead can never be assigned to a Super Admin account (Super Admin is an oversight role, not a working queue).

Calling and logging calls

Clicking a farmer's mobile number (or the 📞 Call button) dials out and automatically logs the call against that lead, updating their Last Call time and total call count. The 💬 WhatsApp button opens a chat with the farmer directly. The 📋 History link shows their full order history without leaving the page.

Bulk Import Farmers

  1. From 📥 Bulk Import Farmers, first download the template (an .xlsx with example data), fill it in Excel, then upload it as .xlsx, .xls, or .csv.
  2. Only the Mobile Number column is required — every other column (Name, Village, Tehsil, District, State, Pincode, Crop, Land Area, Notes, Lead Date) is optional and can be left blank or reordered, since the importer matches columns by their header name, not position.
  3. Lead Date accepts almost any format you'd naturally type (15/07/2025, "July 2025", etc.).
  4. Any row whose mobile number already exists in the CRM is automatically skipped — no duplicate farmer is created. The result message tells you how many were added vs skipped.
  5. A regular executive's import is assigned to themselves automatically. A Super Admin's import goes into the unassigned pool, ready to be allotted out via Lead Pool.
Always fill the template using its actual header row rather than pasting raw columns into a blank sheet — a mismatched or missing header for Mobile Number will reject the whole file.

Transfer Leads (admin only)

Use this when an executive leaves or needs their leads handed to someone else. Pick a From Executive to see all their leads with order history (Delivered/RTO/Cancelled) alongside a checkbox list, tick the ones to move, choose Transfer To, and submit. Only ticked leads move — the rest stay with the original executive.

Lead Pool (Super Admin only)

The pool is the set of leads with no executive assigned (e.g. from a Super Admin's bulk import, or leads sent back from an executive). Only Super Admin can access it.

  • Allot leads — enter how many leads to hand out and pick an executive; the oldest leads in the pool are allotted first, in a stable, predictable order (never random), so repeat allotments don't overlap.
  • Search the pool by name, mobile, village, or lead code, and browse the full pool list with pagination.
  • Return leads to the pool — pick an executive to see their leads (with order history), select which ones to pull back. Each returned lead gets a note recorded automatically, stating who previously had it and how many orders it had produced, so that history isn't lost once it's back in the anonymous pool.

Follow-up page

Lists every lead with a follow-up date/time set, for a chosen day (defaults to today). Overdue follow-ups for today are highlighted. Each row links to Update (opens the full edit profile) and Call. Non-admins only see their own follow-ups; admins see everyone's.

Call Log page

A day-by-day log of every call: the CRM's own tap-to-call clicks plus calls synced from the Android companion app (which also records real talk-time duration — CRM-click calls don't have a duration). Shows total calls, total talk time, and unique farmers called that day. Non-admins only see their own calls; Admin/Super Admin/Warehouse roles can see everyone's and filter by executive.

Automatic alerts while working leads

These pop up on their own across the ERP (not just on the CRM page) so a lead can't quietly sit ignored:

  • New Lead popup — appears the moment a fresh lead lands in your name (e.g. a live WhatsApp/Facebook ad lead), so it can be picked up within seconds.
  • Follow-up Due popup — pops up automatically the moment a lead's scheduled follow-up time arrives, showing the farmer's name, mobile, interest, and notes, with quick links to call or open the lead.
  • My Unattended Leads — the red 🔔 My Unattended Leads button on the CRM page (and an automatic nag every 15 minutes) lists every lead assigned to you that has never been touched at all since assignment (excluding ones already Converted or Lost) — a lead can't just sit forever because its one-time "new lead" popup was dismissed without action.
  • Escalated Leads (admin only) — on the WhatsApp Inbox toolbar, admins see Facebook/Instagram/Click-to-WhatsApp leads across all executives that have sat untouched for 30+ minutes, with the option to set a follow-up, confirm the order, or reassign the lead to someone else on the spot.
Deleting a farmer (admin only, "🗑 Delete") is permanent — there is no way to recover a deleted record. Use it only for genuine duplicates/mistakes.

🎯 Segments

What this page is for

A Segment is a saved filter over the CRM's leads/farmers — e.g. "New leads from Indore" or "High interest, Soyabin crop, not yet purchased". Instead of re-typing filters every time, save them once as a Segment, then pick that Segment as the audience when sending a WhatsApp campaign. This page is only visible to Admins and marketing-head executives (whoever has WhatsApp access).

Creating a segment

  1. Give it a Segment Name (required) — something that describes the audience, e.g. "Indore New Leads".
  2. Set any combination of filters: State, District, Source, Lead Status, Interest, Crop, Purchased (Yes/Not purchased), and a Lead Date range (From/To). Leaving any filter on "Any" means that field doesn't restrict the audience at all.
  3. As you change filters, the "X leads match" counter updates automatically (with a short delay) so you can see the audience size before saving.
  4. Click 💾 Save Segment.
The "Include only leads who have explicitly given marketing consent" checkbox exists for future use — as of now no lead in the CRM has a consent record, so leaving it checked will currently match zero leads. Leave it unchecked unless consent tracking has since been set up.

Editing and deleting a segment

  • Click the icon on any segment row to load its filters back into the form above for editing. The form switches to "Edit Segment: [name]" mode — make your changes and save. Click ✖ Cancel Edit to discard and return to creating a fresh segment instead.
  • Click the 🗑 icon to permanently delete a segment (with a confirmation prompt). This only deletes the saved filter — it does not affect the leads themselves.

Using a segment in a campaign

Click 📣 Send Campaign on any segment row to jump straight to the WhatsApp campaign screen with that segment pre-selected as the audience. The Matching Leads count shown in the segment list is live — recalculated from the current CRM data — so it reflects how many leads would actually be targeted right now, not a stale number from when the segment was created.

A segment is just a saved filter, re-applied fresh every time it's used — it is not a static snapshot of a list of leads. If new leads matching the filter come in later, or existing leads change status, the segment's matching leads (and its campaign audience) change automatically along with them.

⚡ CRM Triggers

What this page is for

CRM Triggers are "when X happens to a lead, automatically send WhatsApp template Y" rules. For example: automatically message every new Facebook lead a welcome template, or nudge a lead that's gone quiet for 5 days. This page is only visible to Admins and marketing-head executives (whoever has WhatsApp access).

Every trigger sends a real, paid WhatsApp template message via Meta — there is no free/unlimited option. That's why a Daily Limit is mandatory on every trigger, and why each trigger will message any given lead only once, ever — even if that lead keeps matching the condition day after day, it won't be messaged again by the same trigger. Triggers are checked automatically every 30 minutes, not instantly.

Creating a trigger

  1. Trigger Name — a label for your own reference, e.g. "Welcome new FB leads".
  2. When This Happens (Event) — pick one of three event types:
    • Lead status changes to — fires for leads whose Status equals the one you pick (e.g. "Contacted").
    • New lead comes in from this source — fires for leads whose Source matches the one you pick.
    • No activity on the lead for X days — fires for leads that have had no action recorded for at least that many days (and were created at least that long ago). Leads already marked Converted or Lost are automatically excluded from this one.
  3. 🎯 Lead Origin — filters which leads this trigger can ever apply to, based on how they entered the CRM, independent of the event condition above:
    • Any — Meta Ads leads and manually added leads, both.
    • Only leads that came from Meta Ads — the Facebook webhook tagged the lead with a campaign/adset/ad ID.
    • Only leads added/uploaded manually in CRM — everything else: manual CRM entry, bulk import, referral, etc.
  4. Send Template — choose from your approved WhatsApp templates (only templates already Meta-approved appear here; the language field fills in automatically once you pick one). If none appear, a template must first be approved under WhatsApp Hub → Templates.
  5. 💰 Daily Limit — the maximum number of messages this trigger is allowed to send in one day. Required on every trigger, no exceptions.
  6. Click 💾 Save Trigger. It's created active (ON) by default.

Reading the trigger list

Each trigger row shows its Event and Lead Origin conditions, the Template it sends, its Daily Limit, how many it has Sent Today and Sent Total (all-time), and Eligible Now — a live count of leads that currently match the trigger's condition and haven't been messaged by it before.

  • Click the ✅ ON / ⏸ OFF badge to toggle a trigger active or paused without deleting it.
  • Click 🗑 to permanently delete a trigger.
"Eligible Now" can be higher than the Daily Limit — that just means the trigger will only message up to the daily cap's worth of those leads each day it runs, working through the backlog gradually rather than sending everything at once.

🎫 Support Tickets

This page is the queue of customer support issues raised for farmers — mostly delivery complaints (wrong pincode, delayed parcel, damaged product) and India Post / courier problems that need someone to follow up. Every ticket links back to the related order and (where known) the farmer's lead record.

What you see by default

The page opens showing only tickets with status Open or In Progress — resolved/closed tickets are hidden automatically so the list only shows what still needs action. Three counters at the top always show the live count of Open, In Progress, and Resolved tickets regardless of what's currently filtered.

Filtering and searching

  • Search — matches against the farmer's name, mobile number, ticket number, or the order's tracking ID.
  • Status — leave on "Open + In Progress" for the normal working view, or pick a specific status (including Resolved/Closed) to look up something already handled.
  • Category — filters by the type of issue the ticket was raised under.

Working a ticket

Each ticket card shows the farmer's name and mobile, the linked order number (if any), and the original complaint description. For any ticket that isn't already Resolved/Closed, there's an update form at the bottom of the card:

  1. Pick a status from the dropdown — In Progress, Resolved, or Closed.
  2. Optionally type a resolution note — this is what gets saved and shown later as the record of what was done.
  3. Click Update.
In Progress = you're actively working on it. Resolved = the issue is fixed. Closed = no further action, ticket done — in the system Closed behaves exactly the same as Resolved (both stop showing in the default queue and both stamp a resolved date). Pick whichever one you'd naturally say to the farmer; there's no functional difference between them.

The first executive who updates a ticket's status is automatically recorded as its assignee if nobody was assigned yet — you don't need to manually claim a ticket first.

India Post tickets — special handling

When a ticket is tied to an India Post shipment, the card shows a highlighted "Ready reference for calling India Post" box with the tracking ID, the farmer's name/mobile, and India Post's IVR/Grievance phone number.

India Post has no complaint API — the only way to actually file a complaint with them is by phone, using this ready-reference box. For other couriers (e.g. Delhivery), the courier name and tracking ID are shown instead, since those complaints can usually be handled through the courier's own portal/app.

Once a ticket is Resolved or Closed

The update form disappears and is replaced by a simple line showing when it was resolved and the resolution note that was saved — this is the permanent record of how the issue was closed out. To reopen or re-check it, use the Status filter to find it again (it won't show in the default Open + In Progress view).

📊 Analytics & Reports

This section covers two related but separate screens: the main Analytics dashboard (sales figures, executive performance, RTO tracking) and the standalone Delivered Orders Report (a simple list of what was actually delivered in a date range). Both are admin-only.

Analytics dashboard — date range and executive filter

At the top you can set a Start date, End date, and optionally filter to one Executive. This filter applies to every tab on the page. If you don't set dates, it defaults to the last 30 days.

  • ⬇ Export CSV / ⬇ Export Excel — downloads the raw order list for the selected range (order number, date, executive, farmer, mobile, status, total, COD amount).
  • 📄 Download PDF Report — a formatted sales report for printing/sharing.

Overview tab

Shows headline numbers for the selected range: Total Orders, Dispatched, RTO (with RTO rate %), Revenue, Delivered, Pending, and Total Farmers. Below that:

  • Executive Performance — each executive's order count, revenue, and delivery rate as a bar, sorted by revenue.
  • Top Products — best-selling products by quantity in the range.
  • Low Stock Alert — any product (not counting combo/bundle products) with 5 or fewer units in stock. This box only appears when something is actually low.
"Revenue" on this dashboard only counts orders that have actually been dispatched (Shipped, Out for Delivery, or Delivered) — an order that's just Placed doesn't count toward revenue yet, even though its value is included in Total Orders.

Day-wise tab

A bar chart plus a table of orders and revenue per day across the selected range — useful for spotting which days were busiest or slowest.

RTO Orders tab

Lists every order in the range that came back as RTO (Return to Origin), with the COD amount lost and the RTO reason. Click an order number to open Farmer History (order + tracking status), or "View" to open the full order.

Delivered Orders Report

A separate, simpler screen reachable outside the main Analytics tabs — it lists orders by their actual delivered date, not their order date, which makes it the right tool for questions like "what got delivered today/this week" rather than "what was placed today."

  1. Set the From/To dates and click 🔍 Filter.
  2. The table shows Order #, exact delivered timestamp, executive, farmer, the products in that order, order total, and COD amount.
  3. Use ⬇ Download CSV to export the same list.
Because this report is keyed off the delivery date, an order placed weeks ago that only got delivered today will show up under today — it does not group by when the order was originally booked.

🚚 Delhivery Courier

The Delhivery Hub is where you interact directly with the Delhivery courier's API — tracking, labels, NDR (delivery-failure) actions, rate calculation, pickups, and editing/cancelling shipments. It's admin-only. There are two related tools reachable from the top of this page: the India Post Bulk Status Update tool, and the PIN-protected Delhivery Configuration screen.

Find Waybill by Order

Type an order number to look up its Delhivery waybill/tracking number, if one exists on that order.

Shipping Label

Type a waybill number and click Generate to pull the official Delhivery shipping label PDF for that shipment.

NDR Management

NDR = Non-Delivery Report, i.e. Delhivery couldn't deliver the parcel on an attempt. Enter the waybill and choose an action:

  • Re-attempt Delivery — tells Delhivery to try delivering again.
  • Reschedule Pickup — reschedules the pickup instead.

Shipping Cost Calculator

Estimates what Delhivery will charge for a shipment before you commit to it — enter origin/destination pincode, weight, payment type (COD/Pre-paid), mode (Surface/Express), and expected status (Delivered/RTO/DTO), then Calculate.

Schedule Pickup

Books a real pickup request with Delhivery for a given date, time, and package count.

This creates an actual pickup request with Delhivery — the page asks you to confirm before submitting because it can't be silently undone from here.

Edit Shipment

Lets you update a live Delhivery shipment's COD amount, weight, name, phone, or address by waybill number — only fill in the fields you actually want to change; blank fields are left as-is.

This modifies a real, already-created shipment on Delhivery's side — confirm the waybill is correct before submitting.

Cancel Shipment (API only)

This only cancels the shipment with Delhivery — it does NOT change the order's status inside the ERP. If you also need the order itself marked cancelled, use that order's own Cancel action separately.

Prefetch Waybills

Reserves a batch of waybill numbers from your Delhivery account quota ahead of time (up to 100 at once), useful if you need waybill numbers before shipments are actually created.

India Post Bulk Status Update

Reached via the 📮 India Post Bulk Status Update button at the top of the Delhivery Hub — despite living under this controller, it's actually for updating India Post (not Delhivery) tracking statuses in bulk, from data India Post has sent you outside the live tracking sync (e.g. an emailed report).

  1. Paste one row per line, comma-separated: Article Number, Event Code, Event Description, Event Office, Destination Office, Tariff, Booking Date. Only the Article Number and Event Code/Description are required — leave the rest blank if you don't have it.
  2. Click Process Update.

The system matches each article number to an order by tracking ID, updates its delivery status, and automatically detects RTO (Return to Origin) — both from an explicit RTO-type event code and from certain office names known to indicate a return (e.g. Kanadia, CJ-388, Scheme 140, BNPL Indore). If a row includes a tariff amount, it's saved once as a Post Office courier charge in Finance (never duplicated for the same article number).

After processing you'll see a summary: how many orders were updated, how many RTOs were detected, how many article numbers weren't found in the ERP, and how many courier charges were newly saved.

Configuration (PIN protected)

Shows the current Delhivery mode (Live/Staging), a masked preview of the API token, and the configured pickup location.

Delhivery's real credentials live in the server's environment file, not in this screen — this page is read-only and for reference/verification only. To actually change the API token, mode, or pickup location, that has to be done on the server itself.

📮 India Post Courier

The India Post Hub is where you manage the Speed Post / India Post courier integration — tracking sync, pincode lookup, tariff calculation, booking, labels, and the delivery tracking report. It's admin-only for the Hub itself, though the tracking report and dispatch actions are also available to Warehouse executives. If credentials haven't been set up yet, a warning banner points you to Configuration.

Real-Time Tracking Webhook

The Hub shows a webhook URL you give to India Post when registering their callback. Once active, delivery/status updates land on Orders automatically, a popup shows the moment a parcel is delivered, and the courier charge is logged into Finance automatically — no manual "Track" click needed. This only works once the app is on a server with a fixed IP that's been whitelisted with India Post.

In practice, India Post's webhook has never reliably fired for this integration. The scheduled background sync (which runs automatically every 15 minutes) and the manual "🔄 Sync All Now" button on the Orders page use the exact same logic and are what actually keeps tracking statuses current — don't rely on the webhook alone.

Pincode Search

Finds delivery post offices under a given 6-digit pincode — useful for confirming the Office ID needed for bookings.

Tariff Calculator

Estimates India Post's charge for a shipment: pick the product type (Speed Post, Business Parcel, 24hr/48hr variants), enter weight, optional dimensions and insurance, and source/destination pincodes.

Track Article

A live tracking lookup by article number — the same lookup used by the Orders page's tracking modal for Post Office shipments.

Book Order with India Post

Registers a booking against a barcode/article number you already have. Note that India Post's API does not generate barcodes for you here — you need one from your own allocated range first (see Configuration below for the one-click auto-barcode alternative used from the Orders page).

Before booking, make sure the order's weight and all three dimensions (length, width, height) are filled in. India Post's booking call is a one-time snapshot — whatever weight/dimensions are on the order at that exact moment get permanently recorded on their side. Editing the order's weight afterwards never reaches India Post (there's no "update shipment" API), so a booking made with missing details ships with a wrong or blank weight/dimensions forever.

India Post Bulk Status Update

Reached via the link near the top of the Hub — this tool actually lives under the Delhivery Hub's controller but is for India Post. See the Delhivery Hub manual page for the step-by-step; in short, you paste tracking rows (article number, event code/description, etc.) and it bulk-updates matching orders' delivery status, detects RTOs, and records India Post charges into Finance.

Delivery Tracking Report

A separate page (reachable from Orders → tracking report, or directly) that groups all orders for a chosen date range into India Post's own tracking stages — Booking, In Transit, Out for Delivery, Delivered, RTO, and so on. Use the quick-range buttons (Today, Yesterday, 7 Days, 30 Days, This Month) or a custom date range, then download as PDF or Excel.

Delivered and RTO ("Returned to Origin") are shown by their actual event date, not the order date — a parcel delivered today shows under today's report even if it was originally ordered weeks earlier. Every other stage reflects orders placed within the selected date range that are currently sitting at that stage.

Important: RTO no longer restores stock immediately

When India Post confirms a parcel is coming back (status = Returned to Origin), the order's status changes to RTO right away — but the product stock is deliberately not added back to inventory at that point. "Returned to Origin" only means the parcel is on its way back; it isn't physically in your hands yet. Stock only gets restored once someone actually scans the parcel in at the warehouse, using the separate 📱 Scan Parcel page. Until that scan happens, an RTO order will correctly show as RTO but will NOT yet have added its items back to available stock — this is expected, not a bug, and is the same rule for both India Post and the manual RTO path.

Configuration (PIN protected)

Where India Post API credentials and settings are managed:

  • API credentials — Username (your allocated India Post Customer ID), Password (default Dop@1234 unless India Post gave you a different one), Customer/Account ID, and API Base URL. You can also paste a token directly if you already have one.
  • Contract ID per Article Type — India Post issues a separate contract ID per service (Speed Post, Business Parcel, etc.); fill in whichever ones you actually use.
  • Barcode Number Range — the block of barcode numbers India Post has allocated to you, per article type. Once set, the "Dispatch via India Post" one-click action on the Orders page auto-generates the next valid barcode (with the correct check digit) with zero manual typing. Ask India Post's web team for your allocated prefix and start/end range if you don't already have it.
COD reconciliation (Articles Bill / delivery charges) already works today from Finance → Courier Charges and doesn't need anything on this Configuration screen — this page is specifically for the booking/tracking API used by the India Post Hub's tools.

📒 Accounting

This section is only visible to admin executives. It is the double-entry bookkeeping engine behind the ERP — every purchase bill, invoice payment, expense, vendor payment, and salary payment you record elsewhere in the system automatically creates entries here. You rarely need to touch it directly except to check balances or post a one-off manual entry.

The tabs

  • Chart of Accounts — the full list of ledger accounts (Assets, Liabilities, Equity, Income, Expenses), each with a code, name, group, and current balance. Click View Ledger next to any account to see its transaction history.
  • Ledger — pick an account and a date range to see every debit/credit line posted to it, with a running balance. Every vendor and every executive automatically gets their own ledger account, so you can look up "how much do we owe this vendor" or "how much have we paid this person" here.
  • Trial Balance — total debits vs total credits across all accounts as of a chosen date. A green "Books are balanced" badge means total debits equal total credits; a red "Out of balance" badge means something needs investigating.
  • Profit & Loss — total income vs total expense for a date range, with the resulting net profit or net loss.
  • Balance Sheet — Assets vs Liabilities + Equity as of a chosen date, including the current period's retained earnings. A green badge confirms the sheet balances (Assets = Liabilities + Equity).
  • Journal Voucher — where you post a manual entry (see below), and a list of the 30 most recent journal entries across the whole system, including auto-generated ones from purchases, payments, and payroll.

Posting a manual journal entry

Use the Journal Voucher tab for anything that doesn't already have its own screen elsewhere (e.g. correcting a mistake, recording a bank charge, an opening balance adjustment).

  1. Set the Date and, optionally, a Narration describing what the entry is for.
  2. For each line, choose an Account from the dropdown (grouped by Assets/Liabilities/Equity/Income/Expenses) and enter an amount in either the Debit or Credit column — not both.
  3. Use + Add Row if you need more than two lines. Remove a row with the ✕ button.
  4. Click Post Journal Entry.
A journal entry must have at least two lines, and total debits must equal total credits — the system rejects an unbalanced entry with an error instead of posting it. Rows where both debit and credit are left blank/zero are silently ignored, so leave unused rows empty rather than deleting them if you're unsure.

Where entries come from

Most journal entries you'll see under Recent Entries and in account ledgers are posted automatically by other parts of the ERP — recording a purchase bill, a vendor payment, an invoice payment, an expense, or a salary payment all create their own journal entries behind the scenes. You don't need to duplicate those here; use Journal Voucher only for entries that don't have a dedicated screen.

Accounting is admin-only. If a non-admin executive tries to open this page, the system blocks access. If your books show "Out of balance" on the Trial Balance tab or an unbalanced Balance Sheet, that's a sign of a data problem — check recent manual journal entries first, since auto-posted entries from bills/payments/payroll are always balanced by design.

🧾 Purchases & Vendors

This section is only visible to admin executives. It covers buying stock from vendors: recording vendor details, purchase bills, and payments made to vendors. Every purchase bill you save here automatically increases stock for the products on it and posts entries to Accounting — you don't need to update stock separately.

Vendors

Add a vendor before you can record a bill against them. Fill in the Vendor / Company Name (required) plus optional Contact Person, Mobile, Email, GSTIN, and Address, then Save Vendor. Saving a vendor automatically creates a ledger account for them in Accounting, so their balance due always reflects actual bills and payments.

The Vendors table shows each vendor's current Balance Due (red if they're owed money, green if settled) and a 📒 Ledger link that jumps to their full transaction history in Accounting.

Purchase Bills

This is where you record stock coming in from a vendor.

  1. Enter the Bill / Invoice No (must be unique — the system will reject a duplicate), Bill Date, and select the Vendor.
  2. For each product received, add a row: pick the Product (its current stock is shown next to the name), Qty, Rate, and GST %. Selecting a product auto-fills its last purchase rate and GST rate, which you can override. Use + Add Product for more items.
  3. Line totals, subtotal, GST, and grand total calculate automatically as you type.
  4. Click Save Bill.
Saving a purchase bill immediately: adds the quantity to that product's stock, updates the product's Buy Price to the rate entered and its Last In Date, logs the movement in the stock log, and posts a Purchase entry in Accounting (debiting inventory/GST input, crediting the vendor). This all happens together — you cannot save a bill without it updating stock and the books at the same time.

Editing or deleting a bill reverses its stock and ledger effect first, then (for edits) re-applies the new item list. In practice this means: if you edit a bill's quantity from 10 to 15, the system first removes the original 10 from stock, then adds back 15 — so stock ends up correct even if you change products entirely between the old and new version. Deleting a bill removes its stock and ledger impact entirely.

A bill that already has a payment recorded against it cannot be deleted — you must delete the payment(s) first. This is a safeguard so a paid bill's history can't disappear while money against it is still on record.
Behind the scenes, stock updates now lock the product row while a bill is being applied or reversed, so two people saving/editing/deleting bills for the same product at the same moment can't corrupt the stock count. This is an internal safety improvement made to protect stock accuracy under concurrent use — it doesn't change anything about what you see or do on screen.

Vendor Payments

Use this tab to record money paid out to a vendor.

  1. Select the Vendor — their current balance due shows in the dropdown.
  2. Optionally select a specific Against Bill to apply the payment to (or leave as "General / On Account" for a payment not tied to one bill). The bill dropdown only lists that vendor's unpaid/partially-paid bills.
  3. Enter Date, Amount, Payment Mode, and optional Reference No / Notes.
  4. Click Save Payment.
If you pick a specific bill, the payment amount cannot exceed that bill's remaining balance due — the system will reject it with an error rather than overpay a bill. Saving a payment posts it to Accounting and, if tied to a bill, updates that bill's Paid/Due amounts and status (Unpaid → Partial → Paid) immediately.

Deleting a payment from the Payment History table reverses its ledger entry and, if it was tied to a bill, subtracts it back out of that bill's amount paid.

💰 Payroll

This section is only visible to admin executives. It handles executive salaries — setting each person's monthly salary, running payroll to accrue what's owed, and recording the actual payments made to them.

Salary Setup

This tab lists every executive with their role, mobile number, current Monthly Salary, and Salary Due (unpaid balance across all their salary records). To set or change someone's monthly salary, type the amount in the box next to their name and click Save. Leaving it blank means they have no salary configured and will be skipped when payroll is run.

The 📒 Ledger link (once an executive has a ledger account) opens their full salary transaction history in Accounting.

Run Payroll / Records

Use Run Payroll for a Month to generate salary records for a period:

  1. Pick the month/year and click Run Payroll.
  2. The system creates one salary record for every active executive who has a monthly salary set on the Salary Setup tab, using that salary amount.
  3. Each new record automatically posts a ledger entry: Debit Salary Expense, Credit that executive's salary payable account.
Running payroll is safe to click more than once for the same month — an executive who already has a salary record for that period is skipped, not duplicated. The confirmation message tells you how many records were created vs. skipped.

The Salary Records table below shows every record with Amount, Paid, Due, and status (Unpaid / Partial / Paid). From here you can:

  • ✏️ Edit a record — e.g. to add a bonus or a deduction for a specific month. Editing reverses the old ledger entry and posts a new one for the updated amount; use the Notes field to explain why the amount was changed.
  • Delete a record — reverses its ledger entry entirely.
A salary record that already has payments against it cannot be deleted — delete the payment(s) first. This prevents a paid month's history from disappearing while a payment against it still exists.

Salary Payments

Use this tab to record an actual payment made to an executive.

  1. Select the Executive — their total salary due shows in the dropdown.
  2. Optionally pick Against Month to apply the payment to a specific salary record (only their unpaid/partially-paid months are listed), or leave it as "General / On Account".
  3. Enter Date, Amount, Payment Mode, and optional Reference No / Notes.
  4. Click Save Payment.
If a payment is tied to a specific month, the amount cannot exceed that record's remaining balance due — the system rejects an overpayment with an error. Saving a payment posts it to Accounting immediately and, if tied to a record, updates that record's Paid/Due amounts and status.

Deleting a payment from Payment History reverses its ledger entry and, if it was tied to a specific month, subtracts it back out of that record's amount paid.

🏦 Finance

Finance is only visible to admin executives, and is additionally locked behind a 4-digit PIN. It's the money control center: what's actually been received (not just ordered), expenses, courier reconciliation, invoices, and GST filing.

PIN Lock

The first time you open Finance in a session, you're asked for a 4-digit PIN. Enter it on the "Enter Finance PIN" screen to unlock. Once unlocked, a 🔒 Lock button appears at the top of every Finance tab — click it any time to re-lock the section immediately (useful before handing the device to someone else). The PIN itself is set from Settings, not from here.

If no PIN has ever been set in Settings, Finance opens directly without asking — set a PIN in Settings to require it going forward.

Overview

The default tab. Use the date range fields at the top (and Apply) to pick the period you want to see. Four figures are shown:

  • COD Income Received — money actually posted to the ledger as received in that period (based on the date the payment was recorded, not the order date).
  • Expenses — total of all expenses logged for the period.
  • Courier Charges — total courier/delivery charges for the period.
  • Gross Profit — COD Income minus Expenses minus Courier Charges.

📄 Download Finance Report PDF exports the same figures for the selected range as a PDF.

If any delivered orders still have no payment status recorded, a warning banner appears here. If some of those are overdue by 3+ days, it links straight to the Payment Reminders tab.

Expenses

Use Add Expense to log a business expense — date, category, description, amount, payment mode, and an optional transaction ID. Saving it immediately posts a matching entry to Accounting (debit the expense category, credit the payment mode account). The table below lists every expense in the selected date range, with a Delete option per row (this also reverses the ledger entry).

Income (Remittance)

Labeled "Income" tab — this is where COD money actually received from a courier gets recorded manually (as opposed to the bulk courier uploads described below).

Enter the order's Tracking ID / waybill as the Reference Number. When it matches an order, that order is automatically recognized as a sale in Accounting — an order only counts as "sold" once its COD payment is actually received, not just when it's dispatched.

A given Reference Number can only be used once — the system blocks a duplicate entry rather than double-counting the same remittance.

Courier Uploads

The Courier Charges tab has four bulk-upload cards for reconciling courier export files, plus a manual entry form and a running list of courier charges for the period.

  • 📮 Post Office COD Bill (upload the India Post Articles_Bill_COD*.xlsx) — matches each row to an order by Article Number/tracking ID, records the COD amount received, books the commission as a separate courier charge, and marks the order paid.
  • 📦 PO Delivery Charges (upload India Post's Type 3 (exported_data)*.xlsx) — matches each article's delivery tariff to an order and books it as a courier charge.
  • 🚚 Delhivery COD Remittance (upload remittance_transactions_export*.csv) — only rows marked "Delivered" are processed; matched by Order Number or Waybill, and the order is marked paid.
  • 🧾 Delhivery Charges (Invoice) (upload Delhivery's per-shipment Invoice CSV) — the delivery charge, RTO charge, and COD commission are booked together as one courier charge per waybill; only waybills that already match an ERP order are accepted.
All four uploads are safe to re-run on the same file or an overlapping one — a row that was already reconciled just gets updated, it is never double-counted or double-posted to the ledger. Rows that don't match any ERP order are silently skipped and reported in the "X skipped (no matching order)" count after upload.

You can also add a courier charge manually below the upload cards if you don't have an export file for it.

Products — Order Value

Shows every product's Buy Price, Sell Price, quantity sold, order value booked, cost, and gross margin. You can edit a product's Buy Price, HSN Code, and GST% directly in this table and click Save — these are used for invoice GST calculations.

"Order Value Booked" here counts every order the moment it's placed, whether or not payment has actually been received — it is not the same figure as "COD Income Received" on the Overview tab. Use Overview for confirmed income, this tab for margin/GST setup.

Invoices

Invoices are generated per order, from the order's own detail page ("Generate Invoice" link), or by entering an Order ID directly on the GST tab's "Generate Invoice" box. An invoice is only available once an order's payment has been received — attempting to view/download one before that is blocked. Two invoice types are issued automatically depending on the order:

  • Tax Invoice — issued once payment is received; gets a permanent invoice number.
  • Bill of Supply / Proforma or Cancelled — shown for orders that are cancelled/RTO'd, or not yet paid.

From the invoice page you can 🖨️ Print / Save as PDF (browser print) or 📄 Download PDF directly.

On the GST tab, Bulk Invoice Download lets you generate a single PDF containing every paid order's invoice in a date range (max 75 orders per run — narrow the date range if you have more), plus a separate Download Invoice Details (Excel) export listing every line item with invoice number and payment status.

GST

Also on the GST tab:

  • GSTR-1 Export — downloads an Excel file in the GST offline-tool format for the selected date range (paid orders only), ready to send to the GST portal or your CA.
  • Company GST Settings — your registered company name, GSTIN, address, state, PAN, phone, email, and bank details used on every invoice. A checkbox here enables automatic monthly GST export: on the last date of each month (after 9 PM), the GSTR-1, Invoice Details, and all Invoice PDFs are generated and emailed automatically, with a reminder every 4 hours until someone downloads them.
  • CA Mail Recipients — add the accountant's email as a To recipient (required for the monthly mail to go out at all) and anyone else as CC/BCC.
  • Monthly GST Exports — a history table of every auto-generated monthly export, its download status, how many reminders were sent, and whether the CA mail has gone out. Download GSTR-1 / Details / Invoices from here at any time.
Downloading any one of the three files in a monthly export bundle marks the whole bundle as "seen," which stops the reminder emails — you don't need to download all three to silence the nagging.

RTO & Payment Reconciliation

Shows the latest 500 dispatched orders and what happened to each: payment received (and when), returned to origin/RTO (and when), or neither yet. Orders that are neither paid nor RTO'd are flagged "⚠️ Pending" and counted in a warning banner at the top — check these regularly, since money may be stuck with the courier.

This tab always shows the latest 500 dispatched orders regardless of the date range filter at the top of the page — the date filter does not apply here.

Payment Reminders

Lists delivered orders whose payment has been pending 3+ days. For each, click 💬 Remind to open a pre-filled WhatsApp message to the farmer, then ✓ Mark Reminded to log that a reminder was sent — the order then drops off this list until its payment status actually changes (it isn't a snooze; it just avoids you re-sending needlessly on the next visit). This tab also always shows every currently-overdue order regardless of the date range filter.

⚙️ Settings

Settings is only visible to admin executives (a few actions — editing another admin, promoting to Super Admin, and marking someone on leave — are Super Admin only, noted below). It's the control panel for the whole ERP: who can log in and what they can see, the dropdown lists used across the app, WhatsApp message templates, lead-source integrations, the daily report email, and the careers/hiring popup.

General

Three things live here:

  • Security PIN Lock — set or change the 4-digit PIN that gates Finance, Products P&L, and the Delhivery/India Post configuration screens. Enter a new PIN and confirm it, then Save PIN. If a PIN is already set, a Remove PIN button appears to turn the requirement off entirely.
  • Post Sales to Accounting Ledger — a one-time (but safe to re-run) catch-up button that posts any already-paid order or Finance entry that predates ledger tracking into Accounting. Entries already posted are skipped, never duplicated.
Forgetting the Finance PIN is not a lockout — just set a new one here, no need to know the old one.

Executives

Manage every login account for the ERP.

  1. Add Executive — fill in Name, Mobile (used to log in), Email, Password, Role, and optionally a Desk. Tick which pages (Page Access) this person can see; by default all are checked. If you're a Super Admin, you can also set individual Admin Permissions (export orders/farmers, permanently delete leads, transfer leads) — these only apply when the role is Admin.
  2. The Executives table lists everyone with role, desk, active/inactive status, and (for Super Admins) leave status. Click Edit to open an inline row for changing any of these, including resetting a password.
  3. 🗑 Delete (Access) does not delete the person or their history — it only disables their login. All their orders, leads, and activity history stay completely intact. Use ✅ Restore Access to re-enable login later.
Roles: Executive and Warehouse are regular staff; Marketing Head is WhatsApp-only access; Admin gets broad access; Super Admin is the only role that can create/edit other Admins or Super Admins, and the only one that can mark someone on leave. A plain Admin cannot edit another admin's account or promote anyone to Super Admin.

Mark On Leave (Super Admin only) opens a date-range popup — the executive is excluded from new lead assignment for every day in that range. If they return early, use 🏖️ On Leave — End Now on their row to re-enable them immediately instead of waiting out the original range.

Dropdown Options

One option per line, per list. These control the reason/category dropdowns used throughout the ERP — order reject/hold/cancel/RTO reasons, expense categories, and payment modes. Edit the text areas and click Save Dropdown Options. Leaving a list completely empty resets it back to the system default rather than saving it blank.

WhatsApp Templates

One message per event that powers the floating WhatsApp button available on every ERP page. Use {name} in the text as a placeholder — it's automatically replaced with the farmer's name when the message is sent. Edit any template and click Save WhatsApp Templates.

Lead Sources (Facebook, IndiaMART & more)

Four integrations live on this tab:

  • Facebook Lead Ads Setup — connect a Meta Lead Ads form so new leads flow straight into the CRM, auto-tagged "Facebook Lead Ad" and rotated between active executives. Copy the Webhook Callback URL and Verify Token shown here into your Meta App Dashboard (Webhooks → Page), and subscribe to the "leadgen" and "messages" fields. Paste a Page Access Token, optional Facebook Page ID, Instagram Business Account ID, and Ad Account ID, then Save Facebook Settings. A "Marketing Hub Readiness" panel shows which permissions (Page Posting, Messenger Inbox, Ads Dashboard, Instagram) are actually working with the current token.
    Also add the App Secret (Meta App Dashboard → Settings → Basic) — without it, anyone who discovers the webhook URL could send fake "new lead" requests straight into the CRM.
  • Facebook Conversions API — enter a Dataset ID from Meta Events Manager so every Facebook lead automatically reports a "Lead" event back to Meta, helping its ad delivery optimize toward people who actually convert. 🧪 Send Test Event confirms the connection is working.
  • IndiaMART — leads are pulled on demand (not pushed automatically) using a CRM Key from the IndiaMART seller panel (Lead Manager → CRM Integration). Save the key, then click 🔄 Sync Now whenever you want to pull in leads received since the last sync. "Last synced" shows when that last happened.
  • Other Lead Sources (Google Ads, JustDial, a website form, etc.) — add a source name to generate its own secret webhook URL. Whoever configures that platform posts lead data (name/mobile/email/city/state/notes) as JSON to that URL. Remove a source to immediately disable its webhook.

Daily Report Email

Configures an automatic daily summary email — today's delivery tracking plus the same Sales Report available from the Dashboard, sent as a PDF attachment. Set the Send From address, Send Time, and one or more comma-separated Send To addresses, then tick Enable daily report email and save. 📤 Send Report Now sends an on-demand copy immediately with today's current numbers, without affecting the regularly scheduled send.

If the ERP's outgoing email isn't configured yet, a warning banner appears here saying reports will be generated but not actually delivered until real email credentials are set up on the server.

Careers/Hiring

Controls the "We're Hiring" popup shown to website visitors and the homepage Apply button. Toggle it on/off, choose a Type, an optional Auto-stop Date (after which it stops showing itself), a Popup Title and short Message, an optional custom Apply Link (leave blank to use the built-in application form), and an optional popup image. Applications submitted through it land in ERP → Recruitment → Applications, which is Super Admin only.

Activity Log

A separate page (reached from the main menu, not a Settings tab) showing a running audit trail of actions taken across the ERP — order creation, dispatch, cancellations, RTOs, CRM saves, logins/logouts, settings changes, calls, and WhatsApp sends. Filter by user, action type, and date range. The summary panel at the top shows a per-user activity count; the table below lists the latest 300 matching entries with timestamp, user, role, action, details, and the page it happened on.

📋 Recruitment / Careers

This page lists everyone who has applied for a job through the public Careers form on the website. It is separate from the CRM/Leads screens because job applicants are not customers or farmer leads — they're people applying to work at Bhumija Elevate.

This page is restricted to the Super Admin login only. Other executive roles will not see "Recruitment" in the menu, and will get an access-denied error if they try to open this page directly.

Viewing applications

The main table shows every application: Name, Mobile, Email, Type (the job category they applied for), Qualification, Experience, Resume, and when they applied.

  • Click View next to Resume to open the applicant's uploaded resume file in a new tab. If it shows "—", no resume was attached.
  • Use the Search box to find an applicant by name, mobile number, or email.
  • Use the Type dropdown to filter to a specific job category.

Editing an application

Click Edit on any row to correct or update an applicant's details — name, mobile, email, location, qualification, experience, or job Type. This is useful when an applicant calls in with a correction, or when staff want to reclassify which role they should be considered for. Click Save to apply the change.

Deleting applications

There are two different levels of delete, and the difference matters:

  • Delete — removes the application from the main list, but it is not gone. It moves into a recoverable "trash" state and can be brought back at any time.
  • Show Deleted — click this button (top of the list) to switch the table to show only deleted applications. From here you can:
    • Restore — brings the application back to the active list, exactly as it was.
    • Permanent — deletes it for good. This also deletes the resume file from the server. This action cannot be undone, and the system will ask you to confirm before proceeding.
Use "Delete" for day-to-day cleanup of applications you're done with (rejected, position filled, etc.) — it's safe and reversible. Only use "Permanent" delete once you're certain an application (and its resume file) will never be needed again, e.g. to clear out very old rejected applications and free up space.

📱 WhatsApp Business API & Bot Config

WhatsApp Hub is where the WhatsApp Business connection, the auto-reply bot's content, message templates, and bulk marketing campaigns are all configured. It's one tabbed page — click the tab buttons near the top (Templates, Campaigns, Bot Manage, Send Test, Messages, Pricing, Connection & Setup) to switch sections; nothing reloads the page. The "Send Campaign" page you may reach separately (via a bookmarked link) simply redirects here, opening the Campaigns tab.

Access to this page is limited to Admin and Marketing Head roles. Editing the actual API credentials (Phone Number ID, WABA ID, Access Token) under Connection & Setup is limited further, to full Admins only — Marketing Head can do everything else (templates, bot content, campaigns) but not touch the connection itself.

At the top of the page you'll always see a hero strip showing the connected WhatsApp Business name, phone number, and quality rating, plus four quick stats: today's estimated spend, this month's estimated spend, messages sent today, and messages failed today.

Settings (Connection & Setup tab)

This tab holds everything about the underlying Meta connection:

  • Connection Status — shows the linked business name, phone number, quality rating, and verification status pulled live from Meta.
  • Inbound Messages Webhook — the Callback URL and Verify Token that must be pasted into Meta's App Dashboard so replies and new contacts reach the CRM Inbox. There's also a Subscribe Now button — pasting the webhook URL alone is not enough, the WhatsApp Business Account also has to be explicitly told to send this app its events. If messages aren't arriving even though the webhook looks configured, this is almost always the fix.
  • Credentials & Estimate Rates (full Admin only) — Phone Number ID, WABA ID, Meta App ID (needed only for photo/JPG templates), and the Access Token. Also sets the ₹/message estimate rates used for the "Est. Spend" figures shown at the top of the page — these are our own internal estimate, not Meta's actual bill.
The "Est. Spend" numbers are calculated in-house from the rates you enter here, not fetched from Meta. For Meta's own estimate of real billing, use the "Sync Real Pricing" button on the Pricing tab — and for the authoritative invoice/balance, only Meta Business Manager's own Billing Hub can be trusted.

Templates

Every WhatsApp message this system sends outside of a live conversation — order confirmations, dispatch alerts, offers — must go through a pre-approved Meta template. Templates are created here and submitted to Meta for approval, which usually takes a few minutes to a few hours.

  • Click + Create New Template, fill in the Template Name (lowercase, underscores only), Category (Utility for order updates, Marketing for offers/promotions, Authentication for OTP), Language, an optional Header (text or photo), and the Body Text. A live preview on the right shows how it will look on WhatsApp as you type.
  • To personalize the message per recipient, click the "+ Variable 1 / 2 / 3" buttons to insert placeholders into the body — these get replaced with each recipient's own value when sent (like mail-merge). The first or last word of the message cannot be a variable — there must be real text before and after it, or Meta will reject the template.
  • Up to 3 optional Buttons can be added (quick reply, website link, or phone number).
  • Click Sync from Meta any time to pull the latest approval status, or to bring in templates created directly on Meta's side.
  • Each template row can be Edited (body/header/buttons — this resubmits it to Meta for re-approval), Hidden, or Deleted.
"Hide" (visibility toggle) is different from "Delete". Hiding just removes a template from the Campaign and Send Test dropdowns here in the ERP — Meta still has it. This exists because our access token doesn't have permission to delete templates from Meta directly for some accounts; if "Delete" fails with a permission error, use "Hide" instead and remove the template manually from Meta Business Manager if needed.

Bot Menu (Bot Manage tab)

This is where you control what the WhatsApp auto-reply bot says and shows when a farmer messages in. It's split into a few blocks on the same tab:

  • Bot Offer / Discount Text — the message (plus an optional photo) shown when a customer taps the bot's "View Offers and Discounts" option. There's no separate offers system — this is a single free-text field with an image.
  • Bot Menu — Turn Options On/Off & Order — the bot's 8 built-in main menu options are listed here. Untick a box to remove that option from the menu entirely; use the ↑ / ↓ buttons to reorder — whichever is on top becomes option "1" in the menu the farmer sees. Click Save Menu when done.
  • Bot Menu — Add/Delete New Option — lets you add a custom menu option beyond the 8 built-in ones, with your own title, short description, and reply text the customer receives when they tap it. Custom options only appear if there's room left within WhatsApp's hard limit of 10 menu rows, after the built-in options.

Products (Bot Manage tab)

The Products block on Bot Manage shows every product as the bot will present it — name, category, price, and live stock (synced straight from the ERP, always accurate). For each product you can:

  • Add/Change WhatsApp Photo — upload a photo specifically for what WhatsApp customers see. This is independent of the product's normal Stock photo — changing one never affects the other. If no WhatsApp-specific photo is set, the Stock photo is used as a fallback (shown with a small "Stock photo (fallback)" tag).
  • Edit — jumps to the full product edit page in Stock for anything beyond photo/description.
  • Add/View/Edit Details — a short Description and a Dose/Quantity field shown to the customer alongside the product in the bot (e.g. "25 ml/15L paani"). This is separate from the main product edit page, kept here for convenience.
  • Delete — permanently removes the product (and it disappears from the bot too). This is the same delete as removing it from Stock.

Categories (Bot Manage tab)

Controls how products are grouped when a farmer browses by category in the bot.

  • Add — create a category name ahead of assigning any product to it, so it's visible in the list immediately (useful when planning ahead).
  • Rename — renames the category across every product that currently has it, in one go.
  • Hide / Show — a hidden category no longer appears as its own entry in the bot's category list; its products fold into an "Others / Various" bucket instead — they're never actually removed from being orderable.
  • Delete — removes the category outright. Products that had it are not deleted — only their category field is cleared, so they land in "Others" rather than disappearing.

Opt-outs (Campaigns tab)

The "Opted-Out / Suppressed Numbers" panel at the bottom of the Campaigns tab lists mobile numbers that must never receive a marketing campaign. A number lands here either automatically (it replied "STOP" to a message) or manually — use the Suppress form to add a number yourself, e.g. when a farmer asks over a phone call rather than by texting STOP. Click Remove on any row to re-include that number in future campaigns.

Opt-outs only block marketing campaign sends. Transactional messages — order confirmation, dispatch, delivery — still reach an opted-out number, since those aren't marketing.

Campaign History

Also on the Campaigns tab, this table lists every campaign that has been sent — grouped by campaign name and template — showing when it went out, total recipients, how many failed, and the estimated cost. Click Export CSV to download the complete history (the on-screen table is capped at the 50 most recent).

Send Campaign

This is the main bulk-send form on the Campaigns tab, built in two steps:

  1. Message — give the campaign a name (for your own record-keeping, shown in History), and pick an approved Template. Only templates Meta has approved (and that aren't Hidden) are selectable. If the template has variables, fill them in — if sending to CRM leads and the first variable is left blank, it's automatically filled with each farmer's own name. If the template has a photo header, a public image URL must be supplied (the template's original approved sample photo is not reused automatically on every send).
  2. Audience — choose one of three ways to pick recipients:
    • Select from CRM — tick individual leads from a filterable, searchable list (filter by status, interest, source, or consent).
    • Upload / Paste Numbers — paste 10-digit mobile numbers (one per line or comma-separated) or upload a .csv/.txt file.
    • Use a Segment — send to everyone matching a saved Segment (create/manage segments on the separate Segments page). Leads without marketing consent are automatically excluded here.
  3. Click Send Campaign. Messages are queued and go out over the next minute or two, not instantly — check the Messages tab or Campaign History to follow status.
A single campaign send is capped at 500 recipients. Numbers that opted out (or are on the manual suppression list) are automatically skipped and don't count against your selection — you'll be told how many were skipped. If everyone selected has opted out, the send is blocked entirely with an explanation.

Send Test

Use this tab to send a single template message to one mobile number before running a full campaign — useful for checking how a template actually renders on a real phone. Enter the recipient's number, pick an approved template, fill in any body parameters (comma-separated, in order), and supply a header image URL if the template needs one.

Messages (log)

A running log of every WhatsApp message sent through the system (template, campaign, or transactional) — date, recipient, template used, category, delivery status, estimated cost, and who/what triggered it. Failed sends show the error reason underneath the status badge.

Pricing

Two different numbers live here, and it's worth knowing the difference: the "Est. Spend" figures shown across the page are our own in-house estimate (messages sent × the rates you set under Connection & Setup). This tab additionally lets you Sync Real Pricing (Last 30 Days) directly from Meta, which is Meta's own approximate figure by message category — closer to the truth than our estimate, but still not the authoritative invoice. For the actual bill/payment history, only Meta Business Manager's Billing Hub can be relied on.

🌳 Bot Flow Builder

This is where you control what the WhatsApp bot says and does at each step, without needing a developer. There are three parts to it: editing the wording of the 8 built-in menu options, building brand-new custom menu options with your own branching conversation on a visual canvas, and analytics showing where farmers drop off inside a flow.

The bot's core logic — placing orders, checking payment, tracking, escalations — is hardcoded for safety and can never be broken from this screen. What you're editing is either wording (for the 8 built-in options) or a genuinely new, self-contained menu option (for custom flows). You cannot accidentally take down order-taking or payment handling from here.

The Bot's 8 Main Options

Every farmer who messages the WhatsApp bot sees the same 8 tappable options: Crop Problem, New Order, Offers, Track Order, Delivery Complaint, Complaint, Product Price, Talk to Executive. Their underlying behaviour (what data gets pulled, what happens next) stays fixed — but you can freely edit exactly what the bot says at each step: the prompts, confirmations, and error/retry messages.

Click ✏️ Edit Bot Messages to open this editor. Each of the 8 options is shown as its own diagram — a strip of connected steps from top (farmer taps the option) to bottom (flow ends). Each step is a colored circle plus a card:

  • 💬/✉️ blue card — the bot sends a plain message.
  • ❓ purple card — the bot asks a question and waits for the farmer's reply.
  • ⚠️ small red card — a retry/error message shown when the farmer's reply wasn't understood (e.g. invalid mobile number, product not recognised).
  • ⚙️ gold card — a background action (like creating a support ticket) with no message of its own — these are not clickable, purely descriptive.
  • 🏁 dark card — the flow ends (back to the main menu, or handed to a human).

Only the white cards with actual text are clickable. Click one to open an editor popup, change the wording, and click 💾 Save — the new wording goes live immediately. A small dot next to the step's title means it's currently different from the factory default. Click ↺ Reset to Default in the popup to put the original wording back.

Some messages contain placeholders like {this} that the bot fills in automatically (farmer name, order number, price, etc.) — don't delete these when editing, or the message will look broken to the farmer.

Custom Flows (Visual Canvas)

Beyond the 8 built-in options, you can add entirely new tappable menu options with your own conversation logic — useful for things like a seasonal scheme, a survey, or a promotional flow that doesn't fit any existing option.

On the main Bot Flow Builder page, use ➕ Create New Flow: give it a Title (max 24 characters — this is literally the button text the farmer sees in the WhatsApp menu) and an optional Description (max 72 characters), then click 🔀 Create Flow. This opens the canvas editor for your new flow.

On the canvas, build the conversation by adding nodes from the toolbar and connecting them:

  • ✉️ Message — bot sends text (and optionally an image) and moves straight to the next node.
  • ❓ Question — bot sends text and waits for the farmer's reply before moving on.
  • 🔀 Condition — branches based on a keyword in the farmer's reply: if their answer contains a chosen keyword it follows that branch, otherwise it falls through to the Default path.
  • 🙋 Handoff — hands the conversation over to a human executive.
  • 🏁 End — the flow finishes and the farmer sees the main menu again.

Drag a node by its colored header bar to reposition it. To wire two nodes together, use the connect button on the source node and then click the node you want it to point to. Every flow needs exactly one node marked ⭐ Start — that's the node that runs first when a farmer taps this menu option. Use the zoom controls (top right) to zoom in/out or reset the canvas view on a busy flow.

Click 💾 Save Flow to save your changes — nothing is saved until you click this. Deleting a node (the × on its header) also removes any connections pointing to it.

Nothing you build in a custom flow can touch order-taking, payment, or tracking logic — those stay entirely inside the 8 built-in options. Custom flows are self-contained conversations layered on top.

On the main Bot Flow Builder list, each custom menu item shows whether it has a flow built yet ("✅ Flow built (N nodes)" vs "— Fixed reply only"). Use 🔀 Edit Flow to reopen the canvas, or the 🗑 button to delete the whole menu item and its flow (this cannot be undone).

Flow Analytics

For any custom flow that has real usage, click View Analytics → (shown inline on the Bot Flow Builder list once a flow has at least one run) to see how farmers are actually moving through it. Choose a period — Today, 7 Days, 30 Days, All Time — and you'll see five numbers:

  • Started — how many farmers entered this flow.
  • ✓ Completed — reached a proper End node.
  • 👤 Handoff — got handed to a human executive instead of finishing on their own.
  • ⏳ Active — still mid-conversation, replied within the last 24 hours.
  • ⚠️ Abandoned — went quiet for 24+ hours without completing or being handed off.

Below that, "Where customers drop off" shows every node in the flow in order from Start to End, with what percentage of everyone who started actually reached that node. A node with a noticeably lower percentage than the one right above it is where farmers are getting stuck or giving up — a good sign that step's wording, question, or option needs rethinking.

🎁 Combos

Combos let you bundle two or more existing products together and sell them as a single item, usually at a discount. A combo automatically shows up in Stock and on the New Order form under a "Combos" category, exactly like a regular product — customers (and the WhatsApp bot) can pick it the same way. This page lives under WhatsApp Hub because combos are primarily offered to farmers through the bot, but they can be ordered manually too.

This page is restricted to Admin and Marketing Head roles.

Creating a combo

  1. Go to WhatsApp Hub → Combos, and use the "Create New Combo" form at the top.
  2. Enter a Combo Name (e.g. "Fungal Control Combo") and optionally upload a Photo.
  3. Add at least 2 products using the product rows — pick a product from the dropdown and set its quantity. Use Add Product to add more rows (a combo can hold more than 2 products).
  4. As you pick products and quantities, Auto Total fills in automatically (sum of each product's normal sell price × quantity).
  5. Combo Price starts out equal to the Auto Total, but you can type your own (lower) price here to give the customer a discount. Savings updates automatically to show the difference.
  6. Click Save Combo.
Only real, independently-stocked products can go into a combo — you cannot build a combo out of other combos. The same product also cannot be added twice in the same combo.

Editing a combo

Click Edit on any combo card to load it back into the form at the top — change the name, photo, products, quantities, or price, then save. This replaces the combo's product list with whatever is on screen when you save.

Hide / Show (deactivating)

Use the Hide button to take a combo off sale without deleting it — its stock is immediately set to 0 so it can't be picked on a new order, but it stays visible here and in past order history. Click Show to reactivate it (its stock recalculates automatically once active again).

Deleting a combo

Click Delete to remove a combo entirely. If the combo has already been used in at least one order, deletion is blocked — you'll be told to use "Hide" instead, since deleting it would break the order history that references it.

How combo stock works

A combo does not have its own stock count that you set — it is calculated automatically from its component products' stock, every time. If a combo needs 2x Product A and 1x Product B, and you currently have 10 units of A (enough for 5 combos) but only 3 units of B, the combo's available stock will show as 3 — limited by whichever component runs out first. Nothing is reserved or set aside in advance; the number simply recalculates whenever a component's stock changes or a combo order is placed.

Because of this, if a combo's stock looks lower than expected, check the stock levels of its individual component products rather than the combo itself — that's almost always where the shortage is.

💬 WhatsApp Inbox

What this page is for

This is the shared team inbox for every conversation that comes in on WhatsApp, plus Facebook Messenger and Instagram DMs (for staff with marketing access). Everyone works from one screen instead of switching between apps. What you can see here depends on your role: most executives only see conversations tied to their own assigned leads/orders, while Admin, Super Admin, Warehouse and Marketing Head accounts see every conversation.

Layout

  • Left column — Conversations. Every WhatsApp/Messenger/Instagram thread, most recent first. Each row shows the contact's name (or number), a channel icon (💬 WhatsApp, 📘 Messenger, 📸 Instagram), the last message preview, and — if you can see everyone's conversations — which executive that lead/order belongs to.
  • Right column — the open conversation, with the message thread and a reply box at the bottom.

Each conversation row can also show small stickers: a coloured 🏷️ status chip (e.g. Contacted, Cold), an interest/order flag (🟢 High, 🟡 Medium, ⚪ Low, 🔴 Not Interested, or 🔵 Order Placed once confirmed), and a 📅 follow-up date (turns to a red ⚠ once it's overdue). A left-edge colour bar also marks a conversation as pending (orange), confirmed (green), or utility-only (grey).

Searching and filtering

  • Search box — matches by name, mobile number, or message text.
  • Filter tabs — All, 👤 Leads, ⏳ Pending Orders, 🔔 Utility, 💬 Needs Reply.
  • Executive dropdown and date range (quick presets or a custom From/To pair) — only shown to roles that can see everyone's conversations.
  • ✕ Clear resets every filter back to All.
What "👤 Leads" actually means here. This tab does not show every CRM lead who happens to also chat on WhatsApp. It only shows conversations tied to a lead that genuinely came from a Facebook/Instagram ad or DM (the lead has a Facebook PSID, Instagram PSID, or ad ID attached). A lead your team typed into the CRM manually — even if that same farmer later messages you on WhatsApp — will not appear under this tab. This is deliberate: mixing manually-entered CRM leads into "Leads" made the tab noisy and no longer told the team "this came from our ad spend." If you're looking for a specific CRM lead's chat, use the search box instead of this tab.

🔔 Utility means an automated system message (e.g. Order Placed / Dispatched / Delivered receipts) was sent to a number with no real lead behind it, and the customer never actually replied. Once a real lead exists, or the customer replies, that conversation moves out of Utility.

Replying

  • If the customer has messaged within the last 24 hours, you'll see a normal text box — type and hit Send. This is a free-form "session" message.
  • If more than 24 hours have passed since their last message, WhatsApp's rules block free-form replies. The composer switches to Send a template instead — pick an approved template, fill in any 1/2 placeholder fields it needs, and send.
  • The composer icons let you attach 😊 Emoji, insert a 💬 Canned Reply, attach a 📎 photo/video/document/audio file, or 🎙️ record a voice note directly in the browser.
  • Tap ↩ on any message to reply-in-context (quotes that message above your reply, same as WhatsApp itself).
  • Hover a message and tap 😊 to send a quick emoji reaction on it.

Canned Replies

Click the 💬 icon in the composer to open your saved canned replies and insert one with a click. Click ⚙ Manage Canned Replies (at the bottom of that same panel) to add a new one (Title + Message) or delete an existing one. These are shared/reusable message templates for things you type often — not to be confused with WhatsApp's own approved message templates used outside the 24-hour window.

Deleting a message or conversation

"Delete" here only removes it from your own inbox panel. WhatsApp's Business API has no "delete for everyone" option — whatever was actually sent or received still exists on the customer's phone. Use this to tidy up your own view, not to un-send something.

🗑 on a single message deletes just that message locally. 🗑 Delete Chat in the conversation header deletes the entire thread from your panel and resets the bot's memory of that conversation, so if the customer messages again later, they'll get the welcome menu fresh rather than picking up mid-flow.

Lead actions (only shown when the open conversation is tied to a real lead)

  • ✅ Confirm Order / ↩ Undo Confirm — a quick triage flag meaning "this lead's order is confirmed." This does not create or edit an actual order record — it's only for tracking in this inbox. Orders are still created the normal way from New Order.
  • 📝 Note — add a dated, attributed remark straight onto the lead's CRM notes without leaving the inbox. Notes are appended, never overwritten, so nothing you or a colleague wrote earlier gets lost.
  • 📅 Follow-up — set the lead's Status (has the team actually talked to them?), Interest (what did they say?), and next Follow-up date/time, plus an optional remark. Status and Interest are deliberately two separate signals — see the tip below.
  • 🔁 Transfer — instantly reassign this lead to another executive, if you have transfer permission. A lead can never be transferred to a Super Admin account.
  • 📇 View in CRM — jumps to this lead's full record in the CRM module.
Status vs Interest — not the same thing. Status answers "has anyone from the team actually talked to this farmer yet" (New Lead → Contacted → Active → Cold/Lost/Converted). Interest answers "what did they say when we did talk to them" (High/Medium/Low/Not Interested). They're shown as two separate badges on purpose — don't assume setting one updates the other.
When you set a Follow-up date, remember the time you type is treated as India time (IST) exactly as typed — you don't need to do any timezone math.

Bot control

The auto-reply bot answers customers automatically until a human needs to take over. Bot controls are visible to Super Admin accounts only:

  • 🤖 Bot ON/OFF (inside an open conversation) — turns the bot on or off for that one conversation only. Turning it back on shows the customer the welcome menu again on their next message, rather than resuming wherever the bot last left off.
  • 🤖 Bot Master: ON/OFF (top toolbar) — the master switch. Turning it OFF silences the bot completely, for every conversation, including numbers that haven't messaged yet. Turning it back ON does not force every individual conversation back on — each one returns to whatever its own toggle was last set to.

Escalated Leads and Unattended Leads

These are two separate reminder pop-ups, not pages you navigate to:

  • 🚨 Escalated Leads — visible only to Admin/Super Admin, as a button in this inbox's toolbar. Shows every Meta-sourced lead (across all executives) that has sat unattended for 30+ minutes, with quick links to call, WhatsApp, open the chat in this inbox, or reassign it. Checked automatically in the background every 2 hours, or click the button any time to check right now.
  • 🔔 Unattended Leads — a reminder for your own leads that have never been touched since assignment. It pops up automatically for every executive every 15 minutes when something is overdue, and can also be triggered on demand from the CRM page (not from this inbox). Setting a follow-up on a lead from that pop-up marks it attended.

Exporting Meta leads (Super Admin only)

📊 Export Meta Leads in the toolbar downloads an Excel file of every Facebook/Instagram/ad-attributable lead, with its assigned executive and full chat history, plus a summary pivot sheet. The same export also goes out automatically as a weekly email.

📣 Social Posts

This page creates and schedules posts to the Bhumija Elevate Facebook Page and/or linked Instagram Business account, straight from the ERP. Only executives who are Admin or Marketing Head can open it — anyone else gets an access-denied error.

Creating a post

  1. Optionally pick a Product from the dropdown. This auto-fills the caption (product name, price, and a standard call-to-action/hashtags) and pulls in the product's photo as the post image.
  2. Choose the Platform: Facebook only, Instagram only, or Both.
  3. Review and edit the Caption box — it's required, and whatever text is picked or generated should always be checked before posting.
  4. Attach a Photo — either let it auto-fill from the selected product, or upload your own (max 5 MB).
  5. Optionally set a Schedule date/time. Leave it blank to post right away.
  6. Click Post Now / Save.
Instagram cannot publish a text-only post. If Instagram or Both is selected but no photo is attached (no product photo and nothing uploaded), the system silently switches the post to Facebook-only instead of showing an error — so if an Instagram post isn't showing up, check whether it quietly lost its image and got downgraded.

AI Caption suggestions

After selecting a product, the Generate AI Caption button asks Gemini to write a fresh caption based on that product's details, replacing whatever is in the Caption box. This is a separate feature from the automatic caption that appears when you first pick a product (that one is a fixed template with the product name, price, and standard hashtags — not AI-written).

  • A product must be selected first — the button will refuse to run otherwise.
  • The AI only suggests text; it never posts anything by itself. You still have to review/edit it and click Post Now / Save.
  • If the AI service is unavailable, unreachable, or has hit its usage limit for the day, the button shows an error instead of a caption — just try again later or write the caption manually.

Publishing behaviour

When a post targets Both platforms, Facebook and Instagram are published to independently. It's possible for one to succeed and the other to fail (for example, if Instagram permissions haven't been granted yet) — the post is still marked Posted as long as at least one side went through, and any per-platform error is shown underneath the status badge in the posts table.

Posts move through these statuses:

  • Draft — saved without a schedule time, not yet published.
  • Scheduled — has a future schedule time; a background job checks every scheduled post whose time has arrived and publishes it automatically.
  • Posted — successfully published to at least one selected platform.
  • Failed — publishing was attempted but neither selected platform succeeded.

From the All Posts list, any post that isn't already Posted can be published immediately with Publish Now, or removed with Delete. A post that failed can simply be retried with Publish Now once the underlying issue (e.g. missing Facebook/Instagram credentials in Settings) is fixed.

Once a post's status is Posted, it can no longer be deleted from this screen — it's already live. To take it down, remove it directly on Facebook or Instagram.

Gotchas worth knowing

  • Publishing depends on the Facebook Page access token and Page ID (and, for Instagram, the linked Instagram Business Account ID) being configured under Settings — if these are missing, every publish attempt for that platform fails with an explanatory error.
  • The photo on a post is served from this site's own storage, so the ERP itself must be publicly reachable for Facebook/Instagram to fetch the image when publishing.
  • There is no character-count enforcement in the Caption box on this screen — Facebook and Instagram apply their own limits on their end.

📢 Facebook Ads

What this page is for

The Facebook Ads Dashboard pulls live campaign and spend data from your Meta (Facebook) Ads account and lines it up against what actually happened in this ERP — leads received and orders placed — so you can see whether ad spend is turning into real business, not just clicks.

Who can open this page

Only executives with the Admin or Marketing Head role can view this dashboard. Anyone else who tries to open it will get an access-denied error.

Connecting your Ads account

If the dashboard shows a "Not Connected" message instead of numbers, it means the ad account isn't linked yet. To fix this:

  1. Go to Settings → Lead Sources (a shortcut link is shown right on the "Not Connected" card).
  2. Enter your Meta Ad Account ID.
  3. Make sure the access token saved there has the ads_read permission. This is different from the permission your Lead Ads webhook token already has, so an older token that only receives leads may not be enough — it needs to specifically include ads_read to show campaigns and spend here.
If you see a red error banner at the top of the page instead of data, it usually means the Ad Account ID or token is present but invalid, expired, or missing the ads_read permission. The error message shown is passed through directly from Meta, so it will usually name the exact problem.

Choosing a date range

At the top of the page is a "From" and "To" date filter. When the page first loads, it defaults to the last 30 days. Pick different dates and click Apply to reload every number on the page — spend, leads, orders, revenue, and both tables — for that period.

The summary numbers

The row of stat cards near the top shows, for the selected date range:

  • Ad Spend — total amount spent across all campaigns, as reported by Meta.
  • Leads — count of ERP leads whose source is recorded as "Facebook Lead Ad," created within the selected dates.
  • Qualified Leads — of those leads, how many have reached a status of Contacted, Active, or Converted (i.e. an executive has actually engaged with them, as opposed to a fresh, untouched, or written-off lead).
  • Cost / Lead — Ad Spend divided by the number of Leads.
  • Orders — orders placed within the date range whose mobile number matches one of those Facebook leads.
  • Revenue — total value of those matched orders.
  • Estimated/Attributed ROAS — Revenue divided by Ad Spend, expressed as a multiple (e.g. "3.20x").
These numbers are matched by mobile number against every lead whose source is "Facebook Lead Ad," across all campaigns combined — they are not broken down campaign by campaign. That's because older leads were never tagged with which specific campaign they came from; only newly arriving leads now capture that, so a true campaign-wise breakdown will only become possible as that newer data builds up. Treat Leads/Orders/Revenue/ROAS as estimated, attributed totals for your Facebook Lead Ad channel as a whole — not exact, audited campaign-level attribution.

Campaigns table

Lists every campaign in the connected ad account with its Name, Status (an "ACTIVE" badge is highlighted differently from paused/other statuses), Objective, and Daily Budget. This list is not limited by the date filter — it reflects the current state of the account. If nothing shows up here, no campaigns exist on the connected ad account, or the token can't see any.

Spend & Results table

Breaks the same date range down campaign by campaign, showing Spend, Impressions, Clicks, CTR (click-through rate), and CPC (cost per click), as reported directly by Meta for each campaign. A "No data for this period" row means Meta returned no activity for any campaign in the selected dates.

How this data is refreshed

Every time you open this page or click Apply on the date filter, the ERP fetches fresh campaign and insights data directly from Meta — nothing here is stored or cached in the ERP itself. The Lead/Qualified Lead/Order/Revenue figures, by contrast, come straight from the ERP's own lead and order records, filtered to the same date range.

🤖 AI Assistant

What This Is

The AI Assistant is a chat-based helper built into the ERP. You'll find it two places: a dedicated "AI Assistant" page, and a floating chat widget available on every ERP screen (both talk to the same conversation — they're not separate chats). You can type in English or Hindi/Hinglish.

Behind the scenes it runs on Google's Gemini model, with an automatic fallback to a second AI provider (Groq) if Gemini is temporarily unavailable or its free-usage quota is hit. Either way, the AI itself never touches the ERP database directly — it can only call a small, fixed set of pre-built "tools," and each tool decides for itself what data it's allowed to hand back based on who's asking.

What It Can Actually Do Today

As of now the assistant has exactly two capabilities wired up:

  • Sales reports — ask for this month's, today's, or last month's sales report (or phrase it your own way, e.g. "July ki report") and it will pull order counts, total order value, dispatched-vs-pending value, and a stage-wise/executive-wise breakdown.
  • Marketing audience recommendations — ask it to recommend farmers/leads for a WhatsApp marketing message. It only recommends leads with a real signal on file (a past order, expressed interest, consent, or a prior reply) — it will never suggest cold or unconsented numbers. If it finds eligible leads and you have an approved WhatsApp template ready, you can tick the ones you want and send the campaign straight from the chat reply.

The full page shows quick-tap shortcut buttons for these ("This month's sales report," "Today's sales report," "Last month's report," "Recommend marketing list") so you don't have to type them out. Outside of these two things, it cannot look up individual orders, leads, stock, or payroll on request, and it cannot place orders, edit records, or send messages on its own — anything beyond these two tools is simply not built yet.

One exception: if you're logged in as Super Admin, the assistant will also answer general/off-topic questions (like a normal AI chat) when none of the business tools apply. Every other role gets a polite "this assistant is only for Bhumija Elevate business tasks" reply instead of an off-topic answer.

Starting and Using a Chat

  1. Open the AI Assistant page, or use the floating chat widget from anywhere in the ERP.
  2. Type your question in the input box and press Enter, or click Send.
  3. Each executive has one ongoing conversation thread — there's no way to start a separate new thread or switch between multiple chats; everything you and the AI have said stays in the same running conversation.
  4. To wipe it and start clean, click 🗑 Clear Chat and confirm. This permanently deletes your message history — it cannot be undone.

The assistant only remembers roughly the last 10 turns of a conversation when deciding how to respond — very old messages in a long-running chat won't influence new answers.

AI Activity Log

The AI Activity page is a separate screen, visible only to Super Admin — anyone else gets an access-denied error. It's a running log of every tool the AI has actually executed, across every channel it operates on (ERP chat, Customer WhatsApp, Internal WhatsApp, Messenger, Instagram), not just this page.

Each row shows: when the call happened, which user (or external contact) triggered it, their role at the time, the channel, which tool ran, its risk level, what data scope was applied (e.g. whose data the tool was restricted to), and the result status — success, failed, denied, awaiting confirmation, confirmed, or cancelled. You can filter the list by user, channel, tool name, or status.

This log exists so a Super Admin can audit exactly what the AI looked up or attempted on anyone's behalf, and catch anything that was denied (blocked by a permission check) or failed.

The assistant only ever sees data that its underlying tool explicitly hands it — never raw farmer lists, ledgers, or payroll straight from the database. It's also role-scoped: your chat won't surface another executive's data or finance/payroll figures unless your role permits it. Gemini's free-tier usage is capped; if that limit is hit the system automatically retries on the backup provider, and only shows an error if both are unavailable — so an occasional "AI Assistant abhi available nahi hai" message is a usage-limit issue, not a bug to report immediately.

📦 Products / Stock

This is the Inventory screen — the master list of every product Bhumija Elevate sells, how much stock is on hand, and every stock movement (received, sold, damaged) ever logged. Only Admin and Warehouse users can access this section.

Top Stats & Filters

The stat cards at the top show total Products, units Sold, units In Stock, Low Stock count (5 or fewer units), and Out-of-Stock Orders (orders taken when stock had already run out — a backorder situation worth watching). Use the search box to filter the list by product name, company, or category, and 📄 Download Stock Report PDF for a printable snapshot of the whole inventory and its total value.

Manual Stock Entry

Use this form to record a stock movement by hand — pick the Product (grouped by product family in the dropdown), a Type, a Qty, and optional Notes, then click Save Entry. There are three types:

  • IN (Purchase/Return) — stock coming in, e.g. a new purchase or a return.
  • OUT (Manual Sale/Adjustment) — stock going out for a reason other than a normal dispatched order, e.g. correcting a count.
  • DAMAGE (Broken/Expired/Lost) — stock that's no longer sellable. This works like OUT (it reduces In Stock the same way) but is logged separately under its own DAMAGE tag in the Stock Log, so damaged/broken/expired/lost stock never gets confused with an ordinary manual adjustment.
New today: the DAMAGE stock-entry type is a brand-new option added as part of a stock-accuracy fix. Previously there was no dedicated way to log broken/expired/lost stock — it either got mixed into OUT entries or didn't get logged at all. Use DAMAGE any time stock is physically gone but wasn't sold, so the Stock Log accurately shows why stock left.

An OUT or DAMAGE entry that asks for more than what's currently available is blocked with an "Insufficient stock" error — you can't take stock negative from this form.

Product List & Product Families

Products that share the same base product but come in different pack sizes (e.g. 250ml, 500ml, 1 Litre of the same item) are shown grouped together as one card/row with a "N sizes" badge — click ✏️ Manage Product & Sizes to open the family (see Master Products below). A product with only one size shows as its own card with ✏️ Edit, ➕ Add Size (to turn it into a family), and 🗑 Delete actions.

Each product card/row also shows: Sold (lifetime), Promised (ordered this month but not yet dispatched — hasn't touched real stock yet), Dispatched (shipped out), and — if applicable — an ⚠️ Oversold badge, meaning units were promised to customers even though stock had run out (a backorder). Stock Value is In Stock × Selling Price. Last In/Last Out dates show the most recent stock movement.

If a product shows an Oversold count, the next stock you add doesn't immediately grow "In Stock" — it first pays off the oversold backorder units, and only the remainder increases the visible In Stock number. This is normal and expected.

Click 📜 Stock History on any single-size product to see every IN (stock received) entry logged for it, with date, quantity, notes, and who logged it.

Click 🗑 Delete to remove a product — this is blocked if the product has ever appeared in an actual order, so historical order data can never be broken by deleting a product.

Editing a Product ("Edit" screen)

Opens a form to update a single product's Name, Company, Category, Technical, Dose, Selling Price, MRP (shown on the website), Description, and its WhatsApp photo (the image the bot sends customers — leaving the file picker blank keeps the current photo, nothing gets removed by accident). This same screen also lets you receive fresh stock:

  • Add Stock (received qty) — how many units physically arrived.
  • …of which Damaged — of that received quantity, how many arrived already broken/damaged. Only the remainder (good units) actually increases In Stock; the damaged portion is logged separately and never added to sellable stock.
New today: the "…of which Damaged" field on Add Stock is a brand-new field added alongside the DAMAGE stock-entry type, as part of the same stock-accuracy fix. If a delivery of 50 units arrives with 3 broken, enter 50 in Add Stock and 3 in "…of which Damaged" — In Stock only goes up by 47, and the 3 damaged units get their own log entry so stock always matches physical reality.

If the product already has oversold units, this screen reminds you that new stock will first clear that backorder before In Stock visibly increases.

Stock Log

Shows the latest 200 stock movements across all products — date, product, type (IN/OUT, with a distinct dark DAMAGE tag), quantity, notes, and who logged it. This is the full audit trail for manual stock changes.

Bulk Import

Reached via the 📦 Bulk Import button on the Inventory page. Two ways to add/update many products at once:

  • Import from Excel File — download the template first (columns: Product Name*, Company, Category, Buy Price, Sell Price*, Stock, HSN Code, GST Rate%, Dose, Technical — only Name and Sell Price are required), fill it in, then upload your file. A product is matched by name: if it already exists it gets updated, otherwise a new one is created. Any stock quantity in the file is added as fresh incoming stock, logged automatically.
  • Bhumija Product Catalog — Preset Quick-Add — a ready-made table of common Bhumija products. Products already in inventory are marked "Yes"; you can tweak price/category/dose/technical/stock for any row before clicking Import All.

Master Products (Product Families & Sizes)

Handled by its own controller, but it's really an extension of the product list above — this is what powers the "grouped by size" cards you see on the Inventory page.

A Master Product is the shared identity of a product (its name, category, company, technical/active ingredient, description, and shared photo) — the actual sellable/stock-tracked items underneath it are its Sizes (e.g. 250ml, 500ml, 1kg), each with its own price, MRP, and stock count.

Creating a brand-new product is always done via ➕ New Product on the main Inventory page — this creates the master and its first size together in one step, so every product is grouped from day one. Fill in Product Name, Company, Category, Technical, Dose, Pack Size + Unit, Selling Price, MRP, and Opening Stock, then Add Product.

To add another size to an existing product, don't use the New Product form — open that product family's Manage Product & Sizes page and use the ➕ Add Size form there instead (Pack Size, Unit, Selling Price, MRP, Opening Stock, Dose). Trying to add a size that already exists (same size + unit) is blocked with an error so you can't accidentally create a duplicate.

On the Manage Product & Sizes page you can also:

  • Edit the shared master fields (Name, Category, Company, Technical, Status, Description, Photo).
  • Tick "Sync to all sizes" when saving to push Category/Company/Technical/Photo down to every size at once, instead of editing each one individually.
  • See every size in a table with its price, MRP, stock, and stock value, and Edit or Unlink each one. Unlink detaches a size from the family without deleting it or its order/stock history — use this only to correct a genuine mis-grouping.
Marking a master product Inactive is how you retire a discontinued product line without deleting it (deleting is blocked anyway once a product has order history).