jpskill.com
💼 ビジネス コミュニティ

linkedin-marketing

LinkedInでの個人ブランディング、リード獲得、B2Bマーケティングのために、コンテンツ作成、最適化、自動化を支援し、投稿作成、成長戦略、API連携、効果測定など、LinkedInを最大限に活用するSkill。

📜 元の英語説明(参考)

Create, optimize, and automate LinkedIn content for personal branding, lead generation, and B2B marketing. Use when someone asks to "write a LinkedIn post", "grow on LinkedIn", "LinkedIn content strategy", "LinkedIn API integration", "automate LinkedIn posting", "LinkedIn carousel", "LinkedIn analytics", or "LinkedIn outreach". Covers content creation with platform-specific formatting, API integration, analytics, and growth strategies.

🇯🇵 日本人クリエイター向け解説

一言でいうと

LinkedInでの個人ブランディング、リード獲得、B2Bマーケティングのために、コンテンツ作成、最適化、自動化を支援し、投稿作成、成長戦略、API連携、効果測定など、LinkedInを最大限に活用するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o linkedin-marketing.zip https://jpskill.com/download/15073.zip && unzip -o linkedin-marketing.zip && rm linkedin-marketing.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15073.zip -OutFile "$d\linkedin-marketing.zip"; Expand-Archive "$d\linkedin-marketing.zip" -DestinationPath $d -Force; ri "$d\linkedin-marketing.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して linkedin-marketing.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → linkedin-marketing フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

LinkedIn Marketing

概要

このスキルは、AIエージェントがLinkedInで高いパフォーマンスを発揮するコンテンツを作成し、LinkedIn APIと連携するのを支援します。プラットフォーム固有のコンテンツルール、投稿のフォーマット、カルーセルの作成、APIベースの公開、分析トラッキング、およびLinkedInのアルゴリズムとオーディエンスの行動に合わせた成長戦略を網羅しています。

指示

プラットフォームのルールとアルゴリズム

2025年から2026年のLinkedInのアルゴリズムは、以下を優先します。

  • Dwell time — ユーザーが投稿を読むのに費やす時間(長文 > 短文)
  • Early engagement — 最初の60〜90分が配信にとって重要
  • Comments > reactions — コメントは「いいね」よりも5〜8倍重要
  • Native content — 投稿本文に外部リンクを含めない(リーチが40〜50%低下)
  • Relevance — 接続だけでなく、トピックに関心のある人にコンテンツを表示
  • Consistency — 週に3〜5回の投稿は、月に1回のバイラル投稿よりも効果的

リーチを低下させる要因:

  • 投稿本文に外部リンクを含める(代わりにコメントに記載)
  • 最初の1時間以内に投稿を編集する
  • エンゲージメントポッド(LinkedInが検出し、抑制)
  • ハッシュタグの詰め込み(最大3〜5個)
  • 反応しない人をタグ付けする

コンテンツ形式とベストプラクティス

テキスト投稿(最も高いオーガニックリーチ)

[Hook — 最初の2行がすべて、スクロールを止めさせる必要あり]

[モバイルでの読みやすさのために、1〜2文ごとに改行]

[Body — ストーリー、洞察、またはフレームワーク。800〜1300文字が最適]

[各段落は最大1〜3個の短い文]

[CTA — コメントを促す質問、「賛成ならいいね」ではない]

[下部に3〜5個の関連するハッシュタグ]

フォーマットルール:

  • 最初の2行は「...もっと見る」の前に表示されるため、魅力的にする
  • 積極的に改行を使用する — テキストの壁はスクロールされる
  • 800〜1300文字が最適な長さ(滞留時間を確保するのに十分な長さで、最後まで読める短さ)
  • 絵文字は箇条書きマーカー(🔹、→、✅)として控えめに使用し、装飾として使用しない
  • Markdownは使用しない — LinkedInはレンダリングしない。強調にはCAPSまたは絵文字を使用する
  • コメントを促す質問で終わる(オープンエンド、はい/いいえではない)

カルーセル(PDFドキュメント — 最も高い保存率)

  • PDFとしてアップロード(各ページがスライド)
  • スライドサイズ:1080x1350px(4:5の比率)または1080x1080px(1:1)
  • 8〜12スライドが最適
  • 最初のスライド = フック/タイトル(太字、最小限のテキスト)
  • 最後のスライド = CTA + プロフィール概要
  • 1つのスライドに1つのアイデア、大きなテキスト(最小24〜32pt)
  • ブランドカラーと一貫性のあるデザイン
  • ファイルサイズ:100MB未満、最大300ページ

ポール(高いエンゲージメント、少ない労力)

  • 2週間の期間が最適
  • 3〜4つのオプション(2つではない — 二元的すぎる)
  • なぜ質問しているのかを説明するコンテキストを投稿本文に追加する
  • 結果分析の投稿でフォローアップする

