Scoping note / Malaysia / September 2026
What the client is actually asking for, what it costs to build properly, and the four things that need answering before any number gets committed.
What it is
Strip away the marketing pages and this is an order intake system for a small legal services outfit. Property agents come to the site with a tenancy agreement that needs stamping, fill in a form, upload documents, and pay. Staff then do the actual work by hand in the back office.
The reference site makes the business model very legible. Drafting a tenancy agreement costs RM50 (advertised as reduced from RM80). Stamping carries a flat RM15 service fee on top of the government duty. Those are volume prices. The client is not selling a premium service, they are selling throughput.
That matters for how you scope it. The public pages are a shopfront and barely earn their keep. The thing that determines whether this business works is how fast one staff member can move fifty applications through the back office in a morning. The admin portal is the product. Everything else is packaging.
Read the fields on the reference site's two forms. Every identity field is Agent Name, Agent Email, Agent Contact. There is no field anywhere for the landlord or the tenant. The people paying are property agents processing tenancies on behalf of their clients, not members of the public stamping their own rental agreement.
That single fact reorders most of the priorities:
Do not sell SEO into this and do not let it be expected for free. There is no ranking value in a service a repeat B2B user reaches by bookmark. Technical hygiene only: clean markup, correct metadata, fast pages, an XML sitemap, HTTPS. That is included as competence, not as a service line.
There is exactly one exception worth raising later. A free public stamp duty calculator, correct and dated, is a genuine search asset. Agents and landlords do search for that. It is the one page on this site that could pull traffic, and it doubles as the proof that the client's numbers are right when the incumbent's are not. Park it as a phase two idea rather than folding it into this quote.
Three surfaces, not one website: a public intake form that takes money, a private back office that processes work, and a status page so agents stop calling to ask where their document is.
Never present this as "a 10 page website". Priced that way it gets benchmarked against a RM5,000 brochure site and the admin portal looks like a free extra. Present it as an operations system with a public intake form attached, and the comparison shifts to software, which is the correct comparison.
The constraint that sets the price
There is no public API from LHDN that lets a third party submit stamping applications programmatically. Since 1 January 2026 stamp duty runs on the Self Assessment Stamp Duty System, accessed through MyTax under e-Duti Setem. Submission requires a Tax Identification Number, a login, an uploaded instrument and a declaration return (BNDS) filed by a human.
So the platform collects the job and the money. A member of staff still logs into MyTax and stamps the document manually, then uploads the stamped certificate back into the portal. Nothing in the brief says otherwise, but nothing in the brief rules it out either, and that gap is exactly where a fixed price project goes wrong in week five.
Ask the client directly: does the platform submit to LHDN automatically, or does your staff stamp manually and upload the result? If they expect automatic submission, the project as specified does not exist and the conversation has to restart.
There is a second consequence. Under self assessment, the person filing carries the liability for getting the duty right. If the site's calculator understates the duty, the client's operation eats the shortfall and the penalty. That turns a small piece of arithmetic into the highest risk component in the build, and it needs treating accordingly: server side calculation, an admin override before anything is charged, a stored snapshot of the rates used at the time of quoting, and a written sign off from the client's own tax agent on the formula.
Reference site audit
The Finance Act 2024 replaced the tenancy duty scale from 1 January 2025. The RM2,400 annual rent exemption was removed, the rates for longer tenancies went up, and a fourth duration band was added. Reading the reference site's own JavaScript, it has not fully caught up.
factor = 1 | 2 | 4
duty = ceil(((rent * 12) - 2400) / 250) * factor
Their do_calculate() function applies the pre-2025 scale and still deducts the abolished RM2,400 exemption. On a RM1,500 tenancy it understates the duty.
factor = 1 | 3 | 5 | 7
duty = max(10, ceil((rent * 12) / 250) * factor)
Full annual rent, no deduction, RM10 minimum principal duty, and four duration bands rather than three.
Their stamping form is in better shape and uses the 1 / 3 / 5 factors with no exemption, but it still carries real defects worth knowing about:
This is the strongest thing you have to say in the pitch. You are not offering to rebuild their competitor's site, you are offering to build the version that computes duty correctly under a self assessment regime where errors are the filer's problem.
Build specification
This is the whole business rule. It goes in an admin editable settings screen, not hardcoded, because this schedule has already changed once in the last two years and will change again.
| Tenancy duration | Rate per RM250 or part | Pre-2025 |
|---|---|---|
| Not exceeding 1 year | RM1 | RM1 |
| More than 1 year, not exceeding 3 | RM3 | RM2 |
| More than 3 years, not exceeding 5 | RM5 | RM4 |
| More than 5 years or indefinite | RM7 | RM4 |
| Late stamping | Penalty |
|---|---|
| Within 3 months after the 30 day deadline | Higher of RM50 or 10% of deficient duty |
| More than 3 months after the deadline | Higher of RM100 or 20% of deficient duty |
Worked example for the spec, so there is an agreed test case: RM1,500 per month over two years is RM18,000 annual rent, 72 blocks, RM216 principal duty. Add RM10 for one duplicate copy. If stamped four months late, add RM100 (the flat amount beats 20% of RM216 at RM43.20). Plus the service fee.
Put the duty schedule in the functional spec as a client supplied input, signed off by their tax agent, and price rate changes after go live as a maintenance item. You do not want to be the party who guaranteed a tax computation.
Scope
Home, Create (service chooser), Draft Tenancy application, Stamping Only application, Track, Contact, Refund Policy, Privacy Policy, Terms, User Manual. Built from the supplied Figma. Worth noting in the quote that the two application forms are counted inside the ten but are an order of magnitude more work than a policy page, so page count is a poor unit here and should not be used to argue for extras later.
Booking form upload, special remarks, agent name, email and contact, fixed fee, payment. Simple by design because a human writes the agreement afterwards.
Rent, tenure, duplicate copies, agreement date, tenancy start date, live fee calculation, then uploads for the agreement itself plus passport (foreign parties) and business owner NRIC (sole proprietor or partnership), agent details, payment. File size ceiling, type whitelist, virus scan on upload.
Application queue with filters by status, service type, date and agent. Detail view with all submitted data and documents. Status transitions with an audit trail. Secure document download and upload of the stamped result. Payment status and reconciliation against the gateway. Duty override before charging. Rate settings screen. CSV export. Staff accounts with roles.
Transactional email to the agent on submission, payment received, in progress, completed and rejected. Internal alert to staff on new paid application. Reference number issued at submission and used on the public tracking page.
Workflow
This is the part that is genuinely missing from the brief. Every status below needs an owner, a trigger and a failure path, and getting it agreed in writing is what keeps a one month build to one month.
Form validated server side, duty recalculated on the server, reference number issued, files quarantined until payment clears.
Owner: systemGateway callback verified and recorded. Needs idempotency so a repeated callback does not double count, and a reconciliation view for payments that succeed at the bank but fail to return to the site.
Owner: systemStaff open the documents and check them. Two exits that the brief does not currently cover: documents are wrong and need resubmission, or the declared rent does not match the agreement and the duty was underquoted.
Owner: staffA second payment link for the shortfall. Decide now whether this exists. If it does not, someone chases it on WhatsApp forever and the portal is not the system of record.
Owner: staff, needs client decisionStaff file it manually on MyTax and record the submission reference back in the portal.
Owner: staff, outside the systemStamped certificate uploaded and released to the agent via a signed, expiring download link. Notification sent.
Owner: staffRefund policy exists on the reference site, so refunds are in scope commercially. Confirm whether they are processed inside the portal through the gateway API or manually at the bank.
Owner: staff, needs client decisionPricing
Honest effort for the scope as written, working solo with the design and spec supplied, is around 34 working days. That is roughly seven weeks, against a requested four. The pricing below is built from that, not from page count.
Every figure is grossed up so that the 10% middleman cut comes out of the quoted price, not out of your margin. Quote the right hand column. Never quote the net column, and never work backwards from it in front of the client.
| Option | What changes | You net | Quote |
|---|---|---|---|
| A. Core | Full public site, both forms, server side calculator, payment gateway, tracking page, notifications. Back office built on native WordPress admin screens with custom columns, filters and status handling. One round of UAT, 30 day defect warranty. | RM16,650 | RM18,500 |
| B. Full | Everything in Core, plus purpose built admin screens with a work queue and dashboard, full status pipeline with audit trail, secure document vault with expiring links, duty override and top up flow, refund handling, gateway reconciliation report, admin editable rate table, CSV export, staging environment, two rounds of UAT, staff training session with a written SOP, 60 day defect warranty. | RM23,850 | RM26,500 |
| B+ Agent accounts | Option B plus agent login, saved profiles that prefill every submission, and submission history. Given this is repeat B2B use, this is the highest value item in the whole scope. | RM26,550 | RM29,500 |
| C. Platform | Everything in B+, plus auto drafted tenancy agreement PDF generated from form data, e-signature, English / Bahasa Malaysia / Chinese, WhatsApp notifications. | RM34,200 | from RM38,000 |
| Walk away floor, net to you RM18,000 | RM20,000 | ||
Option B is the one that matches what they described and the one to quote. Option A exists so that if the budget comes back tight you have something to concede to instead of discounting B. Option C is there to make B look measured, and because "Instant Tenancy" on the reference site has been down for maintenance, which suggests auto generation is the hard part nobody has nailed.
RM26,500Quote this. Nets RM23,850 after the middleman. Floor of RM20,000 quoted, RM18,000 net. Below that the admin portal comes out of scope and you say so rather than absorb it.
Three things need confirming, because each one quietly changes what you take home. Is the 10% taken off the contract value, or added by the middleman on top of your number? Does it apply to the monthly maintenance too, or to the build only? And is it calculated before or after tax?
Also confirm whether you are quoting inclusive or exclusive of service tax. If SST applies to you, quoting a tax inclusive number by accident hands over another slice on top of the 10%.
The duty schedule changed in January 2025 and the filing system changed in January 2026. Build the rates as configuration, then sell the maintenance plan on the basis that you keep them correct. That is a far easier sell than generic hosting support.
Timeline
One month is achievable only if every dependency lands on day one and the scope is frozen. It will not be, so quote six weeks and protect yourself on when week one begins.
Theme scaffold from Figma, design tokens, component library, page templates, hosting and staging set up.
All ten pages built and responsive. Content loaded. Client review checkpoint on the front end while back end work begins.
Both application forms, file upload handling, server side duty calculation with the agreed test cases, validation.
Gateway integration, callback verification, idempotency, reference numbers, tracking page, application data model.
Work queue, detail views, status pipeline, document vault, overrides, exports, roles, notifications.
Security review, PDPA controls, end to end testing, UAT and fixes, staff training, documentation, go live.
Week one starts when all five of these are in hand: final Figma covering every page and every form state, the signed functional spec including the status workflow, payment gateway credentials on a live merchant account, hosting access, and all page content. Merchant account approval in Malaysia routinely takes two to four weeks on its own and is entirely outside your control.
Risk register
| Risk | Effect | Control |
|---|---|---|
| Client expects automatic LHDN submission | Project as specified is not buildable | Confirm in writing before quoting |
| Duty calculated wrong under self assessment | Client absorbs shortfall and penalty, blames the build | Client's tax agent signs off the formula, admin override, rates stored per application |
| Admin workflow undefined in the spec | Scope creep through weeks 4 and 5 | Status pipeline agreed and signed before build starts |
| Merchant account not approved in time | Cannot test or launch | Excluded from your timeline, flagged as a client dependency on day one |
| MyKad and passport copies held on the server | PDPA exposure | Storage outside webroot, expiring signed links, role based access, retention policy, privacy notice |
| Figma arrives incomplete on form states | You design by default and get corrected later | Error, empty, loading and success states required before week one |
| Payment succeeds but callback fails | Paid applications invisible to staff | Idempotent callbacks plus a reconciliation screen |
Before you send a number
The first four change the price. Get those answered before committing to anything.
Does the platform submit to LHDN automatically, or do staff stamp manually on MyTax and upload the certificate back?
BlockingThere is no third party API. If they expect automation, the whole project needs rethinking.
Who signs off the duty calculation formula, and who carries the liability if it is wrong?
BlockingSelf assessment puts the risk on the filer. This needs to be their tax agent, in writing, not your best reading of the Stamp Act.
Which payment gateway, and is the merchant account already approved and live?
ScheduleThe gateway choice moves the price by two or three days, not by tiers. The approval timeline is the part that can sink the launch date, and it is entirely outside your control. Whatever they pick must support FPX, because Malaysian agents pay by bank transfer, not card.
Does their gateway have a refund API, or are refunds done manually at the bank?
ScopeThe simpler local gateways often have no refund API at all. Since there is a published refund policy, this decides whether "process refunds in the portal" is even buildable or has to become a manual step with a record kept.
Can we see the functional spec and the Figma before quoting?
BlockingThe admin portal is most of the work and none of it is described yet. Quoting blind on that is how this goes wrong.
What are the application statuses, and what happens when documents are wrong or the duty was underquoted?
ScopeNeeds a top up payment flow and a resubmission path, or staff end up working outside the system.
Are refunds processed inside the portal or manually at the bank?
ScopeGateway refund API integration is a real line item.
Do agents need accounts, or is every submission anonymous with a reference number?
ScopeAccounts add authentication, profiles, history and password recovery.
English only, or Bahasa Malaysia and Chinese as well?
ScopeThe reference site is bilingual throughout. If they expect the same, that is not a free addition.
Expected volume in year one, and how many staff work the back office?
DesignFifty applications a month and five hundred are different admin designs.
Who supplies the page content and the policy text?
DependencyMissing copy stalls week two.
To send
Positions you as the person who read the brief properly, without giving away the analysis for free.
Hi, I have gone through the brief and the tenancy.my reference. It is a well defined project and it is one we can build. Before I put a firm number on it, there are four things I need confirmed, because each one moves the price.
1. Stamping submission. LHDN does not offer a public API for third party submission, and since January 2026 stamping runs through the Self Assessment system on MyTax. So the platform can take the application and the payment, but a staff member still files it manually and uploads the stamped certificate back. Can you confirm the client understands it works this way? If they are expecting automatic submission to LHDN, we need a different conversation.
2. The fee calculator. Worth flagging early: the duty schedule changed on 1 January 2025. The RM2,400 exemption was removed, the rates went up, and a fourth duration band was added. The reference site has not fully updated, one of its calculators still runs the old formula. We will build to the current schedule, but under self assessment the filer carries the liability for getting it right, so we need the client's tax agent to sign off the formula in writing and we will build an admin override before anything is charged.
3. Payment gateway. Which one, and is the merchant account already approved? We can work with any of the common Malaysian gateways, so the choice itself is not a problem, but it needs to support FPX and we need to know whether it offers a refund API, since there is a refund policy to honour. The approval timeline is the real issue. It often takes two to four weeks and it sits on the critical path.
4. The functional spec and Figma. Can I see both before quoting? The admin side is the bulk of the work here and the brief covers it in one line. In particular we need the application statuses defined: what happens when uploaded documents are wrong, and what happens when the actual duty comes out higher than what was quoted and charged.
One observation on the shape of it. Looking at the reference site, every identity field on both forms is the agent, not the landlord or tenant. So this is a tool for repeat professional users rather than a consumer site. That is worth confirming, because if it is right then the back office and the speed of resubmission matter far more than the marketing pages, and agent logins with saved details become one of the more valuable things we could build.
On budget and timing. As a guide, a build of this shape sits in the RM18,500 to RM26,500 range, depending on how much of the back office is purpose built versus running on standard admin screens. On timing, four weeks from design approval is achievable only if the final Figma, the signed spec, the live gateway credentials and the hosting are all in place on day one and the scope is frozen. Realistically I would plan for six weeks and treat four as the stretch.
Happy to jump on a call with the client directly if that is easier, particularly on point one.