Post analytics and LinkedIn Publishing Community
Read stored LinkedIn/X post performance and operate LinkedIn Publishing Community without confusing local analytics, public comment work, live provider reads, or private inbox messages.
Oxygen stores posts published through its LinkedIn and X Publishing paths as Posts data and discovers recent posts created directly on connected LinkedIn accounts into the same artifact store. The latest cumulative metric snapshots power Publishing → Analytics for the selected channel; public LinkedIn comments across all recent owned LinkedIn posts flow into the durable, oldest-first Publishing → Community workspace.
Public comments are not private LinkedIn inbox messages and are not workspace review notes. A public comment and its thread belong to Posts. A private DM becomes a Message in Unibox. Draft text, assignment, and notes attached to a public comment are local workspace state and are never posted by saving them.
Analytics
oxygen publishing analytics summary --range 30d --json
oxygen publishing analytics summary --channel x --range 30d --json
oxygen publishing analytics post <post-id> --jsonThe summary defaults to owned LinkedIn posts recorded in Oxygen, including recently discovered posts created directly on LinkedIn. --channel x instead covers X posts published through Oxygen. Both paths read stored snapshots and never call the selected provider when opened or queried. snapshotted_posts counts posts with a stored background sync pass; its legacy alias measured_posts does not mean every engagement value was populated. Use coverage.<metric>.measured_posts to see how many posts reported a non-null value for each metric. A null is unknown or unavailable, never zero. Stale and pending snapshots retry automatically; there is no manual provider retry to run.
The current LinkedIn rail can supply reactions, comments, and reposts but not trustworthy impressions, saves, or sends. X ordinary post lookup maps impressions, likes, replies, reposts, bookmarks, conditional link clicks, and conditional video views into the same canonical fields; it exposes no send counter. LinkedIn's richer member-post analytics and X account analytics remain separate, unregistered capabilities.
Publishing Community
oxygen publishing comments list --view unanswered --json
oxygen publishing comments list --view all --json
oxygen publishing comments get <comment-id> --jsonUnanswered is the operating queue, not a synonym for one database state. It includes new comments that need a reply, saved reply drafts, replies awaiting approval, and comments whose reply action is currently unavailable. All includes every lifecycle state, including replied, resolved, ignored, and spam, within the rolling 30-day recent-owned-post scope; it does not mean lifetime LinkedIn history. For automation that needs one exact state, pass --status <state> instead of --view; the two filters cannot be combined.
Opening this queue is a local tenant-database read. It uses 0 Oxygen credits and makes no provider call. A background worker discovers and polls recent owned posts with a six-hour freshness target.
Every list response includes empty_queue_is_current beside the count and a freshness block:
| Field | Meaning |
|---|---|
status | current, awaiting_first_sync, partial, stale, backing_off, or no_targets |
sync_target_posts | Recent owned posts the worker should poll |
completed_posts | Posts that have completed at least one pass |
current_posts | Posts with a successful pass inside the six-hour target |
failed_posts | Posts whose latest pass failed and is waiting to retry |
last_completed_at | Latest successful pass, or null before the first success |
next_sync_at | Next scheduled attempt or retry |
last_error | Exact provider/quota failure when polling is backing off |
counts_trustworthy | true only when discovery and comment polling are current |
automatic_retry_at | Scheduled automatic retry while backing off |
manual_retry_available | Always false; the worker owns quota-safe retry timing |
guidance | Self-contained degraded-state instruction, or null when none is needed |
If an empty response has empty_queue_is_current: false, do not conclude that LinkedIn has no comments. freshness.counts_trustworthy remains false and freshness.guidance names the automatic retry time and exact failure. There is deliberately no manual sync button or retry command: the worker retries automatically, while a user-triggered retry loop could consume the same LinkedIn account quota that caused the backoff.
A reply written directly on LinkedIn is reconciled by the next successful provider sync. Oxygen recognizes the connected account as the author and moves only that reply's exact parent comment to replied; local drafts, notes, and reply receipts remain available for inspection. Creating or approving a reply through Oxygen is refused if the bound LinkedIn sender is no longer active.
Local queue versus live provider reads
oxygen posts get|comments|reactions are a separate low-level path for one known LinkedIn post. Each is a live provider read. It uses 0 Oxygen credits but consumes the connected sender's metered account-read allowance, and it does not populate or refresh the durable queue. Do not use that path when a task forbids provider calls.
Safe public reply flow
oxygen publishing comments update <comment-id> --draft "Exact reply" --json
oxygen publishing comments reply <comment-id> --text "Exact reply" --json
oxygen publishing comments approve <action-id> --content-hash <sha256> --approved --jsonupdate saves only local workspace state. reply freezes an exact unsent preview and returns its immutable action id plus SHA-256 content hash; it makes no provider call. Only approve performs the public LinkedIn write, and only for the newest preview with the exact hash. Never retry an effect_unknown action automatically—open the returned comment deep-link and verify the public thread first.
The same provider-neutral contract powers CLI, MCP (oxygen_publishing_comments), its widget, and the web workspace. LinkedIn is the only channel admitted to Community today; later channels must pass the same capability, pagination, freshness, idempotency, approval, and receipt contract before appearing.