LOADING
Purchaser
Not logged in
Product
Purchase Transactions
# Date Qty Unit Cost Total
Total Qty / Cost 0.000 | $0.00
Markup Group
27.0%
5%20%35%50%60%
Rounding Rule
WAC ÷ Qty  →  × (1 + Markup%)  →  Round ↑
Ready to Calculate
Select a product, enter transactions, choose markup, then tap Calculate.
WAC Formula:
Step 1: Total Qty = Σ Qty
Step 2: Total Cost = Σ (Qty × Cost)
Step 3: WAC = Total Cost ÷ Total Qty
Step 4: Raw Price = WAC × (1 + Markup%)
Step 5: Sell Price = Round UP to nearest $0.05
Price List
734 products · 0 costed · ▲ 0 ▼ 0 · Margin
Markup
Veg%
Meat%
Grocery%
Non-Food%
Round
WAC filter
CODE PRODUCT / ផលិតផល UNIT BASE PRICE WAC COST MU% SELL PRICE CHANGE MARGIN
Price Change History
All WAC calculations this session
Fresh Food
Supply Cambodia
Customers
Customer Orders
Delivery Schedule
Driver App
Customers
Customer Report
Prospects
Operations
Invoices
Purchase Orders
GRN History
Suppliers
Daily Purchase
Expenses
Purchasing
Low Stock Alert
Price List
Price Groups
Pricing Wizard
Recurring Orders
History
Finance
Reports
Accounting
AI Assistant
Help
Settings
Sign Out
Fresh Food Supply Cambodia
PURCHASING
OPERATIONS
CUSTOMERS
FINANCE
?
Not logged in
Purchaser
Not logged in
Product
Purchase Transactions
# Date Qty Unit Cost Total
Total Qty / Cost 0.000 | $0.00
Markup Group
27.0%
5%20%35%50%60%
Rounding Rule
WAC ÷ Qty  →  × (1 + Markup%)  →  Round ↑
Ready to Calculate
Select a product, enter transactions, choose markup, then tap Calculate.
WAC Formula:
Step 1: Total Qty = Σ Qty
Step 2: Total Cost = Σ (Qty × Cost)
Step 3: WAC = Total Cost ÷ Total Qty
Step 4: Raw Price = WAC × (1 + Markup%)
Step 5: Sell Price = Round UP to nearest $0.05
Price Groups
Manage customer pricing tiers · Import monthly price updates · View history
No price groups yet. Click "+ New Group" to create one.
Price Change History
All WAC calculations this session
Daily Purchase
Track advances, runs and reconciliation
Market Spent
Balance
Status
Select a date or click + New Day to start
Expenses
Boeun
Admin
BS
BS
Showing:
to
April 2026
Total Spent
Pending Approval
Paid
Top Category
Spending Trend Last 7 days
By Category
0 selected
All Expenses
Date Description Category Staff Supplier Amount Status Actions
Pricing Wizard
Purchase orders → WAC cost → sell price → apply
1
Source
2
Markup
3
Review
4
Apply
Select data source
Choose where to pull product costs from to calculate your sell prices.
From Purchase Orders
RECOMMENDED
Automatically reads all saved POs in a date range. Best for end-of-month repricing across all products.
Manual entry — one product
Type purchase transactions for a single product. Best for spot-checks or one-off price adjustments.
Reports
Business performance overview
BS
Boeun
Admin
Revenue (Invoices)
Purchase Orders
Expenses
Net Profit Est.
Period:
This Month
Report Settings
Report Type
Group By
Search / Filter

Select report type and click Generate

