LinkedIn Company Pages model

Follower demographics

Who follows each LinkedIn Page: the follower breakdowns from the Followers section of Page analytics (seniority, job function, industry, country, location, company size, employees), in one long table.

Grain
organization_id x facet x segment_id
Built from
  1. 8
    Raw tables
  2. 8
    Staging
  3. 1
    Core
  4. 1
    Analytics
Reads from LinkedIn Company Pages
follower_statistics_by_association_typefollower_statistics_by_functionfollower_statistics_by_geofollower_statistics_by_geo_countryfollower_statistics_by_industryfollower_statistics_by_seniorityfollower_statistics_by_staff_count_rangetotal_follower_count
Ships as
Weld and dbt SQL, open source on GitHub
core.linkedin_pages.follower_demographics
1-- core.linkedin_pages.follower_demographics
2-- Who follows each LinkedIn Page: the follower breakdowns from the Followers
3-- section of Page analytics (seniority, job function, industry, country,
4-- location, company size, employees), in one long table.
5--
6-- Grain: organization_id x facet x segment_id. A snapshot as of the last sync.
7-- Depends on: staging.linkedin_pages.followers_by_*, .total_follower_count
8--
9-- LinkedIn returns at most the top 100 segments per facet and leaves members who
10-- did not fill in a field out of that facet, so a facet's segments rarely add up
11-- to the Page's follower total. share_of_facet divides by the facet's own sum;
12-- share_of_followers divides by the Page's total, so the gap shows what is not
13-- covered. The tables are replaced on every sync, so there is no history: to
14-- track demographics over time, snapshot this model on a schedule.
15
16WITH segments AS (
17    SELECT * FROM {{staging.linkedin_pages.followers_by_seniority}}
18    UNION ALL
19    SELECT * FROM {{staging.linkedin_pages.followers_by_function}}
20    UNION ALL
21    SELECT * FROM {{staging.linkedin_pages.followers_by_industry}}
22    UNION ALL
23    SELECT * FROM {{staging.linkedin_pages.followers_by_country}}
24    UNION ALL
25    SELECT * FROM {{staging.linkedin_pages.followers_by_location}}
26    UNION ALL
27    SELECT * FROM {{staging.linkedin_pages.followers_by_company_size}}
28    UNION ALL
29    SELECT * FROM {{staging.linkedin_pages.followers_by_association_type}}
30)
31
32SELECT
33    s.organization_id,
34    t.organization_name,
35    s.facet,
36    s.segment_id,
37    s.segment_name,
38    s.followers,
39    SAFE_DIVIDE(s.followers, SUM(s.followers) OVER (PARTITION BY s.organization_id, s.facet)) AS share_of_facet,
40    SAFE_DIVIDE(s.followers, t.follower_count)                                                AS share_of_followers,

This model and the 9 it depends on. Deploy them together; refs like {{staging.…}} resolve to the matching folders in Weld, and the dbt view uses source() and ref().

Notes

How it counts. And where it stops.

LinkedIn returns at most the top 100 segments per facet and leaves members who did not fill in a field out of that facet, so a facet's segments rarely add up to the Page's follower total. share_of_facet divides by the facet's own sum; share_of_followers divides by the Page's total, so the gap shows what is not covered. The tables are replaced on every sync, so there is no history: to track demographics over time, snapshot this model on a schedule.

Raw tables it reads

  • raw.linkedin_pages.follower_statistics_by_association_type
  • raw.linkedin_pages.follower_statistics_by_function
  • raw.linkedin_pages.follower_statistics_by_geo
  • raw.linkedin_pages.follower_statistics_by_geo_country
  • raw.linkedin_pages.follower_statistics_by_industry
  • raw.linkedin_pages.follower_statistics_by_seniority
  • raw.linkedin_pages.follower_statistics_by_staff_count_range
  • raw.linkedin_pages.total_follower_count

More LinkedIn Company Pages models

Put LinkedIn Company Pages in front
of your agents.

Connect LinkedIn Company Pages, deploy the models, and ask questions in Claude, Cursor or ChatGPT. Free for 14 days, no credit card.