Abstract blue spheres on dark background
Marketing Tutorial

How to Build a Marketing Ops Agent (7 Systems, One Source of Truth)

Your CMO asks "what's working?" The answer lives in 7 systems. The agent connects them all and gives a unified answer in 30 seconds.

Amodal TeamApril 8, 202620 min read

The problem: 4 hours to answer "what's working?"

Your marketing team runs campaigns across Google Ads, LinkedIn, email, webinars, and the website. Pipeline is tracked in Salesforce. Engagement is tracked in HubSpot. Ad spend is split across two platforms. Website behavior is in Google Analytics. Budget targets are in a spreadsheet.

Every Monday, a marketing analyst spends 4 hours building the weekly campaign report: pull spend from Google Ads and LinkedIn, pull form fills from HubSpot, pull website traffic from GA, pull pipeline from Salesforce, cross-reference it all in a spreadsheet, and try to figure out which campaigns actually drove revenue.

The real problem
By the time the report is done, it's Tuesday. The data is stale. The CMO has already made decisions based on gut feel. And when she asks a follow-up question ("why did MQL conversion drop?"), the analyst needs another 2 hours to dig in.
Part 1

Connect 7 systems

1

Connect everything the marketing team touches

terminal
$ mkdir acme-marketing-ops && cd acme-marketing-ops
$ npx amodal init
✓ Project initialized
$ amodal connect hubspot
✓ Connected. 12,400 contacts, 340 active campaigns, 28 forms indexed.
$ amodal connect google-ads
✓ Connected. 14 active campaigns, 6 months of spend data.
$ amodal connect linkedin-ads
✓ Connected. 8 campaigns, 4 lead gen forms.
$ amodal connect google-analytics
✓ Connected. 148K monthly sessions, 24 conversion events.
$ amodal connect salesforce
✓ Connected. 847 opportunities, pipeline data.
$ amodal connect slack
✓ Connected. Channels: #marketing-ops, #leadership.
$ amodal connect google-sheets
✓ Connected. Q2 Budget Tracker linked.
What the agent can now see across
HubSpot
Contacts, campaigns, emails, forms
Google Ads
Spend, clicks, conversions
LinkedIn Ads
Spend, lead gen forms, audiences
Google Analytics
Traffic, pages, attribution paths
Salesforce
Pipeline, revenue, attribution
Slack
Post summaries, alerts
Google Sheets
Budget targets, quarterly goals
Part 2

Write the skills

Two skills: campaign attribution and lead scoring.

2

Campaign attribution skill

skills/campaign-attribution/SKILL.md
# Skill: Campaign Attribution
## Trigger
Activate when the user asks about campaign performance,
ROI, what's working, spend efficiency, or pipeline attribution.
## Methodology: Multi-touch attribution
For each campaign, gather:
1. **Spend** — Google Ads + LinkedIn Ads (total $ for the period)
2. **Traffic** — Google Analytics sessions attributed to the campaign
3. **Engagement** — HubSpot form fills, email clicks, webinar attendance
4. **Pipeline** — Salesforce opportunities where the campaign is a
touchpoint (first-touch, last-touch, or any-touch)
5. **Revenue** — Closed-won deals attributed to the campaign
Calculate:
- Cost per lead (spend / form fills)
- Cost per opportunity (spend / opps created)
- Pipeline generated (sum of opp amounts)
- ROI (revenue / spend)
- Efficiency score (pipeline / spend, compared to quarterly target)
## Cross-system correlation
Match contacts across systems by email address:
- Google Ads click → GA session → HubSpot form fill → SF opportunity
- LinkedIn lead gen form → HubSpot contact → SF opportunity
- Show the full journey, not just last-touch.
## Output format
- Lead with the headline: "X campaigns ran, $Y spent, $Z pipeline."
- Rank campaigns by efficiency (pipeline per dollar spent)
- Flag underperformers: high spend, low pipeline
- Compare against budget targets from Google Sheets
3

Lead scoring skill

