Skip to content
LucidMetric
All work
Dashboards & Reporting · AI Integrations · Workflow Automation

Client reporting that builds itself, and an AI voice agent that fills the calendar

Increasing Customers

Cannabis marketing agency · Edgewood, Washington

increasingcustomers.com

Increasing Customers runs compliant advertising for cannabis dispensaries across the US. They came to us for one thing — Looker Studio reports their clients would actually open — and the honest problem was that half their ad platforms have no native route into Looker Studio at all. We bridged those with Coupler.io and built one report template that now runs across their client base. Then they asked the harder question: who fills the pipeline while the team is busy delivering? So we built a second, separate system — an AI voice agent that works their GoHighLevel list every day and books discovery calls on its own.

13+

Client dashboards live in Looker Studio

6

Ad & analytics platforms unified

~20 min

Dashboard data refresh cycle

7

Voice assistants configured in Vapi

~30 hrs

Monthly reporting time returned

Estimate

0

Manual dials for first contact

Dashboard count, platform coverage, refresh cadence and assistant count are counted directly from the live Looker Studio, Coupler.io and Vapi workspaces. The monthly reporting figure is our own estimate — roughly two hours of manual assembly per client report, across the current dashboard count — and is not a client-audited number. First-touch dials are zero by design: the agent places every opening call.

Before

  • TikTok, Meta and Instagram had no native Looker Studio connector, so their numbers never made it in
  • Every dispensary got a slightly different hand-built report, so nothing was comparable
  • Reporting was rebuilt manually each cycle, competing with actual client delivery for hours
  • Clients waited on a person to remember to send an update
  • New-business outreach only happened when somebody had a spare afternoon

After

  • Coupler.io pipes the platforms Looker Studio can't reach into the same reporting layer
  • One template, cloned per dispensary, each wired to that client's own connectors and branding
  • Dashboards refresh on their own — clients open a live link instead of waiting for an export
  • An AI agent places first-touch calls from the GoHighLevel list every single day
  • Answered calls book a discovery slot straight into the calendar, no human dial required
  • Unanswered numbers go back in the queue for another day instead of being burned
End to end

Two systems, built one after the other

These tracks run independently. The first keeps existing dispensary clients informed; the second goes and finds the next ones.

Track 1 · Reporting

From five scattered platforms to one live dashboard

Follow one dispensary's numbers from the ad accounts they're trapped in to a link the client can open any time.

  1. 1

    Stop 1 · Scattered

    The numbers live in five different places

    A single dispensary's performance is split across paid social, search and site analytics — none of it in one view.

    Spend and revenue sit in TikTok Ads and Meta, organic visibility sits in Search Console, and on-site behaviour sits in Google Analytics. Google's own products connect to Looker Studio natively. The paid social platforms that matter most to a dispensary do not — which is the constraint that shaped everything else.

  2. 2

    Stop 2 · Bridge

    Coupler.io bridges what Looker can't reach

    A third-party connector layer pulls the non-native platforms into a shape Looker Studio can read.

    Each client's ad accounts are authorised once as a source, then a scheduled data flow keeps them refreshed. Sources are held per client and marked shared or private depending on who needs them, so one agency workspace can serve many dispensaries without their data mixing.

    This is the decision the whole reporting side rests on. Without a bridge for the non-native platforms there is no single report — only a folder of screenshots.

  3. 3

    Stop 3 · Template

    One report, built once

    Rather than a bespoke dashboard per client, a single template carries every metric an account manager needs.

    The standard build opens on scorecards — revenue, ROAS, spend, orders, reach, impressions, clicks, CTR, CPC, CPM and AOV — each with its period-over-period movement. Below that sit spend and revenue dynamics over time, impressions against CPM, clicks against CPC, and a campaign-level table. Separate pages cover media performance, audience demographics and website performance.

  4. 4

    Stop 4 · Rollout

    Cloned across the client base

    The template is duplicated per dispensary and repointed at that client's own connectors.

    Each brand gets its own report — The Verb is Herb, Good Nature, Bleu Leaf, Indoor Treez, Guardian Wellness and the rest — carrying their logo and their data, with a matching Google Ads view where that channel is running. Because they all descend from one template, a metric added centrally is a change every client benefits from.

  5. 5

    Stop 5 · Delivery

    The client opens a link, not an attachment

    Reports refresh roughly every twenty minutes, so the dashboard is current whenever someone looks at it.

    Date range, campaign and ad name are filters at the top of the report, so a dispensary owner can answer their own questions without a request going back to the agency. Nobody exports anything, and nobody waits for the end of the month to find out how a campaign performed.

