Context: Evergreen AI is a competitor-driven SEO tool we launched publicly this week after running it internally at our agency for months. You enter your site and three competitors, it finds the keyword gaps, writes articles against them, publishes to your CMS. $149/mo flat, up to 30 articles.
Flat is the part that was hard. Almost every tool in this category sells credits, and having built one, I understand why.
The first version was going to lose money
We built the original on SpyFu. Good product, the data was fine, but two things killed it for us.
Their cost scaled with our usage in a way our pricing didn't. At any real volume we were looking at roughly half of revenue going straight back out as data cost. You can't run a business on that, and you certainly can't run one at a flat price.
The second problem mattered more. SpyFu hands you a packaged view, effectively a top-10-keywords answer, which is built for a human doing research once. We needed to re-evaluate every competitor continuously, because the premise of the product is catching a gap the week it opens instead of the quarter it opens. A rigid packaged answer can't support that at any price.
So we pulled it out and moved to DataForSEO's raw API. We pull rank, traffic, volume and difficulty for up to 1,000 keywords per competitor and run our own logic on top.
Data cost went from roughly 50% of revenue to roughly 10%.
The uncomfortable part is that the expensive version wasn't a mistake. It was a reasonable v1 and it let us validate the idea on real client sites before we'd built any infrastructure of our own. Buy the packaged product first, replace it with raw data once you know the thing works, is probably the right order. Nobody warns you the replacement is coming.
Model routing was the second lever
The article pipeline is 32 steps. Early on most of them called the same model, because that's what you do when you're just trying to get the thing working.
Most of those steps don't need judgment. Deduplicating new calendar entries against what's already scheduled is a semantic comparison. Pre-selecting which of a client's existing pages are relevant to an outline is a filtering problem. Both run on Haiku, and between them they're the bulk of the call volume.
The steps that actually decide something get Sonnet: what type of article this should be, target length, the competitive angle, and the outline itself.
Splitting the pipeline by which steps need to be smart, rather than running one model end to end, was the difference between LLM spend being a rounding error and being a second data bill.
Idempotency is a margin feature, not just a correctness one
Everything runs as scheduled background jobs on their own cadences. Signals get enriched, plans get updated, entries get identified and researched.
The bit I'd underline for anyone building something similar: every job locks its row to a processing state the moment it picks it up. I originally did that because concurrent runs were double-writing. The real cost showed up later. A double-processed article is double the API spend for output you throw away. Once you're paying per call, a correctness bug and a margin bug are the same bug.
Related: each job takes one project per invocation and always picks the most overdue item across all projects. That started as a fairness fix so a busy account couldn't starve a quiet one. It also flattens spend into a predictable hourly rate instead of spiky bursts, which is what makes a flat price forecastable at all.
Why this matters commercially
Credit pricing isn't really a pricing strategy. It means the vendor hasn't got their unit costs under control and is handing the variance to the customer, who now has to ration articles and think about their bill every month.
Getting to 10% is what let us stop doing that.