From linkedin-ads-manager
Manages LinkedIn ad campaigns via Python CLI: list/get/clone campaigns, pause/resume, update budgets/targeting, analyze performance, batch operations.
npx claudepluginhub twentworth12/linkedin-ads-manager-plugin --plugin linkedin-ads-managerThis skill uses the workspace's default tool permissions.
Manage LinkedIn ad campaigns programmatically via a Python CLI. Full campaign lifecycle: creation, cloning, budget management, targeting configuration, performance analytics, and batch operations.
linkedinreferences/AUDIT_FRAMEWORK.mdreferences/BEST_PRACTICES_B2B_SAAS.mdreferences/PLAYBOOK.mdreferences/TROUBLESHOOTING.mdscripts/analyze_titles.pyscripts/audit_campaigns.pyscripts/audit_campaigns_v2.pyscripts/campaign_group.pyscripts/clone_campaign.pyscripts/daily_report.pyscripts/find_organization.pyscripts/get_access_token.pyscripts/get_posts_token.pyscripts/linkedin_api.pyscripts/linkedin_cli.pyscripts/list_campaigns.pyscripts/post_text.pyscripts/post_video.pyscripts/setup.pyAnalyzes LinkedIn Ads for B2B advertising with 27 checks on technical setup, audience targeting, creative quality, lead gen forms, and bidding strategy. Computes health score, assesses Thought Leader Ads and ABM, generates action plan.
Manages Google Ads, Meta Ads (Facebook/Instagram), LinkedIn Ads, TikTok Ads campaigns via natural language. Automates keyword research, budget optimization, ROAS tracking, wasted spend analysis, ad creatives, targeting, and reporting.
Launches paid ad campaigns on Google Ads, Meta Ads, LinkedIn Ads, or TikTok Ads with targeting, budgets, bidding, creatives, and safeguards. Use for compliant ad deployments.
Share bugs, ideas, or general feedback.
Manage LinkedIn ad campaigns programmatically via a Python CLI. Full campaign lifecycle: creation, cloning, budget management, targeting configuration, performance analytics, and batch operations.
Before asking the user for any API credentials, tokens, or account IDs, always check the .env file in the project root first:
cat .env 2>/dev/null
If the required credentials are present, load them silently and proceed — do not ask the user to provide them. Only ask for credentials if they are genuinely missing from .env.
Before using this skill, credentials must be configured. Run /linkedin-setup or set environment variables:
LINKEDIN_CAMPAIGNS_TOKEN — OAuth token from Marketing Developer Platform app (scopes: rw_ads, r_ads_reporting)LINKEDIN_POSTS_TOKEN — OAuth token from Community Management API app (scope: w_organization_social)LINKEDIN_ACCOUNT_ID — Your LinkedIn ad account IDGet tokens from https://www.linkedin.com/developers/apps → Auth → OAuth 2.0 tools.
Why two tokens: LinkedIn doesn't allow a single app to have both Marketing Developer Platform AND Community Management API products. You need separate apps.
The CLI script lives on a read-only filesystem — always invoke it with bash directly (do not use chmod +x):
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin [command] [options]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin list [--name SEARCH] [--status ACTIVE,PAUSED] [--limit 20]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin get CAMPAIGN_ID [--json]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin clone --source CAMPAIGN --name NEW_NAME [--clone-creatives] [--budget 50]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin update-status CAMPAIGN_ID --status PAUSED|ACTIVE|DRAFT
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin update-budget CAMPAIGN_ID --budget 100
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin pause-all [--name FILTER] [--dry-run]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin resume-all [--dry-run]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin analyze CAMPAIGN_ID [--recommend]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin update-targeting CAMPAIGN_ID [--add-organization ORG_ID] [--add-titles IDS] [--add-skills IDS]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin copy-targeting --source CAMPAIGN_ID --target CAMPAIGN_ID
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin recommend-skills [--campaign-id CAMPAIGN_ID]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin find-org "Company Name"
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin find-skill "Kubernetes"
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin find-title "DevOps Engineer"
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin performance --campaign-id CAMPAIGN_ID [--days 30]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin performance --name "ABM" [--days 7]
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin daily # Yesterday's snapshot + MTD pacing + alerts
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin daily --date 2026-03-10 # Specific date report
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin daily --month-budget 25000 # Override monthly budget for pacing
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin audit # Quick operational check
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin audit-v2 # Comprehensive strategic audit
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin campaign-group --group-id GROUP_ID [--by-type] [--active-only]
--clone-creatives by default (each campaign needs custom creatives).Key pattern: Before writing a custom script, check if an existing command handles the use case.
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin find-org "Company Name"
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin clone --source TEMPLATE_CAMPAIGN --name "ABM_CompanyName" --clone-creatives
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin update-targeting NEW_ID --add-organization ORG_ID --org-name "Company Name"
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin analyze NEW_ID
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin analyze CAMPAIGN_ID
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin copy-targeting --source WINNING_ID --target CAMPAIGN_ID
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin update-targeting CAMPAIGN_ID --add-organization ORG_ID --org-name "Company Name"
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin pause-all --dry-run
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin pause-all
# ... after holiday ...
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin resume-all --dry-run
bash ${CLAUDE_PLUGIN_ROOT}/skills/linkedin-ads-manager/linkedin resume-all
For deeper strategic guidance, read the reference files:
references/BEST_PRACTICES_B2B_SAAS.md — Full strategic playbook: funnel architecture, ICP-first targeting, creative refresh cycles, benchmarksreferences/PLAYBOOK.md — Proven operational patterns for ABM campaigns, targeting diagnosticsreferences/AUDIT_FRAMEWORK.md — Monthly audit checklists and benchmark comparison frameworksreferences/TROUBLESHOOTING.md — Common errors and solutionsnextPageToken.str() before string operations.politicalIntent required: Creating campaigns without it causes 422. Always include "politicalIntent": "NOT_DECLARED".x-restli-id header for new ID.rw_ads scope isn't enough — must add account ID in Developer Portal → Products → View Ad Accounts.OAuth Scopes: rw_ads (read/write campaigns), r_ads_reporting (analytics)
Account Role: ACCOUNT_MANAGER, CAMPAIGN_MANAGER, or ACCOUNT_BILLING_ADMIN