perfectdesign.

Business systems

Quotation system development

A quotation is a document that commits your business to a price. The system around it decides who may promise what, which version the customer actually accepted, and whether anyone can prove it six months later.

In short

A quotation system controls the path from a requirement to a priced document and an agreed next action: what goes into a quote, who approves it before it leaves the business, how revisions are versioned under one number, when it expires, and what is recorded the moment a customer accepts. It stops before order, fulfilment and invoicing design, which are separate work with different owners. Whether that needs a custom build or better use of what you already run is worth answering before anyone writes code.

Written for a sales or operations lead deciding whether manual quoting needs a controlled workflow · 7 min read

What this covers, and where it stops

This is the pre-order half of the job: capturing the requirement, assembling a priced document, approving it, sending it, tracking the customer's decision and recording exactly what was accepted. Order creation, fulfilment, invoicing and reconciliation are the half that follows, and they are scoped separately because they answer to different people and different rules.

You probably need something more controlled if any of the following is true. Two people can quote the same job at different prices. Nobody can say which version the customer is holding. A discount went out that nobody senior would have approved. A quote from four months ago is still being treated as current. Or the number on the document is decided by whoever saved the file.

One number, and it is never reused

Start here, because it costs almost nothing to build and a great deal to retrofit. Every quotation gets one identifier allocated by the system rather than typed by a person. Revisions stay under that identifier as versions. A superseded version is kept rather than overwritten. Nothing reuses a number that has already been issued, even if the original was withdrawn the same day.

That one rule is what lets you answer the only questions that matter in a dispute: what did we send, when, at what price, and who approved it. It is also what removes the spreadsheet of documents that a quotation system was supposed to replace, because the sequence lives in the system that issues the numbers.

One number, every revision underneath it. This is what settles a dispute: what was sent, when, at what price and who approved it. A full text version follows.

One number, every revision underneath it

Editorial framework. This is what settles a dispute: what was sent, when, at what price and who approved it.

Basis: Stripe: Quotes. Reviewed .

Read the graphic as text
  • Number allocated. Issued by the system, never typed by a person
  • Version sent. Immutable from the moment it leaves
  • Revision. A new version under the same number
  • Superseded kept. The earlier version retained, never replaced
Download this infographic (SVG)

What goes into a quote

A quote is a structured record before it is a document. Customer context, including who receives it and where it is sent. Line items, with quantities or units where those apply. The pricing inputs that produced each figure. Notes and terms. A validity period. And a version identity that travels with all of it.

Separate the reusable part from the transaction-specific part. Standard scope wording, terms and section structure belong to a template that a named person maintains. Prices, quantities, dates and names belong to the transaction. Mixing them is how a quotation ends up carrying last year's terms with this year's prices. Odoo's documentation describes one product's approach to that separation, with reusable quotation templates carrying validity settings, line items and a customer-facing preview. It illustrates the shape rather than recommending the tool, and the defaults it documents will not automatically fit your business.

Where the customer context comes from is its own decision. It may be typed, it may come from an existing customer record, or it may be pulled from an opportunity your sales team already keeps. That connection is a sibling piece of work and it belongs with CRM and integrations.

The e-Invoice mandate is already fully live. Every phase has passed. If a system issues invoices, e-Invoice is not an upcoming project, it is a current obligation with a turnover threshold attached. A full text version follows.

The e-Invoice mandate is already fully live

Published statistic. Every phase has passed. If a system issues invoices, e-Invoice is not an upcoming project, it is a current obligation with a turnover threshold attached.

Source: Inland Revenue Board of Malaysia: e-Invoice implementation timeline. Reviewed .

Read the graphic as text
  • Above RM100 million. Mandatory since 1 August 2024
  • RM25 million to RM100 million. Mandatory since 1 January 2025
  • RM5 million to RM25 million. Mandatory since 1 July 2025
  • Up to RM5 million. Mandatory since 1 January 2026
  • Under RM3 million. Exempt, unless the company belongs to a larger group
Download this infographic (SVG)

Pricing rules and discounts

