Sales, Invoicing & Collections
Invoices, payments, customers, quotes and credit notes
Invoices
Invoices are the core of the sales module. Go to Sales → Invoices.
Invoice Lifecycle
Draft→Finalized→Partial→Paid | Overdue (past due date while unpaid)
DraftInvoice created but not yet committed. No stock is deducted. You can freely edit line items. Safe to use while building an order.
FinalizedInvoice is committed. Stock is deducted from the warehouse. Invoice number is assigned. PDF is auto-generated in the background. Invoice can no longer be edited.
PartialA payment has been recorded but it does not cover the full balance. Both the amount paid and remaining balance are tracked.
PaidAll payments received — balance is zero. A receipt PDF is auto-generated and emailed to the customer for each payment.
VoidedInvoice cancelled. Stock is automatically returned to the warehouse. Finance ledger entries are reversed. Only unpaid invoices can be voided — record a credit note for invoices with payments.
PDF at any stage: You can download a PDF for any invoice, quote, or credit note — regardless of status. The PDF includes a colored status badge (e.g., "DRAFT", "PAID", "OVERDUE") so the document's stage is always clear.
Creating an Invoice
- Go to Sales → Invoices → New Invoice
- Select a customer from the searchable dropdown — filter by name, phone, or email. Use the + Add Customer button to create a customer inline without leaving the form (just enter name, phone, email, and payment terms)
- Set the invoice date if needed — it defaults to today but can be back-dated (this is the document date that drives reporting)
- Add line items: search for a product, enter quantity and UoM. Price auto-fills from the customer's price list
- Apply discounts per line if needed. If per-item VAT override is enabled in Settings, each line also shows a VAT Charged / No VAT toggle for one-off exceptions
- Set the due date — auto-filled from the customer's payment terms, with quick Today / 7 / 15 / 30 days presets (relative to the invoice date) or pick any date
- Add notes if required (shown on the PDF)
- If eTIMS external mode is active, fill in the eTIMS section
- Click Save as Draft to save without committing, or Finalize to commit and deduct stock
Stock Protection: StockPulse prevents overselling. If any line item quantity exceeds available stock, the stock badge turns red, a warning banner appears, and the Finalize button is disabled. The server also validates stock — even if the UI data is stale, the sale will be rejected. You can still save as a draft with insufficient stock and adjust later.
Branch Enforcement: When selling stocked items, a branch must be selected on the invoice so the system knows which branch's stock to deduct. If no branch is selected and you add stocked products, the system will prompt you to choose a branch before finalizing. Non-stocked items (services) do not require branch selection.
Tip: For fast walk-in sales without customer selection or due dates, use
Quick Sale instead.
Recording Payments
Open a finalized invoice and click Record Payment. Fill in:
| Field | Notes |
|---|
| Amount | Defaults to the full outstanding balance, with a one-tap “Pay in full” button. Enter a smaller amount for a partial payment |
| Payment Method | Cash, MPesa, Bank Transfer, Cheque, or Credit |
| Split Payment | Toggle on to pay with multiple methods (e.g., part Cash + part M-Pesa). Each split creates separate finance ledger entries |
| Attribute to items | Optional. Toggle on to record which line items a partial payment covers — by quantity (e.g. 3 packs of a bale) or by amount. Each line then shows Paid / Partial on the invoice |
| Reference | MPesa transaction code, cheque number, or bank reference — used for reconciliation |
| Date | Defaults to today. Can be backdated |
After recording a payment, a Receipt PDF is automatically generated and emailed to the customer. No manual action needed.
Full payments settle cleanly: paying the balance marks the invoice Paid even when tax math leaves a sub-cent remainder, so you won't get stuck with a lingering "Partially Paid · KES 0.01". Payments for more than the outstanding balance are blocked with a clear message — record the exact balance (or less for a partial).
Split Payments: When a customer pays with multiple methods, enable the "Split Payment" toggle. Add rows for each method and amount. The sum must equal the total payment amount. Each method is recorded as a separate finance ledger entry for accurate reconciliation. The receipt stores the full breakdown.
Attribute a payment to items: On a partial payment, turn on Attribute to items to say exactly what the money covers. For each line you can either enter a quantity — including a smaller unit, so "3 packs" of a bale works out its own share of the price automatically — or type an amount directly (handy for services, with an optional reason or milestone note). The invoice then shows each line as Paid or Partial, and the receipt lists what was applied where. It's entirely optional — skip it and the payment records exactly as before. If you override a computed amount, the difference is noted on that line.
Reliable PDF Generation: Invoice and receipt PDFs are generated server-side with automatic retry logic. If the initial generation fails (e.g., due to a temporary issue), the system retries in the background. You can also manually regenerate any PDF from the invoice or receipt detail page using the Regenerate PDF button.
Share via WhatsApp or Email: Use the Share button on any invoice, receipt, or quote to send the document directly to a customer. Email opens your email app with a pre-drafted message and download link. WhatsApp prompts for a phone number (or uses the customer's saved phone) and redirects to WhatsApp with the document link.
Customers
Manage your customer database at Sales → Customers.
Key fields:
- Credit Limit: Maximum outstanding balance allowed. The system warns (but doesn't block) when exceeded
- Payment Terms: Number of days before invoices are due (0 = due immediately)
- Price List: Assign a specific price list — overrides the default price list on invoices
- Sold by: The internal staff member who made the sale (revenue attribution)
- Referred by: Optional — the broker who brought the deal (commission tracking). Can be an internal staff member with broker privileges or an external broker
On the customer detail page, the Statement tab shows a running list of all invoices, payments, and credit notes with a running balance. Use the Generate Statement button to download or email a PDF statement to the customer.
Quotations
Quotes are sales proposals sent to customers before they commit to a purchase. Go to Sales → Quotes. Once a customer accepts, convert the quote to an invoice with one click — all line items carry over.
Quote statuses: Draft → Sent → Accepted / Rejected / Expired → Converted
Included from the Starter plan and above (the full_sales_lifecycle feature).
Credit Notes
Use Sales → Credit Notes to issue a credit against a previous invoice — for returns, overcharges, or goodwill adjustments.
- Select the original invoice — its lines, customer, date and totals show right there, so you don't have to open the invoice to recall what was sold. Click Return on any line (or Return entire invoice) to add it to the credit
- Choose the Return Type: Credit (on account), Swap (exchange for other goods), or Refund (cash back) — a short note under the selector explains each
- Add the line items being credited and the reason
- Submit for approval or apply directly
- Once approved, the customer's balance is reduced and stock is automatically returned
Return Types
CreditAmount stays on the customer's account as a credit for future purchases. Revenue is reversed in the ledger.
SwapCustomer exchanges returned goods for different products. After approving, use Fulfill Swap — the returned items show alongside the replacements, and the running total makes the top-up to collect (replacements worth more) or change to hand back (replacements worth less) clear. Cash change is only offered when your return policy allows cash returns; otherwise add a top-up item to match the credit.
RefundCash is returned to the customer. Creates a cash outflow entry in the finance ledger. Only available when the return policy allows it.
Automatic Stock Reversal: When a credit note is approved, stock for stocked items is automatically returned to the branch or warehouse. No separate stock adjustment needed.
Return Policy: Your tenant's return policy (configured in Settings → Company) controls which return types are available. Options: Full Returns (credit, swap, or refund), Swap Only, or No Returns.
Exchanges (one-screen swap)
For a straight exchange at the counter, use New Exchange (on the Credit Notes page, or Exchange / Swap from an invoice's menu) instead of the step-by-step credit note. One screen:
- Pick the original invoice, then set a Return Qty on each line coming back (or Return all)
- Add the replacement items going out
- The screen shows the net: a Top-up to collect (replacements worth more) or Change to give (worth less), with a payment method
- Complete it in one action — stock comes back in, the replacement invoice goes out and is settled, and the net cash is collected or handed back. The original invoice is left untouched.
Change (handing cash back) is only offered when your return policy allows cash returns; otherwise add a top-up item to match the credit.
Friendly Status Labels
StockPulse uses clear, human-friendly status labels throughout the sales module. The underlying values are unchanged for developers, but the UI shows friendlier names:
DraftUnpaidPartially PaidPaidOverdueCancelled
Smart Form Adaptation
The invoice form automatically adapts based on the items you add:
Services onlyWarehouse selection and stock indicators are hidden. No branch needed. Perfect for consulting, repairs, or any non-stocked work.
Stocked items onlyFull warehouse/branch selection is shown with stock levels and availability badges for each line item.
Mixed (both)Warehouse selection is shown for stocked items. Service line items display a "Service" pill so you can tell them apart at a glance.
Clone / Duplicate Invoices
Need to create a similar invoice? Open any invoice and click the Duplicate button. StockPulse creates a new draft with the same customer, line items, and notes — but with a fresh invoice number and today's dates. Edit anything you need before finalizing.
Tip: Cloning is great for repeat orders from the same customer. For truly automated repeat billing, see Recurring Invoices below.
Edit Draft Invoices
Draft invoices can be edited at any time. Open the draft and click Edit to re-open the invoice form, pre-filled with the existing data. Make your changes and choose Save Changes to keep it as a draft, or Save & Finalize to commit and deduct stock in one step.
Note: Only draft invoices can be edited. Once an invoice is finalized, it cannot be changed — issue a credit note to make corrections.
Public Invoice Links
Every finalized invoice gets a shareable public URL that your customer can view without logging in. The link is auto-generated on finalization, or you can generate one on-demand via the Get Link button on the invoice detail page.
URL formatstockpulse.co.ke/invoice/{token} — unique, unguessable token per invoice
What's shownFull invoice details with your company branding, line items, totals, and a Download PDF button. No login required.
Payment Reminders
Chase overdue payments without the awkwardness. StockPulse offers both manual and automatic reminders.
Manual Reminders
Open any unpaid or overdue invoice and click Send Reminder. The reminder is sent via WhatsApp first (if the customer has a phone number), with email as a fallback. The message includes the invoice number, amount due, and a link to view the invoice.
Automatic Reminders
Enable automatic reminders in Settings → Company. Configure how many days after the due date reminders should be sent (e.g., 3, 7, 14, and 30 days). StockPulse sends reminders at 9am EAT daily, up to 20 per tenant per run to avoid spamming.
Tracking: The lastReminderAt timestamp on each invoice ensures the same customer is not reminded too frequently.
Recurring Invoices
For customers you bill regularly, set up recurring invoices to automate the process.
- Open any invoice and click Make Recurring
- Choose the frequency: weekly, monthly, quarterly, or yearly
- Set the day of month for generation (e.g., 1st of every month)
- Optionally enable Auto-Finalize to commit invoices automatically (otherwise they're created as drafts)
Manage all recurring invoices at Sales → Invoices → Recurring. Pause, resume, or end any recurring template at any time.
How it works: An Inngest cron job runs at 6am EAT daily and generates invoices from active recurring templates that are due. Each generated invoice is a regular invoice with its own number, PDF, and payment tracking.
Proforma Invoices
Need to send a proforma instead of a quote? Proformas use the same feature as quotations but with a different label and "PRO" number prefix. When creating a quote, select Proforma Invoice as the document type. The workflow is identical — send, accept, convert to a real invoice.
Sales Targets & Live Performance
Set revenue targets and watch the team work toward them in real time. Two pages cover this:
- Sales → Targets — set a target per salesperson, per branch, or company-wide, for the month or the quarter. Each row shows actual revenue, % achieved, and a progress bar. Targets can be edited after the period starts — every change is captured in the audit log with before/after values, and the row gets an "edited mid-period" flag.
- Sales → Performance — the live dashboard. Today vs yesterday, period-to-date totals, % of period target with an ahead/on-pace/behind callout, a 14-day daily trend, a salesperson leaderboard, a branch leaderboard, and your top 5 products and top 5 customers for the period. Auto-refreshes every 60 seconds.
RBAC: Admins, finance managers, and anyone with the sales.dashboard.team permission see the full team view. Sales reps without that permission see only their own row + their own target — useful for personal accountability without exposing the whole leaderboard. Branch managers with a branch-scoped role see leaderboards and KPIs filtered to just their branches.
Click any salesperson or branch row on the dashboard for a drill-down view — their daily trend, their top products, their top customers, all scoped to that one person or location. Reps can drill into their own row even without team permission.