Skip to main content

LinkedIn: honour audienceInclude / audienceExclude on campaign create and boost

What we're asking for: accept targeting.audienceInclude (and audienceExclude) on POST /v1/ads/create and POST /v1/ads/boost for LinkedIn, and actually pass it through to LinkedIn.

Why this matters to us: our customers are Dutch SMBs who hand us a list of target companies. We upload that list, enrich it, and create a LinkedIn company-list audience through your audiences endpoints - that whole path works well. But the last step, running a campaign against that audience, doesn't exist on any path today. The audience
sits there, correctly built, and can only be used by leaving our product and opening Campaign Manager.

What happens today: measured on 2026-08-28, create returned 201 with the field silently dropped from the echoed targeting; boost and reach-estimate behaved the same (an invalid segment id didn't change the estimate either). Since your 2026-08-29 deploy it's a clean 400 naming the field, which is a much better failure mode - but the
capability is still missing.

What "done" looks like for us:
- audienceInclude / audienceExclude accepted on create and boost for LinkedIn
- the audience echoed back in the ad's targeting on GET, so we can verify it landed rather than trusting a 201
- the same fields reflected in supply-forecast, bid-pricing and rf-predictions, so a pre-spend sanity check on a company-list audience means something

This was raised in support chat on 2026-08-28; posting it here since you pointed to Featurebase for this one.
Status: Completed2 comments

Log in to comment and vote

Comments2

  • Miquel Palet López

    Team•

    Sep 1

    This is now live. targeting.audienceInclude and audienceExclude are accepted on POST /v1/ads/create and POST /v1/ads/boost for LinkedIn and passed through to the campaign. The audience is echoed back in the ad's targeting on GET, and the same fields are honoured on reach-estimate, supply-forecast and bid-pricing, so you can sanity-check a company-list audience before spending.

    • JW Stukart

      •

      Sep 1

      Thanks for shipping this. The forecasting side genuinely works now — I can confirm it end to end. Reach-estimate for the Netherlands returns 16,000,000 with no audience, 0 with one of our company-list segments in targeting.audienceInclude, and
      16,000,000 again with that same segment in audienceExclude. That's exactly the behaviour we were asking for, and it means a pre-spend sanity check on a company list is now meaningful.
                                                                                                                                                                                                                                             
      Campaign create is still failing, though. Tested on 2026-09-01, all with status: "PAUSED" on a LinkedIn ad account:
      
      - targeting.audienceInclude: ["<segment id>"] → 502 from your API, wrapping LinkedIn Ads API error (500): Internal Server Error
      - the same segment in URN form (urn:li:adSegment:<id>) → identical 500
      - targeting.audienceExclude: ["<segment id>"] → 400 Cannot fetch information for the segment. TscpSasbeCampaignConditionalValidator.prefetchSegments should failed before this operation.
      
      My first assumption was that our own segments were at fault: they're test lists well under LinkedIn's 300-member minimum, so I expected them to be untargetable. But a deliberately non-existent segment id (999999999) returns the same 500 — so the
      failure isn't segment-specific. A missing segment ought to surface as a validation error rather than an internal one, which suggests the value isn't reaching LinkedIn in the shape its campaign validator expects on the create path, even though the
      forecasting endpoints clearly handle it correctly now.
      
      Two related observations while you're in that area:
      
      1. Our only realistic segment (319 companies, created on 2026-08-28 through the audiences + companies endpoints) still reports status: "processing" four days later. If that isn't expected, the company-list path is blocked regardless of whether
         targeting works — a segment that never becomes usable can't be advertised against.
      2. GET /v1/ads/audiences/{audienceId} rejects a platform segment id with Invalid audienceId format, while the entries returned by GET /v1/ads/audiences have id: null and only a platformAudienceId. As far as I can tell there's no way to fetch details
         for those segments — which also makes it hard to check whether one has finished processing.
      
      Happy to share account ids, segment ids, idempotency keys and exact timestamps privately if that speeds up the repro.