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:

BucketDefinition
CurrentNot yet due, or no due date set
1–30 days1 to 30 days past the due date
31–60 days31 to 60 days past due
61–90 days61 to 90 days past due
90+ daysMore 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.

[Screenshot pending] AP page with aging strip showing total outstanding payables and the 5 buckets

The bill list

ColumnWhat it is
Doc noBill number (e.g. PO-0021). Click to open detail.
DateDocument date
DueDue date or
SupplierSupplier name. Falls back to the raw code if not yet imported.
TotalBill total
OutstandingAmount still unpaid (= total − payments made)
StatusPaid (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:

StateSet when
openThe bill is entered and not yet settled
paidYou mark it paid (records a payment against it)
cancelledYou 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

StatusMeaning
Pending reviewReceived from LHDN; awaiting your accept/reject (72h window)
AcceptedYou accepted; AP entry auto-posted to GL
RejectedYou rejected; supplier notified
Expired72h passed without action; treated as accepted by LHDN
CancelledSupplier 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.

[Screenshot pending] AP bill detail page showing pending e-invoice with 72h countdown and Accept / Reject buttons

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) billcancel 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