DEV Community

Cover image for We wired a ‘cheap’ model into our CRM and accidentally made pricing changes a production risk
Lars Winstand
Lars Winstand

Posted on • Originally published at standardcompute.com

We wired a ‘cheap’ model into our CRM and accidentally made pricing changes a production risk

I keep seeing the same mistake dressed up as optimization.

A team finds a model that looks absurdly cheap. They test it. It works. Then they do the dangerous part: they let it spread.

First it answers a few support prompts.
Then it drafts follow-ups.
Then it gets wired into the CRM.
Then sales ops depends on it.
Then nobody wants to touch it.

At that point, you’re not making a pricing decision anymore.
You’re making an architecture decision.

And architecture decisions are expensive to undo under pressure.

While researching this, I ran into a thread on r/openclaw where someone said they had DeepSeek tied into their CRM, Google Console access, sales workflows, assistant work, and automations because it was “usable and extremely cheap.”

That sentence should make any builder a little nervous.

Not because DeepSeek is bad.
Because any model becomes risky once it turns into your default business brain.

Cheap models are great right up until they become infrastructure

I’m not against cheap models.

If you’re building:

  • a throwaway internal tool
  • a weekend OpenClaw experiment
  • a temporary n8n flow
  • a low-stakes Zapier step

...then yes, optimize for unit cost.

That’s rational.

But once the same model is handling business-critical workflows, the cost model changes.

Now the expensive part isn’t today’s token bill.
It’s the migration bill you’re quietly creating for future you.

That bill usually includes:

  • prompt rewrites
  • auth changes
  • output-format drift
  • regression testing
  • fallback logic
  • workflow downtime
  • confused humans stepping back in

That’s the real switching cost.

What actually breaks when pricing changes

A lot of people picture model portability like this:

MODEL_NAME=deepseek-v4-pro
# later
MODEL_NAME=gpt-5
Enter fullscreen mode Exit fullscreen mode

That’s the dream.
Usually not reality.

Different models behave differently on:

  • tool calling
  • JSON formatting
  • long-context recall
  • refusal behavior
  • verbosity
  • latency
  • function argument discipline

So when someone in finance says, “Can we move off this provider this week?” what they’re actually asking is:

“Can you revalidate part of production while everyone is stressed?”

That’s not a pricing event.
That’s an incident with a spreadsheet attached.

The hidden outage: uncertainty

One thing that jumped out at me in that Reddit discussion was the uncertainty.

Not even confirmed pricing. Just uncertainty.

That alone is enough to freeze roadmap decisions.

If a provider might become 2x more expensive, you hesitate.
If it might become 100x more expensive, you panic.

Either way, planning gets worse before anything technically breaks.

Your automation can still be working perfectly while the business case underneath it is collapsing.

Portability is not optional once AI touches ops

The pattern I wish more teams used is boring on purpose:

  • one adapter layer
  • environment-based model selection
  • schema enforcement outside the model
  • tested fallback models
  • predictable monthly budget

If your workflows call provider SDKs directly, you’ve already made migration harder than it needs to be.

Your app should call your interface.
Not OpenAI’s interface.
Not Anthropic’s interface.
Not DeepSeek’s interface.

Bad pattern: provider logic everywhere

from openai import OpenAI

client = OpenAI(base_url="https://api.some-provider.com/v1", api_key=os.getenv("API_KEY"))

resp = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "system", "content": "Write a sales follow-up"},
        {"role": "user", "content": customer_context}
    ]
)

