references/ads-and-funnel.md
# Ads And Funnel
Use for public Facebook ad-library evidence: active ad examples, paid creative
patterns, competitor offers, CTA patterns, landing-page clues, and funnel review.
## Align
Likely user needs:
- "What ads are competitors running?"
- "What offers and CTAs show up?"
- "What landing pages do ads point to?"
- "What paid angles should we test?"
Ask only if no paid seed exists:
`Which brand, page, keyword, or ad-library link should anchor the first pass?`
If the user asks for exact spend, targeting, ROAS, clicks, or conversions, say
this route only supports public ad and funnel evidence.
## Run
| Evidence need | Route | First pass |
| --- | --- | --- |
| Ads by keyword or advertiser | `facebook-ads-library` | 1 keyword or advertiser page, up to `10` ads |
Keep ads, landing pages, organic posts, and supplied exports as separate
evidence lanes. Organic posts add context but never prove paid delivery.
### Seed discovery before collection
When the user supplies an exact brand, advertiser page, domain, or ad-library
URL, use that entity directly. When the user supplies only a category, problem,
or product type, do not assume one literal category query is enough:
1. Use a small current public-web discovery pass to identify `3-8` concrete
products or brands in scope. Prefer official product sites and first-party
App Store or Google Play listings when they exist.
2. Record each candidate's product name, brand, official domain, known page name
or URL, aliases, market, and offer wording. This is entity discovery, not
Facebook ad evidence.
3. Build separate attributable lanes:
- up to two category/problem phrases for recall;
- one query per verified product or brand;
- advertiser page or ad-library URLs when verified; and
- offer or landing-domain wording only when the first records justify it.
4. Start with the smallest lanes most likely to answer the decision. Do not run
every discovered entity automatically or silently multiply credit use.
## Read Fields
Use the ad-level fields present in the result: ad id and library link, advertiser
page name, active status, run dates, creative text, media, publisher surface,
disclosed country coverage, and landing URL. Treat any disclosed spend or reach
band as a public transparency field only. Do not invent fields the result does
not contain.
## Analyze
Extract:
- repeated offers, hooks, and CTAs
- creative angle and format
- landing-page clue when present
- advertiser and active status
- audience or geography clue from disclosed fields
Rank examples only inside the collected sample. Do not infer causality.
Classify every candidate as `direct`, `relevant`, `adjacent`, `irrelevant`, or
`uncertain` using advertiser identity, creative text, offer, destination domain,
market, and active status. Main findings require direct or relevant ads;
adjacent records may only guide recovery.
If a supported pass is empty or low-quality, apply the shared research-quality
recovery loop. Change one axis at a time: category phrase -> verified entity,
brand -> advertiser page, alias -> official product name, or broad market -> one
specified country/status scope. Inspect landing destinations when present. Stop
after at most two changed passes or when the approved PostPlus credit bound is reached, and
report the attempted lanes when useful evidence remains unavailable.
## Output
Create `result.json` and `evidence.html`. Group ads by advertiser, offer, CTA,
surface, and landing URL.
Chat format:
- paid seed and country/status filter
- ad count and advertisers
- repeated angles, offers, and CTAs
- landing clues when present
- unsupported metrics
- artifact paths
## Stop
Stop for ad account access, exact targeting, ROAS, billing, conversion, private
audiences, or requests to bypass platform controls.
references/community-voice.md
# Community Voice
Use for public comments, objections, FAQs, buyer language, group discussion, and
qualitative audience voice.
## Align
Likely user needs:
- "What are people complaining about?"
- "What words do customers use?"
- "What objections should our copy answer?"
- "What questions keep showing up?"
Ask only when there is no discussion source:
`Send 1-10 public post or reel URLs, or 1-3 public group URLs, or a comment export.`
## Run
| Evidence need | Route | First pass |
| --- | --- | --- |
| Comments on public posts/reels | `facebook-comments` | `1-10` post/reel URLs, small comment bound |
| Public group discussion | `facebook-groups` | `1-3` group URLs, small post bound |
Run comments for multiple post URLs in parallel. Keep comment evidence and group
discussion as separate lanes.
## Read Fields
Use the fields present in the result: comment or post text, source URL, date,
public engagement counts, author display name, thread depth, and the parent
post or group name. Comment counts without comment text are not voice evidence.
Do not invent fields the result does not contain.
## Analyze
Group evidence into:
- repeated objections
- questions and FAQs
- desired outcomes
- pain language
- praise language
- content or offer ideas
- weak or noisy threads
## Output
Create `result.json` and `evidence.html`.
Chat format:
- sources and comment/discussion count
- 5-10 voice bullets with evidence links
- copy and product implications
- weak areas
- artifact paths
## Stop
Stop for private comments, hidden groups, member lists, direct messages,
demographics, full sentiment claims, or login automation.
references/events-and-local.md
# Events And Local
Use for public Facebook events, local and community activations, offline growth
signals, workshops, meetups, launches, and competitor event monitoring.
## Align
Likely user needs:
- "Are there relevant local or community events?"
- "What event formats work in this niche?"
- "Who organizes these events?"
- "Is there offline demand we can partner with?"
Ask only if no event seed exists:
`What event topic, location, page, group, or event URL should I search first?`
## Run
| Evidence need | Route | First pass |
| --- | --- | --- |
| Events by topic/location or event URL | `facebook-events` | 1 topic+location query or event URL, up to `10` events |
Run events in parallel with a group or marketplace pass only when the user is
running a local growth scan. Keep each lane separate.
## Read Fields
Use the fields present in the result: event URL, name, description, date and
time, location and address, organizer, public response counts (interested,
going, responded), online/offline flag, status (past or canceled), ticket
info, and external links. Do not invent fields the result does not contain.
## Analyze
Extract:
- event theme and audience
- organizer leads
- timing and location pattern
- demand clue from public response counts
- partnership or sponsorship angle
- low-signal or stale events
## Output
Create `result.json` and `evidence.html`. Include event cards with date,
organizer, location, public response counts, links, and status.
Chat format:
- query or location and event count
- strongest local patterns
- organizer or partner leads
- gaps
- artifact paths
## Stop
Stop for private attendee lists, hidden guest data, organizer backend data,
ticketing account access, exact attendance, or private contact extraction.
references/organic-benchmark.md
# Organic Benchmark
Use for competitor organic examples, hooks, formats, topics, offers, and
public post patterns.
## Align
Likely user needs:
- "What content patterns are competitors using?"
- "Which hooks or offers show up repeatedly?"
- "What should we post next?"
- "Which examples are worth saving?"
Ask only if the benchmark set is unclear:
`Which 2-5 public pages, groups, or posts should define the benchmark?`
If the user asks for paid ad examples, route the paid lane to `ads-and-funnel.md`
(`facebook-ads-library`); if they ask for reels or video benchmarks, route to
`reels-and-video.md`. Keep organic and paid evidence in separate lanes.
## Run
| Source | Route | Input |
| --- | --- | --- |
| Competitor page/profile posts | `facebook-profile-posts` | `1-5` page/profile URLs, up to `10` posts each |
| Public group posts | `facebook-group-posts` | `1-3` public group URLs, up to `10` posts each |
| Specific posts | `facebook-post-by-url` | `1-10` post URLs |
Run independent competitors in parallel. Keep page/profile, group, and
direct-post lanes separate in the JSON and HTML.
## Analyze
Extract:
- hook/opening line
- topic/category
- format: image, video, link, text, offer
- CTA or ask
- visible engagement fields
- repeated angle or promise
- source URL
Do not infer causality. Rank examples only inside the collected sample.
## Output
Create `result.json` and `evidence.html`.
Chat format:
- benchmark set and sample size
- top patterns
- strongest examples with source links
- content opportunities
- gaps and caveats
- artifact paths
## Stop
Stop for backend performance, exact reach, conversion, paid delivery, hidden
targeting, share of voice, or full competitor history.
references/page-and-group-audit.md
# Page And Group Audit
Use when the user wants to decide what to fix, copy, monitor, or ignore on a
Facebook page, competitor page, profile, or public group.
## Align
Likely user needs:
- "Is this page alive and useful?"
- "What is the competitor doing better?"
- "Does this group show real demand or just noise?"
- "What should we change next?"
Ask only if the source is missing:
`Which 1-5 public pages or 1-3 public groups should I audit first?`
## Run
| Target | Route | Input |
| --- | --- | --- |
| Page/profile | `facebook-profile-posts` | `1-5` page/profile URLs, `5-10` posts each |
| Public group | `facebook-group-posts` | `1-3` group URLs, `5-10` posts each |
Run independent pages and groups in parallel.
This route audits from the recent-post scrape sample. For page identity,
category, and activity beyond the post sample, add the `facebook-pages` route in
`partner-discovery.md`; for deeper group discussion, add the `facebook-groups`
route in `community-voice.md`. Keep each added lane separate in the evidence.
## Judge
Score only from public post evidence:
- activity: recent dates, posting cadence in the sample
- clarity: repeated post topics and stated offers
- engagement: likes/comments/shares inside the sample
- creative: media, video posts, links, offers, calls to action
- group quality: discussion text, spam/noise ratio
- gaps: empty, stale, private, off-topic, or low-signal evidence
## Output
Create `result.json` and `evidence.html`.
Chat format:
- audit target and sources
- what looks healthy
- what looks weak
- 3 concrete next actions
- unsupported claims
- artifact paths
## Stop
Stop for Page Insights, admin-only group analytics, hidden members, follower
exports, demographics, reach, or conversion.
references/partner-discovery.md
# Partner Discovery
Use for partner, creator, affiliate, community, local-business, or organizer
shortlist work: broad public discovery plus page verification and enrichment.
## Align
Likely user needs:
- "Who should we partner with?"
- "Which pages or communities are relevant?"
- "Which organizers or local businesses fit this campaign?"
- "Can you turn this shortlist into prioritized leads?"
Ask only if there are no usable seeds:
`Give a niche or keyword to search, or 3-10 public pages, groups, or competitors to verify.`
## Run
Discover, then verify:
| Step | Route | First pass |
| --- | --- | --- |
| Broad public discovery from a query | `facebook-search` | 1 query, small result bound |
| Page identity, category, activity, content fit | `facebook-pages` | `1-5` page URLs |
Run discovery first, then verify the returned page URLs. Verify independent
leads in parallel. Do not scrape members or private contacts.
## Read Fields
Use the fields present in the result: search result title and URL, page name,
category, description, activity signal, and any visible website, contact, or CTA
field. Do not invent fields the result does not contain.
## Score
Score from public evidence:
- topical fit
- audience and context fit
- recent activity
- collaboration relevance
- visible website, contact, or CTA when present
- disqualifiers: stale, private, spammy, off-topic, or no source
## Output
Create `result.json` and `evidence.html`. Show a ranked shortlist with source
rows, score reasons, disqualifiers, visible contact/CTA status, and next step.
Chat format:
- criteria and seed count
- top leads and why each fits
- disqualifiers and gaps
- artifact paths
- next outreach action
## Stop
Stop for member scraping, hidden contact extraction, private profiles, login
automation, exact audience targeting, or guaranteed contact availability.
references/public-content.md
# Public Content
Use for source-grounded pulls from public Facebook pages, profiles, groups, or
posts.
## Align
Likely user needs:
- "Show me what this page/group is posting."
- "Summarize this post with evidence."
- "Pull public Facebook examples for this competitor."
- "Give me data I can inspect, not only a chat summary."
Ask only if there is no public source:
`Send a public Facebook page, group, or post URL to start.`
## Run
| Source | Route | Input |
| --- | --- | --- |
| Page/profile posts | `facebook-profile-posts` | `1-5` page/profile URLs, `1-10` posts each |
| Group posts | `facebook-group-posts` | `1-3` public group URLs, `1-10` posts each |
| Direct post | `facebook-post-by-url` | `1-10` post URLs |
If the user gives multiple independent URLs, run them in parallel by source
type. Keep page/profile, group, and direct-post lanes as separate evidence
lanes.
This reference is the scrape lane. If the decision needs reels, comments,
richer page identity, or ad-library creative, route to `reels-and-video.md`,
`community-voice.md`, `partner-discovery.md`, or `ads-and-funnel.md` instead of
stretching a scrape pull.
## Read Fields
Use the post-level fields present in the result: source URL, text, date or
timestamp, public engagement counts (likes, comments, shares), media fields,
and page or group name. Do not invent fields the result does not contain.
## Output
Create `result.json` and `evidence.html`.
In chat, return source count, item count, strongest visible pattern, biggest
gap, and artifact paths.
## Stop
Stop for private profiles, hidden groups, login-only pages, member lists,
backend analytics, full archives, or requests for complete audience truth.
references/reels-and-video.md
# Reels And Video
Use for Facebook reels, short-form video examples, play-count clues, video
creative patterns, and media-led organic benchmarking.
## Align
Likely user needs:
- "What reels are competitors posting?"
- "Which video hooks or formats appear?"
- "What can we adapt for short-form creative?"
- "Is this page using video seriously?"
Ask only if no page, profile, or reel URL exists:
`Which public Facebook page, profile, or reel should I inspect first?`
## Run
| Evidence need | Route | First pass |
| --- | --- | --- |
| Reels from a page/profile | `facebook-reels` | `1-5` page/profile URLs, small reel bound |
| Page/profile posts for a mixed benchmark | `facebook-posts` | `1-5` page/profile URLs, up to `10` posts each |
For a mixed video and post benchmark, run reels and posts in parallel and keep
them in separate lanes.
## Read Fields
Use the fields present in the result: source and shareable URL, text or caption,
date, public play-count clue, media and playback fields, owner or page name, and
any sound or track field. Do not treat play count as reach or conversion. Do not
invent fields the result does not contain.
## Analyze
Extract:
- opening text or visual promise
- repeated format
- owner or page
- public play-count clue when present
- media availability and sound clue
- source URL
## Output
Create `result.json` and `evidence.html`. Show video cards with media fields when
available, source URL, text, play clue, owner, and date.
Chat format:
- page/profile and reel or post count
- strongest video patterns
- examples worth saving
- missing media or low-signal gaps
- artifact paths
## Stop
Stop for private video, login-only content, rights-violating downloads, backend
video analytics, retention, exact reach, or conversion.
references/shared-contract.md
# Facebook Shared Contract
Read this before every route. Keep research public, bounded, attributable, and
useful to the user's decision. PostPlus owns execution, credit guards, and
polling.
## Routes
| Evidence need | Route | Semantic input | First pass |
| --- | --- | --- | --- |
| Public page/profile posts | `facebook-profile-posts` | `--url`, `--limit` | 1-5 URLs, 20 posts |
| Direct post evidence | `facebook-post-by-url` | `--url` | 1-10 URLs |
| Public group posts | `facebook-group-posts` | `--url`, `--limit` | 1-3 groups, 20 posts |
| Ad-library creative | `facebook-ads-library` | `--query`, `--country`, `--status`, `--limit` | 20 ads |
| Post/reel comments | `facebook-comments` | `--url`, `--limit` | 1-5 URLs, 20 comments |
| Public group discussion | `facebook-groups` | `--url`, optional `--query`, `--limit` | 20 posts |
| Events/local activity | `facebook-events` | `--query` or `--url`, `--limit` | 10 events |
| Marketplace listings | `facebook-marketplace` | `--url`, `--limit` | 10 listings |
| Page identity | `facebook-pages` | `--url` | 1-5 pages |
| Rich page/profile posts | `facebook-posts` | `--url`, `--limit` | 20 posts |
| Reels | `facebook-reels` | `--url`, `--limit` | 20 reels |
| Broad public search | `facebook-search` | `--category`, `--location`, `--limit` | 20 results |
Run:
```bash
postplus research run <route> --<semantic flags> --wait --output result.json
```
Use `postplus research run <route> --help` only when the flags are unclear.
Private profiles, hidden groups, member lists, Page Insights, account metrics,
targeting, spend, and ROAS are outside this public surface. Say so and stop.
## Human Alignment
Infer whether the user wants diagnosis, comparison, discovery, extraction,
planning, or verification. Ask one question only when it changes the route,
privacy boundary, sample, or deliverable. Do not ask for implementation details.
## Bounds And Recovery
- Start with one route and the smallest useful sample.
- Keep independent sources separately attributable.
- On hard auth, network, contract, or service errors, stop with the exact error.
- On a successful but sparse/noisy result, apply
`postplus-shared/research-quality-recovery.md` once within the same bound.
- Resume a pending checkpoint with
`postplus research run --resume-from result.json`; never resubmit it.
## Evidence
Keep the complete JSON result. Preserve source URLs and observed dates. Separate
observations from inference, deduplicate repeated records, and never turn a
bounded sample into a platform-wide claim. For item-level work, also produce a
compact HTML artifact with scope, count, strongest examples, gaps, and next
action.
references/shops-and-marketplace.md
# Shops And Marketplace
Use for public Facebook Marketplace listings, local commerce clues, product
pricing, supply and demand signals, and lightweight category research.
## Align
Likely user needs:
- "What products are listed around this category?"
- "What price points show up locally?"
- "Are people selling alternatives?"
- "What local commerce language can inform positioning?"
Ask only if no marketplace seed exists:
`Send a Marketplace search or category URL, or give the product and location to turn into one.`
## Run
| Evidence need | Route | First pass |
| --- | --- | --- |
| Listings by search or category | `facebook-marketplace` | 1 search/category URL, up to `10` listings |
Do not use marketplace listings as a proxy for complete sales volume.
## Read Fields
Use the fields present in the result: listing URL, title, price, location,
listing status (live, sold, pending), delivery or pickup clue, primary photo,
category, and seller display field. Do not invent fields the result does not
contain.
## Analyze
Extract:
- product and category clusters
- visible price bands
- location pattern
- listing status mix
- delivery or pickup clues
- positioning language from listing titles
## Output
Create `result.json` and `evidence.html`. Show listing cards with title, price,
status, location, photo when available, and source link.
Chat format:
- marketplace URL and listing count
- price and category patterns
- local demand clues
- unreliable or unsupported claims
- artifact paths
## Stop
Stop for private seller data, messaging sellers, purchase automation, hidden
inventory, exact sales volume, or off-platform personal data enrichment.
SKILL.md
---
name: facebook-research
description: Run bounded public Facebook research for pages, profiles, groups, posts, reels, comments, ads, events, marketplace listings, and search. Use when public Facebook evidence should support a marketing, creator, community, competitor, or funnel decision.
metadata:
postplus:
familyId: platform-research
familyName: LinkedIn, Facebook, and YouTube
---
# Facebook Research
Use this skill when the user needs public Facebook evidence - page/profile posts,
direct posts, public group posts, reels, comments, ad-library creative, events,
marketplace listings, page profiles, or public search - for a growth, marketing,
creator, community, competitor, or funnel decision.
Apply shared rulebook and user-guidance rules from `postplus-shared`.
When a supported command completes but evidence is empty, sparse, noisy,
off-topic, or the wrong record type, apply the `postplus-shared` reference
`research-quality-recovery.md`; hard execution errors still fail fast.
Apply `references/shared-contract.md` first, then the one narrow reference that
matches the job.
## Two Lanes
Facebook has URL-led routes for public page/profile/group/post content and
specialized routes for reels, comments, ads, events, marketplace, pages, and
search. Pick the route by user intent; PostPlus handles execution details.
## Route
| User intent | Read |
| --- | --- |
| Public page, profile, group, or post content pull | `references/public-content.md` |
| Page health, competitor page, group quality, public presence audit | `references/page-and-group-audit.md` |
| Organic hooks, formats, competitors, post examples, content patterns | `references/organic-benchmark.md` |
| Reels, short-form video, video hooks, media-led benchmark | `references/reels-and-video.md` |
| Comments, audience voice, objections, FAQ, group discussion | `references/community-voice.md` |
| Ad-library creative, paid offers, CTAs, funnel review | `references/ads-and-funnel.md` |
| Events, local activations, organizers, offline demand | `references/events-and-local.md` |
| Marketplace listings, local commerce, price bands | `references/shops-and-marketplace.md` |
| Partner/creator/organizer discovery, broad Facebook search, page verification | `references/partner-discovery.md` |
| Private profiles, hidden groups, member lists, Page Insights, ad account metrics, targeting, spend, ROAS | Stop and ask for a public source or export |
## First Question
Ask only when the answer changes the route, source, privacy boundary, sample
size, or output shape.
| Missing | Ask |
| --- | --- |
| Seed | `What Facebook source should anchor this: page, profile, group, post URL, keyword, or event?` |
| Decision | `What decision should this support: audit, benchmark, voice, ads, events, marketplace, or discovery?` |
| Private target | `Can you provide a public URL or exported dataset instead?` |
| Too broad | `Which 1-5 sources matter most for the first pass?` |
Do not ask the user for internal route identifiers, schemas, implementation
choices, retries, credentials, hidden filters, or internal routing.
## Run Discipline
1. Pick one reference and one lane.
2. Run the smallest real collection that can answer the decision.
3. Parallelize independent sources when they do not depend on each other.
4. If execution succeeds but evidence is empty, sparse, noisy, or off-topic,
apply the shared bounded research-quality recovery rule before accepting or
exhausting the evidence.
5. Produce JSON as the source of truth and a compact HTML evidence artifact when
item-level evidence was collected.
6. Return a short chat answer: scope, counts, strongest finding, biggest gap,
artifact path, and next action.
Result record shapes for every research route are documented in the
`postplus-shared` reference `dataset-item-schemas.md`; consult it before
writing result-processing code, and probe a single record only to verify.
Use only the public filters shown by the selected route.
## Public Command Boundary
- Choose the smallest matching research route and run it directly.
- Readiness diagnostics: `postplus doctor --skill facebook-research`.
- If an owned CLI command fails, report the exact error and stop. Do not bypass
the failure with metadata-only answers, readiness probing, local payload
rewrites, alternate services, or unpublished tools.
- Inspect one route with `postplus research run <route> --help` when its semantic
flags are not already clear.
- Run `postplus research run <route> --<semantic flags> --wait --output
<result.json>`.
- Pass only public URLs, search terms, locations, scope, and result limits.
- Keep the first pass bounded; expand only after inspecting the first result.
Stop on hard errors. Do not silently swap sources or invent missing data.
- If the CLI returns a quote-confirmation challenge, run
`postplus quote confirm --json --challenge-file <challenge.json>` and retry
with the returned token.
<!-- BEGIN GENERATED EXECUTION EXAMPLE -->
```bash
postplus research run facebook-group-posts \
--url "https://example.com/source" \
--wait \
--output ./result.json
```
```bash
postplus research run facebook-ads-library \
--query "example topic" \
--wait \
--output ./result.json
```
<!-- END GENERATED EXECUTION EXAMPLE -->