Skip to main content

Social listening and public-mention triage

Social care is the work of answering the public conversation about your brand, not just the private one. The inbox already ingests private 1:1 messages — Instagram and Messenger DMs, as well as every other direct channel. A public mention is different: an X/Twitter post, a Reddit thread, a Trustpilot or G2 review, or a comment under one of your Instagram/Facebook posts names the brand without opening a DM thread. Without a listening path, someone has to skim feeds and copy links into the queue. With one, a connector normalizes each mention and the same triage, assignment, and reply workflow your team already uses takes over. Public mentions differ from DMs in one structural way. A DM is a private thread — conversation context arrives with it. A public mention is a standalone broadcast — it opens with no context, and the connector supplies the details the queue needs: the platform it came from, the author’s handle, the permalink back to the original post, and optionally sentiment, reach, and the keyword that matched. The platform token you post (twitter, reddit, trustpilot, g2, google_reviews, facebook_public, facebook_comment, instagram_comment, youtube, app_store, play_store, news, forum, or the other catch-all) is what the queue filter and the row’s chip display. Public post commentsinstagram_comment and facebook_comment — are the one platform family with extra structure. A comment belongs to a parent post, so every comment on the same post threads into one replyable conversation instead of one conversation per author, and post_id is required for those platforms.

The queue in the dashboard

The triage queue lives under Inbox → Social mentions — a rail tab next to All conversations, Pending replies, and Archive. Each row shows the mention’s sentiment chip (green for positive, red for negative, muted for neutral), the platform token, the author, an unread count, a working preview of the last message, and deep links — one into the conversation view, and one out to the original public post via the stored permalink. Filter the queue by platform and status (open by default; snoozed, closed, or all). A first filter pass narrows Sent to social mentions to a slice you can clear, and the Load More button pulls through the next page of the mention firehose — the queue pages rather than capping out at one screen. Owners and admins see the rail tab today; it is hidden from agents, with the API itself still readable by every operator when the rail is widened.

Ingest a mention

A listening connector — a poller or a webhook subscriber to a listening provider — normalizes the mention and posts it to POST /inbox/social-mentions/ingest. Only owners, admins, or super-admins can write into the shared queue; agents triage reads.
Three things to get right:
  • Idempotency. external_id is the provider’s stable mention id and the dedup key is (channel, external_id) — re-deliver a mention and the server returns 200 with deduped: true instead of a second conversation. Retry freely.
  • Validation. A missing or malformed field returns 422 VALIDATION_ERROR with per-field errors — fix the payload before retrying.
  • Comment platforms. For instagram_comment and facebook_comment, post_id is required and the comment threads into the post’s single conversation; post_permalink, post_title, and parent_comment_id are optional context the queue renders (a View post link, the caption, the parent comment for a nested reply).
Every write is audit-logged, and a genuinely new conversation also rings the org-admins’ bell so a fresh public mention never sits silent.

List and filter the queue

The dashboard page is backed by GET /inbox/social-mentions, readable by any operator. It defaults to the open queue; pass ?status=all for history or ?platform=twitter to scope to one network.
Each item carries conversation_id, status, author_name, unread_count, last_message, last_message_at, and the full mention metadata blob described below. next_cursor is an offset token — feed it back as ?cursor= to page the firehose; the final page returns null. Status accepts open, closed, snoozed, or all.

The mention metadata blob

Every ingested mention is preserved on its conversation and message as a social_mention metadata blob — the queue’s filter and the row’s rendering both read from it:

Triage a mention, then reply

Public mentions land in the same conversation machinery as every other channel, so the triage loop is the one your team already runs:
  1. Open the mention, read the linked original post through the permalink.
  2. Assign the conversation — or let your routing rules assign it — and reply in the thread.
  3. Close or snooze the queue row to keep the open view clean; reopen from status → all when a customer follows up.
For instagram_comment and facebook_comment platforms, a new comment can also trigger your published comment-received automation: a private DM goes out to the commenter inside Meta’s follow-up window while the public thread stays in the queue. Replies and automation both flow as tenant-owned settings; nothing here routes messages outside your tenant’s own channels.

Authorization and isolation

Tenant isolation is enforced at the schema layer: mentions live inside the same conversations and messages tables every other channel uses, under the social_mention channel — no new tables, no new DDL. Your connector writes only into your tenant’s queue; operators page their own tenant’s queue.

Example connectors

All of these post to the same endpoint with the same idempotency contract — pick a platform, keep the provider’s stable id as external_id, and retry without duplicating conversations. X/Twitter mention:
Reddit thread:
Trustpilot review:
Instagram/Facebook comment (comment thread):

See also