WaveMetrics Sidekick
An AI teammate inside the Google Ads dashboard. Ask it about the account, get analysis and reports, and let it act, with you confirming every write.
- Built at
- Smarketer
- Role
- Fullstack Developer
- Stack
- Vercel Eve, MCP, LangFuse
What are some quick wins to improve ROAS this month?
- Loaded skill· Performance review
- Recalled memory· TV campaign started Jan 5, 2026
- Started Data Analysis AgentData Analysis Agentget_campaign_metrics(last_30_days)get_campaign_metrics(previous_period)get_search_terms(conversions = 0)
Compared 12 campaigns, found 3 opportunities. Returning to main agent.
Three things stand out in the last 30 days. Brand search is capped while Generic keywords burn budget below break-even.
- Brand – Exact5.8×
- Shopping – Bestsellers3.4×
- Retargeting – 30 d2.9×
- Competitor – Phrase1.6×
- Generic – Broad0.9×
- 1Raise the budget on Brand – Exact. It hit its cap on 6 of the last 7 days at 5.8× ROAS.
- 2Pause Generic – Broad. €2,140 spent at 0.9×, down from 1.7× before the TV campaign shifted demand to brand terms.
- 3Add 41 negatives. Search terms with spend but zero conversions, mostly “free” and “used” queries.
Apply quick win 1 to the account: raise the daily budget on Brand – Exact.
Saved as template “Monthly quick wins”. Ask for it any time.
About
WaveMetrics is Smarketer’s Google Ads dashboard that gives deeper insight into accounts. With Sidekick, we wanted to bring in an actually useful AI agent that helps you for daily tasks. You might ask things like “what are quick wins for my ROAS?” or “write me a 30-day report that I can present in the team”, and it answers with real numbers from the account, charts, and, when asked, changes to the account itself.
It is the most practical AI work I have done so far: an agent that can do everything the dashboard can, kept trustworthy by making every sensitive action wait for a person.
Tech
- Vercel EveAgent networkMain agent and specialized subagents answer
- Next.jsChat UIAnswers render as dashboard components via json-render
- LangFuseObservabilityPrompts and agent decisions are logged for analysis
- WaveMetrics backendMCP serverEvery dashboard read and write as a typed tool
- Google AdsAccountHuman-in-the-loop for sensitive actions
The agent talks to our backend through a custom MCP server, so it has the same reach as the dashboard, including creating custom alerts. Anything that changes the account goes through a human-in-the-loop confirmation first. Prompts live in LangFuse next to a library of skills the agent pulls in when a task needs them, which keeps the base prompt small.
It remembers account context between conversations, like when a TV campaign started, and can save the current task as a template so the same report or check is one message away next month. For heavier work the main agent delegates: for example a Data Analysis Agent gathers and crunches the data and hands the result back for the main agent to present, with charts and tables rendered as native dashboard components.
- TypeScript
- Vercel Eve
- MCP
- LangFuse
- json-render
- Multi-agent
Page context
Sidekick knows what is on your screen. It can reference the chart or table in front of you in its answers, and you can hand it a specific element with a picker that works like the one in Chrome DevTools.
- Daily budget
- €165.00
- Bidding
- Target ROAS · 400%
- Status
- Enabled
Why does it dip here?
Thursday fell to 1.9× while spend stayed flat. That is the day the bidding target moved to 400% in your settings, so delivery pulled back before catching up on Saturday.
How page context works
- ReactContextElementWraps a chart, table or settings box together with an LLM-friendly JSON version of it
- React contextPage providerKeeps the list of registered elements and drives the picker overlay
- Eve SDKRequestCompressed page context is sent when submitting a message
- Eve toolget_element_contextThe agent fetches an element's JSON only when it needs it
<ContextElement title="ROAS daily chart" context={roasByDay}>
<Chart data={roasByDay} />
</ContextElement>The agent reads structured data instead of a rendered chart, which is both cheaper in tokens and more accurate, and the list of titles keeps the base prompt small until it actually needs an element. Non-data elements like a filter selector can register the same way, so the AI knows what you've selected.