Customer Orders
Staff view — manage incoming orders
Pending Review
awaiting review
Approved
Invoiced
invoiced
Total Value
Quick Select
Today
Yesterday
This Period
This Week
This Month
This Quarter
This Year
Previous Period
Last Week
Last Month
Last Quarter
Last Year
All Time
Custom Range…
# CUSTOMER PIPELINE DELIVERY ITEMS TOTAL ACTIONS
Purchase Orders
Boeun
Admin
BS
BS
Showing:
to
April 2026
Total Orders
Pending Review
Received
Total Value
0 selected
All Orders
Order ID Supplier Order Date Expected Items Amount Priority Status Actions
Invoices
Boeun
Admin
BS
BS
Showing:
to
April 2026
Total Outstanding
Paid This Month
Overdue
Draft
0 selected
All Invoices
Invoice IDCustomerIssue Date Due DateDeliveryAmountStatusActions
Welcome Back, Boeun!
Here's what's happening with your business today
Boeun
Admin
BS
Suppliers
BS
Boeun
Admin
Total Suppliers
Total Spent
Unpaid Balance
Categories
SUPPLIER NAME CATEGORY CONTACT PHONE PAYMENT TERMS ORDERS TOTAL SPENT UNPAID LAST ORDER ACTIONS
Accounting Report
Monthly P&L Trend
Revenue · Gross Profit · Net Profit
Cash Flow Summary
Cash in vs. Cash out
Profit & Loss Statement
Loading…
Accounts Receivable (AR)
Loading…
Accounts Payable (AP)
Loading…
Revenue by Customer
Loading…
Spend by Supplier
Loading…
12-Month P&L Trend
Monthly revenue, profit & margins
Loading…
Expenses by Category
Loading…
Margin Analysis
Loading…
Customers
Customer profiles & portal access
BS
Boeun
Admin
Active Customers
Inactive
Total Orders
Total Revenue
CUSTOMER TYPE PHONE ORDERS REVENUE OUTSTANDING STATUS ACTIONS
Customer Report
Monthly Revenue Trend
Last 12 months
Top Customers
by revenue in period
Customer Summary
Click row to filter · Click to open profile
Customer Invoices Invoiced Collected Outstanding Collect % Overdue Top Product Profile
⏰ AR Aging Analysis
Aging Bucket Count Amount Share
Quick Actions
Invoice History
Invoice # Customer Invoice Date Due Date Total Paid Balance Status Days Action
>

Telegram

Configure your Telegram bot for order notifications and customer communication.

