ContentFlows/Documentation

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.


LinkedIn

ContentFlows posts via the LinkedIn UGC Posts API. You need two fields:

  • Access token (LINKEDIN_ACCESS_TOKEN) — OAuth 2.0 token with w_member_social scope.
  • Member URN (LINKEDIN_AUTHOR_ID) — identifies which profile or Company Page the posts appear under; starts with urn:li:person: or urn: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.

Facebook

ContentFlows publishes to a Facebook Page (not a personal profile). You need two fields:

  • Page access token (FB_PAGE_ACCESS_TOKEN) — must include pages_manage_posts scope (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

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 with UC), 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.com for 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)

Next steps