Introduction
LinkedIn Ads reste en 2026 la plateforme reine pour la publicité B2B, avec plus de 1 milliard d'utilisateurs professionnels. Contrairement à Google Ads ou Meta, elle excelle dans le targeting par poste, entreprise et compétences, idéal pour générer des leads qualifiés. Ce tutoriel intermediate vous guide pas à pas : de la configuration via l'interface Campaign Manager à l'automatisation via l'API Marketing Developer Platform.
Pourquoi c'est crucial ? Les ROI moyens atteignent 2,5x grâce à un CPC de 5-9€ et un ciblage ultra-précis (ex. : "Directeur IT chez PME françaises"). Nous couvrons les nouveautés 2026 comme les A/B tests automatisés et l'intégration IA pour les audiences. Résultat : des campagnes scalables, mesurables, prêtes à bookmarker pour vos projets pros.
Préparez-vous à passer de novice à expert en 30 minutes de lecture + 1h de pratique.
Prérequis
- Compte LinkedIn Premium ou Sales Navigator (pour accès Ads).
- Accès Campaign Manager (via linkedin.com/campaignmanager).
- App LinkedIn Developer : Créez-en une sur developer.linkedin.com (Marketing Developer Platform).
- Node.js 20+ et npm pour les exemples API.
- Budget test : 50-100€ pour valider une campagne.
- Connaissances de base en HTTP/OAuth (intermediate).
Initialiser le projet Node.js pour l'API
mkdir linkedin-ads-api && cd linkedin-ads-api
npm init -y
npm install axios dotenv linkedin-api-client typescript @types/node ts-node
npm install -D @types/axios
cat > .env << EOF
LINKEDIN_CLIENT_ID=votre_client_id
LINKEDIN_CLIENT_SECRET=votre_client_secret
LINKEDIN_REDIRECT_URI=http://localhost:3000/auth/callback
EOF
cat > tsconfig.json << 'EOF'
{
"compilerOptions": {
"target": "ES2022",
"module": "commonjs",
"strict": true,
"esModuleInterop": true
}
}
EOFCe script initialise un projet Node.js complet pour interagir avec l'API LinkedIn Marketing. Il installe axios pour les requêtes HTTP, dotenv pour les secrets, et configure TypeScript. Remplacez les placeholders dans .env par vos credentials d'app LinkedIn (obtenus sur developer.linkedin.com).
Configurer votre app LinkedIn Developer
- Allez sur developer.linkedin.com > Mon Apps > Créer app.
- Sélectionnez Marketing Developer Platform comme produit.
- Ajoutez ad:read, ad:write, account:read, audience:read/write comme permissions.
- Dans OAuth 2.0, ajoutez
http://localhost:3000/auth/callbackcomme redirect URI. - Notez Client ID/Secret pour .env.
Implémenter l'authentification OAuth 2.0
import axios from 'axios';
import * as dotenv from 'dotenv';
import { execSync } from 'child_process';
dotenv.config();
const CLIENT_ID = process.env.LINKEDIN_CLIENT_ID!;
const CLIENT_SECRET = process.env.LINKEDIN_CLIENT_SECRET!;
const REDIRECT_URI = process.env.LINKEDIN_REDIRECT_URI!;
// Étape 1: Générer URL auth (manuel pour simplicité)
const authUrl = `https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=${CLIENT_ID}&redirect_uri=${encodeURIComponent(REDIRECT_URI)}&scope=r_ads%20r_ads_reporting%20w_organization_social%20r_organization_social&state=state123`;
console.log('Ouvrez ce lien:', authUrl);
// Étape 2: Échanger code contre access_token (exécutez après callback)
async function getAccessToken(code: string): Promise<string> {
const tokenResponse = await axios.post('https://www.linkedin.com/oauth/v2/accessToken', new URLSearchParams({
grant_type: 'authorization_code',
code,
redirect_uri: REDIRECT_URI,
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
}), {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
});
return tokenResponse.data.access_token;
}
// Usage: node -r ts-node/register auth.ts
// Copiez 'code' depuis URL callback, puis:
// const token = await getAccessToken('CODE_ICI');
// console.log(token);Ce code gère l'OAuth 2.0 complet pour LinkedIn : génération d'URL auth et échange code/token. Lancez-le avec npx ts-node auth.ts, copiez le code du callback, et obtenez un token valide 60 jours. Piège : Sans state param, risque de CSRF ; toujours valider en prod.
Créer votre première campagne via interface
Accédez à Campaign Manager : linkedin.com/campaignmanager > Créer campagne.
- Objectif : Choisissez 'Leads' pour formulaires natifs (taux conversion 13% moyen).
- Budget : Daily 50€, Total 500€ – activez 'Coût par résultat' pour optimiser.
- Audience : 50k-300k membres (ex. : France, "Responsable Marketing", entreprises 50-200 salariés). Évitez <10k (coût élevé).
- Placement : Audience Network ON pour +20% reach.
Publiez en draft, puis passez à l'API pour scaler.
Créer une campagne via API Marketing
import axios from 'axios';
const ACCESS_TOKEN = 'votre_access_token';
const ACCOUNT_ID = 'urn:li:sponsoredAccount:123456789'; // De /adAccounts
async function createCampaign() {
const response = await axios.post(`https://api.linkedin.com/rest/adCampaigns`, {
name: 'Campagne Test Leads 2026',
status: 'DRAFT',
campaignGroup: 'urn:li:sponsoredCampaignGroup:987654321',
fundingSource: 'urn:li:sponsoredMarketplaceFundingSource:default',
runSchedule: {
start: '2026-01-15T00:00:00+00:00',
end: '2026-02-15T23:59:59+00:00'
},
budgetAmount: {
currency: 'EUR',
amount: '500.00',
microAmount: 50000000
},
bidAmount: {
currency: 'EUR',
amount: '5.00',
microAmount: 500000
},
type: 'LEADS_GEN_FORM',
offsiteSendTrackingValue: 'linkedin_ads_2026',
conversionReportingGoal: 'LEAD',
}, {
headers: {
'Authorization': `Bearer ${ACCESS_TOKEN}`,
'Linkedin-Version': '202312',
'Content-Type': 'application/json'
}
});
console.log('Campaign ID:', response.data.id);
}
createCampaign();Ce script crée une campagne Leads complète via API v202312. Remplacez token/account/group IDs (obtenez-les via GET /adAccounts et /adCampaignGroups). Piège : 'Linkedin-Version' obligatoire, sinon 400 ; budget en micro-unités (1€=1000000 micros).
Cibler et lancer l'audience
Dans Campaign Manager :
- Audience : Matched Audiences (upload CSV emails) + Lookalike (similaire à vos clients).
- Démos : Poste (CEO), Skills (Salesforce), Seniority (Manager+).
- Exclusions : Vos employés pour éviter waste.
Pour A/B : Dupliquez ad sets, testez 2 variantes créatifs (image vs carousel).
Métrique clé 2026 : Lead Gen Forms remplissent 2x plus vite sur mobile – priorisez.
Définir un ad set avec targeting précis
import axios from 'axios';
const ACCESS_TOKEN = 'votre_access_token';
const CAMPAIGN_ID = 'urn:li:sponsoredCampaign:123456789';
async function createAdSet() {
const response = await axios.post(`https://api.linkedin.com/rest/adGroups`, {
name: 'AdSet France Managers',
status: 'DRAFT',
campaign: CAMPAIGN_ID,
targeting: {
include: {
audiences: [
{ 'urn:li:audience:multiPart': 'urn:li:audience:country:FR' },
{ 'urn:li:audience:member:currentTitle': [{ text: 'Manager', operators: ['IN'] }] },
{ 'urn:li:audience:companySize': [{ values: [51, 200] }] }
],
orList: null
},
exclude: { audiences: [{ 'urn:li:audience:company': ['urn:li:company:123'] }] }
},
bidAmount: { currency: 'EUR', amount: '8.00', microAmount: 800000 },
budgetAmount: { currency: 'EUR', amount: '200.00', microAmount: 20000000 },
}, {
headers: {
'Authorization': `Bearer ${ACCESS_TOKEN}`,
'Linkedin-Version': '202312',
'Content-Type': 'application/json'
}
});
console.log('AdSet ID:', response.data.id);
}
createAdSet();Crée un ad set avec targeting avancé : France, Managers, 51-200 employés. Utilisez URNs standards (docs LinkedIn). Piège : Targeting trop étroit (<50k) déclenche rejet ; testez avec /adAnalytics pour valider reach estimé.
Créer et associer un créatif Sponsored Content
import axios from 'axios';
import FormData from 'form-data';
const ACCESS_TOKEN = 'votre_access_token';
const AD_SET_ID = 'urn:li:sponsoredAdGroup:987654321';
async function uploadAsset(assetPath: string, type: 'image' | 'video') {
const form = new FormData();
form.append('file', require('fs').createReadStream(assetPath));
form.append('owner', 'urn:li:organization:123456789');
form.append('registerUpload', 'true');
const upload = await axios.post('https://api.linkedin.com/rest/images?action=registerUpload', form, {
headers: { ...form.getHeaders(), 'Authorization': `Bearer ${ACCESS_TOKEN}`, 'Linkedin-Version': '202312' }
});
// Upload file to signed URL (simplifié, implémentez full)
console.log('Asset URN:', upload.data.value);
return upload.data.value;
}
async function createAd(imageUrn: string) {
const response = await axios.post(`https://api.linkedin.com/v2/adGroups/${AD_SET_ID}/ads`, {
name: 'Ad Test Leads',
status: 'ACTIVE',
type: 'SPONSORED_CONTENT',
visibility: { com.linkedin.ugc.ShareVisibility: 'PUBLIC' },
childContent: {
'com.linkedin.ugc.ShareContent': {
shareCommentary: { text: 'Découvrez notre solution IA pour marketers !' },
shareMediaCategory: 'IMAGE',
media: [{ status: 'READY', originalUrl: imageUrn }],
visibility: { 'com.linkedin.ugc.ShareVisibility': 'PUBLIC' }
}
}
}, {
headers: {
'Authorization': `Bearer ${ACCESS_TOKEN}`,
'X-Restli-Protocol-Version': '2.0.0',
'Content-Type': 'application/json'
}
});
console.log('Ad ID:', response.data.id);
}
// Usage: const img = await uploadAsset('./banner.jpg', 'image'); createAd(img);Gère upload d'asset (image) et création d'ad Sponsored Content. Nécessite form-data npm. Piège : Versions API différentes (/v2 pour ads) ; assets doivent être <5MB, format JPG/PNG.
Récupérer les performances (Reporting)
import axios from 'axios';
const ACCESS_TOKEN = 'votre_access_token';
const CAMPAIGN_ID = 'urn:li:sponsoredCampaign:123456789';
async function getReport() {
const response = await axios.get(`https://api.linkedin.com/rest/adCampaigns/${CAMPAIGN_ID}?q=analytics&analytics=(pivot:PIVOT_BY_campaign,dateRange:(start:20260101,end:20260131),projections:(campaign,status,impressions,clicks,costInLocalCurrency,conversions))`, {
headers: {
'Authorization': `Bearer ${ACCESS_TOKEN}`,
'Linkedin-Version': '202312'
}
});
console.log('Rapport:', JSON.stringify(response.data, null, 2));
}
getReport();Récupère métriques clés (impressions, clicks, coût, conversions) sur période. Utilisez PIVOT_BY pour granularité. Piège : Date en YYYYMMDD ; quota 100k calls/jour, cachez en prod.
Bonnes pratiques
- Budget pacing : Utilisez 'Accelerated delivery' seulement pour launches ; lifetime budget cap à 10x daily.
- A/B testing : 50/50 split sur 2 ad sets, pause le perdant après 1000 impressions.
- Retargeting : Warm audiences (video viewers 25%+) convertissent 3x mieux.
- Compliance : Pas de promesses irréalistes ; validez formulaires RGPD.
- API : Rate limit 20 calls/sec ; utilisez webhooks pour real-time events.
Erreurs courantes à éviter
- Audience trop large/étroite : <20k = rejet API ; >1M = CPC x2.
- Oubli version API : Toujours spécifiez 'Linkedin-Version:202312' ou 400 Bad Request.
- Token expiré : Refresh auto avec refresh_token (60j max) ; implémentez cron job.
- Pas de UTM : Ajoutez offsiteSendTrackingValue pour tracker en GA4.
Pour aller plus loin
- Docs officielles : LinkedIn Marketing API.
- Outils : Zapier pour no-code, ou LeadSync pour sync leads.
- Formations avancées : Découvrez nos formations Learni sur le Marketing Digital – masterclass LinkedIn Ads + IA générative.
- Communauté : LinkedIn Growth Hacking group (200k membres).