This is where a quotation system earns its place. Figures are resolved from an agreed rule rather than from memory: list price, customer or tier pricing, quantity breaks, and whatever your business genuinely does for a repeat client. The rule produces the number, and the number carries the inputs that produced it so somebody can check the arithmetic later without recreating the conversation.

Discounts need a policy before they need a field. Decide the threshold a salesperson may approve alone, what happens above it, whether a floor exists below which the system refuses outright, and whether a discount is recorded as a percentage, an amount or an overridden unit price, because those three reconcile differently once an order exists. An out-of-policy figure should route to a named reviewer rather than being quietly possible.

A worked example

The roles, policies and system responses below are assumed for teaching and the real scope stays to agree. The acceptance evidence describes tests to run rather than results already achieved.

Illustrative example: one quotation from draft to accepted
Workflow stepAssumed actorProposed system responseExceptionAcceptance evidence to collect
Draft a quoteSalespersonRecord the requirement and line items, and calculate a versioned total from the approved rulesA price is missing, or the discount falls outside policyCollect the rule inputs and check each calculation against them, including the out-of-policy route
Approve and sendSales managerApprove one specific version, record the recipient and the time, then issue the documentA changed version goes out without a further approvalTest version, permission and approval history, and confirm a superseded version cannot be sent
Accept the quoteCustomer and order ownerRecord acceptance against the exact version before any agreed handoffThe version has expired or has been supersededCollect the acceptance record with its version, and check it maps to the intended downstream record

Who may approve, revise and send

An illustrative lifecycle runs draft, review, approved, sent, revision required and superseded, ending in accepted, rejected or expired. Your real states depend on how your business sells, and the useful exercise is naming them deliberately rather than adopting somebody else's list.

Then attach permissions, because states are only as good as the rules about who may move a quote between them. Who may edit the inputs. Who may approve a version. Who may send it, which is not always the same person. Who may revise an approved quote, and whether revising it automatically returns it for approval. Who may inspect the history.

Treat renewed approval after a material change as a control you configure, not a universal rule. Your business decides what counts as material: a price change, a scope change, a longer validity, a different recipient. What should not be configurable is whether the approval is recorded at all. Every version should be able to show who approved it and when, which is precisely what the approval row in the table is asking you to test.

Validity, supersession and expiry

Validity is a business rule rather than a formality. It belongs to a version, it should be visible on the document, and the system should know what to do when the date passes instead of leaving a stale quote quietly available to accept.

Three states get confused, and each prompts a different decision. Superseded means a newer version exists, so the question is whether the customer has seen it. Rejected means the customer said no, so the question is why, because that is some of the most useful sales data you will collect. Expired means time ran out, so the question is whether to reissue at the same price or requote.

Acceptance should be associated with the version it applies to, together with whatever evidence you agree to keep. Odoo's documentation describes one configured approach, where an online signature flow can retain signed-by and signed-on information against the quotation. Whether a signature, an email confirmation or a purchase order is the right evidence in your business is a scoping decision, and a system recording an acceptance is not the same thing as a legal opinion about the contract.

Four ways a quotation stops being live. A stale quote left quietly acceptable is a price you no longer meant to offer. A full text version follows.

Four ways a quotation stops being live

Editorial framework. A stale quote left quietly acceptable is a price you no longer meant to offer.

Basis: Perfect Design: business systems explained. Reviewed .

Read the graphic as text
  • Superseded. A newer version exists, has the customer seen it
  • Rejected. The customer said no, and the reason is data
  • Expired. Time ran out, so reissue or requote
  • Accepted. Recorded against the exact version agreed
Download this infographic (SVG)

After acceptance

An agreed handoff settles four things: which quotation version is the input, which customer and line data transfers, who owns the work downstream, and what happens to an exception such as a line that cannot be delivered as quoted. Order creation, fulfilment, invoicing and reconciliation design begin on the other side of that boundary and are scoped as their own piece of work.

Which rails Malaysian money runs on. Share of transactions across the six payment systems Bank Negara reports. Real-time rails now carry four in five payments, which is why they belong in a checkout before a card form does. A full text version follows.

Which rails Malaysian money runs on

