Google Ads & Local Services

Connect your Google Ads account so KarmaFlow can report on every campaign you run — Local Services, Search, Performance Max and Display — and, for Local Services specifically, answer message leads automatically and follow them through to the invoice they produced.

The integration is Google Ads, not Local Services alone. Local Services is where it goes deepest, because Google charges per lead there and that pricing makes two questions decisive that most advertisers cannot answer: how fast do we reply? and which of these leads actually became revenue? Your other campaign types are read on the same nightly pass and reported alongside.

Where this is up to. Answering Local Services message leads is generally available — it runs on customer accounts today, and connecting is self-serve. Answering the calls those ads produce is a separate, harder job, and it is in private beta: request early access.

What It Covers

Every campaign type

Local Services, specifically

Why Teams Use It

Speed of response is the product. Google ranks Local Services advertisers partly on responsiveness, and consumers who message three businesses tend to hire the one that answers. A team that replies in nine minutes at 2pm and not at all at 2am is paying for leads it never works. An SMS agent answers on the same schedule regardless of hour.

Per-lead billing makes attribution unavoidable. When each lead has a price, "we spent CA$431 last month" is only half a sentence. The other half — how many became booked jobs, and what those jobs were worth — needs the join between Google's lead records and your service CRM, which is what the lifecycle page builds.

Disputes are money. Google credits leads that were spam, out of area, or otherwise not real. Tracking which leads were charged and which were credited turns that from a vague sense into a number you can act on.

Business Outcomes

Outcome How it happens
Faster first reply An SMS agent answers new message leads through Google's channel without waiting for a person
No lead unrecorded Every lead Google reports becomes a CRM contact, including phone leads and channels the agent doesn't answer
Work booked in the conversation With your systems connected, the agent checks real availability and books, without a person relaying it
Honest cost per lead Charged leads minus credited leads, divided into real spend
Revenue you can trace Leads joined to jobs and paid invoices, with the matching method disclosed per record
Conversations a person can take over Per-lead control over what the agent does after someone replies by hand

How It Works

flowchart TD
  subgraph GA["Your Google Ads account"]
    LS[Local Services]
    OTHER[Search · Performance Max · Display]
  end
  LS -->|"poll, every few minutes"| K[KarmaFlow]
  K -->|"new message lead"| A[SMS agent]
  A -->|"reply appended to the conversation"| LS
  A -->|"checks availability, books, reschedules"| S[Your connected systems<br/>MCP · API · endpoints]
  K -->|"every lead, every kind"| C[CRM contact]
  LS -->|"nightly: spend + lead records"| L[(Lifecycle facts)]
  OTHER -->|"nightly: spend, conversions,<br/>impression share, search terms"| L
  C --> J[Service CRM<br/>jobs + invoices]
  J --> L
  L --> R[Google Ads Lifecycle page]

Two passes, doing different jobs.

The poll runs every few minutes against Local Services only. It has to be a poll because Local Services has no webhook — which makes your poll interval your response latency. When a new consumer message arrives on a channel the agent answers, the bound SMS agent drafts a reply and KarmaFlow appends it to the Google conversation the consumer is actually reading.

The nightly sync covers the whole account. It reads daily spend and performance for every campaign type, pulls Local Services lead records, joins them to your CRM's jobs and paid invoices, and stores the result for the lifecycle page. It re-reads a trailing window each night because Google restates the past — a lead's credit state can change days later, which changes what a finished day actually cost.

What each campaign type gives you

Cards appear when the data behind them exists and say so when it does not, so a mixed account shows the union of what its campaigns support.

Local Services Search Performance Max Display
Spend, impressions, clicks
Google conversion tracking (rarely configured)
View-through conversions
Impression share + lost-share split
Top search terms
Leads as CRM contacts (lead forms, message assets) (lead forms, message assets) (lead forms)
Automatic replies (message assets — your SMS agent) (message assets — your SMS agent)
Response time
Cost per charged lead
Jobs and revenue attribution

Why Local Services goes deeper. Google hands over the actual lead — who contacted you, on what channel, and what they said — because that is what you are being charged for. The other campaign types report aggregate performance, with two exceptions that do produce a person:

