Pricing custom work without breaking your product plan
Pricing custom work gets simpler when you separate setup, support, and roadmap items, so client deals do not turn into product branches.

Why custom deals slowly break the product
Custom work rarely hurts you on day one. It hurts you later.
A client asks for a special approval step, a custom report, or a different billing rule. It sounds small, so the deal looks profitable. You charge for the build and move on. But the feature is not the real cost. The real cost is the exception that stays behind.
Once that exception ships, your team has to remember it every time they touch the product. Support replies get longer. QA needs extra checks. New hires need the backstory for why one customer works differently. A fix that should take an afternoon turns into two days because someone has to ask, "Will this break that custom flow?"
That is where margin leaks out. The original work might take 20 hours. The follow-up can keep showing up for months.
Custom work also slows the whole product down. Product improvements help every customer at once. Client-specific changes help one customer and add more conditions to your code, tests, docs, and release process. After a few deals like that, releases start to feel risky. People delay them. Simple improvements pile up.
This happens fast in a small SaaS company. You start with a clean workflow tool. One customer gets a special export. Another gets a different user role. A third wants something close to the first request, but not quite the same. Now you do not have a clear product decision. You have a pile of private deals.
That is the real problem. Product work improves the main path for everyone. Custom work creates side rules, side tests, and side support. If you do not separate those costs early, each new deal looks good on paper and gets more expensive in real life.
Split the work into three buckets
Most bad custom deals start with one vague number.
The client sees a single price, but your team is really taking on three different kinds of work: setup, support, and roadmap work. Those do not cost the same, and they should not be priced the same.
Setup is the one-time work that gets the customer live. That usually includes data import, configuration, training, and launch help.
Support is the repeat work that starts after launch. It includes questions, small changes, bug triage, extra meetings, and the steady stream of "can you also..." requests.
Roadmap work is product work. If the request could help more than one customer, treat it as a product decision instead of hiding it inside one deal.
Put each bucket on its own line in the quote. That small change improves the whole conversation. A setup fee feels finite because it is. Support feels ongoing because it is. Roadmap work stays separate, so you do not quietly promise a product feature in the middle of a sales process.
Use the same names everywhere. If you say "setup" on the sales call, say "setup" again in the proposal and on the invoice. If one document says "support" and another says "success package," people fill in the blanks with their own assumptions.
A clean structure also protects the roadmap. Shared ideas go through normal product review. One-off work gets paid for. Repeat help does not disappear inside a project fee and quietly eat your margin.
Decide what belongs in setup
Setup should cover the work that takes a customer from signed quote to a clean first launch. It should not become a bucket for every request that shows up before or after go-live.
Most setup packages are pretty ordinary: importing old data, configuring roles and permissions, training admins or daily users, running launch checks, and doing one final handoff.
Deals get messy when setup starts absorbing everything. If a customer needs six workshops, three test imports, and manual cleanup of broken legacy data, that is extra paid work. It is not part of a vague onboarding promise.
Put limits in writing. Say how many meetings are included. Say how many training sessions are included and how long they are. Put a cap on migration volume, revision rounds, and manual cleanup. If the migration will take 25 hours, price 25 hours. If training needs two sessions, write down two sessions.
The end date matters as much as the price. Setup should stop on a clear handoff point, such as "10 business days after import sign-off" or "after the first live-week review." After that, support pricing starts. Without that line, customers keep pulling setup work forward for weeks.
It also helps to state what setup does not include. Custom features, open-ended cleanup, new reports, extra training, and post-launch support should stay outside setup unless the quote lists them.
A short scope keeps you out of a common trap: every sale turning into its own mini product.
Price support without hiding it
Many teams bury support inside the project price because it feels easier at the time. It is almost always a mistake.
When support is hidden, the client assumes help is unlimited. Your team starts doing unpaid work every week. The project looked healthy when it closed, but the margin keeps shrinking after launch.
Support needs its own line item and plain rules. State your support hours, response times, and what counts as a normal request. If you answer messages Monday to Friday, say that. If urgent issues get a reply within four hours, write that down.
Do not lump bug fixes, advice, and change requests into the same bucket. They are different.
- A bug fix means the work does not match the agreed scope.
- Advice means the client wants help using, planning, or reviewing something.
- A change request means they want new work.
A simple monthly plan works better than open-ended help. Most small SaaS deals only need a few options: a business-hours email plan, a small monthly block of advisory time, a plan with minor fixes and a hard cap on hours, or a higher tier with faster response times. Rush work and weekend work need separate pricing. If you do not price them separately, clients learn that every request can become urgent for free.
Review support usage every month. Look at how many requests came in, what kind they were, and which ones turned into new work. If one client uses twice the hours in their plan, update the next invoice or move them to a different plan. Teams that do this keep scope under control and avoid building a hidden second product for one account.
Put shared requests on the roadmap
Some requests look custom at first, but they are really product signals.
If more than one customer will want the same thing, treat it as roadmap work. Do not bury it inside a private deal.
A quick test helps. Ask three questions:
- Does this solve a common pain?
- Does it fit the product you want to sell next year?
- Will it still make sense six months from now?
If the answer is yes, stop treating it like a custom favor.
Before you commit, estimate the product value. Will the feature help future sales? Will it reduce support load? Will it remove awkward workarounds inside your own team? If it only helps one customer in one narrow case, keep it custom. If it can help many customers, move it into the main product.
Build shared features in the main codebase from the start. Do not hide them in a client branch just because one customer asked first. A small team can support one clean version of a feature. It struggles when every deal creates a copy.
Say this clearly in the quote. Most clients accept a simple explanation: "This workflow is custom for your team. The reporting option may later become part of the standard product." That gives them clarity without promising exclusivity you cannot afford.
Sometimes co-funding can work. A client pays for part of the build and you move the reusable part onto the roadmap. That only works when the math works. Count build time, testing, support, and long-term maintenance. If the client contribution does not cover that extra burden, you are still underpricing the work.
One rule is enough: client-specific work stays custom, shared product work goes on the roadmap, and each gets priced on its own.
How to quote the deal
A good quote keeps the sale simple and protects the product.
Do not send one total number with fuzzy notes. Break the deal into parts so both sides can see what they are buying, when it ends, and what happens after launch.
- Start with the standard product. Put the normal plan or license first, using the same base price you offer similar customers.
- Add setup as a separate line. Name each item, set a limit, and include a date. For example: import up to 5,000 records, connect one payment provider, and train two staff sessions by May 30.
- Add support as its own plan. Match it to the client's real needs.
- Move reusable feature ideas out of the quote. If a request could help several customers, put it in a roadmap note instead of the setup price.
- State what the quote does not include. Call out extra integrations, feature development, cleanup beyond the agreed limit, and on-site work if you do not offer it.
This structure cuts down on arguments later. It also gives you a clean way to say yes without quietly promising custom product branches.
If a client pushes you to bundle support into setup, push back. Bundling hides the real cost and makes renewal awkward. When the first support issue lands three months later, you want a price and a boundary already on paper.
A quote does not need to be long. It just needs to be clear.
A simple example from a small SaaS sale
A small SaaS team is close to signing a new customer. The buyer likes the product, but asks for three extras: SSO for employee login, help importing old data, and a few changes to the weekly report.
This is where teams often make a mess. They wrap everything into one large quote, promise to "make it work," and end up maintaining a version of the product that only one customer needs.
The clean version is simpler.
The import work belongs in setup. The customer needs help mapping old fields, cleaning bad records, and loading the first batch. Training fits there too, because it happens once at the start.
The report changes and day-to-day questions should not hide inside setup. Those requests tend to continue after launch. Put them under monthly support, with a clear amount and a clear limit.
SSO is different. If this is the only customer asking for it, pause. If several customers or active prospects need SSO, then it belongs in product planning, not in a private feature deal.
The quote might look like this:
- $3,000 setup fee for import and training
- $500 per month for support, including report edits and questions
- SSO is not part of this quote and will go through product review if demand stays strong
That structure keeps the sale honest. The customer sees what they pay once, what they pay each month, and what is still product work. The company keeps one product, one codebase, and one roadmap.
Mistakes that create one-off products
One-off products usually do not start with a huge decision. They start with a rushed quote, a friendly sales call, or one small promise made to close the deal.
A common mistake is hiding setup work inside the first-year price. It looks neat, but it blurs the line between one-time work and recurring service. When renewal comes around, the customer thinks the custom effort is part of the normal subscription.
Another problem starts on the call itself. Someone says, "Yes, we can add that," before product or engineering reviews the request. Now the quote includes a feature, not just a service. That is how sales promises turn into roadmap debt.
Small undefined changes cause just as much damage. "A few edits" sounds harmless until it means extra fields, new reports, another approval step, and three review rounds. If you do not set the limit, the customer will set it for you.
Watch for a few warning signs. Your quote is drifting into one-off territory when setup, migration, and training sit inside one annual number, promised features have no product review behind them, "minor changes" have no count or time limit, nobody checks whether the request helps more than one customer, and old exceptions stay in the contract year after year.
That last point matters more than most teams admit. Special contracts almost never stay small. A custom support rule turns into a custom workflow, then a custom release process, then a custom renewal argument.
A short product review before you send the quote can stop most of this. Two questions are usually enough: can we reuse this, and when does this exception end?
Checks before you send the quote
If a quote takes ten minutes to explain, it is probably too messy.
Read it once as if you were hearing it for the first time. If someone on your team cannot explain the full price in about a minute, split it again until it is clear.
Do one quick review before sending:
- Make sure every line has an owner.
- Make sure every line has a limit.
- Make sure the end point is clear.
- Check with engineering if the deal needs special code or a separate deployment path.
- Check that the support plan matches the real workload, not the optimistic version from the sales call.
One simple test works well: imagine a second customer asks for the same package next week. Could you sell it again with only minor edits? If yes, the structure is probably clean. If no, move some of that work into the roadmap or charge for the extra setup now.
This is where founders often get too optimistic. They price the build, then hide meetings, support, edge cases, and internal coordination inside goodwill. The quote looks smaller. The work does not.
Sometimes it helps to get a second pair of eyes before the proposal goes out. Oleg Sotnikov at oleg.is works as a Fractional CTO and startup advisor, and this is exactly the sort of scope and product boundary problem he helps founders clean up.
What to do next
Pull your last five signed deals and sort every promised task into three buckets: setup, ongoing support, or roadmap work. Do it on paper or in a spreadsheet. If one task keeps bouncing between buckets, your quote process is still too loose.
Then update your proposal template. Keep setup, support, and roadmap work on separate lines every time.
Use a simple rule for custom requests: if only one customer will use it, price it as setup or paid custom work, not as product.
Use that rule on every deal, even when a prospect pushes for an exception. Most product mess starts with one "special case" that felt harmless at the time.
You do not need a perfect quote. You need a quote your team can still live with a year from now.
Frequently Asked Questions
What counts as custom work?
Custom work is any request that changes the product or service for one customer instead of improving the standard offer for everyone. A special approval step, a private report, or a one-off billing rule all count because your team has to carry that exception later.
Should I ever say yes to custom features?
Yes, but only with clear limits and a price that covers the follow-up work too. If the request helps only one customer, treat it as paid custom work. If several customers will want it, move it into product review instead of hiding it inside one deal.
How should I structure the quote?
Break the quote into separate lines for the standard product, setup, and ongoing support. Keep reusable feature ideas out of the commercial scope until product review decides where they belong. That structure makes the price easier to explain and stops quiet promises.
What belongs in setup?
Setup should cover the one-time work that gets the customer live. Put data import, configuration, training, launch checks, and handoff there. Leave custom features, open-ended cleanup, extra workshops, and post-launch help out unless you price them on purpose.
When should setup end?
Give setup a clear finish line in the quote. You can tie it to a date, an import sign-off, or the first live-week review. Once that point passes, move new requests and normal help into support.
How do I price support without losing margin?
Price support on its own line and say what the client gets each month. Spell out support hours, response times, and what counts as advice, bug work, or a change request. If you skip that boundary, clients will treat support like an unlimited add-on.
How do I know if a request belongs on the roadmap?
Use a simple filter. If the request solves a common problem, fits the product you want to sell next year, and still makes sense in six months, review it as roadmap work. If it only helps one customer in a narrow case, keep it custom and charge for it.
What should I leave out of the initial quote?
Call out anything that often expands after the deal closes. Extra integrations, feature development, cleanup beyond the agreed limit, more training, and on-site work should sit outside the quote unless you price them. That saves you from "small" requests that keep growing.
What signs show that a deal is turning into a one-off product?
Watch for bundled first-year pricing, vague promises like "a few edits," and feature commitments that engineering never reviewed. Another bad sign is a quote that nobody can explain quickly. When the scope feels fuzzy, the customer will usually stretch it.
What review should I do before I send the quote?
Do a short internal check before you send it. Make sure each line has an owner, a limit, and an end point, then ask engineering if the deal needs special code or a separate deployment path. If you could not sell the same structure again next week, clean it up before it goes out.