Skip to main content

LinkedIn integration

Publish and schedule posts, comment and react as a member or company Page, and track Page engagement across your client LinkedIn accounts.

What it does

The LinkedIn integration lets your agency run a client's LinkedIn presence from a workflow: publish text, link and media posts, reshare, comment, react, and — for agencies approved for LinkedIn's Community Management API — watch a company Page for new posts, comments and mentions and pull follower and content analytics.

Before you start: LinkedIn's two access tiers

LinkedIn does not sell one API. It sells a self-serve tier that anyone can turn on in minutes and a partner tier that takes a formal review, and which tier your developer app holds decides which half of this integration works. Read this section before you connect anything — it is the single most common source of "the action returns 403".

TierLinkedIn productScopesHow to get it
Self-serveSign In with LinkedIn using OpenID Connectopenid, profile, emailAdd it from the Products tab of your app. Instant.
Self-serveShare on LinkedInw_member_socialAdd it from the Products tab of your app. Instant.
PartnerCommunity Management APIr_organization_social, w_organization_social, rw_organization_adminWritten application, a verified company Page, and a screencast of your integration. LinkedIn reviews in two stages; expect days to weeks.

The self-serve tier is narrower than the product names suggest. Verified against a live self-serve app on 2026-09-20:

What you want to doSelf-serve appVerified result
Read the connected member's profile✅ workslinkedin/get-userinfo returns name, email, locale, photo
Publish, edit, reshare and delete that member's own posts✅ workstext, article and reshare posts all published and deleted
Comment as that member❌ 403Not enough permissions to access: partnerApiSocialActions
React as that member❌ 403Not enough permissions to access: partnerApiReactions
Read a post back, even one you just published❌ 403Not enough permissions to access: partnerApiPostsExternal
Anything addressing a company Page❌needs the Community Management API

So w_member_social buys you publishing and nothing else. Commenting, reacting and reading are partner-gated alongside the company-Page surface, even when the target is the connected member's own content. Plan on the Community Management API if your workflows do more than post.

Requesting a scope your app has not been approved for does not fail quietly on one action. LinkedIn rejects the whole authorization request with 401 Invalid scope, so the client never reaches the consent screen. Add the Community Management scopes to your OAuth client only once LinkedIn has approved the product.

Connect a LinkedIn account

LinkedIn connections are bring-your-own-client: every agency registers its own LinkedIn developer app, so the consent screen your client sees carries your name and logo, not TaskJuice's. There is no shared platform client to fall back on, so this setup is required once per agency before any client can connect.

One-time agency setup

  1. Create a developer app at LinkedIn Developers and associate it with your company Page.
  2. On the Products tab, add "Sign In with LinkedIn using OpenID Connect" and "Share on LinkedIn". Add "Community Management API" too if you need the Page features — that one goes to review.
  3. On the Auth tab, add https://app.taskjuice.ai/oauth/callback as an authorized redirect URL. LinkedIn matches redirect URLs exactly: no query string, no fragment, and the scheme must be https.
  4. Copy the Client ID and Client Secret.
  5. In TaskJuice, open Settings → Integrations → OAuth clients, add a LinkedIn client, and paste both values. Select the scopes your app has actually been granted — the ones LinkedIn has not approved for you are labelled with the reason.

Connecting a client account

  1. Open the workflow where you need LinkedIn and add a LinkedIn trigger or action node.
  2. In the node's Connection field, choose Add connection.
  3. Sign in as the LinkedIn member who administers the Pages you manage for that client, and approve the consent screen.
  4. The node's dropdowns — Company Page, and any other selector — populate from the account you just connected.

To revoke access, open LinkedIn permitted services and remove the entry.

Choosing who posts

Every publishing and engagement action has an Author (or Comment/react as) field in its configuration panel. It lists the company Pages the connected member administers, so the common case is a dropdown rather than a URN paste.

