Content & editorial
Content Syndication & Multi-Channel Publishing
Indicative price, not an offer: $20–50/mo depending on destination-platform count
Generated from docs/plan/paid/content-syndication-multi-channel-publishing/PLAN.md in the AstroBaaS repository. Nothing described below is implemented — it is the written plan for it.
Content Syndication & Multi-Channel Publishing automatically publishes new blog posts and articles to Medium, LinkedIn, Substack, and other platforms after publication. A merchant configures destination platforms via OAuth, sets up automation rules (publish blog posts to Medium and LinkedIn, newsletter articles to Substack), and reviews each syndication before it posts. This is a paid plugin requiring per-platform OAuth credentials and ongoing API support.
The problem
Blog posts only reach visitors to the merchant’s own site. Customers miss new content entirely if they don’t follow the site directly. Without multi-channel distribution, audience growth stalls and content reaches only existing customers, not new prospects.
What it does
- OAuth2 connector for Medium, LinkedIn, Substack, and Bluesky
- Configure syndication rules: ‘Publish all blog posts to Medium with 2-hour delay’
- Rewrite content for platform constraints (LinkedIn 3,000 char limit, Substack requires HTML)
- Generate canonical URL backlink to original post (SEO: tells platforms this is syndicatied, not stolen)
- Schedule syndication: immediate, or delay N hours/days
- Preview before posting: show formatted content as it will appear on destination platform
- Webhook notification when syndication succeeds or fails
- Audit log: source post, destination platform, syndicated_url, status, timestamp
- Manual retry for failed syndications
- Disable syndication rule without deleting (paused state)
What it deliberately does NOT do
Each boundary carries its reason. A boundary without a reason gets crossed by the next person who reads this.
- Bi-directional sync (comments from Medium → pull back to blog) — scope is push only; comments remain on destination platform
- Platform-specific comment monitoring — scope is publish-only; engagement tracking requires separate analytics integration
- Syndication to custom platforms via Zapier or IFTTT — scope is direct OAuth integrations; third-party automation is merchant’s responsibility
Data model
New plugin-owned collections: SyndicationRule (id, contentType, destinationPlatforms[], scheduleDelayMinutes) and Syndication (id, sourcePost_id, platform, destinatedURL, status, scheduledAt). No core schema migration.
API
- POST /api/syndication/oauth/authorize/:platform — start OAuth for destination platform
- POST /api/syndication/oauth/callback — OAuth redirect
- POST /api/syndication-rules — create syndication rule
- GET /api/syndication-rules — list active rules
- PATCH /api/syndication-rules/:id — pause/resume/update rule
- POST /api/syndications/:id/preview — show formatted content for destination platform
- POST /api/syndications/:id/publish — push to destination immediately (or schedule)
- POST /api/syndications/:id/retry — retry failed syndication
- GET /api/syndications?sourcePost_id=X — list all syndications of a post
Every route added here must also appear in src/pages/openapi.json.ts — a test
fails the build if it does not.
Admin
Syndication Rules page lists active rules (trigger: content type, destination platforms, schedule delay). Create rule form shows OAuth login flow, selects destination platforms, sets delay, enables rule. Post detail view shows syndication status: ‘Pending LinkedIn in 2 hours’, ‘Posted to Medium 1h ago’, ‘Failed: rate limit, retry available’. Preview pane shows how content will render on destination. Manual retry and pause buttons per platform.
The seam — why this is paid
Core owns: content storage, audit log, webhook system. Paid plugin owns: OAuth connectors, platform-specific content formatters, canonical URL generation, scheduling logic, platform API calls.
Paid owns external platform integrations and API credentials (Medium, LinkedIn, Substack). Syndication is not core CMS; it is integration infrastructure requiring external credential management and per-platform support.
Dependencies
- core-audit-log (syndication tracking)
- core-webhook-system (syndication events)
- rich-text-editor (for formatting, or expects HTML body)
Acceptance checks
Each of these must be able to fail. Before claiming this is done, break the code deliberately and watch each one go red.
- OAuth login for Medium succeeds and stores refresh token securely
- Blog post published to site is automatically queued for syndication to configured platforms
- Preview shows blog title + first 300 chars of body as it will appear on LinkedIn
- Syndication scheduled for 2 hours delay posts exactly 2 hours after blog publish
- Syndicated post on Medium includes canonical URL link back to original post
- Failed syndication (e.g., 401 auth expired) is recorded with error reason and Retry button appears
- Syndication rule can be paused without deleting; new posts are not syndicated until rule re-enabled
- Merchant can manually syndicate an old blog post to a new platform retroactively
Risks
OAuth token expiry mid-syndication queue breaks all remaining posts; refresh-token rotation must be automated. Content truncation for LinkedIn char limit (3,000) corrupts mid-sentence if not aware of word boundaries. Canonical URL not included breaks SEO (search engine attributes content to destination, not origin). Rate-limit handling (backoff, retry) not implemented causes permanent posting failures. Platform API changes (Medium API deprecated) breaks connector without fallback.
Commercial context
| Suggested price | $20–50/mo depending on destination-platform count |
| Rival anchor | Buffer ($15–99+/mo per channel); Hootsuite ($35–739/mo); IFTTT ($9.99/mo); RSS integrations (free) |
The anchor is what the nearest equivalent charges on Shopify or Magento today. It is context for a pricing decision, not the decision.
Generated from the commerce plan. See docs/COMMERCE-PLAN.md for the full
catalogue and ../../AI-GUIDE.md for how to work on this repository.