Published statistic. Share of transactions across the six payment systems Bank Negara reports. Real-time rails now carry four in five payments, which is why they belong in a checkout before a card form does.

Source: Bank Negara Malaysia: Payment Statistics, Table T3 Payment Systems, 2025. Reviewed .

Read the graphic as text

2025

  • DuitNow: 79.7%. Real-time transfers and QR, 5.44 billion transactions
  • FPX: 14.0%. Online banking, the e-commerce workhorse
  • Interbank GIRO: 4.5%. Scheduled transfers, payroll and supplier runs
  • JomPAY: 1.4%. Bill payments by biller code
  • Direct debit and RENTAS: 0.4%. Recurring collections and large-value settlement
Download this infographic (SVG)

The document people actually read

The rendered document is not a detail. Totals that align, line items that do not break awkwardly across a page, dates in a format nobody misreads, and terms that stay attached to the version they belong to. We look at the rendered file before it goes anywhere, because a quotation is often the first part of your operation a customer inspects closely, and a misaligned total costs more trust than it should.

The cheque is finishing. Under one cheque per person per year, and falling by a fifth annually. Any process that still assumes a cheque in the post is quietly adding a week to getting paid. A full text version follows.

The cheque is finishing

Published statistic. Under one cheque per person per year, and falling by a fifth annually. Any process that still assumes a cheque in the post is quietly adding a week to getting paid.

Source: Bank Negara Malaysia: Annual Report 2025 and Payment Statistics T1. Reviewed .

Read the graphic as text
  • 2020: 1.84.
  • 2021: 1.48.
  • 2022: 1.41.
  • 2023: 1.22.
  • 2024: 1.17.
  • 2025: 0.92. 31.4m total

Chart scale: Cheques issued per Malaysian, per year.

Download this infographic (SVG)

Where your quotes begin

Two starting points behave differently. If a customer picks items from a catalogue and asks for a price, the quotation begins from a selection and most of the work is rules and approval. If quotes begin from a conversation, an enquiry form or an internal sales process, the work starts earlier, with capturing a requirement well enough that two people would quote it the same way.

Bring the current process, the change you want, who is involved, the tools already in use and any constraint that is fixed. Keep credentials out of a first message. Tell us how you quote today and we will say what we would control first, what belongs in a later phase, and whether a custom build is the right answer at all.

What you get

What is actually delivered

01

Allocated quotation numbering

One identifier per quotation, issued by the system, never reused, with every revision kept as a version underneath it.

02

Structured quote record

Customer context, line items, pricing inputs, notes, terms and validity held as data, with the document rendered from it rather than typed over it.

03

Pricing rules

List, tier and quantity-break pricing resolved from an agreed rule, with the inputs stored against each figure so it can be checked later.

04

Discount policy in the system

Thresholds a salesperson may approve alone, a route to a reviewer above them, and an optional floor the system will not go below.

05

Approval before sending

A named approver on a specific version, with the approval recorded against an author and a time, and superseded versions blocked from going out.

06

Validity and lifecycle states

Expiry, supersession, rejection and acceptance as explicit states, each with a defined decision and a visible current version.

07

Acceptance record

Acceptance captured against the exact version, with the evidence you agreed to keep, ready for a handoff to whatever happens next.

08

A document that reads properly

A rendered quotation checked for totals, wrapping, page breaks, dates and terms before it is ever put in front of a customer.

How it runs

Settle the rules and the states, then build the document

Quotation systems are decided by pricing rules, permissions and lifecycle states. The document is the easy part once those are agreed.

  1. 01

    Map how you quote today

    Where requirements come from, who prices them, who checks, what is sent, and what currently proves a customer accepted.

  2. 02

    Agree the pricing and discount rules

    How a figure is produced, which discounts are within policy, where the threshold sits and who reviews anything beyond it.

  3. 03

    Name the states and permissions

    The lifecycle your business actually uses, and who may edit, approve, send, revise and inspect a quotation at each stage.

  4. 04

    Prototype the document and the screens

    You draft, approve and send a real-shaped quotation on a live link, so the rules are judged from the thing itself rather than a specification.

  5. 05

    Build, test the exceptions, hand over

    Out-of-policy discounts, superseded versions, expiry and acceptance are exercised as checks, then the code, data and accounts are handed to you.

