Tax deductibility

AI-flagged LHDN disallowances and the manual override path.

Not every expense in the books reduces taxable income. Malaysian tax law (Income Tax Act 1967 and the Public Rulings on top of it) disallows or caps a long list of common business spending — fines, capital purchases under the wrong code, half of non-customer entertainment, etc.

Kiravy AI takes a first pass at flagging each transaction so you can focus on the disagreements rather than reviewing every row manually. The accountant still signs off — Kiravy AI is a triage layer, not a tax advisor.

The four verdicts

Every transaction can be in one of four states for tax purposes:

VerdictMeaning
DeductibleFully allowable against taxable income
PartialSubject to a statutory cap (e.g. 50% on non-customer entertainment)
Non-deductibleExplicitly disallowed by LHDN — won't reduce taxable income at all
UnknownThe AI couldn't classify with confidence; needs human review

Newly created transactions are Unknown until classified.

What Kiravy AI checks

The classifier looks at the vendor, description, amount, and account code, and applies six common LHDN rules:

RuleVerdict appliedReference
Fines & penaltiesNon-deductibleITA 1967 s. 33 / s. 39
Non-customer entertainmentPartial (50% cap)ITA 1967 s. 39(1)(l); Public Ruling 4/2015
Capitalisable equipment (>RM 1,000)Non-deductible (revenue)ITA 1967 s. 39(1)(c); Schedule 3
Private vehicle running costsPartialITA 1967 s. 39(1)(a/b/k)
Capital legal feesNon-deductibleITA 1967 s. 39(1)(c)
Revenue / COGS accountsDeductible (default)

Anything that doesn't match a rule is left as Unknown — by design. The classifier is conservative: it would rather defer to you than guess wrong on a non-trivial case.

Kiravy AI checks six rules, not all of them. Edge cases — restructuring expenses, related-party transactions, expenses with mixed personal/business use beyond what's in the rules — need a tax adviser. The disclaimer is visible in the UI; treat the AI as triage, not a Form C generator.

How to run it

There are two paths:

From an engagement (recommended)

When you're working through Month-end closeReview queue tab → Run deductibility check button. The classifier runs across every unreviewed transaction in that engagement's period.

This is the normal monthly flow — close the books, classify deductibility in the same pass.

Per-transaction

When a single transaction's verdict is Unknown or you want to re-run after fixing the vendor / account code: open the transaction detail page and re-run from there. (UI surface for this is on the roadmap; today the engagement path is the main one.)

[Screenshot pending] Engagement Review queue with the 'Run deductibility check' button highlighted

Overriding the AI

The AI is never the last word. Open any transaction → the Tax treatment section shows the current verdict + AI note, and gives you an editable form:

  1. Change the verdict dropdown to whatever you think it should be
  2. Add a short note explaining why (max 500 chars — for the audit trail)
  3. Apply override

The override is logged in audit_logs with your user id and timestamp. Future runs of the classifier skip rows you've manually overridden — your judgement sticks.

[Screenshot pending] Transaction detail page showing the Tax treatment section with the override dropdown and note field

Who can override

Partner, Manager, or Staff. Viewers can see the verdict but can't change it.

Finding flagged expenses at year-end

There isn't a dedicated non-deductible expense report page (yet) — but the Transactions tab's filter does the job:

  1. Open the client → Transactions
  2. Tax filter → Flagged (this matches Non-deductible + Partial)
  3. Optionally narrow with the date range — usually the financial year

Or jump straight there with a URL like:

/clients/[clientId]/transactions?tax=flagged&from=2026-04-01&to=2027-03-31

Useful when preparing Form C — these are the expenses your tax adjustment schedule needs to remove (or partially remove) from the P&L.

What the verdict affects

SurfaceHow it's used
Transactions listAn amber dot appears next to flagged rows (non-deductible + partial)
P&L reportFlagged rows show in a warning banner up top; they still appear in the P&L because they're still expenses — but the warning tells you what'll be added back in tax adjustment
AI assistantCan answer questions like "what's our non-deductible spending this quarter?" by filtering on the verdict

Audit trail

Every override is logged. Firm settings → Audit logs (Partners only, planned UI) will surface:

  • Who overrode what
  • When
  • The before and after verdict
  • The note they left

For now, the trail is in the database — visible to support / DB admins. The UI surfaces "Manually overridden [timestamp]" badge on transactions where it matters.

Limits today

  • 6 rules, not the full LHDN ruleset — see the disclaimer
  • Single-jurisdiction (Malaysia / LHDN only) — clients with cross-border operations need manual review
  • No dedicated tax-adjustment schedule export — use the transactions filter + your existing template
  • No tax-rate engine — Kiravy doesn't compute the actual tax payable, just the deductibility status of expenses

What's coming

  • More rules — staff costs, R&D incentives, donations, capital allowances
  • Sabah/Sarawak special exemptions
  • Form C-style tax-adjustment schedule export
  • Drill-through from P&L deductibility warning into the filtered transaction list

What's next