Armakuni Contact us
← All case studies

A hundred and fifty people listened to calls all day.
The question was whether a smaller model could do the job.

A marketing platform for home-services SMBs (small and mid-sized businesses) had 150 people listening to its clients' calls every day, and an AI trial that never reached production quality. We tested a smaller, fine-tuned model against its existing one, on its own labeled calls and its own costs, and repaired the data underneath.

Before

People listened to every call to classify it.

The first trial couldn't reach production.

After
2 weeksfrom the proof of concept to a production commitment

People listened to every call to classify it

The platform helps heating, plumbing and electrical businesses see what their marketing spend actually brings in. It joins advertising performance, call records and service-job data to show which campaigns work, and what happened after someone picked up the phone.

What made the service valuable was people listening, and that couldn't scale: around 150 employees listened to calls every day, noting why each person called, whether they were a real lead and how the call ended, and every new client meant more listening, so the only way to serve more was to hire more.

The first trial couldn't reach production

The company had already tried AI. Its own proof of concept on Anthropic's Claude Sonnet showed the idea could work, but it hit limits on scale and performance the team couldn't get past, and it never reached production quality.

Underneath were three problems. Prompts were stored inconsistently in Langfuse, weren't optimized for token usage and had no common versioning or evaluation framework, and only the people who wrote them could change them safely. The data feeding the model broke in ways that reached client reports before engineers noticed. And across tens of thousands of inbound calls, every cent per call mattered.

Even working perfectly, the platform only sorted calls, and clients wanted to know more than that:

  • A qualified customer who called but never booked.
  • A maintenance agreement or service upgrade nobody offered.
  • A campaign bringing in calls without enough of them turning into jobs.
  • A change in lead quality that needed attention before the next report.

Testing smaller models on the company's own calls and costs

We started with the question the business had to answer, before choosing any model: could a smaller, cheaper model make the classifications it relied on, as accurately as the one it had, on its own calls?

How we built it

6 decisions, in the order we made them. Each one says what we did and why, with what it did drawn beside it.

  1. The data platform was mapped and fixed first
  2. Test the small model on the company's own labeled calls
  3. Accuracy weighed against the cost to run
  4. One prompt structure for every kind of conversation
  5. Three more proofs of concept, on the clients' questions
  6. Listening to how it was said

The data platform was mapped and fixed first

Built withS3Apache AirflowGlueLambdaCloudWatch
Each recordValidatedRetried if it failsLogged a pattern for every adapter
The engineering

A model is only as good as what it's given, and this platform's pipelines failed quietly. We mapped the whole data platform first: an Amazon S3 data lake with Raw, Bronze, Silver and Gold layers, the Apache Airflow DAGs that moved data through it, the adapter framework and the third-party integrations. That gave the team a documented current state for the first time, with each place it failed.

Every data source had its own custom adapter, so each new one meant building integration logic again. The highest-volume call integration was also the most failure-prone, so we rebuilt it first, as the proof of concept for one standardized adapter:

  • Data-quality validation on every incoming record.
  • Automated error handling and retry logic for failed processing.
  • Structured logs that put failures in front of engineers before they reached clients.
  • A reusable pattern for every adapter after it.

Around it, AWS Glue took on automated cataloging and data processing, AWS Lambda handled lightweight serverless computation, Amazon CloudWatch added monitoring and alerts across the ETL pipelines, and infrastructure-as-code templates made environments reproducible, so nobody had to rebuild a deployment by hand. If the labels feeding an evaluation are wrong, the evaluation is wrong too, so the pipeline had to be trustworthy first.

Test the small model on the company's own labeled calls

Built withBedrock
300–500 labelled calls Claude SonnetAmazon Nova

“Just wanted to drop a note to congratulate our Call Intelligence AI team and say thank you for a very successful delivery of MVP of our Call Intelligence. … All clients from [one of our brands] have now been moved from manual tagging to Call Intelligence. This represents about 500 clients. All marketing tracked calls are processed by Call Intelligence at this point. Work is underway to continue the move of [our other brand] from manual to Call Intelligence as well. … The solution has been received really well by our clients, our board, our executive team, and our employees. We have also started to see the ROI we were expecting.”

CTO, a home services marketing group
The engineering

Public benchmarks don't tell you whether a model can label this business's calls. So we built the test from its own work: 300–500 human-validated, labeled calls, scored with the customer's existing evaluation framework.

  • Claude Sonnet was the existing call-analysis model, and the accuracy baseline for classification, disposition labeling and outcome extraction.
  • Amazon Nova was the smaller option, for call and form analysis. Out of the box, the base model didn't match Sonnet on these tasks, so we used Amazon Bedrock fine-tuning workflows to adapt it, on labeled calls, form submissions and the less common service categories where a general model is weakest.

We compared Nova's base and fine-tuned versions against the labeled examples, and broke the results down by prompt and by output value. So the team could see exactly which classifications each model got right or wrong, not just one average.

Subject-matter experts reviewed classifications and refined prompts inside the same evaluation framework, without needing deep ML expertise. That puts the model's quality in the hands of the people who know the calls best.

