Eugene Bernitsky

September 15, 2026 · 4 min read

How We Automated Ad Bidding for an Appliance Repair Company

I am Eugene Bernitsky, founder of Berne Appliance Repair. We started in Miami in October 2022 with two technicians and about 35 jobs a month. Today the network runs three brands across Florida with 19 to 20 field technicians, six dispatchers, and around 7,500 service jobs a year. A company that size buys leads from many places at once: paid search, Google's local service ads, Yelp, Thumbtack, Angi, Meta, and a few smaller sources. For the first two years I set every bid by hand. This is how we stopped doing that, and what the system looks like now.

Why hand bidding fails at 7,500 jobs

At 35 jobs a month you can feel your ad spend. At 7,500 jobs a year you cannot. Each channel has its own knob: a cost-per-lead cap on one, a daily budget on another, a bid slider buried three screens deep on a third. Change one knob and the effect shows up a week later, mixed in with weather, a holiday, and whatever a competitor did that morning. I was making twenty decisions a week with a two-week feedback loop. Most of them were guesses dressed up as strategy.

Two things made it worse. Lead platforms bill by the lead, so a busy week for them is a busy week for us whether we can serve the calls or not. And our capacity is not a number, it is a schedule: twenty technicians, each with a zone, a set of skills, and a calendar that fills unevenly.

One number per channel, moved by a script

The first step was boring and it was the one that mattered: measure the same thing for every channel. For each source we track what we spent in the month and what the jobs booked from that source paid us. Closed, invoiced revenue. Not lead counts, not "conversations." Lead counts lie. A channel can send forty leads and one job.

Each source gets a target return on ad spend. If a channel comes in above target, the script nudges its bid or budget up a step. Below target, down a step. Steps are small and capped, so nothing can run away overnight. Every change goes into a ledger with the reason, so when I look at the month I can see why Tuesday's Thumbtack bid moved.

That is the whole bidding engine. There is no machine learning in it. It is a thermostat.

The capacity gate

The second piece is the one I have not seen at other repair companies. Ads only make sense if there is a truck to send. So before the bidding script touches anything, it asks the dispatch system a question: how full are the next two days?

The answer comes from the real calendar, per market. If the technicians in a market are booked out, the gate lowers ad spend in that market. Not to zero, because a customer who searches today and cannot get a slot until Thursday still needs to find us. But low enough that we stop paying for leads we would lose to a faster competitor anyway. When the calendar opens up, the gate lets the bids climb back.

The same signal works in reverse. When a market is quiet and a channel has a good return, the system pushes a bit harder there, and only on the channels that are earning their keep.

The failure modes taught us more than the successes. Early on the gate counted a technician's day off as "busy" and cut ads during a slow week. Once it read a weekend calendar as a full one. Every wrong reading became a rule.

Free language models for the paperwork

Around the bids sits a lot of text nobody wants to write: the note explaining a lead dispute, the first reply to a "do you fix this?" message, a summary of yesterday's calls. We route that through a gateway that rotates across the free tiers of several model providers. Drafts cost nothing. A dispatcher or I approve anything that goes to a customer, and the paid, stronger model is used only where judgment matters.

Telegram is the control room

All of this shows up in Telegram. One bot posts the morning brief: spend by channel, jobs booked by channel, which markets the gate throttled and why. A second bot is where dispatchers work leads: take it, book it, call the customer. The parts bot the technicians use lives in the same app. Nobody at Berne opens a dashboard on purpose. If a decision needs a human, the bot asks, with buttons.

What I would tell another owner

Start with revenue per channel per month. Everything else is decoration until that number is honest. Put a cap on every automatic change. And connect your ads to your calendar before you connect them to anything clever. A service company sells hours of a skilled person's time. The ad budget should know how many of those hours are left.

Frequently asked questions

What does automated ad bidding mean at Berne Appliance Repair?

A script compares each lead channel's monthly spend with the invoiced revenue from jobs that channel produced, then raises or lowers that channel's bid or budget by a small, capped step toward a target return. Every change is logged with its reason.

What is the capacity gate?

A rule that reads the technicians' real schedule for the next two days, per market, and lowers ad spend where the calendar is already full. It raises spend back when slots open.

How big is Berne Appliance Repair?

Founded in Miami in October 2022 by Eugene Bernitsky. Three brands across Florida, more than 30 people, 19 to 20 field technicians, six dispatchers, and around 7,500 service jobs a year.