B2C Social Listening (Contacts)
Audience: Operators running the Contacts (B2C) workflow in Client Growth Hub.
Goal: Find people showing public buying intent on social networks, review person prospects, and optionally publish approved replies.
Related: Research Campaigns, Admin, Settings, and Integrations, Messaging, Outreach, and Automations
What it is
Client Growth Hub can research public social conversations and support approved interactions for the Contacts workflow:
- Listen for buying intent on Reddit (the current social-intent source)
- Create person prospects from matching posts and profiles
- Draft replies for human review, then publish when approved
LinkedIn and Instagram may be connected by an organization admin for human-approved posts on that organization's own accounts. They are not listen sources. Quiet hours and rate limits apply to Approve & publish, not to listen/discovery. Reddit listening stays on the shared platform account.
Operators switch to Contacts with the Businesses / Contacts toggle on Research and Prospects. Both workflows can exist in the same workspace.
Operator flow
- Open Research → select Contacts.
- Create campaign and complete the guided interview.
- Choose discovery mode:
- Social intent — listen for people posting public buying intent
- Account consumers — find businesses, then expand to affiliated people
- Launch the campaign. For social intent, listening continues while the campaign is active — new matching posts become new person prospects and reply drafts over time.
- Review candidates under Prospects (Contacts toggle). Approve / reject / import as usual.
- Optionally open Social → edit drafts → Approve & publish or Reject.
Org admins can tune listen cadence, freshness, and search defaults under Settings → Social listening (interval, max post age, default communities, default listen keywords). Under Settings → Your social accounts they connect Facebook, pick the Facebook Page, then choose the Meta ad account the organization pays for, and connect Instagram and LinkedIn used for approved posts. Live ad spend stays off until it is explicitly enabled. Campaign interview and Edit campaign answers prefill from those defaults; blank campaign fields fall back to workspace defaults at listen time. Pause or complete the campaign to stop listening.
Listening cadence. When a Contacts campaign is first activated it becomes a scheduled listener at the workspace interval. If you switch the campaign to manual cadence, it stays manual: later launches run one listen and do not turn scheduling back on. A manual launch of a scheduled campaign counts as that interval's listen, so the next scheduled listen waits a full interval instead of running again seconds later.
Relevance filters (social intent)
| Control | Typical behavior |
|---|---|
| Prospect limit | Caps new hits per listen pass and overall shortlist |
| Max post age | Rejects stale posts (org default often 45 days; campaign can override) |
| Topic phrase + shopping language | Requires a topic phrase from your listen keywords (for example "life insurance" or "term life") and active shopping language above a match threshold. Keyword words scattered through an unrelated post, such as "car insurance… the whole cost", do not count. |
| Ranking | Posts whose title is about the topic, and posts that return to it several times, rank above posts that mention it once in passing. Matching communities and geography add a smaller boost. |
How listening reuses and ages intent
- Reuse before search. A campaign first evaluates fresh posts your workspace has already collected. It searches only when those do not fill its prospect limit. Campaigns in the same workspace with overlapping keywords share one search per window (about an hour) and still evaluate matches independently.
- Intent expires; people do not. A post counts as current intent until it is older than the campaign's max post age. The person stays on record, and a new post from the same person creates a new intent.
- Same post, several campaigns. One post can match more than one campaign. Each campaign keeps its own prospect and draft.
- Rejected stays rejected. Re-listening does not recreate a prospect you already rejected.
Contact details
Listening never collects email addresses or phone numbers. The post and profile link are enough to review and reply. An email or phone lookup runs only after acceptance, when the person showed explicit or engaged intent and the campaign needs another channel. A found contact attaches to the same person. Suppressed or opted-out people are never looked up.
Reply drafts
Not every matched post gets a draft. Drafts are created only for prospects the campaign keeps; posts ranked below the prospect limit, or excluded as people already on record, are recorded as intent without a draft. Client Growth Hub drafts a reply when the post is a useful place to help. It only observes, with no draft, when the post duplicates one already handled, when you replied to that person recently, or when the offer has nothing useful to add. Observed posts are still recorded as intent.
Drafts reference a short topic from the source post, turn the campaign offer into one sentence, and invite a reply or DM. For example, with the offer "help Ontario residents compare and buy life insurance":
Hi u/example — saw your question about “Life Insurance Shopping”. We help Ontario residents compare and buy life insurance. Happy to answer questions here if that's useful, or you can DM me.
Write the offer as either a verb phrase ("help families plan coverage") or a noun phrase ("auto insurance for Toronto drivers"); both read correctly.
Sensitive posts. Posts about serious illness, death, grief or self-harm are never given a template reply. They stay as prospects, and the Social item is marked suggested with a note asking a person to decide whether a personal reply is appropriate. Suggested items cannot be published until someone promotes them. They do not paste the prospect’s full post body. Discovery is the primary value; publishing is secondary and always requires a human Approve & publish. Automatic publishing without human approval is off. Quiet hours and rate limits apply to publishing, not to listening.
Meta lead ads
On a Contacts campaign, Ads is where you allow ads and set the daily budget, country, headline, body, a public https image, and call to action. Ads stay off until that is saved, including the image. When you launch a research run, you can start the ad. The choice starts unchecked. The run list shows whether the ad was accepted or why it was blocked. Set live on Ads starts spend. Pause, or spend past the daily budget, stops it. A later run that leaves the box unchecked does not pause it. Live spend still requires the API and worker ads flags. There is no Settings switch for those flags.
On the campaign Ads section, and on Ads → New ad, choose a JPEG, PNG, GIF, or WebP file, click Generate image, or paste a public https image URL. Generate uses the headline and body on that form. It needs OPENAI_API_KEY on the API. When the key is empty, Generate stops and the file and URL choices still work. Uploaded and generated images stay in Saved images for that organization, and a later ad can pick one. A chosen file is published at an https address on this site, and Meta fetches that address. Every Meta create sends that image and a click destination. A failed ad shows the provider sentence under the status. The destination is that organization's notify-only ad form. The address includes this research campaign's id. A person who submits that form is stored as a lead in Engagement Hub, then becomes a business and its contact when the campaign is B2B, or a person when the campaign is B2C. A B2C visitor who enters a business name, address, or website also creates that business. That page does not start a call or a text. The Connect campaign still sends its confirmation text when someone submits the Connect page. If the image or the ad form address is missing, the start stops and Ads shows ads_image_missing or engagement_url_missing. The ad provider is not called. Starting again updates the image and destination on an existing failed ad before the next create.
For the Aventora pilot, connect Facebook under Settings → Your social accounts, pick the Facebook Page, and save the customer-owned account act_1542409354594463 with the Page id, Business id, and lead-gen terms. Allow ads on the campaign with a daily budget of 20 CAD, a headline, a body, and a public https image. The click destination is that organization's notify-only ad form, with this campaign's id. Check Start the ad on a research run. Before Set live, confirm whether a special ad category applies to ads aimed at financial professionals. On the production host, /opt/aventora/cgh/.env.production is the file both api and worker load. Set ADS_ENABLED=true, ADS_KILL_SWITCH=false, ADS_DRY_RUN=false, and ADS_LIVE_ENABLED=true there after this code is deployed, then recreate api and worker. Those values stay false in the published examples.
A B2B form submission becomes a business and its contact on that campaign. A B2C submission becomes a person, and also a business when the visitor entered a business name, address, or website. Sending the same lead again does not create a second prospect. If spend passes the approved budget, the ad pauses and the section shows that reason.
The Meta account is ready for this only after Settings → Your social accounts has a Page id, a Business id, the scopes Zernio returned, and accepted lead-gen terms.
Google search ads
A super admin connects one Google Ads account under Settings → Google ads. Each organization uses the Connect campaign created with its CRM workspace. Organization admins see Connect under Settings → Connect campaign, and the same Create ad campaign or Refresh ad campaign control is on that page and on the organization CRM workspace section. Either one asks Engagement Hub for the notify-only page and replaces the ad address shown there. The Connect campaign itself stays as it is. Any Accounts or Contacts campaign can allow Google ads and set a daily budget, country, headline, description, and keywords. When you launch a research run, you can start that search ad. The choice starts unchecked. Clicks open that organization's notify-only ad form, with this campaign's id. A B2B submission becomes a business and its contact. A B2C submission becomes a person, and also a business when the visitor entered a business name, address, or website. The Connect campaign still sends its confirmation text. A later run that leaves the box unchecked does not pause an ad that already started. The same ads flags that gate Meta also gate Google. Those flags stay off in the published examples and are set only on the server.
Accounts and Contacts campaigns can both allow Meta ads and Google ads. When an Accounts launch stops for brief approval, the choices to start those ads are sent with the research job after the brief is approved.
Organization admins use Ads to list every Meta and Google ad, create one with or without a research campaign, and pause, set live, cancel, or finish it. Canceled and finished ads cannot be set live. A Meta Instant Form submission becomes a person prospect even when the ad is not attached to a research campaign. A click on the ad, including a Google click, opens the notify-only ad form. A B2B submission there becomes a business and its contact on the named research campaign. A B2C submission becomes a person, and also a business when the visitor entered a business name, address, or website. The Connect campaign still sends its confirmation text.
Getting started tutorial
The docked Getting started wizard includes a Contacts pack with sample person prospects so trial users can learn the loop without waiting on a live social listen. Tutorial jobs do not consume research entitlements. See Operator User Guide.
Changelog
| Date | Change |
| --- |
| 2026-10-07 | The Ad leads form can include an optional business name, address, and website. A B2B submit creates a business and its contact. A B2C submit creates a person, and a business when those fields are filled. |
| 2026-10-07 | Settings → Connect campaign keeps the Connect page in Connect campaign URL. Ad campaign URL shows the saved notify-only page. |
| 2026-10-07 | Create ad campaign and Refresh ad campaign are on Settings → Connect campaign and on the organization CRM workspace section. Either one replaces the ad address with the notify-only page. |
| 2026-10-07 | Settings → Connect campaign shows Create ad campaign when the notify-only page does not exist. The button creates that Engagement Hub page only. |
| 2026-10-07 | Ad clicks open the organization's notify-only form. A submission becomes one person prospect on the named research campaign. The Connect campaign still sends its confirmation text. |
| 2026-10-07 | A Meta ad that was created is labeled paused. An earlier provider error is not shown on that ad. Set live starts spend. |
| 2026-10-07 | Start the Meta ad on the campaign Ads section sends the saved creative and does not start another research run. |
| 2026-10-07 | While an image is generating, a notice asks the admin to stay on the page until it finishes. |
| 2026-10-07 | Saved images for the organization stay available. On an ad, pick one, upload another, or generate another. |
| 2026-10-07 | Generate image asks OpenAI for one square picture from that ad’s headline and body. Set OPENAI_API_KEY on the API. Choosing a file or pasting an https URL still works when the key is empty. |
| 2026-10-07 | Organization admins can choose an image file for a Meta ad. The file is published at an https address Meta can fetch. A failed ad shows the provider sentence on Ads. |
| 2026-10-07 | A Meta ad starts only with a public https image and the organization's Connect campaign URL (or an https campaign link). Ads shows ads_image_missing or engagement_url_missing and does not call the provider when either is missing. |
| 2026-10-04 | Each organization gets a CRM workspace and a Connect campaign. Google ads open that campaign URL. |
| 2026-10-03 | Save and recheck readiness reads Meta ads scopes from the Page account and the Meta ads account. |
| 2026-10-03 | Settings → Your social accounts has Connect ads permissions. That login is what returns the Meta ads scopes, which are stored from account health. |
| 2026-10-03 | The Facebook Page id is saved from the Page you select. The Business id is saved when the ad account list includes it. |
| 2026-10-03 | Connecting Facebook under Settings → Your social accounts asks for the Facebook Page before the Meta ad account can be saved. |
| 2026-10-03 | An Accounts campaign can allow Meta ads as well as Google ads. Approving the research brief keeps the choices to start the Meta ad and the Google search ad. |
| 2026-10-03 | Organization admins use Ads to see Meta and Google ads as active, paused, canceled, or finished. They can create an ad with or without a research campaign, and pause, set live, cancel, or finish it. A Meta form lead becomes a person prospect even when no research campaign is attached. |
| 2026-10-03 | A super admin connects one Google Ads account and saves an https Engagement Hub URL. Any Accounts or Contacts campaign can allow a Google search ad. A research run can start it, and clicks open that URL. Live flags stay off in the published examples. |
| 2026-10-03 | Research runs show whether the ad started or the block reason. Set live starts spend after the paused create. The Aventora pilot is the customer-owned account act_1542409354594463 at 20 CAD/day. Live flags are set only on the server. |
| 2026-10-03 | A Contacts campaign stores whether ads are allowed, the daily budget, and the creative. Each research run can start the ad. Leaving that choice off does not pause an ad that is already spending. |
| 2026-10-03 | Contacts campaigns include an Ads section for a paused Meta Instant Form. Settings collects Page, Business, returned scopes, and lead-gen terms. Form leads become one prospect. Spend past the approved budget pauses the ad. |
| 2026-10-03 | Organization admins connect Facebook, Instagram, and LinkedIn under Settings → Your social accounts. Approved Instagram and LinkedIn posts use that organization's account. Reddit listening stays shared. |
| 2026-09-29 | Manual cadence stays manual after relaunch; a manual launch defers the next scheduled listen by one interval; sensitive posts (serious illness, death, grief) are escalated to a person instead of drafted. |
| 2026-09-29 | Matching requires a topic phrase from the listen keywords and ranks on-topic titles first; drafts only for kept prospects; draft wording turns the offer into a proper sentence and uses u/handle on Reddit. |
| 2026-09-29 | Documented reuse of collected posts before search, shared searches across overlapping campaigns, intent expiry by max post age, per-campaign prospects for shared posts, no recreation of rejected prospects, gated email/phone lookup after acceptance, observe-versus-draft replies, and that publishing always needs human approval. |
| 2026-09-06 | Social intent listen is Reddit-only. LinkedIn is optional publish, not listen. Quiet hours and rate limits apply to publish, not discovery. |
| 2026-08-12 | Workspace default listen keywords; campaign override with blank = org default fallback. |
| 2026-07-28 | Public guide focused on social research/interaction capabilities (no internal provider connection details). |
| 2026-07-28 | Initial public B2C social listening guide (Contacts toggle, Social inbox, listen cadence). |