Track 2 · Outbound lead generation

An AI voice agent that works the list every day

A separate system, built after the reporting went live, to answer the question of who fills the pipeline while the team delivers.

  1. 6

    Stop 6 · List

    The list already lives in GoHighLevel

    Prospect dispensaries sit in the agency's CRM, tagged for outreach — no new database required.

    GoHighLevel is where contacts, conversations, calendars and payments already live for the agency, so the outbound system was built to read from and write back to it rather than alongside it. Tags mark who is in the outreach pool and who has already been worked.

  2. 7

    Stop 7 · Batch

    Make.com picks the day's batch

    A scheduled scenario pulls a fixed number of contacts, paces itself, and tags each one as it goes.

    The scenario searches GoHighLevel for tagged contacts, then walks them with a deliberate sleep between each so calls don't fire in a burst, updating the contact record as it goes. That tag write-back is what stops the same dispensary being dialled twice on consecutive days.

  3. 8

    Stop 8 · Call

    Eva places the call

    A Vapi assistant opens the conversation, introduces the agency, and asks for the person who handles marketing.

    The assistant runs a low-latency transcriber with GPT-4.1 and a natural voice, tuned to land around a second and a half of response time so the conversation doesn't feel like a robocall. It opens by naming the agency and what it does for dispensaries, then asks to be pointed at the decision-maker. A knowledge base about the agency lets it answer real questions instead of deflecting them.

    The brief was warm and consultative, never pushy. A voice agent that pitches hard on an outbound cannabis call gets hung up on — and burns a contact the client can't easily replace.

  4. 9

    Stop 9 · Book

    It books the discovery call itself

    A prospect who is interested gets a slot in the calendar during the call, not a follow-up email later.

    The assistant's goal is a booked thirty-minute discovery call with the agency's lead strategist. Because the system is wired back into GoHighLevel, that booking lands in the same calendar the team already works from, against the same contact record the call was made from.

  5. 10

    Stop 10 · Requeue

    A missed call is a retry, not a loss

    No answer, voicemail or a bad moment puts the contact back in the pool for another day.

    A webhook reports the outcome back into Make, which updates the contact, sets the retry state, waits, and posts to the call endpoint again on a later run. The practical effect is that a finite prospect list keeps producing conversations instead of being spent in a single pass.

What building for an agency's own clients taught us

Connector coverage decides the architecture

The brief was Looker Studio dashboards, but the real constraint was that the client's most important ad platforms have no native path into Looker Studio. Choosing a bridging layer first — rather than designing the report first — is what made a single unified dashboard possible at all.

Build the template once, clone it many times

For an agency, the leverage isn't a beautiful bespoke dashboard. It's one standard report that survives being cloned across a whole client base, so onboarding a new dispensary is a connector swap rather than a fresh build.

A voice agent needs a knowledge base, not just a script

Prospects interrupt with real questions about pricing, compliance and results. An agent with only an opening line stalls; one given a proper brief about the agency can answer, stay in the conversation, and still get to the booking.

Design for the no-answer, because that's most calls

The interesting engineering in outbound isn't the successful call — it's what happens to the other ninety percent. Treating a missed call as a scheduled retry turned a one-shot contact list into a channel that keeps working.

Reporting eating your month?

If client dashboards get rebuilt by hand and outreach only happens when someone finds a spare afternoon, both of these systems can be built for your agency.

Services behind this build