directionally, very bad is exactly right, but your boss needs more than vibes.
Pull the raw ad platform data alongside the CRM pipeline. Run a simple attribution query (if they're even tracking it) to see cost per MQL vs cost per SQL against the benchmarks they promised at onboarding. a quick look at wasted spend: export the campaign-level cost and split by matched vs unmatched leads. if more than 30% of spend goes to unqualified or uncontactable leads, that's your first number.
Here's a lightweight proof I've used before - run a Python script to cross-reference the agency's LinkedIn campaign IDs against your HubSpot lifecycle stages.
import pandas as pd
# assume you've exported LinkedIn cost data and HubSpot lead stages
linkedin = pd.read_csv('linkedin_ads.csv')
hubspot = pd.read_csv('hubspot_leads.csv')
merged = linkedin.merge(hubspot, left_on='lead_id', right_on='contact_id')
waste = merged[merged['lifecycle_stage'].isin(['lead','unknown'])] # not even MQL
waste_percent = len(waste) / len(merged) * 100
print(f"Spend on unqualified leads: {waste_percent:.1f}%")
If that number tops 40%, the agency is either ignoring your ICP or running vanity campaigns. present that to your boss as a single slide - the metric, the script, and a comparison to the agency's own reported ROI.
also cross-check frequency and click-through rates on retargeting. High frequency + low CTR means they're burning budget on people who already ignored them. that's not "full-funnel," that's laziness.
one more thing: ask for the ad copy variants they've tested in the last quarter. If the answer is less than 10 per account, they're not even trying to optimize. Show your boss the difference between "we're running ads" and "we're running experiments."