Connect Telegram in 3 Steps
1
Create a Telegram Bot
Open Telegram and message @BotFather to create a new bot. Copy the token it gives you.
Open @BotFather
2
Enter Bot Token & Scan QR to Open Bot
Paste the token from BotFather, then scan the QR code on your phone to open the bot chat and send any message.
After opening the bot and sending any message:
3
Confirm Chat ID & Connect
Your Chat ID (auto-filled above, or enter manually)
Notification Settings
Delivery Schedule
Customer orders grouped by delivery date
Staff:
Orders
0
In period
Delivered
0
Completed
Pending
0
Awaiting approval
Unassigned
0
Need a trip
Trips
0
Planned
Approved
0
Ready to deliver
Value
$0.00
Total orders
Help Center
How can we help?
Browse guides, search by keyword, or jump to a category below.
Record a Payment
Customer pays for invoice or balance
1
Go to Customers → Click customer name
2
Click Record Payment button
3
Select invoice(s) to cover → Enter amount → Choose method (Cash / ABA / KHQR)
4
Click Confirm Payment
Payment creates RCP-XXXX entry (Credit) and reduces outstanding balance
Payment — Wrong Amount
Record payment with incorrect amount
Cannot edit payment amount directly — amount affects balance (accounting standard)
1
Find wrong payment in Transaction History — filter by Payment
2
Click row → Drawer opens → Click ⟲ Void (or use ⋮ menu → Reverse Payment)
3
Select reason → Click ⟲ Confirm Reversal
System creates REV-XXXX counter-entry — audit trail preserved
4
Click Record Payment again → enter correct amount
Both entries visible in ledger — Auditor can trace full history
ℹ️ Wrong payment shows REVERSED badge · Counter-entry shows ⟲ REVERSAL
Payment — Wrong Method / Date / Reference
Correct non-balance fields (safe to edit directly)
Method, Date, Reference do NOT affect balance — can edit directly
1
Click payment row in Transaction History
2
Drawer opens → Click Edit
3
Change Method (Cash/ABA/KHQR) or Date or Reference
Amount field is locked — use ⟲ Void to change amount
4
Click Save Changes
Refund to Customer
Customer overpaid — return money
1
Go to Customer Profile → Click Refund
2
Modal shows outstanding & overpaid amount (auto-detected)
3
Enter refund amount → Select method → Enter reason
4
Check Balance Preview (before/after) → Click Confirm Refund
ℹ️ Creates RFD-XXXX Debit entry — increases outstanding (money left company)
Refund wrong amount? → Click on refund row → Reverse → Record new correct refund
Opening Balance Error
Entered wrong opening balance
Customer is NEW (no transactions yet)
1
Go to Customer Profile → Edit Profile
2
Finance tab → Change Opening Balance amount + date
3
Save → Updated directly
Customer HAS transactions
1
Go to Customer Profile → Balance Bar
2
Click Adjust button (next to Opening Balance)
3
Enter correct amount → Enter reason → Confirm
Creates OB-ADJ-XXXX adjustment entry
Edit Profile fields are locked when transactions exist
Credit Limit
Set maximum outstanding balance per customer
1
Customer Profile → Edit Profile → Finance tab
2
Set Limit (USD) e.g. $5,000 · Set Alert at e.g. 80%
3
Save → Progress bar appears in Balance Bar
Below 80%
Normal
80–99%
Warning
100%+
Over Limit!
Aging Report
See how long invoices have been outstanding
1
Go to Customer Profile → Click Aging Report bar to expand
2
See 5 buckets: Current · 1-30 days · 31-60 · 61-90 · 90+ days
Current
Not yet due
1–30 days
Past due
31–60 days
Past due
61–90 days
Past due
90+ days
Severely overdue
ℹ️ Opening Balance debt is counted in 90+ days bucket
Export Transactions
Download transaction history to Excel
1
Go to Customer Profile → Transaction History tab
2
Apply period filter or type filter if needed (All / Invoice / Payment / Refund)
3
Click Export → Excel file downloads automatically
Export includes: Date, REF, Type, Description, DR, CR, Balance + Total row
Delivery Schedule — របៀបប្រើប្រាស់
Create trips, assign drivers, track deliveries
Overview — Delivery Flow
Order placed Approved Assigned to Trip ⏰ Set delivery time Driver delivers Record arrival → Done
Creating a Delivery Trip
1
Go to Delivery Schedule → find the delivery date group
2
Click + Create Trip in the Unassigned section
3
Select Staff (driver + helpers) → set Delivery Date + Departure Time
4
Check the orders to include — orders from different days can be combined in one trip (cross-date orders show yellow badge)
5
Review ⏰ Delivery Time Check — confirm or edit each order's delivery time. Click Auto-fill to parse from order notes automatically
6
Click Create Trip → trip appears in the schedule grouped under the delivery date
Orders not yet in a trip show as Unassigned — red in the KPI strip
If delivery date < order date, system will warn you (back-dating). Confirm only if recording a past trip.
⏰ Delivery Time — Company Standards
Customer writes System converts to Note
"Morning"09:00 AMStandard morning slot
"Early morning"08:00 AMFirst slot of day
"Before lunch"11:00 AMPre-lunch delivery
"Afternoon"03:00 PMAfternoon slot
"Urgent"+1hr from nowAuto-calculates
"ASAP"08:00 AMEarliest route time
(not mentioned)11:00 AMCompany default
Recording Delivery
1
Find the order in the trip → click Delivered
2
Modal opens with arrival time defaulting to current time — adjust if needed
3
See live KPI preview — e.g. "Score: 90% — Late 7 min"
4
Click Confirm → order marked delivered, KPI saved
Accidentally clicked delivered? Click ↩ Undo to reset back to Approved
Click All Done on the trip header to mark ALL stops delivered at once
Three Tabs Explained
Schedule
View all trips + unassigned orders grouped by delivery date. Create and manage trips here.
Report
Two views: Orders View (filter by customer/status) and Completed Trips (trip-level history with KPI).
Staff KPI
Leaderboard showing each driver's KPI score, bonus, and trip count. Click a row to see their full trip history.
Delivery Staff KPI System
How performance is scored, calculated, and bonuses applied
📋 Order Lifecycle — Daily Workflow
🛒
Creating a Customer Order
Manual entry · AI Order paste · Favourites · Keyboard shortcuts
📋 Two ways to create
1. Manual entry — pick products from catalog and enter qty
2. AI Order — paste customer's text/photo/Excel, AI extracts items
🛒 Manual Entry Steps
1
Go to Customer Orders → click + New Order
2
Select Customer → delivery date defaults to tomorrow → check Address & Note
3
Filter catalog by category pill (W. Herbs, Vegetables, etc.) or search by name/Khmer/code
4
Set qty using / + buttons or type directly. Cart updates live
5
Review cart → click 📋 Place Order
⭐ Favourites pill — appears automatically when a customer has ordered any product 2+ times before. Click ★ Favourites to see only their frequent items, sorted by how often they order it. Each favourite shows last: 30 kg · 5× hint.
⚡ AI Order — Paste from Customer
1
Click ⚡ AI Order next to search box
2
Paste Khmer/English text, drop a screenshot, upload Excel/PDF — AI extracts product names + qty
3
Review AI suggestions in the resolution screen — fix any wrong matches → confirm
4
Cart fills with parsed items in customer's original sequence (★ shown above "Other Products" divider)
⌨️ Keyboard Shortcuts (press ? in form)
/ focus search · ⌘K open AI Order · [ ] previous/next category
in qty: ±1 · ⇧↑ ⇧↓: ±5 · Tab: jump to next qty (skips +/− buttons)
⌘Enter place order · ⌘S save as draft · Esc close
⚠️ Tips
Draft auto-saves — close the form, your work returns when you reopen
• If catalog is empty: customer may have a stale category filter — click All Products
• Same customer ordering for tomorrow already? You'll see "Add items to existing order?" — pick that to merge instead of creating duplicate
Reviewing & Approving Orders
What to check · Approve, edit, or reject
Pending orders need a decision before they enter delivery flow. The Customer Orders page shows them with a Review button.
Review Steps
1
Customer Orders → filter Pending → click Review
2
Check the workflow bar at top — confirms which stage you're in
3
Verify customer info, delivery date, address, contact — edit inline if wrong
4
Check each item: name, qty, price → edit qty/price directly in the table
5
Click Approve → order moves to delivery queue. Or Reject with reason
💡 When to reject vs edit
Edit if it's a small fix (price, qty, swap product)
Reject only if order is invalid (duplicate, wrong customer, can't fulfill) — sends notification to customer
✏️
Editing an Existing Order
When you can edit · Inserting items in correct position
Order is editable while: not yet receipt-confirmed AND not yet invoiced.
Once an invoice is created or the customer confirms receipt, the order is locked. To change a locked order, issue a credit note instead.
1
Customer Orders → click ⋮ → Edit Order
2
Change Customer via dropdown (confirm dialog appears — copies new customer's contact)
3
Change Delivery Date, phone, email, address inline — auto-saves with green flash
4
Edit qty and price in any row — total recalculates live
5
Click product name → search row appears → pick replacement product
6
Click + ▾ on any row → choose "Insert above" or "Insert below" → keep customer's original sort order intact
7
Click × to remove a row · Or use + Add Product to End at bottom
8
Click Done when finished — auto-saves on every change
📦
Confirming Delivery & Receipt
Exception-based confirm · per-item resolutions · guest link
Exception-based means: customer assumes everything is OK by default. They only flag items that are wrong, missing, damaged, or different. Speeds up confirmation from minutes to seconds for normal deliveries.
Customer-side flow
1
Customer logs in → My Orders → tap Confirm Receipt on delivered order
2
OR open guest link sent via Telegram (no login needed if on same WiFi)
3
For each item, default = OK. If issue: tap item → write note → pick resolution
4
Submit → admin gets notification
📋 Per-item Resolutions
Invoice as is — accept what was received, charge full
Send Remainder — short-shipped, deliver missing qty later (creates follow-up task)
Cancel item — drop from invoice, no charge
Accept — keep but flag note for record
Replace — wrong item, redeliver correct one (creates follow-up)
Credit Note — issue credit memo, customer balance reduced
Admin-side after confirm
1
Customer Orders → click order → workflow bar shows "Receipt Confirmed"
2
Numbered Next Steps appear: Fix Errors, Issue Credit Note, Create Invoice, Schedule Remainder
3
Address each step in order — system blocks invoicing if Credit Note pending
📝
Issuing a Credit Note
When to issue · how it affects balance
Issue a credit note when goods are received but customer is owed money back (damaged, wrong, returned). Reduces customer's outstanding balance.
1
From Order Review modal → click 📝 Issue Credit Note
2
Select items → enter credit amount → optional reason
3
Confirm → CN-XX number assigned, customer balance reduced automatically
4
Customer can be notified via Telegram (auto if configured)
💡 Credit Note vs Invoice adjustment
Before invoicing — adjust the invoice amount instead
After invoicing — issue Credit Note (audit trail preserved)
🧾
Creating Invoices
Auto-adjustments · partial · parent-consolidated
1
Order must be delivered + receipt confirmed first
2
From Order Review → click 🧾 Create Invoice
3
Invoice auto-includes only items resolved as "Invoice as is" or "Accept" (skips cancelled, credit-noted)
4
If a Send Remainder is pending, button shows Create Partial Invoice — invoice covers delivered portion, remainder bills later
5
Review → Confirm → INV-XX assigned
🏢 Parent-consolidated invoices
For customers in a parent group (e.g. hotel chain), you can issue ONE invoice covering all subsidiaries' orders. Customers list → Parent → 📊 Consolidate Invoice. Useful for monthly billing to head office.
📦 Procurement — Suppliers & Stock
📦
Creating Purchase Orders
Supplier assignment · partial · merge duplicates · In Stock
The unified Create POs modal converts customer orders into supplier POs. One customer order can split across multiple suppliers; multiple customer orders for same delivery date auto-merge into a single PO per supplier.
1
Customer Orders → select one (or several via checkbox) → click Purchase Now
2
Items appear grouped by supplier. Unassigned rows have a per-row picker → choose supplier or staff (or quick-add new)
3
Edit qty per row — type 0 to move to In Stock (don't order, use existing stock)
4
Items in stock can be partially ordered — type a qty less than ordered, splits between stock and PO
5
Click Create N POs. If some items still Unassigned: button shows Create N POs (skip X) with confirm
6
Modal stays open after create — review the new POs in Already Created section
⚠️ Auto-merge by supplier + delivery date
If 50 customer orders all deliver tomorrow, this creates ONE PO per supplier covering all 50. Each PO carries a list of source orders. Approved/sent POs are never silently merged.
Cleanup: Merge Duplicates
1
If duplicate pending POs exist (same supplier + same delivery date), an amber ⮈ Merge duplicates button appears
2
Click → preview merge plan → confirm. Earliest PO ID becomes keeper, others fold in
💡 Other Pending POs — read-only section shows POs from other customer orders going to the same suppliers. Useful context but cannot be merged across customers (preserves traceability per customer).
📥
Receiving Goods (GRN)
Recording supplier delivery · partial receipt · discrepancies
1
Purchase Orders → click pending PO → Receive Goods
2
Enter received qty per item — defaults to ordered qty
3
If short-shipped or damaged: enter actual received → add note for discrepancy
4
Confirm → GRN-XX created → stock levels update → costing recorded
5
View past GRNs in GRN History page
📊 WAC update — each GRN updates the Weighted Average Cost for that product. Use the WAC Calculator page to recompute manually if needed.
👥 Customer Management
👤
Adding a Customer
Self-registration · admin approval · parent groups · PIN
Path A — Customer self-registers
1
Customer opens shared link → fills name, phone, business, address
2
Submission lands in Pending Registrations queue
3
Admin reviews → Approve or reject
4
On approve: 4-digit PIN is generated → sent to customer (or shown to admin to relay)
Path B — Admin adds directly
1
Customers page → + Add Customer
2
Fill business name, contact, phone, email, address, default markup
3
Save → customer can immediately appear in order forms
🏢 Parent / Subsidiary structure
For hotel chains or restaurant groups, set parentId on the subsidiary's record (searchable dropdown in customer edit form). Subsidiaries appear nested under parent in the customer list. Parent rollups available for invoices, statements, and reports.
💰
Customer Categories & Pricing
Markup groups · per-customer price overrides
Each customer gets a default markup applied to base costs. Hotel chains might be 15%, restaurants 25%, retail 35%. Per-product overrides stack on top for specific deals.
1
Customers → click customer → Pricing tab
2
Set Default Markup % — applied to all products unless overridden
3
Add specific overrides: pick product → set fixed price OR specific markup
4
Save → New Order forms now show this customer's prices automatically
⏰ Daily Operations
📅
Daily Workflow Checklist
Morning, midday, evening routine for admin + drivers
🌅 Morning (6–9 AM)
☐ Review Pending orders from overnight → approve / reject
☐ Run Purchase Now on approved orders → generate POs
☐ Send POs to suppliers via Telegram / call
☐ Check Delivery Schedule → assign drivers, set departure times
☀️ Midday (10 AM–2 PM)
☐ Receive supplier deliveries → record GRNs
☐ Update WAC if cost changed
☐ Drivers head out — track via Driver App
☐ Handle in-flight customer requests (add items, change delivery time)
🌆 Afternoon (2–5 PM)
☐ Customer Confirm Receipt rolls in (Telegram links work fastest)
☐ Address exceptions: Send Remainder, Replace, Credit Notes
☐ Create Invoices for confirmed orders
☐ Send invoices via Telegram
🌙 Evening (5–7 PM)
☐ Record customer payments
☐ Reconcile cash / ABA / KHQR receipts
☐ Check Aging Report — flag overdue customers
☐ Review tomorrow's pending orders preview
☐ Export daily backup (recommended once/week minimum)
📊
Reports & KPIs — Which Tells What
Picking the right report for the question
Dashboard
Today's pulse — orders pending, deliveries due, revenue snapshot
Customer Report
Per-customer sales, order frequency, top items, parent-group rollups
Aging Report
Who owes you and how long — 0/30/60/90+ days buckets. Use for collections calls
Staff KPI
Driver on-time rate, deliveries per shift, monthly bonus calc
Costing & WAC
Margins per product, weighted average cost vs. selling price
⚙️ System Setup (one-time)
📱
Setting Up Telegram Notifications
Bot token · chat ID · what fires when
1
On Telegram, open @BotFather/newbot → follow prompts → save the token
2
Create a Telegram group → add the new bot → send any message in group
3
Visit https://api.telegram.org/bot{TOKEN}/getUpdates → find chat.id (negative number for groups)
4
FreshFood → Settings → paste Bot Token + Chat ID → save
5
Click Test — you should receive a test message in the group
📨 Notifications fire on:
New customer order placed · Order approved · Order delivered · Receipt confirmed · Invoice issued · Credit note issued
🏷️
Business Branding
Logo · contact info · appears on invoices, statements, PDFs
1
Settings → Business Branding
2
Upload logo → use crop tool to fit square area (recommended 512×512 PNG)
3
Fill: Business Name, Address, Phone, Email, Website
4
Save → branding now applies to: topbar, sidebar, invoices, statements, delivery notes, receipts, price list, PDF exports, email templates
⚠️ Logo not showing? Refresh the page after saving. If sidebar logo missing, check that the page finished loading before the branding script ran (usually fixes itself on refresh).
💾
Data Export & Backup
Backup before changes · weekly export recommended
⚠️ Backup before risky changes — bulk import, supplier deletion, mass price update. Without backup, accidental data loss is permanent.
1
Settings → Data Export
2
Pick scope: Full Backup (all data) OR specific (Orders / Customers / Invoices / Products)
3
Pick format: JSON (full backup, restore-able) or Excel (for analysis)
4
Download → save with date in filename, e.g. freshfood-backup-2026-04-28.json
5
Store in cloud (Google Drive, Dropbox) — local-only backups can be lost
💡 Recommended cadence
Daily: nothing (system auto-saves)
Weekly: Full JSON backup → Google Drive
Before bulk operations: snapshot the affected scope
Test Mode
💬 Feedback Tracker
Bugs, questions, and suggestions from your team
Filter:
🤖 AI Order Review
Review and confirm before creating order
Customer
+ New Customer
Delivery
Date
Time
Note
Order Items
# Product Qty Unit Unit Price Total
Subtotal $0.00
Driver App
Today's deliveries
Loading… — stops
0
Total
0
Done
0
Remaining
🎯 Sales Prospects
CRM — track and convert potential customers
Name Stars City Type Status Pri Phone Follow-up Notes Actions
Loading...