SEOVentra
GuidesCMS Connections

CMS Connections Guide

Step-by-step setup instructions for every supported CMS platform. Connect once, publish AI-generated content directly from SEOVentra forever.

18 platforms< 5 min eachAES-256 encrypted
Your CMS / website
WP
WordPress
Credential format: user:app_password
Connect now →
1Go to your WordPress admin → Users → Profile
2Scroll to "Application Passwords" — enter a name like "SEOVentra" and click Add
3Copy the generated password (shown once)
4In SEOVentra → Dashboard → CMS → Add Connection → WordPress
5Enter your site URL (e.g. https://yoursite.com) and paste as username:password — your WordPress username, a colon, then the application password
6Click "Test Connection"
Requires WordPress 5.6+ with the REST API enabled and an account with unfiltered_html capability (default for Administrators) so JSON-LD schema can be embedded. Yoast SEO, if installed, also gets the canonical meta key set automatically.
Gh
Ghost
Credential format: Admin API key (id:secret)
Connect now →
1Log into your Ghost Admin panel
2Go to Settings → Integrations → Add custom integration
3Name it "SEOVentra" and click Create
4Copy the Admin API Key — it's already in the id:secret format SEOVentra expects
5In SEOVentra → CMS → Add Connection → Ghost
6Paste your site URL and the Admin API Key, then click "Test Connection"
Ghost natively supports a canonical_url field and per-post script injection, so both the canonical link and JSON-LD schema are applied exactly as Ghost intends — no workarounds needed here.
Sh
Shopify
Credential format: Admin API access token
Connect now →
1In Shopify Admin → Apps → Develop apps → Create an app
2Name it "SEOVentra" and configure Admin API scopes: write_content, read_content
3Install the app and copy the Admin API access token
4In SEOVentra → CMS → Add Connection → Shopify
5Enter your store URL (e.g. yourstore.myshopify.com) and paste the token
6Click "Test Connection"
Published content goes to your Shopify blog (Online Store → Blog Posts). Shopify auto-generates its own canonical URLs for blog articles — there's no per-article override in Shopify's API, so SEOVentra doesn't claim to set one here.
Wf
Webflow
Credential format: Site API token + Collection ID
Connect now →
1Log into Webflow → Account Settings → Workspace → API Access
2Generate a Site API token with CMS write scope
3Find your target Collection's ID (Webflow → CMS → click the Collection → copy the ID from the URL)
4In SEOVentra → CMS → Add Connection → Webflow
5Paste your site URL and API token, then enter the Collection ID in the connection's Label field
6Click "Test Connection"
Webflow has no canonical URL or schema API for CMS items — publishing sends the article content into your chosen Collection, and any head-tag SEO fields depend on your Webflow site's own template.
Md
Medium
Credential format: Integration Token
Connect now →
1Go to medium.com → Settings → Security and apps → Integration tokens
2Create a token with description "SEOVentra"
3Copy the generated token
4In SEOVentra → CMS → Add Connection → Medium
5Paste your profile URL (e.g. https://medium.com/@yourhandle) and the token
6Click "Test Connection"
Medium's API supports a canonicalUrl field on published posts, which SEOVentra sets to your original article URL to protect your own site's SEO.
Su
Substack
Credential format: Substack subdomain
Connect now →
1Find your Substack subdomain — the part before .substack.com in your publication URL
2In SEOVentra → CMS → Add Connection → Substack
3Enter your full publication URL and paste just the subdomain (e.g. yourname) as the credential
4Click "Test Connection" — SEOVentra checks that your domain is reachable
Substack has no official publish API, so direct one-click publishing isn't available here — SEOVentra tells you this plainly rather than pretending otherwise. For automated Substack delivery, connect the Webhook platform instead and route it through Zapier, Make, or your own receiver.
Hn
Hashnode
Credential format: Personal Access Token
Connect now →
1Log into Hashnode → click your avatar → Account Settings → Developer
2Generate a new Personal Access Token and copy it
3In SEOVentra → CMS → Add Connection → Hashnode
4Paste your blog URL (e.g. https://yourblog.hashnode.dev) and the token
5Click "Test Connection"
Hashnode supports canonical URLs natively via its GraphQL API — SEOVentra always sets the canonical to your primary domain, so duplicate content isn't an issue.
Wx
Wix
Credential format: apiKey:siteId
Connect now →
1Go to dev.wix.com → your account → API Keys → Create API Key
2Grant it access to the Wix Blog API
3Copy your Site ID from Wix → Settings → General → find your Site ID
4In SEOVentra → CMS → Add Connection → Wix
5Enter your site URL and paste as apiKey:siteId
6Click "Test Connection"
Wix requires both the API key and Site ID together — a key alone isn't enough to identify which site to publish to.
Dr
Drupal
Credential format: user:password
Connect now →
1Make sure your Drupal site has the JSON:API core module enabled
2Use an existing admin account, or create one dedicated to SEOVentra publishing
3In SEOVentra → CMS → Add Connection → Drupal
4Enter your site URL and paste as username:password
5Click "Test Connection"
Publishes as a Drupal Article content type via JSON:API. Canonical URL and schema handling depend on your theme and any SEO modules you have installed — Drupal has no universal API field for either.
Wh
Webhook
Credential format: webhookUrl or webhookUrl::bearerToken
Connect now →
1In SEOVentra → CMS → Add Connection → Webhook
2Enter your endpoint URL — any URL that accepts POST requests
3Optionally append ::yourBearerToken after the URL for an Authorization header
4SEOVentra sends the full article as JSON to your endpoint on publish
5Parse the payload in your server to create content in any system — Zapier, Make, n8n, or your own code
6Click "Test Connection" — a reachability check is sent
The universal fallback: if a platform isn't directly supported yet (including Substack, which has no official publish API), route it through Webhook to an automation tool instead.
Publish & distribute

Public blogging and publishing platforms Google actively crawls and cites. These extend your reach beyond your own site — they don't replace it, and several of them don't support canonical URLs or schema the way a full CMS does. Each note below is honest about exactly what's applied.

D2
DEV.to
Credential format: DEV.to API key
Connect now →
1Log into dev.to → Settings → Extensions
2Scroll to "DEV Community API Keys" → generate a key named "SEOVentra"
3Copy the key
4In SEOVentra → CMS → Add Connection → DEV.to (under Publish & distribute)
5Enter your own site URL (this is used for the canonical link back to your article) and paste the API key
6Click "Test Connection"
DEV.to natively supports a canonical_url field, which SEOVentra sets to your original article — that part is real, not a workaround. DEV.to sanitizes post bodies and doesn't allow injected <script> tags, so JSON-LD schema can't be applied there.
Wa
Write.as
Credential format: accessToken or accessToken::collectionAlias
Connect now →
1Log into write.as (or your WriteFreely instance) → Customize → API
2Generate an access token
3In SEOVentra → CMS → Add Connection → Write.as
4Enter your own site URL and paste the token
5Optional: to publish into a specific blog instead of your default one, append ::youralias after the token
6Click "Test Connection"
Write.as renders Markdown directly — your article's Markdown is sent as-is, with no HTML conversion, canonical field, or schema support (Write.as doesn't have either).
Tb
Tumblr
Credential format: oauthToken:blogIdentifier
Connect now →
1Go to tumblr.com/oauth/apps → register an application (or use an existing OAuth2 token if you already have one)
2Generate an OAuth2 access token for your account
3Find your blog identifier — it's the subdomain part, e.g. yourblog for yourblog.tumblr.com
4In SEOVentra → CMS → Add Connection → Tumblr
5Enter your own site URL and paste as token:blogIdentifier
6Click "Test Connection"
Tumblr posts use its own block-based format (NPF), not HTML — your article is flattened into a heading plus body text. There's no canonical URL or schema field on a Tumblr post.
Tg
Telegra.ph
Credential format: Telegraph access token
Connect now →
1No account signup required — visit telegra.ph/api#createAccount to generate a free access token instantly
2Copy the access_token value from the response
3In SEOVentra → CMS → Add Connection → Telegra.ph
4Enter your own site URL and paste the access token
5Click "Test Connection"
Telegra.ph is a lightweight instant-view format, not a full CMS — there's no canonical URL or JSON-LD schema field. Keep your access token safe: it's the only way to manage or edit pages published under that account later.
Ma
Mastodon
Credential format: Instance URL + access token
Connect now →
1On your Mastodon instance (e.g. mastodon.social), go to Settings → Development
2Click "New Application", give it a name like "SEOVentra", and enable the write:statuses scope
3Copy the generated access token
4In SEOVentra → CMS → Add Connection → Mastodon
5Enter your instance URL as the site URL (e.g. https://mastodon.social) and paste the access token
6Click "Test Connection"
Mastodon statuses are capped at 500 characters on most instances — this publishes a summary of your article with a link back, not the full body. There's no canonical or schema field on a status.
GP
GitHub Pages
Credential format: token:owner/repo:branch
Connect now →
1In GitHub → Settings → Developer settings → Fine-grained personal access tokens → Generate new token
2Scope it to just your Pages repository, with Contents: Read and write permission
3In SEOVentra → CMS → Add Connection → GitHub Pages
4Enter your own site URL and paste as token:owner/repo — for example token:yourname/yourname.github.io
5Branch is optional and defaults to your repo's default branch; add :branchname after repo if you need a specific one
6Click "Test Connection"
Publishes as a Jekyll-formatted Markdown file into _posts/ with a proper canonical_url in the front matter. If GitHub Pages isn't enabled on the repo yet, enable it under Settings → Pages so the post actually goes live — the commit itself will still succeed either way.
Li
LinkedIn
Credential format: accessToken:authorUrn
Connect now →
1Create a LinkedIn app at the LinkedIn Developer Portal and request the w_member_social scope
2Complete the OAuth2 consent flow once to get an access token
3Find your author URN — urn:li:person:xxxx for your personal profile, or urn:li:organization:xxxx for a company page you admin
4In SEOVentra → CMS → Add Connection → LinkedIn
5Enter your own site URL and paste as accessToken:authorUrn
6Click "Test Connection"
LinkedIn posts are capped at 3,000 characters and have no canonical or schema field — this publishes a summary with a link back to your article. LinkedIn access tokens expire after 60 days and must be reconnected manually; there's no refresh-token flow for this scope.
Bg
Blogger
Credential format: refreshToken:clientId:clientSecret:blogId
Connect now →
1Go to console.cloud.google.com → create a project (or use an existing one) → APIs & Services → Enable the "Blogger API v3"
2Go to APIs & Services → Credentials → Create Credentials → OAuth client ID → choose "Desktop app" as the application type
3Copy the generated Client ID and Client Secret
4Build this authorization URL, replacing YOUR_CLIENT_ID, then open it in a browser and approve access: https://accounts.google.com/o/oauth2/v2/auth?client_id=YOUR_CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/blogger&access_type=offline&prompt=consent
5Google shows you an authorization code — exchange it for tokens by POSTing to https://oauth2.googleapis.com/token with code, client_id, client_secret, redirect_uri=urn:ietf:wg:oauth:2.0:oob, and grant_type=authorization_code
6The response includes a refresh_token — save it, this is the long-lived credential (access tokens alone expire in about an hour)
7Find your blogId by opening your Blogger dashboard and copying the numeric ID from the URL, or by calling GET https://www.googleapis.com/blogger/v3/blogs/byurl?url=YOUR_BLOG_URL with any valid access token
8In SEOVentra → CMS → Add Connection → Blogger
9Enter your blog's public URL as the site URL, and paste the credential as refreshToken:clientId:clientSecret:blogId
10Click "Test Connection"
Blogger only allows publishing through OAuth2 — Google removed static-API-key write access, so there's no shortcut here. SEOVentra exchanges your refresh token for a fresh access token on every publish, so the connection keeps working indefinitely without you reconnecting. Blogger has no canonical URL field; JSON-LD schema is embedded directly in the post body instead, which Blogger preserves.
FAQ
Are my credentials stored securely?

Yes. All credentials — API keys, passwords, tokens — are encrypted with AES-256 before storage. They are never logged, never returned in API responses, and can be deleted from your dashboard at any time.

Can I connect multiple sites on the same CMS?

Yes. You can add multiple connections of the same type — for example, three different WordPress sites. Each connection is independent and can be selected per-article when publishing.

What happens if a publish fails?

You get a clear error message from the platform's own API response — nothing is silently swallowed. Your article stays in SEOVentra so you can fix the connection and retry.

Does publishing trigger IndexNow?

Yes — if you have IndexNow configured, a successful CMS publish automatically queues the new URL for IndexNow submission and GSC ping. No extra steps needed.

Can I publish to multiple platforms at once?

Not in a single click — you select one target per publish action. You can publish the same article to several platforms by publishing to each one in turn, which is exactly the point of the "Publish & distribute" platforms: get the same article indexed and cited from more than one place.

Do the "Publish & distribute" platforms apply canonical URLs and schema the same way my CMS does?

No, and SEOVentra doesn't pretend otherwise. DEV.to and GitHub Pages do set a real canonical URL back to your site. Blogger gets JSON-LD schema embedded in the post body. Tumblr, Telegra.ph, Mastodon, and LinkedIn have no canonical or schema fields at all — those publish a summary with a link back, not a duplicate of the full article. Every publish result tells you exactly what was and wasn't applied.

Jump to platform
WP WordPressGh GhostSh ShopifyWf WebflowMd MediumSu SubstackHn HashnodeWx WixDr DrupalWh WebhookD2 DEV.toWa Write.asTb TumblrTg Telegra.phMa MastodonGP GitHub PagesLi LinkedInBg Blogger

Ready to connect?

Set up your CMS connection in under 5 minutes. Then publish AI articles in one click.

Connect CMS →Content Engine
Other guides