Why Local Services shows no conversions. Local Services campaigns generally have no Google conversion tracking configured. Rather than print a confident 0, the page says the tracking does not apply and points at the lead statuses and attributed revenue that carry the outcomes instead.

A mixed account is the normal case. Running Local Services alongside Performance Max is common, and the lifecycle page shows spend across all of it while reserving the lead-level detail for the campaigns that produce leads.

Connecting your own systems

Two different things connect here, and it is worth keeping them apart.

What the agent can act on during a conversation is open-ended. The agent answering your Local Services leads is an ordinary SMS agent, so it reaches whatever you connect:

If your system… What it takes
Exposes an MCP server Register the URL and its auth and bind it to the agent — immediate, nothing to build. See MCP Servers.
Is Workiz Already built: thirteen tools covering lookup, availability, booking, rescheduling, dispatch and payments. See What Your Agents Can Do With Workiz.
Has an API but no MCP server Build against it yourself with keys from Settings (the gear icon) → Access & security → Tenant API Access — see the API reference — or ask us to connect it for you.
Can send an HTTP request It can push into KarmaFlow's webhook and form endpoints, no integration work on your side beyond making the call.

Self-serve or with us — your choice. Everything above can be set up by a tenant administrator without waiting on anyone; the API keys page is where the credentials live. If you would rather we did it, that is a normal part of onboarding.

Tools are granted per agent, so you decide exactly what it may do — an agent can be free to check availability and book while never being able to take a payment.

Not signed up yet? Create an account — connecting your systems is part of setting up, not a separate project.

What feeds revenue attribution is narrower and separate. The lifecycle page joins your ad spend to jobs and paid invoices from one connected service CRM, chosen in setup step 4, and today that means Housecall Pro or Workiz. Attribution is the only place that list applies; it does not limit what the agent can act on, and it is not required for anything above.

What's Different From Reading Google's Dashboard

Google's own Local Services dashboard shows you leads and lets you reply to them. What it does not do:

Google's dashboard KarmaFlow
Replies to a new message lead A person, when they see it An SMS agent, within the poll interval
Leads as CRM records No Every lead becomes a contact
Response time measured Not shown Median, from Google's own timestamp
Spend joined to revenue No — Google cannot see your invoices Spend → lead → job → paid invoice
Reply from a shared workspace Google account access required Any user with the right permission

Replying from Google's dashboard still works, and KarmaFlow notices when you do — see Human takeover.

What This Integration Does Not Do

Stated plainly, because these are the questions that come up after connection:

Private beta: calls answered by a voice agent

In development — not available yet. Everything above describes what works today; this section describes what we are building next, so you can factor it into your plans.

Today, calls from your ads ring whatever number you have configured, and KarmaFlow reports them after the fact — count, talk time, and recordings where Google holds them. We are working on letting a voice agent answer those calls, the way an SMS agent already answers message leads:

A voice agent is a different kind of thing from an SMS agent — a real-time conversation rather than a turn-by-turn exchange — so this is genuinely new capability rather than the messaging feature pointed at a phone line. That is also why it is not here yet.

Ask for early access. The beta is small on purpose, and which campaign types we support first depends on who is waiting for what — so the form asks which ones you run.

Request early access to calls from ads →

None of this gates the rest of the integration. Connecting Google Ads and answering message leads is self-serve and available now; see below.

How to get started

Enrolment is self-serve and takes one field.

  1. Go to Settings (the gear icon, top right) → Channels → Google Ads · Local Services. You need to be a tenant administrator.
  2. Enter your 10-digit Google Ads account ID — shown as 123-456-7890 in Google Ads — and press Request link.
  3. Approval can take up to 24 hours. You will get a manager-link invitation in your Google Ads account; accept it there, then press Verify back in KarmaFlow.
  4. Meanwhile, carry on configuring: choose the SMS agent that answers message leads, and turn on the nightly lifecycle sync. Nothing below the link depends on it completing first.

Connect Google Ads walks every step in order, including what to check once the account reads linked.

Learn More

Sign in to KarmaFlow