Skip to content
Agency Skills
Browse skillsContributorsContribute a skill
Install every skill
Agency Skills

Skills written by the people who run agencies, consultancies and coaching firms. Free and open source, MIT.

LibraryAll skillsCollectionsContributorsInstall every skillFor AI agents (llms.txt)
ContributeHow to contributeContributor guideGitHubReport a problem
GiaLearn about GiaBook a build session
A community project, published by Gia.PrivacyTerms
Skills/Win the work/LinkedIn watchlist brief
Win the work

LinkedIn watchlist brief

Use this skill when an agency wants to track what specific clients, prospects, partners or companies are posting on LinkedIn without checking each profile by hand. Cleans a list of LinkedIn URLs, learns what kinds of posts matter, runs a test, then sets up a daily scheduled task that pulls the last 24 hours of posts through Bright Data and delivers a short brief with the posts worth engaging with. Also use for "daily LinkedIn digest", "keep an eye on these accounts", "what are my clients posting", "watch these LinkedIn profiles".

Patrick M. FerdigFounder and Principal Consultant, The Power of Partnering
LinkedInthepowerofpartnering.com
Say something like
“daily LinkedIn digest”“keep an eye on these accounts”“what are my clients posting”“watch these LinkedIn profiles”
linkedinbrightdatacomposiogoogle-sheetslinkedinsignalssocial-listeningaccount-monitoringscheduled-brief
SKILL.mdView on GitHub

LinkedIn watchlist brief

This skill does setup. It collects the watchlist, learns what the user cares about, tests one run, then creates a scheduled task. The scheduled task does the daily work in a fresh session with no memory of this conversation, so its prompt has to carry everything it needs. The deliverable is a chat message in that session, not an email or a file.

For an agency, the watchlist is usually the people whose news should change the next conversation: client champions, open prospects, referral partners and the companies behind them.

Requirements

Bright Data connected through Composio. Confirm the connection before anything else. If it isn't connected or has no active Bright Data account, tell the user what to connect and stop. Never ask for an API token in chat or put one in a prompt, because scheduled task prompts are stored in plain text.

The exact actions, fields and the quirks found in live test runs (async waits, engaged-with posts leaking into profile results, one-off dead_page failures) are in references/bright-data-setup.md. Read it before the test run.

Step 1. Collect and clean the watchlist

Accept URLs pasted in chat, an attached CSV (a LinkedIn connections export or Sales Navigator export), or a Google Sheet link. Normalize each:

  • Person: https://www.linkedin.com/in/<slug>/
  • Company: https://www.linkedin.com/company/<slug>/
  • Strip query strings, fragments, /recent-activity/..., /posts/..., and locale subpaths.
  • Sales Navigator URLs (/sales/lead/, /sales/company/) can't be scraped. List them back and ask for the public profile URL.
  • Drop duplicates. Reject post, search, and feed URLs.

Report counts (people, companies) and any rejects. Don't print the full list back unless asked.

Where the list lives. Up to about 75 URLs: embed it in the scheduled task prompt. Larger, or if the user wants to edit it without rerunning setup: a Google Sheet with columns url, name, type, notes, read on each run.

Step 2. Confirm settings (one round of questions)

  • Schedule: weekdays or every day, and a time in the user's time zone (default 6:45am).
  • Cost cap: posts per account per run (default 5). Bright Data bills per record.
  • Focus: what makes a post worth engaging with for them (for example, partnerships, hiring signals, product launches, funding). This drives the top-of-brief picks. Use their words in the task prompt.

Step 3. Test run

Run the daily procedure in references/scheduled-task-prompt.md once, now, on up to 5 accounts. Post the brief in chat. If nothing posted in 24 hours, rerun with a 7-day window so the user can see the format, and label it as a test. Adjust format if asked, then create the task.

Step 4. Create the scheduled task

Create the scheduled task with your scheduling tool:

  • name: "LinkedIn watchlist brief"
  • cron_expression: CRON_TZ=<user's IANA zone> <min> <hour> * * <1-5 or *>
  • initiation: human_request
  • notifications: {push: true}
  • prompt: the template in references/scheduled-task-prompt.md with values filled in

