Bills & expenses (AP)
Review supplier e-invoices from LHDN, track what the client owes, manage aging.
The AP tab is where you manage every bill a client owes their suppliers — what's been received, what's paid, what's overdue — and where you review e-invoices that suppliers submitted to LHDN MyInvois.
Open from any client → AP.
The aging strip
Outstanding payables summarised across five buckets:
| Bucket | Definition |
|---|---|
| Current | Not yet due, or no due date set |
| 1–30 days | 1 to 30 days past the due date |
| 31–60 days | 31 to 60 days past due |
| 61–90 days | 61 to 90 days past due |
| 90+ days | More than 90 days past due — highlighted red |
Each bucket shows the sum of outstanding for non-paid, non-cancelled bills in that range. The top-right shows the overall percentage overdue.
Useful pre-payment question: how much do we owe in the next 30 days, and to which suppliers?
The strip is computed across all non-paid, non-cancelled bills — filters below don't change it.
The bill list
| Column | What it is |
|---|---|
| Doc no | Bill number (e.g. PO-0021). Click to open detail. |
| Date | Document date |
| Due | Due date or — |
| Supplier | Supplier name. Falls back to the raw code if not yet imported. |
| Total | Bill total |
| Outstanding | Amount still unpaid (= total − payments made) |
| Status | Paid (green) / Open (neutral) / Overdue (red) / Cancelled (grey) |
Sorted newest first by document date.
Bill status — how it's computed
A bill's status is one of three real states, set by what you do in Kiravy:
| State | Set when |
|---|---|
open | The bill is entered and not yet settled |
paid | You mark it paid (records a payment against it) |
cancelled | You cancel the bill |
Overdue is not a stored state — it's shown automatically when an open bill passes its due date. Once you record a payment the bill becomes paid and stops showing overdue. Nothing flips a flag; overdue is derived from the status plus the due date at the time you look.
Filtering
Toolbar above the list:
- Status — All / Open / Overdue / Paid / Cancelled
- From date / To date — filters by document date
Filtering does not affect the aging strip.
e-Invoice: AP path (supplier sends you an invoice)
When a supplier submits an e-invoice to LHDN MyInvois addressed to this client, Kiravy picks it up automatically and puts it in your AP queue for review.
How it works
Supplier submits to LHDN
(via their own system)
↓
Kiravy polls / webhook
(GET /documentdetails/{uuid})
↓
You review in Kiravy AP ← Reject: notify supplier
(accept or reject within 72h)
↓
Accept → auto-post to GL
(AP entry created automatically)
Red = rejection path. Green = happy path.
The 72-hour review window
Once Kiravy receives the validated invoice from LHDN, a 72-hour countdown starts. Within that window you must either:
- Accept — the bill is posted to the GL automatically as an AP entry
- Reject — Kiravy notifies the supplier via LHDN; they must cancel and re-issue a corrected invoice
After 72 hours with no action, LHDN treats the invoice as accepted by default.
Don't let invoices expire silently. The AP tab shows a countdown badge on bills awaiting your review. Set up email notifications (AP notification settings) so nothing slips past the 72h window.
What "Accept" does
Accepting posts the bill as a GL entry automatically — you don't need to enter it manually. The posted AP entry links back to the original LHDN UUID for audit purposes.
What "Reject" does
Rejecting sends a rejection signal back through LHDN. The supplier is notified that their invoice was rejected and the reason you provided. They'll need to cancel the original submission and re-issue. The rejected invoice stays in your AP history (status: Rejected) for the audit trail.
e-Invoice AP statuses
| Status | Meaning |
|---|---|
| Pending review | Received from LHDN; awaiting your accept/reject (72h window) |
| Accepted | You accepted; AP entry auto-posted to GL |
| Rejected | You rejected; supplier notified |
| Expired | 72h passed without action; treated as accepted by LHDN |
| Cancelled | Supplier cancelled before the window closed |
The detail page
Click any bill:
- Supplier (name + code)
- Document date / Due date / Currency
- Total / Outstanding
- Description
- e-Invoice status, LHDN UUID, and accept/reject action buttons (when pending)
Line items are not synced in v1 — planned for a future release.
How bills post to the ledger
You enter bills directly in Kiravy (or accept them from the LHDN MyInvois path above), and the moment a bill is created it posts to the ledger as a balanced journal entry — in plain words: debit Expense for the net, debit SST input for the tax, and credit Accounts payable for the total. That's what feeds the trial balance, P&L, and SST summary. See How Kiravy's general ledger works for the full picture.
Recording a payment — when you Mark as paid, Kiravy posts a payment (debit Accounts payable, credit Bank), which clears the outstanding amount and moves the bill to paid.
Changing or undoing a posted bill
Because a posted bill has already hit the books, it's immutable — you can't edit it in place. To correct one:
- Open (unpaid) bill — cancel it and re-enter a fresh one with the right figures.
- Paid bill — you can't plain-cancel it (a payment is already recorded against it). Issue a refund / void instead, which reverses both the bill and its payment. See Settlements & refunds.
What each role sees
- Partner / Manager — every client's bills firm-wide
- Staff / Viewer — only assigned clients; read-only
What's coming
- 72h countdown badge visible in the list
- Email notifications for new pending AP e-invoices
- Line items per bill
- Per-currency aging buckets
- Partial payments (today's Mark as paid settles a bill in full)
What's next
- Sales invoices (AR) — the AR-side mirror
- Suppliers — who these bills are owed to
- Month-end close — reviewing AP at period close