記事とニュースレター

  • 記事:1000〜2000語、GoogleによってSEOインデックス化
  • ニュースレター:サブスクライバーはメール+アプリ内通知を受け取る
  • 長文のソートリーダーシップに適している
  • バイラルポテンシャルは低いが、権威構築は高い
  • 300〜400語ごとに画像を含める

ビデオ

  • ネイティブビデオ(YouTubeリンクではない)
  • 縦型(9:16)または正方形(1:1) — ワイドスクリーンではない
  • フィードの場合は2分未満(30〜90秒が最適)
  • 字幕は必須(80%以上が音なしで視聴)
  • 最初の3秒でフックする
  • 最大ファイルサイズ:5GB、最大期間:15分

LinkedIn API連携

認証 (OAuth 2.0)

// LinkedIn uses OAuth 2.0 with 3-legged flow
const LINKEDIN_AUTH_URL = 'https://www.linkedin.com/oauth/v2/authorization';
const LINKEDIN_TOKEN_URL = 'https://www.linkedin.com/oauth/v2/accessToken';

// Step 1: Redirect user to authorize
const authUrl = new URL(LINKEDIN_AUTH_URL);
authUrl.searchParams.set('response_type', 'code');
authUrl.searchParams.set('client_id', process.env.LINKEDIN_CLIENT_ID);
authUrl.searchParams.set('redirect_uri', process.env.LINKEDIN_REDIRECT_URI);
authUrl.searchParams.set('scope', 'openid profile email w_member_social');
// Redirect user to authUrl.toString()

// Step 2: Exchange code for token
const tokenResponse = await fetch(LINKEDIN_TOKEN_URL, {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'authorization_code',
    code: authorizationCode,
    client_id: process.env.LINKEDIN_CLIENT_ID,
    client_secret: process.env.LINKEDIN_CLIENT_SECRET,
    redirect_uri: process.env.LINKEDIN_REDIRECT_URI,
  }),
});
const { access_token, expires_in } = await tokenResponse.json();
// Token valid for 60 days, refresh before expiry

API経由でのコンテンツの投稿


// Get user profile URN
const profileRes = await fetch('https://api.linkedin.com/v2/userinfo', {
  headers: { Authorization: `Bearer ${access_token}` },
});
const { sub: personUrn } = await profileRes.json();

// Create a text post
const postRes = await fetch('https://api.linkedin.com/v2/posts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${access_token}`,
    'Content-Type': 'application/json',
    'X-Restli-Protocol-Version': '2.0.0',
    'LinkedIn-Version': '202401',
  },
  body: JSON.stringify({
    author: `urn:li:person:${personUrn}`,
    commentary: 'Your post text here...',
    visibility: 'PUBLIC',
    distribution: {
      feedDistribution: 'MAIN_FEED',
      targetEntities: [],
      thirdPartyDistributionChannels: [],
    },
    lifecycleState: 'PUBLISHED',
  }),
});

// Create a post with image
// Step 1: Initialize upload
const uploadRes = await fetch('https://api.linkedin.com/v2/images?action=initializeUpload', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${access_token}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    initializeUploadRequest: {
      owner: `urn:li:person:${personUrn}`,
    },
  }),
});
const { value: { uploadUrl, image: imageUrn } } = await uploadRes.json();

// Step 2: Upload image binary
await fetch(uploadUrl, {
  method: 'PUT',
  headers: { 'Content-Type': 'image/png' },
  body: imageBuffer,
});

