Most owners debate this as if it had two settings: put the prices up, or hide them behind "contact for a quote." Framed that way, both sides sound right. Publishing feels like inviting price-shoppers and undercutters and locking yourself into a number you'll regret on the hard jobs. Hiding feels safe — until you count the good-fit buyers who wanted a rough figure, didn't get one, and quietly went to a competitor who gave them something to work with.

The binary is false, and it's the reason the argument never resolves. The real choice isn't whether a number appears. It's how much of the truth about your pricing you can publish and still keep accurate — and there are several honest formats between a fixed price tag and total silence. Most service businesses should publish enough for a reasonable buyer to understand the likely order of magnitude and what moves it. Depending on the service, that might be an exact price, a real starting price, a banded range, a few scoped examples, a base fee plus named variables, or a plain explanation of what a responsible estimate requires and why. "Contact for a quote" is sometimes the correct answer. It becomes a problem only when it's used to avoid saying anything at all.

Start with how variable the work actually is

The format follows from one fact about the service: how much the work genuinely varies.

Some services are standardized enough to publish an exact figure. When the same work is delivered under the same conditions — inspections, recurring plans, fixed consultations, a standardized cleaning package, a bounded service call — a firm price lets the buyer act without a conversation neither of you needed. Other services vary because the work itself does: a contractor has to see access and existing conditions, a professional service depends on complexity and records and how many people are involved, a repair starts with an unknown cause. That variation doesn't make public pricing impossible. It changes which format tells the truth.

Service condition Format that stays truthful
Same deliverable, consistent conditions Exact price
Stable base scope, optional additions Base price plus add-ons
Common scope with a predictable floor "Starting at," with the starting conditions stated
Several recurring project types Scoped examples or packages
Meaningful but explainable variation A range, with the cost drivers named
Condition can't be known without inspection A diagnostic/assessment fee, then the quote process
Scope can't be judged from a website visit at all Explain what produces an estimate and what usually changes it

One phrase deserves more suspicion than it gets: "custom pricing." If every project ends up at roughly the same number after a sales call, the pricing was never custom — the call was a gate, and the buyer paid for it in time.

What has to be true before a number goes on the page

Whatever format you choose, a few conditions decide whether the number helps or backfires.

It has to describe something a real buyer can actually purchase. If the page says "packages from $99" but almost nobody eligible can buy the $99 package, the figure is doing promotion, not information. If it excludes an unavoidable charge, it manufactures a false comparison even when the fine print is technically present. The Federal Trade Commission's general advertising standard is that claims be truthful, not deceptive, and evidence-based; specific trades and states layer more rules on top, so this isn't legal advice. The practical version is simpler: state what the figure covers, what it excludes, and what a buyer must do to get it. If you can't state those clearly, you've chosen the wrong format.

The cost drivers should be legible even before the final number is. A buyer can learn something useful without a firm quote if the page names what moves the price — square footage, access or travel, urgency, materials, number of locations, condition of what's already there, permits, revisions or stakeholders, optional ongoing support. Naming the drivers explains why two similar-looking jobs don't cost the same, and it gives the eventual estimate a shape. Resist fake precision, though: a calculator whose inputs don't actually determine the quote is just an elaborate "contact us." Publish variables only as far as your estimating method really supports them.

The number should help the right buyer self-select — in both directions. Pricing can tell someone a service is within reach, and it can tell someone it isn't. Both are useful when the information is accurate. (What it does not do is reliably raise your conversion rate or lead quality — that depends on your market and offer, and anyone who promises a lift from "just showing prices" is guessing.) The word that carries the weight is responsible: a starting price with no starting scope pulls in people the option doesn't fit, and a range like $500–$50,000 can be perfectly true and still tell a buyer nothing. A range earns its place when it explains the categories inside it.

The buyer should be able to see what they get for it. Price without scope invites comparison by number alone. The surrounding copy should answer what's included, what's excluded, what conditions are assumed, whether the fee is one-time or recurring or hourly or usage-based, when payment is due, what would change it, what marks completion, and what happens after the initial work. This is why a package page usually beats a bare price list — the goal isn't to defend the price with a speech, it's to make the purchase legible.

The maintenance problem is the one most owners underestimate

An out-of-date public price is worse than no price, because it creates a fight before the work even starts — the buyer arrives anchored to a number you no longer honor, and now you're negotiating from behind. This is the quiet reason a lot of "we don't post prices" policies exist: not strategy, just an old price nobody wanted to keep chasing.

