# Google Ads & Local Services

Connect your Google Ads account so Karmaflow.ai 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](https://forms.gle/Ex2bNT6Q4Kj2Df189).

## What It Covers

### Every campaign type

- **Daily spend, impressions and clicks** per campaign type, in the account's own currency and bucketed by the account's local day.
- **Conversions and conversion value** from Google's own conversion tracking, where you run campaign types that use it — Search, Performance Max and Display.
- **View-through conversions** for Display, where the impression did the work and there was never a click.
- **Search visibility** for Search campaigns: impression share, plus the split between share lost to rank and share lost to budget — which turns "we could be showing more" into a choice between bidding higher and spending more.
- **Top search terms** for Search campaigns, over the current window.

### Local Services, specifically

- **Automatic replies to message leads.** An SMS agent you choose answers new Local Services messages through Google's own channel, usually within one poll interval.
- **Every lead becomes a contact.** Message and phone leads land in the CRM with their category, status and Google's charge state, so they can be filtered, listed and enrolled in campaigns like any other record.
- **The agent can act, not just answer.** With your operational systems connected, it can check real availability, book the job, reschedule it or capture the lead — inside the same conversation. See [what your systems need](#connecting-your-own-systems) below.
- **Human takeover, on your terms.** When a person steps into a conversation, you decide whether the agent keeps going, drafts for approval, or stands down — per lead, or as a default for the whole account.
- **Response-time reporting.** The median time a consumer waits for a reply, measured from Google's own timestamp — the metric Google ranks advertisers on.
- **Spend through to revenue.** Daily ad spend joined to leads, then to jobs and paid invoices from your service CRM, with the attribution method shown for every match.
- **Charge and credit tracking.** Which leads Google charged for, which were credited back after a dispute, and the resulting real cost per lead.

## 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

```mermaid
flowchart TD
  subgraph GA["Your Google Ads account"]
    LS[Local Services]
    OTHER[Search · Performance Max · Display]
  end
  LS -->|"poll, every few minutes"| K[Karmaflow.ai]
  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.ai 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:

- **Message assets** (Search and Performance Max) put a *Send message* button on the ad. Tapping it opens the consumer's own texting app addressed to whatever number you entered in Google Ads — so enter your **SMS agent's number**, and the conversation arrives as an ordinary text from the consumer's real phone. Google keeps no record of it; your SMS agent answers it like any other text, and Karmaflow.ai attributes it to the ad by the ad's starter message or by the number it landed on. See [Search and Performance Max leads](/help/integrations/google-ads-setup#search-and-performance-max-leads).
- **Lead forms** (Search, Performance Max, Video, Display) are imported: each submission becomes a contact, a follow-up task and a notification, with the click id kept on the record.

**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](/help/integrations/mcp-servers). |
| Is **Workiz** | Already built: thirteen tools covering lookup, availability, booking, rescheduling, dispatch and payments. See [What Your Agents Can Do With Workiz](/help/integrations/workiz-agents). |
| 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](/docs/tenant-api) — or ask us to connect it for you. |
| Can send an **HTTP request** | It can push into Karmaflow.ai'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](https://omni.karmaflow.ai/auth/register) — 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.ai |
|---|---|---|
| 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.ai notices when you do — see [Human takeover](/help/integrations/google-ads-human-takeover).

## What This Integration Does Not Do

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

- **It does not create or edit campaigns.** Karmaflow.ai reads Google Ads and replies to Local Services leads; budgets, bids and campaign setup stay in Google.
- **It does not answer phone leads — yet.** Phone conversations are recorded and reported — count, talk time, and recordings where Google holds them — but an agent does not take calls placed through your ad. That is the private beta below; [request early access](https://forms.gle/Ex2bNT6Q4Kj2Df189) if it matters to you.
- **It does not read Search, Performance Max or Display conversations from Google.** Those campaigns have no lead inbox at Google. What they *can* produce reaches you through your own numbers and forms: a message asset pointed at your SMS agent's number arrives as a text, a call asset or Local Services call destination pointed at a Karmaflow.ai number is answered by your voice agent, and lead-form submissions are imported. Karmaflow.ai attributes each of those to Google Ads itself, without asking Google.
- **It cannot see a reply you send from your personal phone.** Only replies made in Karmaflow.ai or in Google's own dashboard are visible to it.
- **Spend is not always available.** Some Local Services campaign configurations do not expose cost through the API. When that happens the page says so rather than showing zero.

## 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.ai 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:

- **Local Services call leads**, which Google already reports to us as leads
  in their own right.
- **Call extensions on Search and Performance Max campaigns**, and other
  campaign types where Google exposes them.

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 →](https://forms.gle/Ex2bNT6Q4Kj2Df189)

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.ai.
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](/help/integrations/google-ads-setup) walks every step in
order, including what to check once the account reads **linked**.

## Learn More

- [Connect Google Ads](/help/integrations/google-ads-setup) — the four setup steps, start to finish
- [Google Analytics 4 & Google Ads Conversions](/help/integrations/google-analytics) — send chats, calls, deals and conversation outcomes to GA4 and, through it, to Ads bidding; offline conversions by click id
- [Answering Local Services leads](/help/integrations/google-ads-lead-replies) — how the agent replies, and how to reply yourself
- [Human takeover](/help/integrations/google-ads-human-takeover) — what the AI does after a person steps in
- [The Google Ads Lifecycle page](/help/integrations/google-ads-lifecycle) — reading spend, leads, and attributed revenue
- [SMS Agents](/help/sms-agents/overview) — configuring the agent that answers
- [How the Google integrations work: technical architecture](/help/integrations/google-integrations-architecture) — the pipelines, credentials, records and guarantees, for technical evaluators

[Sign in to Karmaflow.ai](https://omni.karmaflow.ai/auth/login)