// Step 3: Create post with image
await fetch('https://api.linkedin.com/v2/posts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${access_token}`,
    'Content-Type': 'application/json',
    'LinkedIn-Ve
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

LinkedIn Marketing

Overview

This skill helps AI agents create high-performing LinkedIn content and integrate with the LinkedIn API. It covers platform-specific content rules, post formatting, carousel creation, API-based publishing, analytics tracking, and growth strategies tailored to LinkedIn's algorithm and audience behavior.

Instructions

Platform Rules & Algorithm

LinkedIn's algorithm in 2025-2026 prioritizes:

  • Dwell time — how long people spend reading your post (long-form > short)
  • Early engagement — first 60-90 minutes are critical for distribution
  • Comments > reactions — comments weight 5-8x more than likes
  • Native content — no external links in post body (kills reach 40-50%)
  • Relevance — content shown to people interested in the topic, not just connections
  • Consistency — 3-5 posts/week beats 1 viral post/month

What kills reach:

  • External links in post body (put in comments instead)
  • Editing post within first hour
  • Engagement pods (LinkedIn detects and suppresses)
  • Hashtag stuffing (3-5 max)
  • Tagging people who don't engage back

Content Formats & Best Practices

Text Posts (Highest organic reach)

[Hook — first 2 lines are everything, must stop the scroll]

[Line break after every 1-2 sentences for mobile readability]

[Body — story, insight, or framework. 800-1300 characters optimal]

[Each paragraph is 1-3 short sentences max]

[CTA — question to drive comments, not "like if you agree"]

[3-5 relevant hashtags at the bottom]

Formatting rules:

  • First 2 lines show before "...see more" — make them irresistible
  • Use line breaks aggressively — wall of text = scroll past
  • 800-1300 characters is the sweet spot (long enough for dwell time, short enough to finish)
  • Emojis sparingly as bullet markers (🔹, →, ✅), not decoration
  • No markdown — LinkedIn doesn't render it. Use CAPS or emojis for emphasis
  • End with a question to drive comments (open-ended, not yes/no)

Carousels (PDF documents — highest save rate)

  • Upload as PDF (each page is a slide)
  • Slide size: 1080x1350px (4:5 ratio) or 1080x1080px (1:1)
  • 8-12 slides optimal
  • First slide = hook/title (bold, minimal text)
  • Last slide = CTA + profile summary
  • One idea per slide, large text (24-32pt minimum)
  • Brand colors and consistent design
  • File size: under 100MB, max 300 pages

Polls (High engagement, low effort)

  • 2 weeks duration optimal
  • 3-4 options (not 2 — too binary)
  • Add context in the post body explaining why you're asking
  • Follow up with results analysis post

Articles & Newsletters

  • Articles: 1000-2000 words, SEO-indexed by Google
  • Newsletters: subscribers get email + in-app notification
  • Good for long-form thought leadership
  • Lower viral potential but higher authority building
  • Include images every 300-400 words

Video

  • Native video (not YouTube links)
  • Vertical (9:16) or square (1:1) — NOT widescreen
  • Under 2 minutes for feed (30-90s optimal)
  • Captions mandatory (80%+ watch without sound)
  • Hook in first 3 seconds
  • Max file size: 5GB, max duration: 15 minutes

LinkedIn API Integration

Authentication (OAuth 2.0)

// LinkedIn uses OAuth 2.0 with 3-legged flow
const LINKEDIN_AUTH_URL = 'https://www.linkedin.com/oauth/v2/authorization';
const LINKEDIN_TOKEN_URL = 'https://www.linkedin.com/oauth/v2/accessToken';

// Step 1: Redirect user to authorize
const authUrl = new URL(LINKEDIN_AUTH_URL);
authUrl.searchParams.set('response_type', 'code');
authUrl.searchParams.set('client_id', process.env.LINKEDIN_CLIENT_ID);
authUrl.searchParams.set('redirect_uri', process.env.LINKEDIN_REDIRECT_URI);
authUrl.searchParams.set('scope', 'openid profile email w_member_social');
// Redirect user to authUrl.toString()

// Step 2: Exchange code for token
const tokenResponse = await fetch(LINKEDIN_TOKEN_URL, {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'authorization_code',
    code: authorizationCode,
    client_id: process.env.LINKEDIN_CLIENT_ID,
    client_secret: process.env.LINKEDIN_CLIENT_SECRET,
    redirect_uri: process.env.LINKEDIN_REDIRECT_URI,
  }),
});
const { access_token, expires_in } = await tokenResponse.json();
// Token valid for 60 days, refresh before expiry

Post Content via API

// Get user profile URN
const profileRes = await fetch('https://api.linkedin.com/v2/userinfo', {
  headers: { Authorization: `Bearer ${access_token}` },
});
const { sub: personUrn } = await profileRes.json();

// Create a text post
const postRes = await fetch('https://api.linkedin.com/v2/posts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${access_token}`,
    'Content-Type': 'application/json',
    'X-Restli-Protocol-Version': '2.0.0',
    'LinkedIn-Version': '202401',
  },
  body: JSON.stringify({
    author: `urn:li:person:${personUrn}`,
    commentary: 'Your post text here...',
    visibility: 'PUBLIC',
    distribution: {
      feedDistribution: 'MAIN_FEED',
      targetEntities: [],
      thirdPartyDistributionChannels: [],
    },
    lifecycleState: 'PUBLISHED',
  }),
});

// Create a post with image
// Step 1: Initialize upload
const uploadRes = await fetch('https://api.linkedin.com/v2/images?action=initializeUpload', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${access_token}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    initializeUploadRequest: {
      owner: `urn:li:person:${personUrn}`,
    },
  }),
});
const { value: { uploadUrl, image: imageUrn } } = await uploadRes.json();

// Step 2: Upload image binary
await fetch(uploadUrl, {
  method: 'PUT',
  headers: { 'Content-Type': 'image/png' },
  body: imageBuffer,
});

