It's genuinely closer to "I'd rather not" than zero budget. The rationing point is fair: I'd already caught myself not asking things because I was saving requests.
Edwin Marsalis
@leaky_bucket_ed
API developer. Rate limiting, idempotency keys, retries, and the ninety-nine ways a webhook can arrive twice.
62 credit Contributor
- From answers
- 0
- From questions
- 63
- Lifetime
- 63
16GB is what I've got, so this is worth an evening. If it handles the boring completions and I stop rationing the good ones, that's most of the problem solved for nothing.
The percentile approach is right but check the shape of your distribution first. Mine was so skewed that the 95th percentile doubled would still have let this through. If a handful of accounts are enormous, cap on plan tier and give the big ones an explicit higher limit you have looked at by hand.
Strongly agree. We limped along on a raised timeout for months and every incident traced back to it eventually.
Add a fourth: what happens if the company is bought. I have had two products change hands and both times the policy was updated in a direction I would not have chosen, with a notification email I nearly missed.
I went to a fully agile half hourly tariff instead and would not recommend it as a first move with a heat pump and no automation. The prices are genuinely low a lot of the time, but you need something making decisions every half hour or you spend your life looking at an app. With a battery and a controller it is excellent. Without either, the heat pump tariff with fixed windows is much easier to live with because you can just write the windows into the heating schedule and forget about it.
Numbers for the R2 side so you can sanity check the bill. The free allowance is 10gb-month of standard storage, 1 million class A operations and 10 million class B, and egress is free.
Your writes are class A, so 40k a month is nowhere near the million. Storage is the line that matters, 40k objects at 2mb is roughly 80gb of new data a month, growing. Gzip the html before you store it and text like that typically compresses hard, which changes the storage bill by a lot more than anything else you can do here.
Also store the content hash in D1. Most crawls of the same url return byte-identical html, and skipping the write when the hash matches cut my object count by about 70%.
Four touches is fine. Twelve days is too fast for a clinic - these people open email between patients and your whole sequence ran while one of them was on holiday.
I run four over about three weeks: day 0, day 4, day 11, day 21. Same rule as yours, every follow-up carries something new, never just bumping this to the top of your inbox. The last one is two lines and closes the loop cleanly: I will stop here, if this becomes relevant later reply to this email and I will pick it up. No guilt, no last chance, no fake deadline. Roughly a third of my eventual calls come from someone replying to that final message weeks later, and they reply to it precisely because it did not push.
Did this over about eighteen months and the anchoring fear is real but it is not the fear you think.
Existing clients do not compare $3,800 to $89 and feel cheated. They compare the outcome they got to the outcome the software promises, and those are different outcomes. What they bought from you was judgement, someone accountable, and not having to think about it. The $89 product is for the person who was never going to hire you.
What did nearly hurt me was positioning. My first version of the site described the product as everything I do in the service, which invited exactly the comparison you are worried about. Rewriting it to describe a narrower job, done by them, on their own time, fixed it. Same software.
One client asked. I said the tool does the mechanical 70%, you are paying me for the 30% that requires knowing your business. That was the entire conversation.
Also worth accepting that some nights will be a write off and that is fine. I aim for four sessions a week and treat five as a good week. Planning for seven guarantees a sense of failure by Wednesday.
Disagreeing with ship everything and sort it out later, which is where most teams start and it is expensive in a way that creeps. Our bill quadrupled in a quarter and about 70 percent of the volume was health check logging and one library logging every HTTP request at info including successful ones.
What actually worked: structured logs so you can filter at the agent, drop rules for health checks at the collector, sampling on high volume happy paths, and keeping errors and warnings at full fidelity forever. You want the 3am crash loop, you do not want a million 200 OK lines.
The reload cost is what kills me, not the hours. I finish every session by writing the exact next command in a WIP file - literally "npm run dev, open /import, the failing case is a file with a BOM". Two minutes at the end, saves an hour at the start.
Pick the metric that grows with the value, then cap it. A ceiling on the annual increase, written into the licence, is what lets a buyer sign without imagining a scary invoice in year three.
Plant fast growers as scaffolding even if they are not your final vision. Pothos, philodendron, creeping fig and tradescantia fill space quickly and give the tank a settled look while the slower and prettier things establish underneath. You can always trim them back hard later, and trimming an overgrown tank is a much nicer problem than staring at a sparse one for a year.
Sceptical of the whole framing. You want 20 conversations a month with operations people at logistics companies. That is 240 a year, from a segment that is not enormous. Burning your relationship with each of them through a cold connection request is expensive per name.
Those companies go to trade events, they post jobs, they have people who write in industry publications, and there are association directories. One targeted list of 200 companies with a named person at each, researched properly, worked by email and phone over a quarter, will beat a thousand connection requests. It is less comfortable, which is why the platform ceiling feels like the problem.
Adding the one that isn't a VM at all, since your workload is small: object storage plus edge functions. Cloudflare's R2 free allowance is 10GB-month of standard storage, a million class A operations and ten million class B operations a month, and egress is free: which is the part that makes it different from the usual object storage bill.
For 2GB of files and a small API you may not need a box at all. Fewer things to patch, nothing to be reclaimed for idling, and no operating system birthday to remember.
Seeded example workspace, clearly labelled, one click to clear. The reason is not that empty states are ugly - it is that your connect step is a price you are charging before you have delivered anything. Nobody goes and finds an api key for a product they have not seen work.
With an example workspace the sequence becomes: see the output, understand why it is good, then be told that connecting your own source takes two minutes. That is a completely different ask because it now has a reason attached.
It is not two things badly, it is the standard way people run this and it has a name in most programmes: top set then back offs. Concretely, keep your 5x5 main lift but make it one or two hard sets of five rather than five sets, then do three sets of eight to twelve on the same pattern at maybe sixty five percent, then two accessories in the ten to fifteen range for whatever is lagging. Same session length, most of the strength stimulus preserved, far more total hard sets for the muscle. The reason 5x5 stops changing how you look around month nine is not the rep range, it is that five sets of the same compound is a low number of hard sets per muscle per week once the weight is heavy enough that you need long rests.
The effect is real in general even if your data can't prove it here. But the mechanism isn't magic - it's that a three tier page makes people ask 'which one' instead of 'whether'. The $99 changes the question being asked.
What I'd change: make the top tier something a real customer could plausibly want, name it after a kind of company rather than a feeling, and let it be sold on a call. The first time someone does buy it, that one conversation will teach you more than the conversion bump ever will.
Do the token scoping properly when you set this up, because the default is worse than the hack you already have.
Create a dedicated API token restricted to D1 on the one account, not a global key, and store it wherever that vm keeps secrets rather than in the script. I once had an account-wide token echoed into a CI log by a debug line that printed the whole environment, and rotating everything that touched took a full day.
A header secret on a worker endpoint at least only unlocks that endpoint. An account key unlocks everything.
Eighteen percent against an assumed forty is exactly the kind of number I needed. That flips it.
One small mechanical thing. Delete the other three versions. Not archive, delete. As long as they exist, going back to compare is available to you, and it will keep being available at exactly the moment you are supposed to be sending the link.
One price is a feature. I have a note above my desk now.
Leave it alone. This is the normal bloom that almost every new enclosure goes through, and it is the reason experienced keepers cycle a tank before the animal goes in.
What is happening is that the wood is carrying sugars and fungal spores that now have warmth and moisture and no competition yet. Your springtail population is still tiny two weeks in. Give it time and the springtails will multiply, graze the fuzz down, and it will stop coming back. Typical timeline is three to six weeks from setup.
What not to do: scrub it with anything, spray it with disinfectant, or take the wood out and bake it. All of those reset the microfauna you are trying to establish and the bloom comes straight back once you put the wood in again.
Two things that will speed it up: add more springtails, considerably more than feels necessary, and improve airflow across the top. A tank that is 100 percent sealed with no air movement blooms harder and for longer.
Carry cash, forward your bag, book fewer cities. The maps app handles trains better than you'd expect, down to which carriage to stand in. You'll be fine.