Social posts

Overview
Since 0.7 a social post IS a content item. You write it under Content like any other text, and the networks are its targets. It therefore exists only ONCE — before, the same thought lived as a social row and as a blog post side by side, and the two drifted apart. Scheduling, approval, languages and versions come from the editorial system; what this module contributes is the connection to the network.
Posts are written, scheduled and published here. Publishing itself is done by a network adapter — the system knows the posts, the adapter supplies the connection to the network.
A post can be linked to a campaign. It then counts towards that campaign's attribution; without a link it stands on its own.
Due posts are published by a daily run. The run is idempotent and works in batches — a second pass publishes nothing twice.
Paid reach sits next to it: ad campaigns.
Core tasks
Create a post. Write the content, pick the network and the publication time.
Schedule. The planned time controls when the run picks the post up. Until then it stays editable.
Track the status. Post statuses are configurable, see Marketing settings. On the dashboard upcoming posts can be shown as a widget.
Link a campaign. Optional — it is the bracket that connects the post with sends and attribution.
Fields in detail
A social post is a content item, not a record of its own. There is no separate administration — social supplies the channels, the post fields come from there.
| Element | From | What it does |
|---|---|---|
| Content type | content | What kind of post is created. |
| Text and media | fields of the content type | The post itself. |
| Targets | connected networks | Where it is published. Several at once are possible. |
| Per-channel content | field value per channel | The same field, a different version. That is the point: text for a professional network reads differently from one for an image network — the channel axis sits inside the field value, not in a second administration. |
| Planned publication | the content item | When the post appears. Until then it sits in the calendar but nowhere public. |
Connected account
This module's own mask sits under Settings → Social connections. It has exactly one purpose: to decide in whose name the company speaks.
| Field | Required | Values / format | What it does |
|---|---|---|---|
Network provider | yes | linkedin, meta (Facebook & Instagram), x | Which network is meant. An unknown key is rejected. |
Brand brandId | no | one of your brands; empty = the brand-less connection | Which brand the account stands for. Brand-specific, and that is not a detail: the same instance can serve two brands with two accounts, and the permission social.connection.manage must be held in exactly THAT brand — holding it in another one is not enough. |
Account accountId | partly | one of the offered pages or accounts | Which page publishing runs through. Needed for Meta, where one authorisation can cover several pages: taking the first one automatically would be guessing, and whoever manages three pages then posts publicly to the wrong one. Only an offered account is accepted, never a freely typed identifier. |
Ad account adAccountId | partly | one of the offered ad accounts | Which account spends money. Kept apart from the posting account because it is a second consent: being allowed to publish does not yet mean being allowed to spend budget. Here too: only from the offered ones. |
At least one of account and ad account must be set — a call with neither is rejected.
Shown rather than entered:
| Field | Values / format | What it means |
|---|---|---|
connected | yes/no | Whether an authorisation is stored for this network (and this brand). |
expiresAt | timestamp, empty = no expiry stored | When the access expires. |
expiringSoon | yes/no | Whether the expiry falls within the next seven days. Networks let access expire — LinkedIn after roughly 60 days, and it does not renew on its own. Without this warning the first to notice is someone wondering why nothing has appeared for a week. |
accounts | list of pages/accounts | What the authorisation offers — the choice for account. |
adAccounts | list of ad accounts | What the authorisation offers for advertising. Empty means advertising was not granted along with it. |
Disconnecting removes the secrets of the connection. The app credentials remain — they belong to the installation, not to the connection; see integrations.
Settings & permissions
- Module
module.socialfor the connections; the posts themselves hang onmodule.content. social.post.manage— plan and publish posts. Pre-assigned to the role Vertrieb.social.connection.manage— connect and disconnect company accounts. Deliberately a separate
permission: writing posts is day-to-day work, connecting a company account is not.
social.brand.all— the cross-brand view of connections and figures.- No publishing without a network adapter. Planning works; delivery needs a configured connection.
- Statuses are maintained under Marketing settings with
marketing.config.manage.
FAQ & troubleshooting
The post stays scheduled and is never published. Either the time has not been reached yet, or no adapter is configured for that network.
The post was published twice. Should not happen: the daily run is idempotent. Check whether the same content was created twice.
"Expires on … — please reconnect." The network's access ends in less than seven days. Reconnect the account before it does — after that no scheduled post appears any more.
Meta posts to the wrong page. Then the wrong page is selected under account. A Meta authorisation often covers several pages; the selection decides which one it is.
I see no analysis for the post. Without a campaign link there is no attribution — and therefore no row in the marketing report.