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

DraftFinalizedPartialPaid |  Overdue (past due date while unpaid)
Draft

Invoice created but not yet committed. No stock is deducted. You can freely edit line items. Safe to use while building an order.

Finalized

Invoice 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.

Partial

A payment has been recorded but it does not cover the full balance. Both the amount paid and remaining balance are tracked.

Paid

All payments received — balance is zero. A receipt PDF is auto-generated and emailed to the customer for each payment.

Voided

Invoice 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

  1. Go to Sales → Invoices → New Invoice
  2. 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)
  3. Add line items: search for a product, enter quantity and UoM. Price auto-fills from the customer's price list
  4. Apply discounts per line if needed
  5. Set the due date (auto-filled based on customer payment terms)
  6. Add notes if required (shown on the PDF)
  7. If eTIMS external mode is active, fill in the eTIMS section
  8. 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:

FieldNotes
AmountDefaults to the full outstanding balance. Enter less for a partial payment
Payment MethodCash, MPesa, Bank Transfer, Cheque, or Credit
Split PaymentToggle on to pay with multiple methods (e.g., part Cash + part M-Pesa). Each split creates separate finance ledger entries
ReferenceMPesa transaction code, cheque number, or bank reference — used for reconciliation
DateDefaults to today. Can be backdated

After recording a payment, a Receipt PDF is automatically generated and emailed to the customer. No manual action needed.

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.
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

Requires the full_sales_lifecycle feature (Business plan and above).

Credit Notes

Use Sales → Credit Notes to issue a credit against a previous invoice — for returns, overcharges, or goodwill adjustments.

  1. Select the original invoice
  2. Choose the Return Type: Credit (on account), Swap (exchange for other goods), or Refund (cash back)
  3. Add the line items being credited and the reason
  4. Submit for approval or apply directly
  5. Once approved, the customer's balance is reduced and stock is automatically returned

Return Types

Credit

Amount stays on the customer's account as a credit for future purchases. Revenue is reversed in the ledger.

Swap

Customer exchanges returned goods for different products. Credit stays on account to be applied to a new invoice.

Refund

Cash 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.

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 only

Warehouse selection and stock indicators are hidden. No branch needed. Perfect for consulting, repairs, or any non-stocked work.

Stocked items only

Full 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 format

stockpulse.co.ke/invoice/{token} — unique, unguessable token per invoice

What's shown

Full 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.

  1. Open any invoice and click Make Recurring
  2. Choose the frequency: weekly, monthly, quarterly, or yearly
  3. Set the day of month for generation (e.g., 1st of every month)
  4. 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

Track sales team performance against monthly targets at Sales → Targets. Set a target amount per salesperson per month and monitor progress in real time.