We get asked to "add AI" to a product roughly as often as we get asked to fix a specific, named problem. Those are different requests, and only one of them reliably produces something worth shipping.
Start from the workflow, not the model
The automation work that actually saves time shares one trait: it replaces a specific, repeated, well-defined human task — not a vague category of "make things smarter." Before we touch a model, we ask what a person currently does by hand, how often, and what it costs them in time or errors. If we can't answer that concretely, we don't have a project yet.
Good candidates we've seen
- Classifying and routing inbound support requests that currently get triaged manually
- Extracting structured data from unstructured documents (invoices, contracts, forms)
- Drafting first-pass responses that a human still reviews before sending
Poor candidates we've seen
- "An AI assistant" with no defined task, added because competitors have one
- Fully automating a decision with real financial or legal consequence, unsupervised
- Replacing a workflow nobody has actually measured the cost of yet
The part everyone forgets: what happens when it's wrong
Every model is wrong sometimes. The projects that hold up in production have an answer for that built in from day one — a confidence threshold that routes uncertain cases to a human, a way to flag and review bad outputs, a ceiling on how much autonomy the system has before someone checks its work.
The question isn't whether the model will be wrong. It's what your system does the moment it is.
Cost discipline, from the start
LLM costs scale with usage in a way traditional software costs mostly don't. We set a cost ceiling before writing the integration, design caching so repeated queries don't repeatedly cost money, and pick the smallest model that reliably does the job rather than defaulting to the most capable one available.
// a shape we reuse often
async function classify(input) {
const cached = await cache.get(hash(input));
if (cached) return cached;
const result = await model.run(input, { maxCost: '$0.002' });
if (result.confidence < 0.85) return routeToHuman(input);
await cache.set(hash(input), result);
return result;
}The short version
Automation earns its place when it replaces a specific task you can already measure, has a defined path for when it's wrong, and has a cost ceiling before it ever touches a real user. Everything else is a demo, not a system.
