What this audit checks
Authentication & access
- Access token (60-day) within 14 days of expiry
- Refresh token (365-day) within 30 days of expiry - renew before merchant re-prompt
- Ad account URN (urn:li:sponsoredAccount) resolves and account status is ACTIVE not CANCELLED/PENDING_DELETION
- Required scopes present (r_ads, r_ads_reporting, rw_ads, r_organization_social)
Spend & budget pacing
- Daily budget utilisation per campaign (under-pacing <70% or over-pacing >120% of dailyBudget)
- Wasted-spend burst - zero-MQL spend >$X in last 72h on any active campaign
- End-dated or COMPLETED campaigns still accruing spend
- Bid creep - unitCost above category benchmark given premium LinkedIn CPC floor
Campaign performance (ROAS / CTR / CPC)
- Cost-per-MQL (B2B ROAS proxy) spiked >50% vs prior 7D same-DOW window via /v2/adAnalytics
- CTR below objective benchmark per campaign objectiveType (LEAD_GENERATION, WEBSITE_CONVERSIONS)
- CPC above account median across active SPONSORED_UPDATES and TEXT_AD campaigns
- Campaigns with >$X spend and <1% conversion (zero-conversion spend)
Conversion & attribution
- Lead Gen Form sync to CRM/MAP broken - /v2/adFormResponses rising while contact creation <50% expected for >30min
- Conversion tracking gap - WEBSITE_CONVERSIONS campaigns reporting clicks but zero recorded conversions
- Lead Gen Form completion rate collapse vs trailing 7D baseline
- Conversation Ads (SPONSORED_INMAILS) response rate <1% - sender reputation decay risk
Creative & audience health
- AdCreatives with review_status REJECTED or PENDING in active campaigns
- Member-match audiences below the 300-member privacy floor (won’t deliver, spend reallocates to broad)
- Audience saturation - effective member-match reach <50K narrowing delivery
- Orphan campaigns ACTIVE with no active AdCreative
Cross-channel revenue at risk
- Lead Gen Form lead email_hash not found in hubspot.contact / salesforce.lead within sync SLA (MQL leak)
- Active campaign targeting commerce-sibling SKU with qty=0 (rare B2B-commerce OOS spend)
- Branded paid clicks cannibalising organic when google_search_console sibling ranks #1 for the query
- Landing pages with website_performance LCP p75 >4s and conversion <0.5x account average
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
roas | 3.0 | - |
ctr | 0.4 | - |
conversion_rate | 5.0 | - |
cpc | 12 | 20 |
wasted_spend_pct | 8 | 15 |
budget_pacing | 70 | - |
refresh_token_days_to_expiry | 30 | 7 |
Data sources
GET https://api.linkedin.com/v2/adAccounts- Auth + account status sanityGET https://api.linkedin.com/v2/adCampaigns- Campaign state, budget, objectiveGET https://api.linkedin.com/v2/adCreatives- Creative review_status + typeGET https://api.linkedin.com/v2/adAnalytics- Spend / impressions / clicks / conversions for ROAS, CTR, CPCGET https://api.linkedin.com/v2/adFormResponses- Lead Gen Form submissions for CRM/MAP sync integrityPOST https://www.linkedin.com/oauth/v2/accessToken- Refresh OAuth access token