To act as the member rather than a Page, switch that field to expression mode with the {} toggle and supply a person URN. Get Userinfo returns the member id in sub, so the expression is the literal text urn:li:person: followed by that value — for example urn:li:person:{{$steps.get_userinfo.data.sub}}.

Triggers

All three triggers poll — LinkedIn's webhook surface is described under Known limitations — and all three need the Community Management API, because LinkedIn exposes no readable event stream for a member's own activity.

Each fires once per polling cycle and carries every new item in an items array. Add a Loop node over items to handle them one at a time, or read the array directly for a digest.

  • linkedin/new-organization-share — fires when a new post appears on a watched company Page. Only posts created after the workflow is first published fire, judged by the post's own creation date, so editing a post that existed before then does not fire it. Deduplicates on the post URN, so editing an existing post does not re-fire.
  • linkedin/new-page-comment — fires when someone comments on one of the Page's posts. Carries the comment URN in generatedActivity; follow it with List Comments on a Post to read the text.
  • linkedin/new-page-mention — fires when another member or Page mentions the watched Page in a post.

Posts and events that already exist when you publish the workflow form the baseline and are not replayed.

Actions

Publishing

  • linkedin/create-ugc-post — publishes a text-only post.
  • linkedin/create-article-post — publishes a post that shares a link. LinkedIn deliberately does not scrape the URL, so the title, description and thumbnail you supply are exactly what renders.
  • linkedin/create-media-post — publishes a post carrying one image, video or document, referenced by its asset URN. Get an image or document URN with Initialize Image Upload (or Initialize Document Upload) and then Upload Media.
  • linkedin/initialize-image-upload — reserves an upload slot for one image and returns its uploadUrl and image URN.
  • linkedin/initialize-document-upload — reserves an upload slot for one document (PDF, PowerPoint or Word) and returns its uploadUrl and document URN.
  • linkedin/upload-media — sends an image or document to the uploadUrl an Initialize step returned. The file is the whole request body.
  • linkedin/create-multi-image-post — publishes one post carrying 2 to 20 images.
  • linkedin/reshare-post — reshares an existing post, with or without your own commentary.
  • linkedin/update-post — edits a published post's text, call-to-action label or landing page.
  • linkedin/delete-ugc-post — permanently deletes a post.

Finding the URN of a post you just created. LinkedIn answers every publish with an empty body and returns the new post's URN in a response header instead. The post-creating actions above capture it, so a later step reads it as {{$steps.<node-id>.meta.headers['x-restli-id']}} — not from the step's output data, which is empty by design. Chain it into Get Post, Create Comment, React to a Post or Delete Post.

Reading posts

  • linkedin/get-post — reads a single post by URN. The AUTHOR view context also returns drafts and posts still processing.
  • linkedin/list-posts — lists the posts authored by a Page or member, newest first.

Engagement

  • linkedin/create-comment — comments on a post, or replies in a thread when given a parent comment URN.
  • linkedin/list-comments — lists the comments on a post with each one's likes summary.
  • linkedin/delete-comment — deletes a comment.
  • linkedin/create-reaction — reacts to a post or comment. LinkedIn's UI labels map to LIKE (Like), PRAISE (Celebrate), EMPATHY (Love), INTEREST (Insightful), APPRECIATION (Support) and ENTERTAINMENT (Funny).
  • linkedin/delete-reaction — removes a reaction.

Company Pages and analytics

  • linkedin/get-userinfo — reads the connected member's OpenID Connect profile. Its sub is the member id you need to post as that member.
  • linkedin/list-organization-acls — lists the Pages the connected member has a role on, with that role and its state. This is the call behind every Company Page dropdown.
  • linkedin/get-organization — reads a Page's name, vanity name, website and description.
  • linkedin/get-follower-statistics — lifetime follower breakdown by seniority, function, industry, company size and region.
  • linkedin/get-follower-statistics-by-time — follower gains over a window, bucketed by day or month, split organic and paid.
  • linkedin/get-share-statistics — lifetime impressions, clicks, reactions, comments, shares and engagement rate.
  • linkedin/get-share-statistics-by-time — the same metrics over a window, bucketed by day or month.
  • linkedin/get-social-metadata — total comment and per-type reaction counts for one post, in a single call.
  • linkedin/list-page-notifications — pulls the Page's engagement events from LinkedIn's 60-day notification store. Use it to backfill history the polling triggers did not cover.

