# What is Generative Engine Optimization?
Source: https://docs.siftly.ai/concepts/geo-explained
Understand how GEO differs from traditional SEO and why it's the next frontier for brand visibility.
## The shift in search
For decades, ranking on Google meant optimizing for a crawler — a bot that read your HTML, indexed your keywords, and matched your page to search queries. SEO was about signals: backlinks, page speed, keyword density, structured data.
That model is changing fast.
AI-powered search engines like **ChatGPT**, **Perplexity**, **Google AI Overviews**, and **Microsoft Copilot** don't return a list of links. They generate an answer. When someone asks "What's the best tool for tracking brand mentions in AI?" — the AI reads, synthesizes, and responds. Your page either gets cited or it doesn't.
**Generative Engine Optimization (GEO)** is the discipline of ensuring your brand, content, and expertise are what AI models reach for when generating those answers.
***
## GEO vs. traditional SEO
| | Traditional SEO | Generative Engine Optimization |
| ----------------- | -------------------------- | ---------------------------------------- |
| **Target** | Search engine crawlers | AI language models |
| **Goal** | Rank on page 1 | Get cited in AI answers |
| **Metric** | Keyword rankings, clicks | Citations, share of voice |
| **Content focus** | Keyword density, backlinks | Authority, clarity, structured knowledge |
| **Measurement** | SERP position | Citation frequency, visibility score |
| **Competition** | 10 blue links | A single synthesized answer |
GEO doesn't replace SEO — it extends it. A well-optimized page that ranks well in traditional search often gets cited in AI results too. But the signals that drive AI citation are different enough that GEO deserves its own strategy.
***
## How AI models decide what to cite
AI search systems draw from two sources:
### 1. Training data
Large language models are trained on large corpora of text. Brands with strong, authoritative content published before and during training windows have a higher baseline presence.
### 2. Retrieval-Augmented Generation (RAG)
Most modern AI search tools retrieve live content at query time using semantic search. When a user asks a question, the AI fetches relevant documents from the web, then synthesizes an answer using those documents as grounding context.
**This is where GEO has the most leverage.** By optimizing your content for retrieval — clear entity definitions, structured answers, authoritative tone — you improve your odds of being retrieved and cited.
***
## The GEO playbook
Find the prompts and topics where your competitors are being cited but you're not. These are your highest-leverage opportunities.
Review existing pages for GEO signals: clear entity definitions, direct answers to common questions, structured data, and authoritative tone.
Publish content that directly answers the questions AI systems are asked. Structured formats (FAQs, listicles, comparisons) perform well in AI retrieval.
Monitor your citation rate and visibility score over time. GEO is iterative — what works changes as models are updated and competitors adapt.
***
## Key GEO metrics in Siftly
The percentage of AI responses to tracked prompts that include a mention or recommendation of your brand. Higher is better.
A composite score (0–100) combining citation frequency, sentiment, and competitive share of voice. Your headline metric for AI visibility.
Your brand's citation percentage relative to the total citations in your market. A brand cited in 30 out of 100 responses has 30% SOV for that topic.
How many of the prompts Siftly tracks for your market include your brand in the response. Low coverage = opportunity.
When your brand is cited alongside competitors in a single response, what position is it mentioned at? First mention carries more weight.
***
GEO is an emerging field and AI search platforms evolve rapidly. Siftly's analysis engine is continuously updated to reflect changes in how major AI systems retrieve and cite content.
# Brand Visibility
Source: https://docs.siftly.ai/features/brand-visibility
Understand your overall AI visibility score and track how your brand's presence in AI-generated search evolves over time.
## What is the Visibility Score?
The **Visibility Score** is Siftly's headline metric — a single number (0–100) that represents how prominent your brand is in AI-generated search results across your tracked topics.
It's calculated from:
* **Citation frequency** — How often your brand appears across all tracked prompts
* **Share of voice** — Your citations relative to total citations in your market
* **Sentiment weight** — Positive citations count more than neutral; negative citations reduce the score
* **Position bias** — Citations where your brand is mentioned first carry more weight
A score of **0** means your brand is never cited. A score of **100** would mean your brand appears positively and first in every tracked AI response — theoretical, but directionally useful.
***
## The Overview dashboard
The **Overview** page is your visibility command center. Here's what you'll find:
### Visibility Score card
Your current score with a trend indicator showing change vs. the previous period (week, month, or quarter — configurable).
### Visibility trend chart
A line chart showing your visibility score over time. Use this to:
* Correlate score changes with content you published
* Spot the impact of competitor activity
* Identify seasonal patterns in your market
### Citation breakdown
A breakdown of your citations by:
* **Platform** — Which AI platforms cite you most
* **Topic** — Which topics drive the most mentions
* **Sentiment** — The ratio of positive to neutral to negative
### Competitor comparison
See your visibility score plotted against your top competitors. This is your share-of-voice view — who's winning the AI search landscape in your market.
***
## Improving your visibility score
AI retrieval systems favor content that directly answers specific questions. Create pages structured as clear Q\&A, FAQs, and how-to guides around your high-opportunity prompts.
AI models form "knowledge" about brands from structured, consistent information across the web. Make sure your brand name, description, founding year, and category are consistent across your website, Wikipedia, LinkedIn, Crunchbase, and press coverage.
If your brand has abbreviations, former names, or product sub-brands, add them in **Settings → Brand → Aliases**. This ensures citations using alternate names are counted and attributed correctly.
Use Siftly's website crawling feature to index your brand's website into the RAG pipeline. This increases the chance that your content is retrieved when AI systems look for supporting sources.
Review negative citations in the Citations tab and identify the root cause. Often a single piece of content — a comparison page, an FAQ, or a case study — can shift the framing.
***
## Scheduled analysis and trend tracking
Your visibility score is only as useful as the cadence at which it's measured. Set up a **scheduled analysis** to track trends automatically:
* **Weekly** — Recommended for most brands; balances signal quality with change velocity
* **Daily** — For brands in fast-moving markets or during active content campaigns
* **Monthly** — For brands with lower publishing frequency or stable markets
Navigate to **Settings → Scheduled Analysis** to configure your schedule.
# Citation Analysis
Source: https://docs.siftly.ai/features/citation-analysis
Track every time your brand appears in AI-generated search responses and understand the full context of each mention.
## Overview
Citation Analysis is the core of Siftly's GEO platform. It continuously monitors how AI search engines — ChatGPT, Perplexity, Google AI Overviews, and others — respond to prompts in your market, and captures every mention of your brand.
For each citation, Siftly records:
* The exact prompt that triggered the response
* The full AI-generated response text
* Your brand's position in the response (first mention vs. secondary)
* Sentiment (positive, neutral, or negative)
* Which competitors were mentioned in the same response
* The platform the response came from
***
## How citation tracking works
Siftly maintains a library of prompts for each topic in your market. These are the questions real users ask AI systems: "What's the best tool for X?", "Compare A vs B", "How do I solve Y?". New prompts are continuously added as user behavior evolves.
At each analysis run, Siftly sends prompts to AI platforms and captures the full response. Queries are run across multiple platforms to give you cross-platform coverage.
Siftly's detection engine scans every response for your brand name, aliases, website URL, and product names. Fuzzy matching catches variations like abbreviations and common misspellings.
Each detected citation is enriched with sentiment analysis, competitive co-mentions, and position data, then stored in your brand's citation history.
***
## The Citations dashboard
Navigate to **Citations** in the sidebar to see all mentions of your brand.
### Filters
| Filter | Description |
| -------------- | ---------------------------------------------------------- |
| **Date range** | View citations from a specific time window |
| **Platform** | Filter by AI platform (ChatGPT, Perplexity, etc.) |
| **Topic** | Filter by the topic category the prompt belongs to |
| **Sentiment** | Show only positive, neutral, or negative citations |
| **Rank** | Filter by whether your brand was cited first, second, etc. |
### Citation cards
Each citation card shows:
* The prompt text
* A snippet of the AI response with your brand highlighted
* Sentiment badge and position indicator
* Competitors co-cited in the same response
* Timestamp and platform
Click any citation to expand the full response text.
***
## Sentiment analysis
Siftly classifies each citation as:
The AI response recommends, praises, or ranks your brand favorably. Example: *"Siftly is widely regarded as the leading GEO platform for enterprise teams."*
Your brand is mentioned factually without a clear positive or negative framing. Example: *"Tools in this space include Siftly, BrandX, and CompanyY."*
The AI response includes a criticism, limitation, or comparison that frames your brand unfavorably. These are your highest-priority items to address through content.
Negative citations aren't always bad — being mentioned alongside better-known competitors is still brand presence. Focus on the context, not just the label.
***
## Competitive co-mentions
When your brand appears in the same AI response as a competitor, Siftly records the relationship. Over time, this data shows you:
* Which competitors are most frequently cited alongside you
* Whether you're typically ranked above or below them
* Which topics trigger competitor mentions without including you
Use this data to identify where competitors have stronger GEO footing and target those gaps with content.
***
## Export
Export your citation data from the Citations page:
* **CSV** — Full citation export with all metadata fields
* **PDF report** — Formatted citation summary for sharing with stakeholders
# Content Generation
Source: https://docs.siftly.ai/features/content-generation
Generate GEO-optimized content grounded in your brand's data, with automatic citations and internal links.
## Overview
Siftly's content generation engine turns your GEO analysis into actionable content. Instead of starting from a blank page, you start from data — the exact prompts where you have citation gaps, the competitors outranking you, and the questions your audience is asking AI systems.
Generated content is:
* Grounded in your brand's website and published materials (via RAG)
* Structured to maximize AI retrieval and citation likelihood
* Annotated with internal links to your existing content
* Ready to publish or export to your CMS
***
## Creating content from a gap
The fastest path to GEO content is directly from a citation gap:
1. Go to **Rankings → \[Topic] → Gaps**
2. Click any prompt where you don't appear
3. Click **Generate Content for this Prompt**
Siftly will generate a content brief and a full draft optimized for that specific query, drawing on your indexed website content and brand profile.
***
## The content editor
The content editor gives you a full draft with:
### Suggested title and meta
An H1 and meta description optimized for both traditional SEO and AI retrieval.
### Body content
Structured content (headings, lists, Q\&A sections) that directly addresses the target prompt. GEO-optimized content tends to be specific, authoritative, and directly answerable.
### Brand citations
References to your own brand, products, and case studies pulled from your indexed website content. These ground the content in your specific expertise rather than generic information.
### Internal links
Suggested links to existing pages on your website that are semantically related. Internal linking strengthens topical authority signals for both traditional SEO and AI retrieval.
### Competitor differentiation
Where relevant, the generator identifies opportunities to contrast your approach against competitors — without being explicitly comparative in a way that could read as defensive.
***
## Website indexing for RAG
Content generation quality improves significantly when Siftly has indexed your website. Indexing allows the generator to pull specific facts, case studies, and product details from your actual content rather than relying on generic knowledge.
To index your website:
1. Go to **Settings → Website Crawling**
2. Enter your domain URL
3. Click **Start Crawl**
Siftly will crawl and index your website using semantic chunking. Indexing typically takes 10–30 minutes for most websites.
Re-index your website whenever you publish significant new content. Siftly doesn't auto-crawl — trigger a new crawl manually or set up a scheduled crawl to keep the index fresh.
***
## Exporting content
Once you're happy with a draft, export it to your publishing workflow:
| Format | Use case |
| ------------ | ----------------------------------------------------- |
| **Markdown** | Paste into any CMS that accepts Markdown |
| **HTML** | Copy into a page builder or WYSIWYG editor |
| **DOCX** | Share with stakeholders or hand off to a content team |
| **PDF** | Archive or present to clients |
Or use one of Siftly's native **CMS integrations** to push content directly to WordPress, Ghost, Webflow, Strapi, Sanity, Wix, or Framer. See [CMS Integrations →](/integrations/overview)
***
## Content versioning
Every draft is versioned. Use the **Compare** view to see a side-by-side diff between versions:
* Track edits made after generation
* Compare performance of different content approaches over time
* Restore a previous version if needed
# Rankings & Share of Voice
Source: https://docs.siftly.ai/features/rankings
See where you stand versus competitors for every topic in your market and track your share of AI search presence.
## Overview
The Rankings feature answers the competitive question at the heart of GEO: **when AI systems respond to prompts in your market, who gets cited, in what order, and how often?**
Siftly tracks this across every topic you monitor and surfaces it as structured leaderboards and share-of-voice metrics.
***
## Leaderboards
Navigate to **Rankings** to see the competitive leaderboard for your market.
Each leaderboard row shows a brand with:
* **Visibility score** — Their composite AI visibility for this topic
* **Citation rate** — Percentage of tracked prompts that include them
* **Average rank** — Their average position when cited (lower = better)
* **SOV %** — Their share of all citations in this topic
* **Trend** — Change vs. the previous period
Your brand is always highlighted. Use the topic selector to switch between the topics you're tracking.
Sort the leaderboard by **Citation Rate** to find who's being cited most frequently. Sort by **Average Rank** to see who gets the top-of-response position. These tell different stories.
***
## Share of Voice (SOV)
Share of Voice answers: **of all brand citations in my market, what percentage belong to me?**
If AI systems produce 1,000 brand citations across tracked prompts, and your brand appears in 220 of them, your SOV is 22%.
SOV is a zero-sum metric — if your SOV goes up, someone else's goes down. Track it over time to see whether you're gaining or losing ground relative to your market.
### SOV by topic
Break down your share of voice by topic to find where you're overperforming and where you have gaps:
* Topics where your SOV is **above** your overall average are strengths to maintain
* Topics where your SOV is **below** your average are gaps to close with targeted content
***
## Prompt-level analysis
Drill into any topic to see a prompt-by-prompt breakdown of who was cited for each individual query.
This view shows you:
* The exact AI prompt
* Which brands appeared in the response
* The order they were mentioned
* Whether your brand was present at all
**Prompts where you don't appear** are your most direct content opportunities. Siftly surfaces these as **"Gaps"** — click any gap to get AI-generated content recommendations for that specific prompt.
***
## Tracking competitors
Siftly automatically detects competitors from your market category. You can also manually add competitors:
1. Go to **Settings → Competitors**
2. Click **Add Competitor**
3. Enter the brand name and website URL
Once added, the competitor will appear in all leaderboards, SOV charts, and prompt-level breakdowns on the next analysis run.
Competitor data reflects what AI systems say about them — Siftly doesn't have access to their internal analytics. Treat competitor metrics as AI-perceived reputation, not ground-truth performance data.
# Introduction
Source: https://docs.siftly.ai/index
Welcome to Siftly — the Generative Engine Optimization platform that puts your brand in front of AI.
## What is Siftly?
Siftly is a **Generative Engine Optimization (GEO)** platform that helps brands understand and improve how they appear in AI-generated search results — from ChatGPT and Perplexity to Google AI Overviews and beyond.
As search shifts from ten blue links to AI-generated answers, the brands that win are the ones that AI systems actively cite, recommend, and reference. Siftly gives you the data and tools to become one of them.
## Why GEO matters
Traditional SEO optimizes for search engine crawlers. GEO optimizes for AI language models. When a user asks an AI assistant "What's the best project management tool?" — the AI doesn't scroll through results. It synthesizes an answer from the content it was trained on and the sources it can retrieve.
**Siftly answers the questions that matter:**
* Is my brand being cited in AI responses?
* Which topics and prompts surface my competitors instead of me?
* How is my share of voice trending over time?
* What content should I publish to increase my AI visibility?
## Core capabilities
Track every time your brand is mentioned, cited, or recommended in AI-generated responses across the most popular AI search platforms.
Measure your overall AI visibility score and see how it changes week over week as you publish new content and optimize existing pages.
See exactly where you rank versus competitors for any topic or search prompt. Understand your share of voice in your market.
Generate SEO and GEO-optimized content backed by your brand's data, with automatic citation integration and internal linking.
## Who is Siftly for?
Siftly is built for teams that need to stay visible as search evolves:
* **Marketing teams** tracking brand presence in AI-generated answers
* **SEO specialists** expanding their strategy from traditional search to generative AI
* **Content strategists** identifying gaps and opportunities in AI citation coverage
* **Agencies** managing GEO for multiple brands and clients
## How it works
```mermaid theme={null}
flowchart LR
A[Connect Your Brand] --> B[Run Citation Analysis]
B --> C[Track Visibility & Rankings]
C --> D[Generate Optimized Content]
D --> B
```
1. **Connect your brand** — Add your company name, website, and relevant topics
2. **Analyze** — Siftly queries AI models with hundreds of prompts relevant to your market
3. **Monitor** — Track citations, rankings, and visibility trends on your dashboard
4. **Optimize** — Use AI-assisted content generation to close gaps and increase citations
***
Ready to get started? [Set up your first brand →](/quickstart)
# Duda Integration
Source: https://docs.siftly.ai/integrations/duda
Publish GEO-optimized content from Siftly to your Duda website via Zapier.
## Overview
This guide walks you through connecting Siftly to Duda using Zapier as a bridge. After following it, you'll be able to publish GEO-optimized content from Siftly directly to your Duda blog with a single click.
**Difficulty:** ✅ Non-tech friendly — no coding required. Setup takes about 10 minutes.
Duda's direct API requires an enterprise-tier plan. Zapier is the only automation platform with a native Duda "Create Blog Post" action, so Siftly uses a Zapier webhook to bridge the connection. One Zapier account can handle all your Duda sites.
***
## How it works
When you click **Publish → Duda** in Siftly, it sends your article (title, body, description, author, site name) to a Zapier webhook URL.
Your Zap receives the data and uses Duda's "Create Blog Post" action to create the post on your Duda site.
The blog post is created on your Duda website. You can edit slug, tags, and SEO fields in the Duda editor if needed.
***
## Prerequisites
Before starting, you'll need:
* A **Duda** website with a blog enabled (Agency plan or higher)
* A **Zapier Pro** account (\$30/month — [start a 14-day free trial](https://zapier.com/app/pricing))
* About 10 minutes for the one-time setup
Zapier Pro is required because the "Webhooks by Zapier" trigger is a premium feature. One Zapier Pro account covers **all** your Duda sites — no per-site cost.
***
## Step 1: Create a Zap in Zapier
Log in to [zapier.com](https://zapier.com/app/zaps) and click **Create Zap**.
1. Search for **"Webhooks by Zapier"** as the trigger app
2. Choose **"Catch Hook"** as the trigger event
3. Click **Continue** — no configuration needed
4. Zapier shows your webhook URL:
```
https://hooks.zapier.com/hooks/catch/123456/abcdef/
```
5. **Copy this URL** — you'll paste it into Siftly in Step 2
6. Click **Continue** (skip the test for now — Siftly will send test data when you connect)
1. Click the **+** to add an action step
2. Search for **"Duda"** and select it
3. Choose **"Create Blog Post"** as the action event
4. Click **Continue**
5. Click **Connect Account** — a Duda login popup opens
6. Log in with your **Duda Agency credentials**
7. Authorize Zapier and click **Continue**
Zapier shows the Duda blog post fields. Map them to the webhook data:
| Duda Field | Select from trigger |
| -------------------------- | ---------------------------------------------------------------------------------------------- |
| **Site Name** (required) | Select `site_name` from the dropdown — OR hardcode your site name (e.g., `www.srgaglobal.com`) |
| **Title** (required) | Select `title` |
| **Description** (required) | Select `description` |
| **Content** (required) | Select `content` |
| **Author** (optional) | Select `author_name` |
| **Thumbnail** | Leave empty |
| **Main Image** | Leave empty |
**Multi-site tip:** Map **Site Name** to the `site_name` field from the webhook data instead of hardcoding it. This way, one Zap handles all your Duda sites — Siftly sends the correct site name with each publish.
The webhook fields may not appear in the dropdown until Zapier receives at least one payload. Complete Step 2 first (connect Siftly), then come back to Zapier and re-map the fields.
Click **Publish** to activate the Zap. It's now waiting for data from Siftly.
***
## Step 2: Connect Duda in Siftly
1. In Siftly, go to **Settings → Integrations**
2. Click **Connect** next to **Duda**
3. Paste the **Zapier webhook URL** from Step 1
4. Enter your **Duda Site Name** (e.g., `www.srgaglobal.com`) — this is sent with each publish so the Zap knows which site to create the post on
5. Optionally enter your **Blog Base URL** (e.g., `https://www.yoursite.com/blog`) — used to show the published post link in Siftly
6. Click **Connect Duda**
Siftly sends a test payload to verify the webhook is active. If your Zap is turned on, you'll see a success confirmation.
After connecting, go back to Zapier and edit your Zap's action step — the webhook fields (title, content, description, site\_name, author\_name) will now appear in the mapping dropdowns.
***
## Step 3: Publish from Siftly
1. Open any content piece in Siftly's content editor
2. Click **Publish → Duda**
3. Click **Publish**
Siftly sends the content to Zapier, which creates the blog post in Duda within seconds.
***
## Multiple Duda sites
One Zapier Pro account handles all your client sites:
**Option A — One Zap for all sites (recommended):**
* Map the **Site Name** field in Zapier to `site_name` from the webhook
* Each Siftly org stores its own Duda site name
* One Zap dynamically routes to the correct site
**Option B — One Zap per site:**
* Create separate Zaps for each site, each with its own webhook URL
* Hardcode the site name in each Zap's Duda action
* Each Siftly org connects with its site-specific webhook URL
***
## Fields sent to Duda
Siftly sends these fields automatically on every publish:
| Field | Description |
| ------------- | -------------------------------------------- |
| `site_name` | Your Duda site name (for multi-site routing) |
| `title` | Article title |
| `content` | Full HTML body |
| `description` | Meta description / excerpt |
| `author_name` | Content author |
Duda's Zapier action does not support slug/path, meta title, tags, or draft/published status control. Posts are created with Duda's default settings. Edit slug, tags, and SEO fields directly in the Duda editor after publishing.
***
## Troubleshooting
Your Zap may not be turned on. Go to Zapier → your Zap → check it shows **ON** (green). If you just created it, click **Publish** to activate.
Check Zapier's **Zap History** (Zapier → your Zap → History tab). If the trigger fired but the action failed, common causes:
* Duda account disconnected in Zapier — reconnect it
* Site not selected — edit the Zap and hardcode or map the site name
* Field mapping is empty — re-map the fields after Siftly sends a test payload
Zapier needs at least one webhook payload to detect the field structure. Connect Siftly first (sends a test), then go back to Zapier → edit the action → fields will now appear.
Go to Siftly → **Settings → Integrations → Duda** → **Disconnect**, then reconnect with the new webhook URL.
No. One Zapier Pro account (\$30/month) covers all your Duda sites. Use the `site_name` field to route content to the correct site dynamically.
***
## Difficulty & setup recap
| Aspect | Rating |
| ---------------------- | -------------------------------------------------- |
| **Initial setup** | ✅ Easy — paste a webhook URL, no coding |
| **Zapier setup** | ⚠️ One-time 10-minute setup + Zapier Pro (\$30/mo) |
| **Ongoing publishing** | ✅ Easy — one-click publish from Siftly |
| **Multiple sites** | ✅ One Zap handles all sites via `site_name` |
| **JSON-LD** | ❌ Not supported via Duda's Zapier action |
| **Developer needed?** | No |
***
## Related
Compare all supported platforms and the unified field mapping system.
Set up your brand and run your first GEO analysis.
How Siftly generates GEO-optimized content and recommendations.
Our guide to picking the right CMS for GEO optimization.
# Framer Integration
Source: https://docs.siftly.ai/integrations/framer
Connect Siftly to your Framer site and publish GEO-optimized content directly to your Framer CMS collections.
## Overview
This guide is for Framer users who want to publish Siftly-generated content and apply GEO/SEO recommendations (meta tags, JSON-LD, keywords) to their Framer site. After following it, you'll know how to connect Siftly, map CMS fields, and add structured data to your pages.
**Difficulty:** ⚠️ Some technical setup — SEO fields are visual, but JSON-LD and dynamic structured data require custom code injection.
Framer is a visual website builder with a built-in CMS. The Siftly–Framer integration lets you create content in Siftly's editor and publish it directly to a Framer CMS collection using the unified 3-tier field mapping system — no copy-pasting required.
This is especially useful for teams that manage blog posts, landing pages, or resource libraries in Framer and want to keep their publishing workflow inside Siftly.
***
## Prerequisites
Before connecting, you'll need:
* A Framer site with a **CMS collection** already created (e.g., a "Blog" collection)
* A Framer account with **Editor** or **Owner** permissions
* Your Framer **API token** (see below)
* Your Framer **Project ID**
***
## Step 1: Get your Framer credentials
### API Token
1. Open your Framer project
2. Click the **Project Settings** gear icon (top-right)
3. Go to **Integrations -> API**
4. Click **Generate Token** and copy the token
### Project ID
Your Project ID is visible in the project URL or in Project Settings. It looks like a long alphanumeric string.
Treat your Framer API token like a password. Anyone with the token can create and modify content in your Framer CMS. Store it securely and never share it publicly.
***
## Step 2: Connect Framer in Siftly
1. In Siftly, go to **Settings -> Integrations**
2. Click **Connect** next to **Framer**
3. Enter your:
* API Token
* Project ID
* Blog Base URL (optional — for building published URLs)
4. Click **Verify Connection**
Siftly connects to your Framer project via the SDK and **automatically discovers all CMS collections**. You'll select which collection to use in the next step.
***
## Step 3: Schema Mapping
### Collection Selection
After credentials are validated, Siftly shows a **dropdown of all CMS collections** discovered from your Framer project. Select the collection you want to publish to (e.g., "Blog Posts").
When you select a collection, Siftly fetches its field schema and presents them for mapping.
### Field Mapping
Select fields from the dropdown for each mapping:
#### Required Fields
| Siftly Field | Description | Notes |
| ------------ | ------------------------------------ | -------------------------------------- |
| **Title** | The page or post title (H1) | Map to your collection's title field |
| **Slug** | URL-friendly version of the title | Map to your collection's slug field |
| **Body** | Full body content (rich text / HTML) | Map to your collection's content field |
#### Optional Fields
Leave any of these blank to skip them. When mapped, they are auto-populated from your content data.
| Siftly Field | Suggested Framer Field Type | Notes |
| -------------------- | ---------------------------- | ------------------------- |
| **Meta Title** | Plain Text | SEO page title |
| **Meta Description** | Plain Text | SEO description / excerpt |
| **Keywords** | Plain Text (comma-separated) | Target keywords |
| **Categories** | Plain Text (comma-separated) | Content categories |
| **JSON-LD** | Plain Text (long) | Structured data markup |
| **Word Count** | Number | Total word count |
| **Hero Image** | Image | Featured image |
#### JSON-LD Type Toggle
When a JSON-LD field is mapped, a **text/json** toggle appears:
* **json** (default): Sends as a parsed JSON object
* **text**: Sends as a serialized JSON string
For Framer, **text** is typically the right choice since Framer fields are usually plain text.
If your Framer collection has different field names (e.g., `headline` instead of `title`), select the correct field from the dropdown.
***
## Custom Fields
Add extra fields your Framer collection requires that aren't part of Siftly's standard content schema.
### Field Types
| Type | Description | Example |
| ------- | ---------------------------- | --------------------------------- |
| String | Plain text | Author name, subtitle |
| Number | Numeric value | Priority, reading time |
| Boolean | True/false | Featured post, comments enabled |
| JSON | Structured object | SEO config, social media metadata |
| Select | Pick from predefined options | Category, status, content type |
### Select Options with Separate Labels and Values
When adding a **Select** custom field, you define the available options in a textarea. Each option can have a separate **value** (sent to CMS) and **label** (shown in the dropdown):
```
value:label
```
**Example — Labels differ from values:**
```
1:Health
2:Tech
3:Food
4:Fashion
```
The dropdown shows `Health`, `Tech`, etc., but Siftly sends `1`, `2`, etc. to the CMS API.
**Example — Labels same as values:**
```
food
tech
health
fashion
```
When no `:` is present, the option text is used as both the label and value. This is backward-compatible with existing configurations.
Use the `value:label` format when your CMS expects specific IDs, slugs, or enum values that differ from the human-readable names shown to content editors.
### Use Existing Field (Source Fields)
Link a custom field to auto-populate from existing content data:
* **Title**, **Slug**, **Meta Title**, **Meta Description**, **Excerpt**
* **Keywords**, **Categories**, **Word Count**
* **JSON-LD**, **Hero Image**
* **Date Published**, **Date Modified** (from JSON-LD graph)
### Editing Custom Fields
Click the **pencil icon** on any existing custom field to edit its configuration inline.
***
## Publishing
### Draft vs Published
When publishing, choose between:
* **Draft** — content appears in your Framer CMS collection as a draft item for review
* **Published** — content is created and published to your live Framer site
### Custom Fields at Publish Time
Fields with **Use Existing Field** show as "Auto-populated from \[source]" in the publish dialog — no input needed. Manual custom fields appear pre-filled and editable.
Standard fields (title, slug, body, meta data, keywords, categories, JSON-LD, word count) are auto-populated from your content — no manual input needed.
***
## Updating existing items
By default, each publish from Siftly creates a **new** CMS item in Framer. To update an existing item instead:
1. In the Siftly content editor, click **Publish -> Framer -> Advanced**
2. Toggle **Update existing item**
3. Paste the **Framer item ID** of the item you want to update
***
## Troubleshooting
Your API token is invalid or expired. Regenerate the token in Framer's Project Settings and update it in Siftly.
Make sure your Framer project has at least one CMS collection created. The collection must exist before connecting.
Check the Framer CMS panel for the item in **Drafts**. If published with Draft status, it won't be live.
If a required field isn't mapped, the publish will fail. Ensure all required fields are mapped via the dropdown or have a default value set.
Ensure you're on the latest version. Source fields are auto-populated server-side — no user input needed.
***
## Where to apply Siftly's recommendations on Framer
Framer has visual SEO settings for basic meta fields, plus a custom code feature for advanced structured data. Here's where each field lives.
### Meta Title
**Location:** CMS item → **SEO** tab → **Title** field
When you open a CMS item in Framer's editor, the SEO tab shows the page title. This renders as the `
` tag.
**Via Siftly:** If you create a plain text field in your CMS collection (e.g., `meta-title`) and map Siftly's **Meta Title** to it, you can then bind that CMS field to the page's SEO Title in Framer's page settings.
To bind a CMS field to the SEO title:
1. Open your CMS template page
2. Go to **Page Settings → SEO**
3. Click the variable icon (⚡) next to the Title field
4. Select your `meta-title` CMS field
### Meta Description
**Location:** CMS item → **SEO** tab → **Description** field
Same binding approach as meta title — create a CMS field, map it in Siftly, then bind it in Framer's page settings.
### Open Graph Image
**Location:** CMS item → **SEO** tab → **Social Image**
Framer uses the page's designated social image for OG tags. You can bind a CMS **Image** field to the social image slot.
Siftly does not push image files to Framer. After publishing, upload your OG image to the CMS item in Framer's editor, or set a default social image in the page template.
### Canonical URL
Framer auto-generates canonical URLs for all pages. No override is available via the CMS — it always points to the page's own URL.
### Tags & Categories
Framer doesn't have a native tag/category taxonomy. Use a **Plain Text** CMS field with comma-separated values.
Siftly pushes keywords as a comma-separated string to whatever plain text field you map.
### JSON-LD Structured Data
Framer does NOT auto-generate JSON-LD. You must add it manually.
**For static JSON-LD (same schema on all pages of a template):**
1. Open your CMS template page in Framer
2. Click **Page Settings → Custom Code → Head**
3. Paste the JSON-LD:
```html theme={null}
```
**For dynamic JSON-LD (unique per CMS item):**
Framer's custom code injection does NOT support CMS field variables. You cannot dynamically insert CMS field values into the Head code section. This means per-page dynamic JSON-LD is extremely limited in Framer.
**Workaround — Store JSON-LD in a CMS field and render via code component:**
1. Create a `json-ld` plain text (long) CMS field in your collection
2. Map Siftly's **JSON-LD** field to this CMS field
3. Create a Framer **Code Component** that reads the CMS field and renders it:
```tsx theme={null}
// Framer Code Component
import { useEffect } from "react";
export default function JsonLdInjector({ jsonLd }: { jsonLd?: string }) {
useEffect(() => {
if (!jsonLd) return;
const script = document.createElement("script");
script.type = "application/ld+json";
script.textContent = jsonLd;
document.head.appendChild(script);
return () => { document.head.removeChild(script); };
}, [jsonLd]);
return null;
}
```
4. Place this code component on your CMS template page and connect the `jsonLd` prop to your CMS field.
Client-side injected JSON-LD (via JavaScript) may not be reliably crawled by all search engines. Google generally processes it, but some AI crawlers may not execute JavaScript. For maximum GEO impact, static head injection is preferred — but Framer's limitations make this difficult for dynamic content.
### Keywords
Framer does not render a `` tag natively. Store keywords in a CMS field for internal organization. If you need a keywords meta tag, use the same code component approach to inject it.
***
## Pushing Siftly recommendations automatically
Siftly produces your article plus meta title, meta description, keywords, and JSON-LD.
Select your collection. Choose Draft or Published status.
All mapped fields (title, slug, body, meta title, meta description, keywords, JSON-LD, word count) are sent in a single call. The CMS item is created with all text fields populated.
Open the CMS item in Framer. Verify SEO fields are bound correctly in the template. Publish the site if changes are pending.
***
## Platform-specific quirks & limitations
**Dynamic JSON-LD is severely limited.** Framer's Custom Code → Head section does NOT support CMS field variables. Per-page JSON-LD requires a code component that injects via JavaScript — which may not be reliably crawled by all AI engines.
**No server-side rendering for code components.** Framer renders code components client-side. JSON-LD injected via code components is NOT in the initial HTML response — it requires JavaScript execution. This reduces reliability for AI crawlers.
**CMS plan required.** Framer's CMS feature requires at least the **Mini** plan (or higher). Free plans do not include CMS collections.
* **SEO field binding:** Framer's SEO title and description can be bound to CMS fields, but you must set this up manually in the Framer Designer. Siftly pushes to the CMS field — Framer's template bindings render it.
* **No categories/tags taxonomy:** Framer has no built-in taxonomy. Use plain text fields with comma-separated values.
* **Publishing delay:** After creating a CMS item via API, Framer may need a site publish to reflect the change on your live domain.
* **Image handling:** Framer CMS supports image fields, but Siftly cannot upload images via API. Upload images manually in Framer.
* **Rich text limitations:** Framer's rich text field supports standard formatting but may strip unsupported HTML elements (tables, custom embeds).
***
## Validating the setup
After publishing your first CMS item from Siftly:
Open your Framer project → CMS → find the new item. Verify all fields (title, body, meta fields, JSON-LD) are populated.
Click the CMS item and preview the rendered page in Framer. Check that the SEO title and description appear in the page settings.
After publishing the site, open the live page. Right-click → **View Page Source**. Search for:
* `` — should contain your meta title
* `` — should contain your JSON-LD (if using static head code or code component)
Go to [Google Rich Results Test](https://search.google.com/test/rich-results) and paste your page URL.
Go to [Schema.org Validator](https://validator.schema.org/) for additional validation.
***
## Difficulty & setup recap
| Aspect | Rating |
| ----------------------- | ------------------------------------------------------------------------------------------------ |
| **Initial setup** | ⚠️ Medium — API token + collection setup + field binding |
| **Applying SEO fields** | ✅ Easy for meta title/description (visual binding) |
| **JSON-LD** | ❌ Hard — static only in Head code; dynamic requires code component with JS-injection limitations |
| **Ongoing editing** | ✅ Easy — publish from Siftly, items appear in Framer CMS |
| **Developer needed?** | For JSON-LD code component — not for basic meta fields |
***
## Related
Compare all supported platforms and the unified field mapping system.
Set up your brand and run your first GEO analysis.
How Siftly generates GEO-optimized content and recommendations.
Our guide to picking the right CMS for GEO optimization.
# Ghost Integration
Source: https://docs.siftly.ai/integrations/ghost
Publish GEO-optimized content from Siftly directly to your Ghost blog using the Ghost Admin API.
## Overview
This guide is for Ghost users who want to publish Siftly-generated GEO content and apply Siftly's SEO/GEO field recommendations. After following it, you'll be able to push optimized content to Ghost and understand where each meta field lives in the platform.
**Difficulty:** ✅ Non-tech friendly — Ghost has built-in SEO fields, no plugins needed.
Ghost is an open-source publishing platform built for professional blogs and newsletters. The Siftly–Ghost integration connects to your Ghost site via the **Ghost Admin API** and publishes content directly — either as a live post or a draft — using the unified 3-tier field mapping system.
This integration is ideal for teams running Ghost-powered blogs who want to close the loop between SEO/GEO analysis and content execution inside a single workflow.
***
## Prerequisites
Before connecting, you'll need:
* A Ghost site (Ghost Pro or self-hosted Ghost 5.x+)
* **Admin** access to your Ghost dashboard
* A **Custom Integration** created in Ghost (see Step 1)
The Ghost Admin API is available on all Ghost plans, including Ghost Pro and self-hosted installations. There is no plan restriction.
***
## Step 1: Create a Custom Integration in Ghost
Ghost uses **Custom Integrations** to generate API credentials for third-party tools like Siftly.
1. Log in to your Ghost Admin dashboard (e.g., `https://yoursite.ghost.io/ghost`)
2. Go to **Settings** (bottom-left gear icon)
3. Click **Integrations**
4. Scroll to the bottom and click **Add custom integration**
5. Give it a name — e.g., **Siftly**
6. Click **Create**
After creation, Ghost displays four pieces of information. You need **two** of them:
| Field | Where to find it | Example |
| ----------------- | -------------------------------- | ------------------------------------ |
| **Admin API key** | Shown under the integration name | `69d9c7eeb369ab00013a5f2b:dde97d...` |
| **API URL** | Shown below the Admin API key | `https://yoursite.ghost.io` |
The **Admin API key** grants full read/write access to your Ghost site, including image uploads to the Ghost media library — treat it like a password. Never share it publicly or commit it to source control. Siftly encrypts and stores it securely at rest.
The Admin API includes image upload access. Siftly uploads hero images and inline content images to Ghost's media library automatically at publish time — no additional configuration needed.
The Admin API key is in the format `id:hex_secret` separated by a colon. Copy the entire string including both parts.
***
## Step 2: Connect Ghost in Siftly
1. In Siftly, go to **Settings → Integrations**
2. Under **CMS Integrations**, click **Ghost**
3. Enter your:
* **API URL** — the base URL of your Ghost site (e.g., `https://yoursite.ghost.io`)
* **Admin API key** — the full `id:hex_secret` string copied from Ghost
* **Blog Base URL** *(optional)* — the public-facing URL of your blog (e.g., `https://mycompany.com/blog`)
4. Click **Connect Ghost**
Siftly validates your credentials by making a test call to the Ghost Admin API. If validation succeeds, you'll see the **Connected** screen with your site URL confirmed.
If your Ghost site is on a custom domain (e.g., `https://blog.mycompany.com`), use that as the API URL — not the `.ghost.io` subdomain, unless that's your primary domain.
### Blog Base URL (optional)
The **Blog Base URL** field lets you set the public-facing domain for your blog, separate from the Ghost Admin API URL. This is useful when:
* Your Ghost instance is hosted at `yoursite.ghost.io` but your public blog lives at `mycompany.com/blog`
* You want Siftly to track and display the correct canonical post URL after publishing
When set, Siftly builds the published post URL as:
```
{Blog Base URL}/{slug}/
```
For example, if your Blog Base URL is `https://mycompany.com/blog` and your post slug is `intro-to-geo`, the tracked URL will be `https://mycompany.com/blog/intro-to-geo/`.
If left blank, Siftly uses the post URL returned directly by the Ghost API.
***
## How Ghost authentication works
Ghost's Admin API does not accept plain API keys in HTTP headers. Instead, it requires a **short-lived JWT token** signed from your Admin API key on every request. Siftly handles this automatically:
1. When you publish, Siftly splits your Admin API key into its `id` and `hex_secret` parts
2. It generates a JWT token signed with **HS256** using `bytes.fromhex(hex_secret)` as the signing key
3. The JWT carries a 5-minute expiry (`exp = iat + 300`) and the audience claim `"/admin/"`
4. Each request uses a freshly generated token — no token caching or refresh needed
This is handled entirely server-side. Your Admin API key never leaves Siftly's backend after being saved.
***
## Field Mapping
Ghost uses the unified 3-tier field mapping system. Ghost's built-in fields have fixed API names, so the required fields are pre-configured.
### Required Fields
| Siftly Field | Ghost Post Field | Notes |
| ------------ | ---------------- | --------------------------------------------- |
| **Title** | `title` | Pre-configured — Ghost's built-in title field |
| **Slug** | `slug` | Pre-configured — Ghost's built-in slug field |
| **Body** | `html` | Pre-configured — sent via `?source=html` |
### Optional Fields
When mapped, these are auto-populated from your content data.
| Siftly Field | Ghost Post Field | Notes |
| -------------------- | ---------------- | ------------------------------------------ |
| **Meta Title** | `meta_title` | SEO page title |
| **Meta Description** | `custom_excerpt` | Truncated to 300 characters |
| **Keywords** | `tags` | Up to 10 tags, created if they don't exist |
| **Categories** | — | Not natively supported by Ghost |
| **JSON-LD** | — | Not natively supported by Ghost |
| **Word Count** | — | Not natively supported by Ghost |
Ghost has a fixed post schema — you map optional fields to the available Ghost post fields. Fields marked with "—" are not supported by Ghost's API and will be skipped.
### HTML content handling
Siftly wraps the post body in Ghost's **HTML card** comments before sending:
```html theme={null}
```
This preserves your HTML exactly as Siftly generated it, preventing Ghost's Lexical editor from modifying headings, lists, links, or custom formatting during the conversion process.
***
## Custom Fields
Add extra fields your Ghost posts require that aren't part of Siftly's standard content schema. Custom fields are sent as additional properties in the Ghost API payload.
### Field Types
| Type | Description | Example |
| ------- | ---------------------------- | --------------------------------- |
| String | Plain text | Author name, subtitle |
| Number | Numeric value | Priority, reading time |
| Boolean | True/false | Featured post, comments enabled |
| JSON | Structured object | SEO config, social media metadata |
| Select | Pick from predefined options | Category, status, content type |
### Select Options with Separate Labels and Values
When adding a **Select** custom field, you define the available options in a textarea. Each option can have a separate **value** (sent to CMS) and **label** (shown in the dropdown):
```
value:label
```
**Example — Labels differ from values:**
```
1:Health
2:Tech
3:Food
4:Fashion
```
The dropdown shows `Health`, `Tech`, etc., but Siftly sends `1`, `2`, etc. to the CMS API.
**Example — Labels same as values:**
```
food
tech
health
fashion
```
When no `:` is present, the option text is used as both the label and value. This is backward-compatible with existing configurations.
Use the `value:label` format when your CMS expects specific IDs, slugs, or enum values that differ from the human-readable names shown to content editors.
### Default Values
Set a default value when adding a custom field. This value pre-fills at publish time — you can override it for each post.
### Use Existing Field
Instead of setting a manual default, you can link a custom field to an existing content field. For example, map Ghost's `og_description` field to use the same value as **Meta Description**.
This is useful when your Ghost setup has multiple fields that should contain the same data (e.g., `custom_excerpt` and `og_description` both using your meta description).
***
## Publishing
### Draft vs Published
When publishing, choose between:
* **Draft** — content is pushed to Ghost as a draft post for review in Ghost Admin
* **Published** — the post is created and immediately published to your live site
### Custom Fields at Publish Time
If you've defined custom fields, they appear in the publish dialog pre-filled with their default values (or auto-filled from linked fields). You can edit them before publishing.
Standard fields (title, slug, body, meta data, keywords) are auto-populated from your content — no manual input needed.
***
## After publishing
Once published, the post appears on your Ghost site (immediately if you chose Published, or in Ghost Admin drafts if you chose Draft). From Siftly you can:
* **View the post** — click the published URL link in the content editor
* **Track performance** — the post URL is saved to Siftly for citation and visibility analysis
To make further edits, go to your Ghost Admin dashboard → **Posts** → find the post and edit it in Ghost's editor.
Siftly does not support updating an existing Ghost post. Each publish creates a new post. To revise published content, edit it directly in Ghost Admin.
***
## Where to apply Siftly's recommendations on Ghost
Ghost has built-in SEO fields on every post — no plugins required. Here's where each field lives and how Siftly's recommendations map to them.
### Meta Title
**Location:** Post editor → click the gear icon (⚙️) → **Meta data → Meta title**
Ghost renders this as the `` tag and OG title. If left empty, Ghost uses the post title.
Siftly auto-pushes the meta title to Ghost's `meta_title` field when you map it in your integration settings.
### Meta Description
**Location:** Post editor → gear icon (⚙️) → **Meta data → Meta description**
Ghost renders this as `` and `og:description`. If left empty, Ghost auto-generates an excerpt from the first 500 characters of your post.
Siftly maps this to `custom_excerpt` by default, which Ghost uses as both the visible excerpt and the meta description.
### Open Graph Image / Social Share Image
**Location:** Post editor → gear icon (⚙️) → **Twitter card** and **Facebook card** sections
Ghost supports separate OG images for Twitter and Facebook. Upload or paste an image URL in each section.
Ghost also uses the **Feature image** (the hero image at the top of the post) as the default OG image if no specific social images are set. Set a Feature Image and you get social sharing coverage automatically.
### Canonical URL
**Location:** Post editor → gear icon (⚙️) → **Meta data → Canonical URL**
Ghost auto-generates a canonical URL pointing to the post's own URL. Override this field only for syndicated or cross-posted content.
Siftly does not push canonical URL overrides. Ghost's default canonical (the post permalink) is correct for original content.
### Tags & Categories
**Location:** Post editor → gear icon (⚙️) → **Tags**
Ghost uses **Tags** for both categories and tags (there is no separate category system). The first tag is treated as the "primary tag" and often used by themes for navigation.
Siftly pushes keywords as Ghost tags automatically. Tags that don't exist are created. Up to 10 tags per post.
### JSON-LD Structured Data
**Ghost auto-generates Article JSON-LD** for every post. This includes:
* `@type: Article`
* `headline`, `datePublished`, `dateModified`
* `author` with name and URL
* `publisher` with logo
* `image` from the feature image
**You do NOT need to add Article schema manually.** Ghost handles it.
**Supplemental schema (FAQ, HowTo, Product) — pushed automatically by Siftly:**
When you map Siftly's **JSON-LD** field in your integration settings, Siftly wraps your JSON-LD in a `
```
The `{{wf {...} }}` template syntax only works inside **Embed** elements on CMS template pages. It does NOT work in Page Settings → Custom Code. If you need per-page dynamic JSON-LD, you MUST use an Embed element in the page body.
**Alternative — Store full JSON-LD in a CMS field:**
Create a `json-ld` plain text (long) field in your collection. Map Siftly's JSON-LD output to this field. Then add an Embed element that outputs it:
```html theme={null}
```
This lets Siftly push fully-formed JSON-LD that renders dynamically per post.
### Keywords
Webflow does not render a `` tag by default. If you want one:
1. Add an Embed element in your CMS template page's `` section (via custom code):
```html theme={null}
```
For most use cases, keywords stored as tags in a CMS field are sufficient for AI crawlers that parse page content.
***
## Pushing Siftly recommendations automatically
Siftly produces your article plus meta title, meta description, keywords, categories, and JSON-LD.
Select your Webflow collection. Choose Draft or Published status.
All mapped fields (title, slug, body, meta title, meta description, keywords, categories, JSON-LD, word count) are sent in a single API call. CMS item is created with all data populated.
Webflow CMS items are live immediately if you chose Published. If your site has unpublished changes in the Designer, you may need to click **Publish** in Webflow to push the latest template changes.
***
## Platform-specific quirks & limitations
**Dynamic JSON-LD requires Embed elements.** Webflow's Page Settings → Custom Code does not support CMS field bindings (`{{wf ...}}`). For per-post JSON-LD, you MUST use an Embed element in the template page body.
**CMS item limits:** Webflow's CMS plans have item limits (e.g., 2,000 items on the Basic plan, 10,000 on Business). Check your plan's CMS item quota before bulk-publishing from Siftly.
* **Publishing delay:** After creating a CMS item via API, it may take a few seconds for Webflow's CDN to reflect the change. New items are usually live within 30 seconds.
* **Rich Text field quirks:** Webflow's Rich Text fields support a subset of HTML. Unsupported tags (e.g., `