Connecting channels
ContentFlows publishes to your social channels automatically once you connect them. Each channel needs two values: an access token (what grants permission) and an ID (which account / page / channel to publish to). Both are pasted into your dashboard and stored encrypted in AWS Secrets Manager, isolated to your account.
Where to connect
In your admin dashboard, go to the Integrationstab. You'll see a card for each supported channel with input fields for every value that platform needs. Fill them in and click Save.
One-time setup per channel
You only need to do this once per platform. ContentFlows uses the saved values for all future publishing until a token expires or you replace it.
ContentFlows posts via the LinkedIn UGC Posts API. You need two fields:
- Access token (
LINKEDIN_ACCESS_TOKEN) — OAuth 2.0 token withw_member_socialscope. - Member URN (
LINKEDIN_AUTHOR_ID) — identifies which profile or Company Page the posts appear under; starts withurn:li:person:orurn:li:organization:.
Step-by-step guide: Getting a LinkedIn token and URN →
Token expiry
LinkedIn access tokens expire every 60 days. The URN is permanent — you only need to regenerate the token.
ContentFlows publishes to a Facebook Page (not a personal profile). You need two fields:
- Page access token (
FB_PAGE_ACCESS_TOKEN) — must includepages_manage_postsscope (the one most often forgotten). When derived from a long-lived user token, Page tokens never expire. - Page ID (
FB_PAGE_ID) — the numeric ID of the Page (e.g.123456789012345), NOT the human-readable username.
You must be an Admin of the Page.
Step-by-step guide: Getting the Facebook Page token and ID →
Instagram publishing requires a Professional account (Business or Creator) linked to a Facebook Page. Personal Instagram accounts cannot be used for API publishing.
- Access token (
IG_ACCESS_TOKEN) — optional. Leave blank to reuse the Facebook Page token you already configured. - Business Account ID (
IG_BUSINESS_ACCOUNT_ID) — numeric ID of the Instagram Business Account linked to your Facebook Page (e.g.17841412345678901).
Step-by-step guide: Getting the Instagram Business Account ID →
Converting to a Professional account
In the Instagram app: go to Settings → Account → Switch to Professional Account. Choose Business or Creator. Then link to your Facebook Page under Settings → Account → Linked Accounts.
YouTube
ContentFlows uses the YouTube Data API v3 to generate metadata (titles, descriptions, tags) for your content calendar.
- API key (
YOUTUBE_API_KEY) — from Google Cloud Console with YouTube Data API v3 enabled. - Channel ID (
YOUTUBE_CHANNEL_ID) — your channel's unique ID (starts withUC), found in YouTube Studio → Settings → Channel → Advanced settings.
Step-by-step guide: Getting the YouTube API key and Channel ID →
Email newsletter
ContentFlows sends newsletters via Amazon SES to your per-tenant subscriber list. No token is required — it's configured when your account is provisioned.
Managing subscribers
The Newsletter tab in your dashboard has a full subscriber panel with:
- Stats header — active / pending / unsubscribed / bounced / complained counts
- Import — CSV upload, Mailchimp API key, or ConvertKit API key
- List view — search, filter by status, delete per row, bulk delete, CSV export
- Re-subscribe — bring back an unsubscribed or bounced contact
Your public signup URL is https://YOUR-SLUG.contentflows.cc/subscribe, where YOUR-SLUG is the DNS-safe identifier set on your tenant (default: a cleaned version of your company name). Sign-ups use double opt-in (confirmation email); CSV / Mailchimp / ConvertKit imports bypass verification because you attest consent on upload.
One-time DNS setup (operator only)
For the subdomain signup page to resolve for any tenant, the platform operator needs wildcard DNS configured once:*.contentflows.cc as a CNAME pointing at whichever origin serves the root contentflows.ccsite. Until that's in place, the fallback URL https://contentflows.cc/subscribe?tenant=YOUR-SLUG works everywhere.
Unsubscribe links are signed with HMAC-SHA256 and embedded in every outgoing newsletter (RFC-8058 List-Unsubscribe-Post header is included for Gmail / Yahoo one-click compliance).
Sending domain (DKIM + SPF + DMARC)
Emails by default go from noreply@contentflows.cc. For much better deliverability, authenticate your own domain so newsletters come from newsletter@your-business.com.
Open the Brand tab, find the Sending domain card, type your domain, copy the 5 DNS records it shows, paste them at your DNS provider, and click Verify. The card polls SES for 10 minutes until DKIM + DMARC are validated.
What the 5 records are
- 3 × CNAME for DKIM signing (SES-generated tokens)
- 1 × TXT at the root domain for SPF (
v=spf1 include:amazonses.com -all) - 1 × TXT at
_dmarc.your-domain.comfor DMARC (v=DMARC1; p=none; rua=mailto:dmarc@your-domain.com)
How credentials are stored
All fields across all platforms for your tenant are saved as a single encrypted JSON blob in AWS Secrets Manager at contentflows/tenants/YOUR_TENANT_ID/social-tokens. Secrets are never logged, never shown again after saving, and isolated to your account. ContentFlows never stores your social media password.
Replacing a value
To update a token or an ID (e.g. after token expiry), go to the Integrations tab, paste the new value(s) into the relevant fields, and click Save. Only the fields you change are updated — the rest of the blob stays intact.
What happens after connecting
Once a channel is connected, ContentFlows automatically publishes approved content on your schedule. Review and approve each piece from the Content Queue tab before it goes live.
Supported channels
- LinkedIn — personal or Company Page posts (UGC Posts API)
- Facebook — Page posts (Graph API)
- Instagram — feed posts on Professional accounts (Graph API)
- YouTube — metadata lookups (Data API v3)
- Email newsletter — via Amazon SES (configured automatically)