Posting an image or a document

An image or document post takes three steps in one workflow run, because the upload URL LinkedIn hands out expires:

  1. Initialize Image Upload (or Initialize Document Upload for a PDF, PowerPoint or Word file). Pick the same author the post will use.
  2. Upload Media. Set Upload URL to the Initialize step's uploadUrl ({{$steps.<init>.data.uploadUrl}}) and File to the file from an earlier step, such as a form upload or a download action.
  3. Create Media Post. Set Media URN to the Initialize step's image (or document) output, {{$steps.<init>.data.image}}. Give a document post a Media title.

To post several images at once, add one Initialize Image Upload and Upload Media pair per image (2 to 20 pairs), then Create Multi-Image Post with Images built from each pair's image:

[
  { "id": "{{$steps.init1.data.image}}", "altText": "Keynote stage" },
  { "id": "{{$steps.init2.data.image}}" }
]

Upload Media only accepts upload URLs on LinkedIn's own upload host, so the connection's token never reaches any other server. Uploads run as workflow steps: the builder's Test button has no file storage, so testing Upload Media there reports that files cannot be sent from a node test.

Known limitations

  • Connections expire every 60 days. LinkedIn access tokens last 60 days, and programmatic refresh tokens are restricted to approved partners. On a self-serve app there is no way to refresh in the background, so each client has to reconnect roughly every two months. If your agency is an approved partner with refresh tokens enabled, this does not apply.
  • No webhooks today. LinkedIn does deliver real-time Page activity, through an eventSubscriptions API paired with Organization Social Action Notifications. TaskJuice does not use it yet for two reasons: the webhook URL must first be registered and validated by hand in the LinkedIn developer portal, and each subscription is keyed by your agency's own developerApplication URN, which TaskJuice does not currently collect. Until both are handled, the three triggers poll. The default 15-minute interval keeps a workflow well inside LinkedIn's daily call quota; the floor is 5 minutes.
  • Video posts are not supported: LinkedIn takes video in 4 MiB byte-ranged parts, and an action sends a whole file. Image and document posts are covered by the recipes above.
  • Commenting, reacting and reading are partner-gated, not just Page work. This is the limitation that surprises people. w_member_social publishes and nothing more. On a self-serve app, commenting returns 403 partnerApiSocialActions, reacting returns 403 partnerApiReactions, and reading a post back — including one you published seconds earlier — returns 403 partnerApiPostsExternal. All three verified live on 2026-09-20. The engagement and reading actions therefore need the Community Management API, exactly like the Page surface, and a workflow that posts then comments on its own post will fail at the second step until you are approved.
  • Posting as a Page needs a page role. The connected member must hold ADMINISTRATOR, DIRECT_SPONSORED_CONTENT_POSTER or CONTENT_ADMIN on that Page. Run linkedin/list-organization-acls to see what the connection can actually reach.
  • Rate limits are per member and per app. Sharing is capped at 150 requests per member per day and 100,000 per application per day, reset at UTC midnight. TaskJuice surfaces a 429 as a retryable rate-limit error.
  • LinkedIn Ads is not part of this integration. Campaign management, conversions, lead sync and matched audiences sit behind the separate Advertising API partner programme and are not covered here.
  • API versions sunset annually. Every call pins the 202608 release. LinkedIn supports each version for at least a year, so this is refreshed as part of normal catalog maintenance.
Was this helpful?