When I was helping a friend figure out how much stamp duty they owed on a RM650k property, we spent 20 minutes Googling scattered blog posts with outdated rates. That frustration turned into a weekend project: a free, client-side Malaysian stamp duty calculator.
What is Stamp Duty in Malaysia?
Stamp duty (also called MOT stamp duty or Memorandum of Transfer duty) is a government tax you pay when transferring property ownership in Malaysia. It applies to the Sale and Purchase Agreement (SPA) and the MOT document.
The rates are tiered based on the property price:
| Property Value | Rate |
|---|---|
| First RM100,000 | 1% |
| RM100,001 - RM500,000 | 2% |
| RM500,001 - RM1,000,000 | 3% |
| Above RM1,000,000 | 4% |
So for a RM650,000 property, you don't just pay 3% on the whole amount -- you pay 1% on the first RM100k, 2% on the next RM400k, and 3% on the remaining RM150k.
Total = RM1,000 + RM8,000 + RM4,500 = RM13,500
Most people get this wrong by applying a flat rate.
First-Time Buyer Exemption
Good news for first-time buyers: if your property is priced RM500,000 or below, you qualify for a full stamp duty exemption on the MOT. This is a significant saving -- up to RM9,000 on a RM500k purchase.
The calculator accounts for this automatically.
What I Built
The Malaysian Stamp Duty Calculator does one thing well:
- Enter property price
- Tick if you are a first-time buyer
- Get an instant, accurate breakdown
Technical decisions:
100% client-side. All calculations run in the browser. No data is sent to any server, no analytics on your property price, no cookies. Property purchases are sensitive financial decisions -- your numbers stay on your device.
No framework. Vanilla JS, ~80 lines of logic. Fast to load, zero dependencies, works offline after first visit.
Mobile-first. Most Malaysians browse on phones. The layout works on a budget Android as well as a MacBook.
The Tiered Calculation Logic
The core logic is straightforward once you model the tiers correctly:
function calculateStampDuty(price) {
const tiers = [
{ limit: 100000, rate: 0.01 },
{ limit: 500000, rate: 0.02 },
{ limit: 1000000, rate: 0.03 },
{ limit: Infinity, rate: 0.04 },
];
let duty = 0;
let prev = 0;
for (const tier of tiers) {
if (price <= prev) break;
const taxable = Math.min(price, tier.limit) - prev;
duty += taxable * tier.rate;
prev = tier.limit;
}
return duty;
}
Clean, testable, easy to update if rates change.
Build-in-Public Notes
This is part of Sorted MY -- a growing collection of financial calculators and guides for Malaysians. The goal is practical tools that work without an account, subscription, or data harvesting.
Other calculators on the roadmap: RPGT calculator, legal fees estimator, and a full property purchase cost breakdown.
If you find it useful, a tip is always appreciated.
Try it free: https://hlteoh37.github.io/sorted-my/calculators/stamp-duty.html
Feedback welcome in the comments -- especially if I got anything wrong on the rates!
Top comments (0)