There are third party costs, and the distinction matters. A domain registration, hosting, a software subscription, or advertising spend are real expenses that go to somebody else, and they are yours regardless of who does the work. Those get named specifically before you agree to anything, with the actual figures rather than a range, and wherever possible they are billed directly to you rather than passed through with a margin attached. A provider who marks up your hosting is earning money from a decision you cannot see.

What causes surprise invoices elsewhere is usually scope rather than dishonesty. Somebody asks for one more page, then another, then a change to something already finished, and each request is small enough that nobody stops to discuss it. Then the invoice reflects the accumulation and it reads as a hidden cost. The way to avoid that is to agree scope in writing and to say out loud when a request sits outside it, at the moment it is made rather than at the end. If a change is significant, you hear the price before the work happens, and you can decide it is not worth it.

The honest caveat is that estimates for genuinely unknown work are estimates. If something turns out to be more complicated than it looked, that gets raised as soon as it is known rather than absorbed silently and billed later. Occasionally the discovery goes the other way and something takes less time than expected, in which case the invoice is smaller.

If you are evaluating providers, the useful question is not whether there are hidden fees, because everybody says no. Ask what happens when you request something outside the agreed scope, and how they handle an estimate that turns out to be wrong. Those two answers describe the actual billing relationship.

The costs most often forgotten by both sides are the recurring ones attached to what gets built. Hosting, a domain renewal, software subscriptions the site depends on, and any licence for something included in the design. Those continue after the project ends and they are yours, so they belong in the conversation at the start rather than appearing as a surprise in month four.