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.
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.
| 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 |
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.
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.
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.
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.
Stated plainly, because these are the questions that come up after connection:
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.
Enrolment is self-serve and takes one field.
123-456-7890 in
Google Ads — and press Request link.Connect Google Ads walks every step in order, including what to check once the account reads linked.