// Step 3: Create post with image
await fetch('https://api.linkedin.com/v2/posts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${access_token}`,
    'Content-Type': 'application/json',
    'LinkedIn-Version': '202401',
  },
  body: JSON.stringify({
    author: `urn:li:person:${personUrn}`,
    commentary: 'Post with image...',
    visibility: 'PUBLIC',
    distribution: {
      feedDistribution: 'MAIN_FEED',
    },
    content: {
      media: {
        id: imageUrn,
        title: 'Image title',
      },
    },
    lifecycleState: 'PUBLISHED',
  }),
});

Company Page Posting

// Post as company page (requires r_organization_admin + w_organization_social)
await fetch('https://api.linkedin.com/v2/posts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${access_token}`,
    'Content-Type': 'application/json',
    'LinkedIn-Version': '202401',
  },
  body: JSON.stringify({
    author: 'urn:li:organization:12345678',
    commentary: 'Company update...',
    visibility: 'PUBLIC',
    distribution: { feedDistribution: 'MAIN_FEED' },
    lifecycleState: 'PUBLISHED',
  }),
});

Analytics

// Get post analytics (requires r_organization_social scope for org posts)
const analyticsRes = await fetch(
  `https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:12345678&timeIntervals.timeGranularityType=DAY&timeIntervals.timeRange.start=1704067200000&timeIntervals.timeRange.end=1706745600000`,
  { headers: { Authorization: `Bearer ${access_token}` } }
);

// Personal post metrics via ugcPosts
const ugcRes = await fetch(
  `https://api.linkedin.com/v2/socialMetadata/${postUrn}`,
  { headers: { Authorization: `Bearer ${access_token}` } }
);

Growth Strategy

Posting schedule: 3-5x/week (Tue-Thu peak engagement, 8-10 AM local time)

Content mix:

  • 40% educational (frameworks, how-tos, lessons learned)
  • 25% stories (personal experiences, behind-the-scenes)
  • 20% opinion/contrarian takes (drives comments)
  • 10% engagement posts (polls, questions)
  • 5% promotional (product, hiring, announcements)

Comment strategy:

  • Reply to every comment on your posts within 2 hours
  • Leave 5-10 thoughtful comments/day on posts in your niche
  • Comments on big accounts get you visibility to their audience
  • Ask follow-up questions in comments to extend threads

Examples

Example 1: Write a LinkedIn post announcing a product launch

User prompt: "Write a LinkedIn post for me. I'm the CTO of Meridian Analytics and we just launched a real-time data pipeline product called StreamFlow that processes 2 million events per second. Target audience is engineering leaders at mid-size SaaS companies."

The agent will draft a LinkedIn text post optimized for the algorithm. The first two lines hook with: "We spent 14 months building something we couldn't find anywhere else.\n\nToday we're launching StreamFlow — a real-time data pipeline that handles 2M events/sec with sub-10ms latency." The body tells the story of the problem (batch processing delays costing customers $40K/month in stale dashboards), the solution, and early results from beta customers. It ends with an open-ended question: "What's the biggest bottleneck in your data pipeline today?" followed by 4 hashtags: #DataEngineering #RealTimeAnalytics #SaaS #ProductLaunch. The link to the product page goes in a separate first comment, not in the post body.

Example 2: Automate posting to a LinkedIn company page via API

User prompt: "Build a TypeScript function that posts a weekly engineering blog summary to our LinkedIn company page (Meridian Analytics, org ID 91847362) every Monday at 9 AM EST."

The agent will create a TypeScript module that authenticates with LinkedIn OAuth 2.0 using LINKEDIN_CLIENT_ID and LINKEDIN_CLIENT_SECRET from environment variables, obtains an access token with w_organization_social scope, then calls POST /v2/posts with author: "urn:li:organization:91847362", the formatted blog summary as commentary, visibility: "PUBLIC", and lifecycleState: "PUBLISHED". The function is wrapped in a cron scheduler using node-cron with the pattern 0 9 * * 1 (Mondays at 9 AM). It includes token refresh logic to handle the 60-day expiry and logs each post's success or failure to a linkedin-posts.log file.

Guidelines

  • Put links in the FIRST COMMENT, never in the post body
  • Write for mobile — 60%+ of LinkedIn users are on phones
  • Don't edit posts in the first hour — it resets distribution
  • Use "I" not "we" for personal posts — LinkedIn is personal-first
  • Tag max 3-5 people per post, only if they'll actually engage
  • Post consistently at the same times — your audience learns when to expect you
  • Repurpose high-performing posts after 3-4 months — new followers haven't seen them
  • Save carousels as PDF at 1080x1350px for optimal mobile display