Proof

Work you can click through

VITALE Back Office is a concept prototype we built ourselves, not client work, and no client outcome is implied. It appears here because it is the same discipline applied to a different document: figures produced from a configurable set of rules, a cycle that can be re-run and compared, and a statement a person has to be able to read and question.

Concept prototypes are labelled as prototypes everywhere they appear. They demonstrate what we can build, not work delivered for that named client. More client work is going live and will be added as it does.

How we work

The parts people ask about before they commit

How we build

React first, other languages when a project needs them

We build in React by preference, on both web and mobile, and we work in other languages when a project genuinely calls for it.

Timeline

Project dependent, and often quicker than expected

Timelines are project dependent. A focused build can go live in about a week, while a larger platform takes longer once scope is agreed.

Ongoing care

Quoted with the project, not bolted on

For a more complex website or a system with a real backend, ongoing care starts from RM 250 a month, with the plan confirmed against what was actually launched. Care is quoted with the project, not bolted on afterwards.

Getting hold of us

Normally under one working day

We normally respond to a support request in under one working day, and we work to solve problems as fast as we can. That is how we normally work rather than a contractual guarantee, and responding is not the same as resolving. If your operation needs a formal response or resolution commitment, we can write one into your scope.

Ownership

Everything belongs to your business

You own everything we build for you: the code, the content, the domain, the hosting account and every third-party account opened for the project. There is no lock-in. If you move to another provider, everything goes with you and we help with the handover.

  • Source code, handed over in your own repository
  • Domain and DNS, registered to your business
  • Hosting and every service account, in your name
  • Analytics, search and ad accounts, with us as a manager you can remove
  • All content, media and data in the system

Questions

Asked about quotation systems

Straight answers to what people ask before they commit. Anything else, message us.

What does a quotation system cost?

Our published website packages are on the pricing page. A quotation system is quoted against the scope we agree, because the work is decided by how complicated your pricing rules are, how many approval stages exist, and whether it has to exchange records with a system you already run.

Can we not just use templates in a spreadsheet?

For a handful of quotes a month, often yes, and we will say so. Spreadsheets stop working when more than one person quotes, when a discount needs approving, or when somebody has to prove which version a customer accepted. Those three pressures, rather than volume alone, are usually what makes a system worth building.

How are revisions handled?

Under the same number, as versions. The original is kept and marked superseded rather than overwritten, the new version carries its own approval, and the current one is obvious on every screen. Nothing is deleted, because the point of the system is being able to show what was sent and when.

Can it stop somebody discounting too far?

Yes, once you decide the policy. A threshold can be approved by a salesperson alone, anything beyond it routes to a reviewer, and a floor can refuse outright. The part worth thinking about is the exception route, because a rule with no route simply moves the discount into an email.

Does it have to connect to our accounting system?

Not necessarily, and it is worth being deliberate. Many businesses keep quoting separate and hand accepted quotes across as a defined step. Whether a direct connection is feasible depends on permissions, data quality and supplier terms, which we check before promising anything. That work is covered on CRM and integrations.

Is a signature on a quotation legally binding?

That is a question for your legal adviser, not for us. What a system can do is record an acceptance against an exact version with the evidence you agreed to keep, so there is no argument about which document was accepted. The legal weight of that record is separate from the software.

How long does a quotation system take to build?

Timelines are project dependent. A focused build can go live in about a week, while a larger platform takes longer once the scope is agreed. Here the pacing item is normally the pricing rules and the approval policy, because those are business decisions rather than development time.

Where to go next

  • CRM and integrations

    Where customer and opportunity context comes from, and whether an accepted quote can be handed across automatically.

  • Admin dashboards

    The screens where open quotes, pending approvals and expiring versions become visible to an owner.

  • Accounts and portals

    Roles and permissions, the layer deciding who may approve, send or revise a quotation.

  • VITALE Back Office prototype

    A concept prototype built around rules-driven figures and a statement a person has to be able to question.

Sources

Tell us what you need built

We will show you the closest thing we have already built, then scope the real version against your requirements.