Confirm in one line: schedule, account count, and the approval setting the result reports.

To change it later (new URLs, time, focus): find the existing "LinkedIn watchlist brief" task, rebuild the prompt and update it. Don't create a second task.

What good looks like

  • The brief only shows posts the account actually wrote inside the window. Engaged-with posts are filtered out by only_authored_posts and a user ID match, because one test returned two of them out of three results.
  • "Worth engaging" uses the user's own words for what matters, and is skipped when nothing qualifies rather than padded.
  • A failed URL is retried once before it is reported, and an empty result reads as "nothing returned," never "didn't post."
  • Red flag: a cost surprise. If the test run suggests a high daily cost, say so before the task exists, and keep the per-account cap modest.

Rules

  • Read-only on LinkedIn. Never comment, react, connect, or message anyone.
  • Empty results mean "nothing returned," not "didn't post."
  • Keep the account cap modest. If a test run suggests the daily cost will be high, say so before creating the task.
2 reference files
references/bright-data-setup.md

Bright Data setup and tested behavior

Connection and actions

Bright Data through the Composio connector (brightdata toolkit). Load COMPOSIO_SEARCH_TOOLS and COMPOSIO_MULTI_EXECUTE_TOOL with ToolSearch, then run a search for "scrape LinkedIn posts using brightdata" to confirm the connection is active. Actions used:

  • BRIGHTDATA_SCRAPE_LINKEDIN_POSTS (fixed dataset gd_lyy3tktm25m4avu764)
    • People: mode: discover_by_profile_url, item fields url, start_date, end_date, only_authored_posts
    • Companies: mode: discover_by_company_url, item fields url, start_date, end_date
  • BRIGHTDATA_GET_SNAPSHOT_STATUS, BRIGHTDATA_GET_SNAPSHOT_RESULTS

If Composio isn't connected or has no active Bright Data account, tell the user what to connect and stop. Never ask for an API token in chat or put one in a prompt, because scheduled task prompts are stored in plain text.

Tested behavior

These came out of live test runs. They explain the shape of the procedure below.

  • Runs take 1 to 2 minutes per batch. Use asynchronous mode and wait with a background sleep 60 between status checks; synchronous calls tend to time out.
  • Profile discovery without only_authored_posts also returns other people's posts the person engaged with (2 of 3 results in one test). Set it to true, and also drop any record whose user_id doesn't match the profile slug.
  • A profile can fail with dead_page on one run and succeed on the next. Retry failed URLs once before reporting them.
  • Full records include about 10 comments each. Pass custom_output_fields so the payload stays small.
  • An empty result for a company usually just means it didn't post in the window. That's a normal outcome, not a failure.
references/scheduled-task-prompt.md

Scheduled task prompt template

Fill in the braces and pass this as the scheduled task prompt. It runs in a fresh session with no memory of setup, so it carries everything.

Produce my LinkedIn watchlist brief for the 24 hours ending now. Output it as a chat message in this session. Do not email it or create a file.

Tools: Composio (load COMPOSIO_SEARCH_TOOLS and COMPOSIO_MULTI_EXECUTE_TOOL via ToolSearch). Bright Data actions: BRIGHTDATA_SCRAPE_LINKEDIN_POSTS, BRIGHTDATA_GET_SNAPSHOT_STATUS, BRIGHTDATA_GET_SNAPSHOT_RESULTS.

Watchlist: {EMBEDDED LIST or "read Google Sheet {SHEET_ID}, tab {TAB}, columns url/name/type"}

What I care about: {FOCUS}

Procedure:
1. Use the current UTC time from the Composio response. Window = now minus 24 hours to now, ISO 8601 with Z.
2. Trigger two asynchronous BRIGHTDATA_SCRAPE_LINKEDIN_POSTS runs in one multi-execute call, both with limit_per_input {CAP}, include_errors true, format json, execution_mode asynchronous, custom_output_fields "url|user_id|user_name|account_type|date_posted|post_type|post_text|headline|num_likes|num_comments|discovery_input":
   - mode discover_by_profile_url, one item per person: url, start_date, end_date, only_authored_posts true
   - mode discover_by_company_url, one item per company: url, start_date, end_date