So before anything goes up, decide who owns it. Name the person who updates the site when pricing changes, and remember prices hide in more places than the pricing page — service pages, FAQs, downloadable PDFs, structured data, booking tools, old campaign landing pages, and your Google Business Profile. Google Business Profile currently lets eligible businesses list services and, for supported or custom services, add a price and description. That can help, and it's one more surface that now has to agree with the website and the actual offer. If several places show a price, they need one controlled source or a standing review, or they will eventually contradict each other in front of a customer.

Four honest ways to show variable pricing

When the work varies, these four formats keep the page truthful without pretending to a precision you don't have.

A real starting price. Use "starting at" only when a buyer can recognize the qualifying starting scope. "Projects start at $2,000" tells them almost nothing. "A single-room interior repaint starts at $2,000 when walls are paint-ready and the room is empty; repairs, trim, ceilings, specialty coatings, and protecting an occupied room are estimated separately" gives the number a body — and pre-empts the argument.

A range with bands. A broad range becomes useful when it's split into recognizable project types — a small defined scope in one band with its conditions, a typical project in another with its common variables, and complex or multi-location work sent to a custom estimate after discovery. Build the bands from your own estimating method and current offer. Don't copy competitors' numbers to fill the table; you'll be publishing someone else's guess.

Scoped examples. Examples work when you have recurring shapes of work but not fixed packages. Each one should state the requested work, the included scope, the important limitation, the price or range at the time, and what would have changed it — and say plainly that it's an example, not a promise that every similar-looking job lands at the same number.

The estimating path, published. Sometimes a responsible number really does need an inspection, records, measurements, or a diagnosis. When it does, publish the path instead of hiding it: what the buyer submits, whether the assessment is free or paid, what you'll inspect, when they'll get an estimate, whether it's fixed or a range or conditional, and what can change it. That is far more useful than "Call for details," and it does the qualifying work "contact for a quote" only pretends to.

When hiding all pricing is the right call

Withholding every number can be correct — for genuinely bespoke work, for services where a concealed condition can materially change the job, or where regulated, technical, or safety decisions require inspection before any figure is responsible. It's also right when the buyer might reasonably mistake a partial number for a complete quote, when the scope behind the number isn't standardized yet, or when the price changes so often the site can't stay accurate.

Even then, the honest version isn't silence. Publish the estimating method, the main drivers, and any defensible floor. Reserve full opacity for the rare cases that truly earn it — and make it a decision, not inherited folklore about what competitors do or what a sales call is "supposed" to protect. The same discipline points the other way, too: lean toward an exact price when the service and its boundary are standardized, the buyer can purchase or schedule without discovery, unavoidable fees can be shown, your team honors the public figure, and you can update the site quickly when it changes. A booking page that asks for a commitment while hiding the fee isn't reducing friction — it's postponing the buyer's uncertainty to a worse moment.

Settle the pricing before you design the page

Most pricing-page disputes are really unresolved-offer disputes wearing a design costume. Answer these internally before anyone argues about cards, toggles, and comparison tables:

Question Your answer
What exactly can a customer buy?
What is the minimum legitimate scope?
Which costs are unavoidable?
Which variables change the price?
Can the buyer recognize those variables?
What is included after delivery?
What recurring fees exist?
How long is the price valid?
Who approves and updates the public number?
Where else is this price displayed?

If those answers aren't settled, the design isn't your blocker.

Why RP shows its own prices — and why that isn't advice for you

For the record, I publish RP's website prices: a Lead Website at $6,500 plus $79/month and a Connected Lead System at $13,500 plus $199/month, with the first 90 days of the monthly fee included, along with the payment schedule, the ongoing service, the cancellation terms, and the difference between the two packages. I did it because I dislike the sales ritual where a provider withholds a number while trying to discover the buyer's maximum budget. Publishing a baseline may leave money on the table on a larger build. It also lets a buyer evaluate fit before an awkward call and filters out the person shopping for a $500 website. For me, that clarity is worth the trade.

That format works for this offer because the builds have defined scope and a stated boundary, so an exact number describes something a buyer can actually purchase. It is a disclosed example of the standardized-scope case above — not evidence that every service should sell in two fixed packages, and definitely not a benchmark for what your work should cost.

Take the smaller lesson, which travels: if the scope is stable enough to price, show the scope next to the number; if it isn't, show the buyer what controls the estimate. Pricing information doesn't have to answer every question. It has to remove the avoidable mystery — the mystery that was costing you the buyers you actually wanted.