There are 3 types of guarantees I could make you:
1. Guaranteed features
2. Guaranteed timeline
3. Guaranteed cost
But you can only pick two!
If they pick #1 and #3, then I charge per project, but they don't get the final quote until they agree on the full spec in excruciating detail. The build then takes as long as it takes. In my experience people choose this option 90% of the time.
If they pick #1 and #2, then I charge hourly: and I work however many hours a day I need to, to guarantee the timeline and features. I don't really need them to agree to the spec in this situation, because scope-creep just means more billable hours every week.
If they pick #2 and #3, then I charge per project, and I tell them to prioritize their feature-requests in order of importance. I build the project and add features in the order they requested, and when time runs out I turn the site on, regardless of how many features are done. In this way, I'm technically charging per project, but it's really just my hourly rate multiplied by the capped number of hours.
While you will hear some objections over hourly, they are all easily answered and simple enough to spin into positives for both client and yourself. Stick with hourly, set minimums if you desire and move forward. Don't think about it too much.
"Some clients, not you of course, will take advantage of a fixed bid to waste everybody's time tweaking things that don't matter, or expanding the scope beyond what was originally intended or agreed upon. If I were to accept fixed-bid contracts, I'd have to heavily charge more than what I figure it will actually cost to make up for the people who will abuse the contract like that. The only way for me to be fair with you is to ask for a fair price per-hour. That way the clients who do want to waste my time can pay for it, and those that don't waste my time can save money."
https://news.ycombinator.com/item?id=4101802
For small projects, bill per day. For large projects, bill per week.