3. Wait with a background `sleep 60`, then check BRIGHTDATA_GET_SNAPSHOT_STATUS for both. Repeat until ready or failed (max 20 minutes). Fetch with BRIGHTDATA_GET_SNAPSHOT_RESULTS.
4. Retry any URL that errored (for example dead_page) once in a second batch.
5. Keep only records dated inside the window whose user_id matches the input slug.

Brief format (Markdown, plain direct tone, no em dashes, no exclamation points):
- Title: "LinkedIn brief, {date}: {N} posts from {M} accounts"
- Worth engaging (top 3 max): who, one line on why it matters given what I care about, link. Skip if nothing qualifies.
- People: one block per person who posted. Per post: 1 to 2 sentence summary in your own words, link, likes and comments.
- Companies: same structure.
- Footer: count of quiet accounts, then any URLs that still failed after retry, with the reason.
- If nobody posted, one line saying so.

Summarize rather than quote. Never invent fields that weren't returned. Read-only on LinkedIn. Send the brief with SendUserMessage, then stop.

Install this skill

Pick the app you use. We remember it for next time.

  1. Download the skill as a ZIP.
  2. In Claude, open Customize, then Skills, then Your skills.
  3. Choose Upload skill and pick the ZIP. Leave it switched on.
Download ZIPOpen Claude skills

Then ask: “daily LinkedIn digest”

Want the whole library, kept up to date? .

Run it on your own playbookBook 30 minutes. We build it onto a Company Brain live.
Win the workcollection
Salescategory
MITlicense

Install this skill

Pick the app you use. We remember it for next time.

  1. Download the skill as a ZIP.
  2. In Claude, open Customize, then Skills, then Your skills.
  3. Choose Upload skill and pick the ZIP. Leave it switched on.
Download ZIPOpen Claude skills

Then ask: “daily LinkedIn digest”

Want the whole library, kept up to date? .

A Company Brain

Want this sounding like you?

Out of the box it runs on general knowledge. On a Company Brain it runs on your framework, your pricing and the proposals you’ve already won with, so the output comes back in your voice.

Book 30 minutes

More in Win the work

Win the work

Activity incentive sprint

When a sales team's pattern needs interrupting for a few days: Call 1 bookings have dried up, presentations have stalled, a dormant list needs clearing, or the quarter needs a jolt. Produces an Executive Sprint Brief for a 1-day blitz, 3-day push or 2-week sprint, with targets worked from the team's real baseline, qualifying criteria, a scoreboard, a reward and three daily huddle prompts. Also use for "sales blitz", "sprint incentive", "spiff", "activity competition", "get the team booking meetings this week".

Tony Dowling · CONVRG
Win the work

Buyer read

When a finished page, deck, or piece of client copy is about to go to the client or be published, and a real ICP or buyer research document exists. Produces a ranked list of what would make the target buyer stop trusting it, read in character, with every finding citing a line in a real source, plus what to cut and a score. Catches what craft reviews miss: scenarios that can't happen in the buyer's week, an offer never plainly stated, missing price, unused proof, seller vocabulary. Also use for "/buyer-read", "review this as the buyer", "have the ICP look at this", "what would a CFO think of this page", "be hypercritical about this copy". Not for grammar or voice checks, and never for rewriting.

Chris DuBois · Dynamic Agency OS
Win the work

Client proposal

When a proposal is due and it is about to be the last one with the name changed. Produces a proposal built from what the prospect actually said: their situation in their own words, the firm's named approach, scope with explicit exclusions, the objection they already raised answered directly, pricing options, and the proof the firm can stand behind. Also use for "I need a proposal out tonight", "respond to this RFP", "write the SOW", "pitch document".

Tapajyoti (Tukan) Das · Gia