skills/lead-scoring/SKILL.md
# Skill: Lead Scoring
## Trigger
Activate when the user asks about lead quality, which
leads to prioritize, or "who should sales call first."
## Scoring signals (weight each 0-100)
- **Email engagement** (HubSpot): opened 3+ emails in 7 days = 25pts
- **Website behavior** (GA): visited pricing page = 30pts, visited
case studies = 15pts, 3+ sessions in 7 days = 20pts
- **Content engagement** (HubSpot): webinar attended = 25pts,
whitepaper downloaded = 15pts, demo requested = 40pts
- **ICP match** (HubSpot + LinkedIn): company size 50-500 = 20pts,
title contains VP/Director/Head = 15pts, target industry = 10pts
- **Recency** (all): all signals in last 7 days = 1.5x multiplier,
last 30 days = 1.0x, older = 0.5x
## Thresholds
- 80+ = Hot (route to sales immediately)
- 50-79 = Warm (nurture, prioritize for next outreach)
- Below 50 = Cold (continue nurture sequence)
## Rules
- Demo requested always = Hot regardless of other signals
- Competitor email domain = exclude (they're researching us)
- Student/personal email = score 0 (not ICP)
Part 3

Monday morning: the CMO asks

7 systems, one question, 30 seconds.

4

"How did last week's campaigns perform?"

#marketing-ops — 9:02 AM Monday
L
Lisa Chen (CMO) 9:02 AM
@amodal how did last week's campaigns perform? Compare against our Q2 targets.
A
Amodal 9:02 AM
Queried: Google Ads (spend + conversions), LinkedIn Ads (spend + leads), Google Analytics (sessions + attribution), HubSpot (form fills + email engagement), Salesforce (pipeline created), Google Sheets (Q2 targets). 6 systems, 3.2s.
Week of March 17: 6 campaigns, $14,200 spent, $342K pipeline generated
Campaign
Spend
Leads
Pipeline
CPL
ROI
Webinar: AI for Ops
$2,100
89
$148K
$24
70x
Google: 'agent platform'
$4,800
124
$96K
$39
20x
LinkedIn: CTO targeting
$3,200
42
$84K
$76
26x
Blog retargeting
$1,400
67
$12K
$21
9x
LinkedIn: brand awareness
$1,800
18
$2K
$100
1x
Google: competitor terms
$900
31
$0
$29
0x
Top performer: Webinar "AI for Ops" — 70x ROI, $148K pipeline from $2,100 spend. 89 registrants, 67 attended, 12 requested demos.
Underperformers: LinkedIn brand awareness ($1,800, only $2K pipeline) and Google competitor terms ($900, zero pipeline). Recommend pausing both.
vs Q2 targets: $342K pipeline on a $325K weekly target. 105% of goal. But pipeline is concentrated in 2 campaigns (webinar + Google brand). Need more diversification.
30 seconds, 6 systems
The agent correlated ad spend from 2 platforms, website traffic from GA, form fills from HubSpot, pipeline from Salesforce, and budget targets from a spreadsheet. One table. One recommendation. The analyst used to spend 4 hours building this in Excel.
5

"Which webinar leads should sales call first?"

#marketing-ops — 9:05 AM Monday
L
Lisa Chen (CMO) 9:05 AM
@amodal the webinar had 67 attendees. Which ones should sales call today?
A
Amodal 9:05 AM
Queried: HubSpot (67 webinar attendees + email activity), Google Analytics (website behavior per contact), LinkedIn (company data for ICP match), Salesforce (existing opportunities). 4 systems, 2.8s.
12 hot leads, 23 warm, 32 cold
Top 5 (Hot — route to sales today):
Rachel Torres, VP Ops @ DataFlowScore: 94
Attended webinar + visited pricing page 2x + opened 4 emails + company 200 employees (ICP match)
James Wu, Director Eng @ CloudFirstScore: 91
Attended webinar + downloaded whitepaper + 5 website sessions in 3 days + demo form started (not submitted)
Maria Santos, Head of IT @ Acme CorpScore: 87
Attended webinar + visited pricing + case study pages + company already in Salesforce (existing opportunity, Qualification stage)
Tom Liu, CTO @ StartupCoScore: 82
Attended webinar + 3 emails opened + visited /for-builders page + company 80 employees (ICP)
Dana Park, VP Product @ MegaCorpScore: 80
Attended webinar + visited pricing + company 400 employees + but used personal email (slightly lower confidence)
Note: Maria Santos (Acme Corp) already has an open opportunity in Salesforce. The webinar might re-engage a stalled deal. Flag to the account owner (Marcus Rivera).

The agent cross-referenced webinar attendees (HubSpot) with website behavior (GA), email engagement (HubSpot), company data (LinkedIn), and existing pipeline (Salesforce). It scored each lead, ranked them, and caught that one attendee has a stalled deal. The sales team knows exactly who to call, in what order, and why.

Part 4

The VP asks "why did conversion drop?"

The diagnostic question that used to take half a day.

6

Root cause analysis across 4 systems

#marketing-ops — 2:15 PM Tuesday
K
Kevin Park (VP Marketing) 2:15 PM
@amodal MQL-to-SQL conversion dropped from 28% to 19% this month. Why?
A
Amodal 2:15 PM
Queried: HubSpot (MQL definitions + form data + lifecycle changes), Google Analytics (traffic sources for MQLs), LinkedIn Ads (audience targeting changes), Salesforce (SQL acceptance rates by source). 4 systems, 4.1s.
Three contributing factors identified:
Factor 1: Form change captured lower-intent leads (biggest impact)
On March 3, the "Download Whitepaper" form was changed from requiring company name + title to just email. Form fills increased 3x (from 40/week to 120/week), but 70% of new submissions are personal emails (gmail, yahoo) vs 30% before the change. These leads are scoring as MQL on email engagement alone but failing SQL qualification because they're not ICP.
Factor 2: LinkedIn audience shifted (moderate impact)
The LinkedIn "AI for Operations" campaign audience was expanded on March 8 to include "Students and Recent Graduates." These leads attend webinars but don't convert. MQLs from LinkedIn are up 40% but SQL acceptance is down from 32% to 12% for LinkedIn-sourced leads.
Factor 3: Sales capacity (minor impact)
2 of 6 SDRs were out last week (PTO). Average follow-up time went from 4 hours to 18 hours. Leads contacted after 12 hours convert at half the rate. But this only explains ~3% of the drop.
Recommended actions
  1. 1. Revert the whitepaper form to require company name + title (biggest lever)
  2. 2. Exclude "Students and Recent Graduates" from the LinkedIn audience
  3. 3. Add a lead-scoring rule: personal email = score 0 (not ICP)
  4. 4. Consider a 12-hour SLA for SDR follow-up on hot leads
Cross-system root cause
The agent traced the conversion drop to three factors across four systems: a HubSpot form change, a LinkedIn audience expansion, and Salesforce response time data. No single system could have surfaced this. The analyst would have needed to check HubSpot form submissions (and remember the change), pull LinkedIn audience settings, and cross-reference with Salesforce follow-up times. Half a day of work, done in 4 seconds.
Part 5

The CMO says "ok, do it"

Analysis is step one. The agent also takes action across systems.

7

"Pause the underperformers and move the budget"

#marketing-ops — 9:08 AM Monday (continued from the campaign review)
L
Lisa Chen (CMO) 9:08 AM
Ok. Pause the LinkedIn brand awareness and Google competitor campaigns. Move that $2,700 budget to the webinar campaign. And update the budget tracker.
A
Amodal 9:08 AM
Confirmation required (4 actions across 3 systems)
1. LinkedIn Ads: Pause campaign "Brand Awareness Q2" (currently spending $257/day)
2. Google Ads: Pause campaign "Competitor Terms" (currently spending $128/day)
3. Google Ads: Increase "AI for Ops Webinar" daily budget from $300 to $685 (+$385/day from reallocated spend)
4. Google Sheets: Update Q2 Budget Tracker: reallocate $2,700/week from paused campaigns to webinar campaign
Net budget change: $0. Same total spend, reallocated to higher-performing campaign.
L
Lisa Chen (CMO) 9:08 AM
[Confirmed all 4]
A
Amodal 9:09 AM
✓ LinkedIn Ads: "Brand Awareness Q2" paused
✓ Google Ads: "Competitor Terms" paused
✓ Google Ads: "AI for Ops Webinar" budget updated to $685/day
✓ Google Sheets: Q2 Budget Tracker updated (row 14, reallocation noted)
4 actions, 3 systems, 1 sentence
Lisa said one sentence. The agent translated it into 4 specific API calls across LinkedIn Ads, Google Ads, and Google Sheets. Each action was itemized with the exact impact (daily spend changes, row numbers in the spreadsheet). Lisa confirmed once. Done. No logging into 3 dashboards. No remembering which campaign is which in which platform.
8

"Get those hot leads to sales"

#marketing-ops — 9:10 AM Monday
L
Lisa Chen (CMO) 9:10 AM
Those 12 hot webinar leads — assign them to SDRs and make sure Marcus knows about the Acme Corp re-engagement.
A
Amodal 9:10 AM
Confirmation required (5 actions across 3 systems)
1.
HubSpot: Move 12 contacts to lifecycle stage "Sales Ready." Create follow-up task for each, assigned by round-robin to SDR team (4 SDRs, 3 leads each).
2.
Salesforce: Create opportunity for Rachel Torres (DataFlow, $85K est.) flagged as "Hot Inbound — Webinar."
3.
Salesforce: Add "AI for Ops Webinar" as campaign touchpoint on existing Acme Corp opportunity (Marcus Rivera's deal).
4.
Salesforce: Create task for Marcus Rivera: "Re-engage Maria Santos (Acme Corp) — attended AI for Ops webinar, visited pricing 2x this week. Stalled deal may be back in play."
5.
Slack: DM each SDR their assigned leads with scores, signals, and suggested talking points.
L
Lisa Chen (CMO) 9:10 AM
[Confirmed all 5]
A
Amodal 9:11 AM
✓ HubSpot: 12 contacts → "Sales Ready," follow-up tasks created
✓ Salesforce: Opportunity created for Rachel Torres (DataFlow)
✓ Salesforce: Webinar touchpoint added to Acme Corp opportunity
✓ Salesforce: Task created for Marcus Rivera (Acme Corp re-engagement)
✓ Slack: DMs sent to 4 SDRs with personalized lead assignments

Here's what one of those SDR DMs looks like:

Slack DM — to Alex Rivera (SDR)
A
Amodal 9:11 AM
Your hot leads from the AI for Ops webinar (3 assigned):
1. Rachel Torres — VP Ops @ DataFlow (Score: 94)
Attended full webinar. Visited pricing page twice this week. Opened 4 emails. Company: 200 employees, SaaS, matches ICP perfectly.
Talking point: She asked a question during the webinar about multi-system integrations. Lead with how the agent connects to their existing tools.
2. Tom Liu — CTO @ StartupCo (Score: 82)
Attended webinar. Visited /for-builders page 3x. Company: 80 employees, Series A.
Talking point: He's technical. Lead with the OSS CLI and the "amodal dev" local experience. Don't pitch the platform until he's tried the product.
3. Dana Park — VP Product @ MegaCorp (Score: 80)
Attended webinar. Visited pricing. Company: 400 employees. Used personal email (slightly lower confidence).
Talking point: Large company, likely evaluating for a team. Lead with the ISV / embedded use case. She's VP Product — the white-label angle may resonate.
HubSpot tasks created for each. Target: first contact within 4 hours (your highest-converting window).
Not just a lead list — a call prep kit
Each SDR gets their 3 leads with scores, signals, and personalized talking points. The agent pulled the webinar Q&A (Rachel asked about integrations), the website behavior (Tom visited /for-builders 3 times — he's technical), and the company profile (Dana's at a 400-person company — ISV angle). The SDR doesn't research. They dial.
9

Fix the conversion problem

Remember the MQL-to-SQL diagnosis from Part 4? The agent found three root causes. Lisa decides to act on all three:

#marketing-ops — 2:30 PM Tuesday
L
Lisa Chen (CMO) 2:30 PM
@amodal let's fix the MQL conversion issues. Revert the whitepaper form to require company + title. Exclude students from the LinkedIn audience. And update our lead scoring to score personal emails as zero.
A
Amodal 2:30 PM
Confirmation required (3 actions across 3 systems)
1.
HubSpot: Update form "Download Whitepaper" — add required fields: Company Name, Job Title. (This will reduce form fills ~60% based on the pre-March 3 baseline, but submissions will be higher quality.)
2.
LinkedIn Ads: Update audience for "AI for Operations" campaign — exclude "Students" and "Recent Graduates" from targeting.
3.
Lead scoring skill: Add rule: "Personal email domain (gmail, yahoo, hotmail, outlook) = score 0, exclude from MQL pipeline." This will be saved to your skill file and deployed on next publish.
Expected impact: MQL volume will drop ~40% but MQL-to-SQL conversion should return to ~28% baseline within 2 weeks.
L
Lisa Chen (CMO) 2:31 PM
[Confirmed all 3]
A
Amodal 2:31 PM
✓ HubSpot: "Download Whitepaper" form updated — Company Name and Job Title now required
✓ LinkedIn Ads: Students and Recent Graduates excluded from "AI for Operations" audience
✓ Lead scoring skill: personal email = 0 rule added, saved to skills/lead-scoring/SKILL.md
The skill change is saved locally. Run amodal deploy or push to main to make it live.
Diagnose AND fix in one conversation
Tuesday at 2:15: "Why did conversion drop?" Agent finds 3 root causes across 4 systems. Tuesday at 2:30: "Fix all three." Agent reverts a form, updates an ad audience, and adds a scoring rule. From diagnosis to fix: 15 minutes. No logging into HubSpot, LinkedIn Ads, or editing a skill file manually. The CMO described the intent in English. The agent translated it into API calls and config changes.
10

Enroll cold leads in a nurture sequence

#marketing-ops — 9:15 AM Monday (continued)
K
Kevin Park (VP Marketing) 9:15 AM
@amodal those 32 cold leads from the webinar — don't just drop them. Enroll them in the "Post-Webinar Nurture" sequence in HubSpot. And create a retargeting audience in Google Ads from the warm + cold leads.
A
Amodal 9:15 AM
Confirmation required (2 actions across 2 systems)
1.
HubSpot: Enroll 32 contacts (cold webinar leads) in workflow "Post-Webinar Nurture" (5-email sequence over 3 weeks: recap, case study, pricing, demo offer, last chance).
2.
Google Ads: Create customer match audience "Webinar Attendees March" with 55 emails (23 warm + 32 cold). Available for retargeting campaigns within 24-48 hours.
K
Kevin Park (VP Marketing) 9:15 AM
[Confirmed both]
A
Amodal 9:16 AM
✓ HubSpot: 32 contacts enrolled in "Post-Webinar Nurture"
✓ Google Ads: Audience "Webinar Attendees March" created (55 emails uploaded)

No lead left behind. Hot leads go to SDRs (Salesforce + Slack). Warm and cold leads get enrolled in a nurture sequence (HubSpot) and a retargeting audience (Google Ads). Every webinar attendee is in a pipeline, being worked by either a human or an automation.

Write actions taken in this session

Action
System
Trigger
Paused 2 underperforming campaigns
LinkedIn + Google Ads
CMO: "pause the underperformers"
Reallocated $2,700/week budget
Google Ads
CMO: "move budget to webinar"
Updated budget tracker spreadsheet
Google Sheets
CMO: "update the tracker"
Moved 12 leads to Sales Ready
HubSpot
CMO: "get leads to sales"
Created opportunity for Rachel Torres
Salesforce
Agent: hot lead, no existing opp
Added webinar touchpoint to Acme deal
Salesforce
Agent: existing opp re-engagement
Created task for Marcus (Acme re-engage)
Salesforce
CMO: "make sure Marcus knows"
DM'd 4 SDRs with lead assignments
Slack
CMO: "get leads to sales"
Reverted whitepaper form fields
HubSpot
CMO: "fix the conversion issues"
Excluded students from LinkedIn audience
LinkedIn Ads
CMO: "fix the conversion issues"
Added personal-email scoring rule
Skill file
CMO: "fix the conversion issues"
Enrolled 32 cold leads in nurture
HubSpot
VP: "don't drop them"
Created retargeting audience
Google Ads
VP: "create a retargeting audience"

13 write actions across 6 systems. Every one confirmed by a human before execution. Total time: ~10 minutes of conversation. Without the agent: logging into 6 dashboards, remembering campaign IDs, finding the right forms, updating spreadsheets manually. Easily 2 hours of operational work.

Part 6

Automate the weekly report

No more 4-hour Monday morning spreadsheets.

11

Schedule the weekly automation

terminal
$ amodal install automation weekly-campaign-report
Installed weekly-campaign-report v1.0.0
Schedule: Monday 8:00am → #marketing-ops and #leadership

Every Monday at 8am, the agent queries all 7 systems and posts a campaign performance summary to both channels. The CMO sees it before the 9am meeting. The marketing analyst doesn't build a spreadsheet anymore. She reviews the agent's report and adds commentary.

#leadership — Monday 8:00 AM (automated)
A
Amodal 8:00 AM
Weekly Marketing Report — March 17-23
$14,200
Spent
371
Leads
$342K
Pipeline
105%
vs Target
Highlight: Webinar "AI for Ops" drove $148K pipeline on $2.1K spend (70x ROI). Watch: 2 campaigns underperforming (LinkedIn brand, Google competitor). Recommend pausing. Trend: MQL-to-SQL conversion at 19% (down from 28%). Investigation posted to #marketing-ops.
Part 7

The agent learns, the VP tunes

12

Knowledge proposals from a month of campaigns

Admin UI → Knowledge Proposals
Proposed by agent · from 4 weeks of campaign data

"Leads who attend a webinar AND visit the pricing page within 48 hours convert to SQL at 3.2x the baseline (42% vs 13%). Recommend auto-scoring these as Hot regardless of other signals."

Source: 340 webinar attendees, 4-week lookback, HubSpot + GA + Salesforce correlation

Proposed by agent

"Google Ads 'agent platform' campaign converts best on Tuesdays and Wednesdays (2.4x other days). Recommend shifting 60% of budget to Tue-Wed."

Proposed by agent

"Leads from companies with 100-300 employees convert at 2x the rate of 300+ (28% vs 14%). Consider tightening ICP definition in lead scoring."

Kevin approves the webinar+pricing insight. The lead scoring skill now auto-routes those leads as Hot. He edits the company size threshold before approving the third one: his sales team can handle enterprise, so he keeps 300+ in the ICP but adds a note that mid-market should be prioritized in outbound sequences.

13

Cost dashboard

Admin UI → Costs → acme-marketing-ops
$45.20
This month
480
Sessions
12
Users
4 hrs
Analyst time saved/week

$45/month. The marketing analyst used to spend 4 hours every Monday building the weekly report. $45/month vs $800/month in analyst time. And the CMO gets the report at 8am Monday instead of Tuesday afternoon.

Part 8

Community packages you get for free

14

Install marketing community knowledge

terminal
$ amodal install skill campaign-attribution-multitouch
Installed campaign-attribution-multitouch v2.1.0
$ amodal install skill lead-scoring-b2b
Installed lead-scoring-b2b v1.4.0
$ amodal install knowledge b2b-benchmarks
Installed b2b-benchmarks v2026.Q1 (CPL benchmarks, conversion rates by industry, channel performance baselines)
$ amodal install knowledge icp-scoring-framework
Installed icp-scoring-framework v1.2.0 (firmographic scoring templates, signal weighting best practices)

We wrote our own skills in this tutorial for the walkthrough. But in practice, you'd install community skills first, then override with your specifics:

skills/campaign-attribution/SKILL.md (override version)
---
import: campaign-attribution-multitouch
---
# Acme-specific overrides
- We use a 90-day attribution window (community default is 30)
- Our "demo requested" event is called "book_demo_click" in GA
- Compare all metrics against targets in the Q2 Budget Tracker
(Google Sheets, linked as google-sheets connection)
- Our fiscal quarters start Feb/May/Aug/Nov, not calendar quarters
Community handles the methodology, you handle the specifics
The community attribution skill knows multi-touch attribution, channel benchmarks, and standard marketing metrics. Your override adds: your attribution window, your event names, your budget spreadsheet, your fiscal calendar. When the community skill updates with better methodology, you get it automatically. Your overrides stay.

What you built

7
systems connected
2
skills written
$45
per month
4 hrs
saved per week
Who
Where
What they do
When
CMO
Slack
Asks about campaign performance, pipeline, ROI
Monday mornings
VP Marketing
Slack + Admin UI
Asks diagnostic questions, tunes lead scoring, approves knowledge
As needed
Marketing analyst
Slack
Reviews automated reports, adds commentary, asks follow-ups
Daily
SDR team
Slack
Gets prioritized lead lists with scores and signals
After campaigns
The agent
Everywhere
Weekly reports, lead scoring, attribution, diagnostics, learning
Continuous

7 connections, 2 skills, 1 automation. The CMO gets answers in 30 seconds instead of waiting until Tuesday for a spreadsheet.