Why: if only the people who built a fine-tuned model can check it, the business depends on them; when its own experts can test it, the business keeps control.

Accuracy weighed against the cost to run

The switch AccuracyCost per call3, 6, 12 monthsGo/no-go guide
The engineering

A model that's as accurate but costs more is no win, and one that's cheaper but slightly worse can still cost the business its clients. So the evaluation weighed task accuracy against operating cost:

  • Cost-per-call breakdowns showed the economics of each model option.
  • Total cost of ownership covered 3, 6 and 12 months.
  • A go/no-go guide brought the accuracy and cost findings together for the decision.

The deliverable was a tested model option, and the evidence to decide on a switch. The savings depend on production adoption and operating results, and we said so.

One prompt structure for every kind of conversation

Built withLangfuse
CallsFormsSchedulersChats One prompt
The engineering

The prompts were the other bottleneck. In a separate proof of concept, we built one shared prompt structure for calls, forms, schedulers and chats, with modular, dynamic sections that bring in the right context for each engagement type:

  • A team member can change one block without rewriting the whole prompt.
  • Langfuse keeps the version history, so every change can be traced.
  • Side-by-side model comparisons show what a change did to the outputs.
  • Tags decide which prompt version is in use, so a change goes live on purpose.

Three more proofs of concept, on the clients' questions

Calls sortedMissed service opportunities found
The engineering

With the foundations in place, we built three more proofs of concept to answer the questions the platform's clients were actually asking.

Which service opportunities were missed? A post-call engine reads each transcript for recurring customer problems, no previous maintenance and signs of dissatisfaction. It maps those signals to a service recommendation library covering maintenance agreements, seasonal tune-ups, installation upgrades and complementary services, then scores each opportunity so the business can see where a relevant recommendation went unmade.

What should clients expect from their marketing spend? A forecasting engine uses historical service-job data, seasonality, campaign type and close-rate history. Time-series forecasts give expected lead volume, qualified leads, revenue ranges and confidence scores. A budget recommendation model weighs return on advertising spend and channel performance, and suggests where to spend more or less.

Which campaigns need attention? An anomaly-detection engine watches call counts, qualified leads, cost per lead, job value and campaign performance. Seasonal adjustment tells an expected dip from a real problem, configurable severity thresholds decide what's worth an alert, and alerts go to the internal team to investigate.

Together with the prompt framework, these were four proofs of concept.

Listening to how it was said

Built withNova Sonic
assessedThe transcriptThe audio, for how it was said
The engineering

Text transcripts lose the tone of a call: the frustration, the hesitation. Amazon Nova Sonic was assessed for voice-tone and intonation analysis, using a parallel audio-stream design, along with speaker identification: voice-print matching for repeat callers, automatic tagging of the people on calls and speaker verification.

Audio brings biometric obligations, so the assessment covered GDPR and CCPA, encryption and access control for audio streams and anything derived from them, and the audio quality each capability would need. The roadmap puts speaker identification at 0 to 3 months and the full voice-analysis pipeline at 3 to 12 months. This stayed assessment and roadmap work.

What we'd tell another CTO

1Test a smaller model on your own labeled work. The 300–500 calls the company's people had already validated said more about Nova against Sonnet than any public benchmark could, including that the base model needed tuning before it was worth considering.
2Put a cost on the decision before anyone argues about it. Cost per call over 3, 6 and 12 months turned "a cheaper model" into something finance could sign or refuse.
3Fix the pipeline before blaming the model, because data that fails quietly makes every evaluation built on it untrustworthy.

What else changed

  • A tested, fine-tuned Amazon Nova option for call and form analysis, measured against Claude Sonnet on 300–500 human-labeled calls.
  • The cost of each option, per call and over 3, 6 and 12 months, with a go/no-go guide.
  • A standardized adapter for the highest-volume call data, with validation, retries and structured logs, and the pattern for the rest.
  • One versioned prompt structure for calls, forms, schedulers and chats.
  • Four proofs of concept: the prompt framework, missed-opportunity detection, forecasting with budget recommendations, and anomaly alerts.
  • AWS funded $25,000 of the model benchmarking and fine-tuning work.

What comes next

Production adoption of the call analysis, measuring the review effort it saves and what it costs to run, then the four proofs of concept moved into the platform. Speaker identification and voice-tone analysis remain on the roadmap. The test of everything after that is whether the platform's clients act on what it finds.

How we'd do it today

This project came before our current offers. Here's how we'd approach the same work now.

This is AI Inference Engineering work. We'd build the business its own model for the routine classifications, starting with LoRA adapters because they cost far less than full fine-tuning, and serve it on Amazon SageMaker AI at about a tenth of the price, with a router keeping the hard calls on a frontier model through Amazon Bedrock. Alongside the 300–500 labeled calls, a second labeled set would stay sealed, so no prompt writer could tune to it, and the weights and tests would stay in the business's own AWS account, so moving to a newer model later takes days rather than a rebuild.

Have a problem like this one?

A free workshop: a few hours with the architects who'd do the work, on your own systems. No cost.

Book a free workshop