Sales invoices (AR)

Create invoices, submit to LHDN MyInvois, track outstanding, review aging.

The AR tab is where you manage every sales invoice for a client — what they billed, what's been paid, what's overdue — and where you submit e-invoices to LHDN MyInvois for compliance.

Open from any client → AR.

The aging strip

The top of the page summarises outstanding receivables across five buckets:

BucketDefinition
CurrentNot yet due, or has 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 amounts for invoices in that range. The top-right also shows the percentage of total outstanding that is overdue.

The strip is computed across all non-paid, non-cancelled invoices — filters below don't change it. Aging is a holistic AR-health number.

Multi-currency caveat. The strip sums amounts without FX conversion in v1. If a client invoices in mixed currencies the total will be approximately wrong proportional to the foreign-currency share. Phase 2 will bucket per currency.

[Screenshot pending] AR page with the 5-bucket aging strip at the top

The invoice list

Each row:

ColumnWhat it is
Doc noInvoice number (e.g. INV-0042). Click to open detail.
DateDocument date
DueDue date — if not set
CustomerCustomer name. Falls back to the raw code if the customer hasn't been imported.
TotalTotal invoice amount
OutstandingAmount still owed (= total − payments received)
StatusPaid (green) / Open (neutral) / Overdue (red) / Cancelled (grey)

Sorted newest first by document date.

Invoice status — how it's computed

An invoice's status is one of three real states, set by what you do in Kiravy:

StateSet when
openThe invoice is raised and not yet settled
paidYou mark it paid (records a payment against it)
cancelledYou cancel the invoice

Overdue is not a stored state — it's shown automatically when an open invoice passes its due date. The moment you record a payment, the same invoice stops showing overdue, because it becomes paid. Nothing has to flip 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: AR path (you send invoice to customer)

Malaysia's LHDN requires eligible sales invoices to be submitted to MyInvois. Kiravy submits on your behalf as your authorized intermediary — first authorize Kiravy and enable MyInvois under Settings → Tax & compliance.

How it works

Create invoice in Kiravy (MYR)
        ↓
Open the invoice → "Submit to MyInvois"   ← Blocked: fix & retry
(checks: seller + customer details, 72h window)
        ↓
Submit to LHDN MyInvois
        ↓
LHDN validates                ← Rejected: LHDN error code shown
        ↓
Validated — UUID + verification QR
        ↓
Send the invoice PDF to the customer
(QR on the PDF links to the MyInvois portal)

Submission is a manual action per invoice — Kiravy never auto-submits. Validation is asynchronous; status updates by itself (see below), or you can click Refresh status.

Before you submit

A few things must be in place, or submission is blocked with a clear message:

RequirementWhere to set it
MyInvois enabled + seller TIN/IDSettings → Tax & compliance
Seller MSIC, business activity, addressSettings → Tax & compliance
Customer TIN, ID type + numberCustomers → customer detail (MyInvois section)
Customer address (line 1, city, postcode, state)Customers → customer detail
Currency = MYRThe invoice (v1 supports MYR only)
Invoice date within 72 hoursThe invoice — see the window note below

On the invoice detail page, an amber warning next to the customer flags when the selected customer is missing any e-invoice field, so you can fix it before submitting.

The 72-hour submission window

LHDN rejects any invoice whose document date is more than 72 hours before submission (error CF321). Kiravy checks this up front: a stale invoice is blocked at submit with a message, and the detail page warns as the window approaches. Kiravy does not quietly rewrite the document date to dodge this — correct the date, or void and reissue, so your books stay in sync with LHDN.

LHDN rejection

If LHDN rejects the invoice, Kiravy shows the LHDN error code and description on the detail page. Fix the underlying issue and click Resubmit to MyInvois.

UUID, verification QR, and the customer's window

Once validated, LHDN assigns a UUID and a long identifier. Kiravy builds a verification QR code from these and renders it on the invoice detail page and the invoice PDF — the customer scans it to verify the e-invoice on the MyInvois portal. The customer has 72 hours to reject the invoice via MyInvois.

Status updates automatically

You don't have to keep clicking Refresh:

  • Opening the invoice re-checks LHDN if the status isn't final yet — so a validated invoice (and its QR) appears on its own.
  • A background sweep also keeps statuses current, including catching a cancelled / rejected that happens within the 72h window when nobody's looking.

Invoice statuses (e-invoice)

StatusMeaning
SubmittingClaimed and in flight to LHDN (prevents a duplicate submission)
SubmittedSent to LHDN, awaiting validation
ValidLHDN validated; UUID + QR assigned; ready to send to customer
RejectedLHDN rejected; fix and resubmit
CancelledCancelled at LHDN (e.g. within the 72h window)

If a submission can't be confirmed (e.g. a network drop), the invoice stays Submitting and shows Check status instead of Submit — Kiravy reconciles against LHDN before letting you retry, so you never accidentally file a duplicate e-invoice.

The detail page

Click any invoice:

  • Customer (name + code), with the e-invoice readiness warning if any field is missing
  • Document date / Due date / Currency
  • Total / Outstanding
  • Description
  • e-Invoice status badge, UUID, and the verification QR once validated

Line items are not synced in v1 — that's a planned Phase 2 feature.

[Screenshot pending] AR invoice detail page showing a validated e-invoice with UUID and verification QR

How invoices post to the ledger

You create invoices directly in Kiravy, and the moment you raise one it posts to the ledger as a balanced journal entry — in plain words: debit Accounts receivable for the total, credit Revenue for the net, and credit SST output for the tax. 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 Bank, credit Accounts receivable), which clears the outstanding amount and moves the invoice to paid.

Changing or undoing a posted invoice

Because a posted invoice has already hit the books, it's immutable — you can't edit it in place. To correct one:

  • Open (unpaid) invoicecancel it and re-issue a fresh one with the right figures.
  • Paid invoice — you can't plain-cancel it (a payment is already recorded against it). Issue a refund / void instead, which reverses both the invoice and its payment. See Settlements & refunds.

What each role sees

  • Partner / Manager — every client's invoices firm-wide
  • Staff / Viewer — only assigned clients; read-only

What's coming

  • Line items per invoice
  • Per-currency aging buckets
  • Customer linkout from invoice detail
  • Partial payments (today's Mark as paid settles an invoice in full)

What's next