hubspot.create_note(resp.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

This looks fine until you need to switch providers fast.

Now this logic is duplicated across workers, cron jobs, CRM hooks, and random automation scripts nobody wants to own.

Better pattern: one adapter, config-driven routing

MODEL_PROVIDER=openai_compatible
MODEL_NAME=deepseek-v4-pro
FALLBACK_MODEL_NAME=gpt-5
JSON_MODE=strict
Enter fullscreen mode Exit fullscreen mode
response = llm_adapter.generate(
    task="sales_assistant_followup",
    input=payload,
    required_schema="followup_email_v2",
    sensitivity="medium"
)

hubspot.create_note(response.body)
Enter fullscreen mode Exit fullscreen mode

Now the workflow doesn’t care whether the answer came from GPT-5, Claude Opus 4.6, Grok 4.20, DeepSeek, Qwen, or a local Llama deployment.

That’s the point.

A practical adapter example

Here’s a simplified Python version of what I mean.

import os
from openai import OpenAI

class LLMAdapter:
    def __init__(self):
        self.model = os.getenv("MODEL_NAME", "gpt-5")
        self.fallback_model = os.getenv("FALLBACK_MODEL_NAME", "gpt-5")
        self.client = OpenAI(
            base_url=os.getenv("OPENAI_BASE_URL"),
            api_key=os.getenv("OPENAI_API_KEY")
        )

    def generate(self, task, input, required_schema=None, sensitivity="medium"):
        prompt = self._build_prompt(task, input, required_schema)

        try:
            return self._call_model(self.model, prompt)
        except Exception:
            return self._call_model(self.fallback_model, prompt)

    def _build_prompt(self, task, input, required_schema):
        return f"Task: {task}\nSchema: {required_schema}\nInput: {input}"

    def _call_model(self, model, prompt):
        resp = self.client.chat.completions.create(
            model=model,
            messages=[
                {"role": "system", "content": "Return concise, valid output."},
                {"role": "user", "content": prompt}
            ]
        )
        return resp.choices[0].message
Enter fullscreen mode Exit fullscreen mode

This is not fancy.
That’s why it works.

If you use n8n, Make, or Zapier, the same rule applies

The trap is even easier to fall into with no-code and low-code automation.

Why?
Because it feels modular while you’re building it.
But the model call often ends up embedded directly inside dozens of steps.

A typical failure pattern looks like this:

  • one OpenAI-compatible HTTP node in n8n
  • copied into 14 workflows
  • each workflow has slightly different prompt text
  • two of them depend on exact JSON keys
  • one has a retry hack
  • nobody remembers which one powers the sales inbox

Then pricing changes.
Now you’re diffing workflow exports at midnight.

If you’re using n8n, Make, or Zapier, centralize model config somewhere you control.

Even a basic internal proxy is better than hardcoding provider details in every automation.

Direct provider vs abstraction vs local inference

There are really three common strategies here.

Approach What you’re really buying
Direct-to-provider integration Lowest apparent upfront unit price, but maximum exposure when that provider changes pricing or terms
Aggregator or abstraction layer like OpenRouter Better switching flexibility and alternate providers for the same or similar models, but still tied to per-token economics
Local or self-hosted inference More control and predictability, but now you own infrastructure, throughput, failover, and model ops

None of these is universally right.

But pretending switching is free is definitely wrong.

Are local models the answer?

Sometimes, yes.

If you have:

  • repetitive internal workloads
  • predictable throughput
  • GPU access
  • actual ops talent

...then local inference can be a very good trade.

You remove some vendor pricing risk.
You gain more control.

But now you own:

  • VRAM constraints
  • deployment failures
  • failover
  • throughput tuning
  • quantization tradeoffs
  • model update strategy

A local Qwen or Llama setup can absolutely be the right move.
It is not a free move.

You’re just choosing a different kind of pain.

The checklist I’d use before wiring any model into ops

Before connecting an LLM to HubSpot, Salesforce, Zendesk, Notion, Google Workspace, or internal admin tools, I’d ask:

  1. Can I change providers without editing workflow logic?
  2. Do I have a fallback model already tested in production-like conditions?
  3. Is output schema enforced outside the model?
  4. Do I know my maximum monthly exposure if usage spikes?
  5. Can I protect sensitive data before it leaves my stack?

If the answer to the first four is no, you’re building hidden fragility.

If the answer to the fifth is no, you may also be building a compliance problem.

The budget problem nobody wants to admit

This is the part teams usually avoid talking about.

Per-token pricing changes behavior.

It makes people hesitate before scaling automations.
It makes agent loops feel financially suspicious.
It turns experimentation into cost monitoring.
It creates token anxiety.

That’s tolerable for small experiments.
It’s terrible for systems you want running 24/7.

A lot of teams don’t actually need the absolute lowest token price.
They need predictable spend and the ability to swap models without rewriting everything.

That’s why the OpenAI-compatible layer matters so much.

And it’s also why flat-rate options are more interesting than they first appear.

If your stack can keep the same OpenAI-compatible integration while routing across models like GPT-5.4, Claude Opus 4.6, and Grok 4.20 behind the scenes, you get a much safer operating model for automations.

Especially if the budget is fixed instead of usage-whiplashed.

That’s the appeal of Standard Compute in one sentence: unlimited AI compute at a predictable monthly price, using an OpenAI-compatible API, without forcing teams to babysit token spend every time an agent gets busy.

For teams running lots of workflows, that’s not just a pricing preference.
It’s architectural risk reduction.

My opinionated take

The biggest risk in AI automation is not that a model gets worse.

It’s that a model gets embedded.

Once a “cheap” model is threaded through CRM actions, support replies, assistant flows, and internal ops, a future price change stops being a vendor problem.

It becomes your migration problem.

So yes, use cheap models.
I do.
Most developers should.

Just don’t let a cheap model become infrastructure without infrastructure-grade safeguards.

If you want your automations to survive the next pricing shock:

  • design for movement first
  • put a stable interface in front of model calls
  • test fallback models early
  • separate workflow logic from provider choice
  • pick a budget model your team can actually live with

Pick the model second.

That order matters a lot more than people think.

Top comments (0)