How it works
Ghost is a server-side integration—unlike Magic Embed, content is pushed from Ghost to BeyondWords when posts change, not fetched from the visitor’s browser.- You connect Ghost to BeyondWords by saving your Ghost Admin API Key and API URL in the dashboard. BeyondWords registers webhooks on your Ghost site for
post.addedandpost.editedevents. - When you publish or update a post, Ghost sends the post payload to BeyondWords. The post’s
titleandhtmlbecome the content item’s title and body; the Ghost post ID becomessource_idand the post URL becomessource_url. - BeyondWords processes the HTML with
auto_segment(applying content filters if configured) and generates audio/video. - The player script in your theme’s Site footer loads on each post page, identifies the content by page URL, and embeds the player once generation is complete.
Connect Ghost to BeyondWords
Create a custom integration in Ghost
In Ghost Admin, go to Settings → Integrations.Click Add custom integration, name it BeyondWords, then click Add.Copy the Admin API Key and API URL—you’ll need both in the next step.
Save credentials in BeyondWords
Go to Settings → Integrations → Ghost in your BeyondWords project dashboard.Paste the API URL and Admin API Key from Ghost, then click Save changes.BeyondWords validates the credentials and registers webhooks on your Ghost site automatically. You should see a success message confirming the connection.
Copy the embed code
In the Embed code dropdown on the same page, select the format you want on post pages:
Click the copy icon alongside the embed code.
Add the embed code to Ghost
In Ghost Admin, go to Settings → Code injection and open the editor.In the Site footer section, paste the embed code. Take care not to interfere with any existing scripts.Set
target to the CSS selector where the player should appear in your theme—for example .post-full-content, article, article header, or .content. The dashboard embed defaults to .post-full-content, which works for most Ghost themes.Click Save.What Ghost sends to BeyondWords
On eachpost.added or post.edited webhook, BeyondWords maps the Ghost post to a content item:
| Ghost field | BeyondWords field |
|---|---|
Post id | source_id |
Post url | source_url |
Post title | Title |
Post html | Body (processed with auto_segment) |
Post feature_image | Feature image |
| First author name | Author |
published_at (or updated_at) | Publish date |
#beyondwords-skip are treated as unpublished—see Skip generation for specific posts below.
Player placement
The embed code uses the JavaScript SDK (BeyondWords.Player). If you don’t pass a content identifier, the player matches content using the current page URL (window.location.href), which corresponds to the post’s source_url.
Set target to a CSS selector for the element the player should inject into. The player is inserted as the first child of that element.
If your theme uses a non-standard layout, inspect the post template and choose a selector that wraps the article header or body. You can also add a dedicated container in your theme:
target: '.beyondwords-target' in the embed code.
For advanced theme integration, the @beyondwords/ghost-helper package can auto-detect the target element on Ghost post and page templates. The dashboard embed code uses the player SDK directly, which is the recommended approach for most sites.
Customize player appearance in Distribution → Player in your dashboard, or pass additional player properties in the embed script.
Fine-tuning your integration
- Content extraction: Content filters apply to post HTML sent via webhooks. Use filters to exclude newsletter blocks, related posts, or other recurring elements.
- Data attributes: Add
data-beyondwords-*attributes to your Ghost theme templates or post HTML for metadata and per-paragraph control. - Player settings: Configure widget style, colors, and behavior.
- Generate scripts: Required if you use an Audio summary or Video summary embed code variant.
Skip generation for specific posts
To prevent a post from generating or updating audio/video:- In the Ghost post editor, open the Post settings side panel
- In the Tags field, add the internal tag
#beyondwords-skip - Publish your post as usual
- New posts with this tag are not ingested for generation.
- Existing posts with this tag are marked unpublished—the player will not load. Future post edits will not trigger regeneration.
- Remove the tag and re-publish to resume normal sync.
FAQs
Do I need to configure webhooks manually in Ghost?
Do I need to configure webhooks manually in Ghost?
No. When you save your Ghost credentials in the BeyondWords dashboard, webhooks for
post.added and post.edited are registered on your Ghost site automatically.How does the player find the right content for each post?
How does the player find the right content for each post?
The embed script identifies content by the post page URL. BeyondWords stores each Ghost post’s canonical URL as
source_url when the webhook fires. As long as the URL in the visitor’s browser matches, the player loads the correct audio or video.Can I embed audio summary or video summary?
Can I embed audio summary or video summary?
Yes—choose Audio summary or Video summary in the embed code dropdown. Your project must generate scripts for content items (configure in Content → Preferences or per-item in the Editor). The Ghost integration only sends the post body; script generation happens on the BeyondWords side.
What happens if I edit a post in the BeyondWords Editor?
What happens if I edit a post in the BeyondWords Editor?
Editing in the Editor switches the content item to
manual_segment processing and disables automatic CMS updates (auto_segment_updates_enabled). Ghost webhook updates for that post will be blocked until you re-enable automatic updates or send a new API update with type set to auto_segment. Prefer content filters over Editor edits if you want Ghost updates to keep syncing.How do content filters work with Ghost?
How do content filters work with Ghost?
Dashboard content filters apply to the post HTML sent via webhooks, because Ghost content is processed with
auto_segment. Configure filters in Settings → Extraction → Filters. See the content extraction guide.How do I customize the player?
How do I customize the player?
Go to Distribution → Player in your BeyondWords project dashboard for widget style, colors, and default behavior.For per-site customization, edit the embed script in Ghost Code injection—any player property can be passed to
BeyondWords.Player in the onload handler.The player isn't showing on my post—what should I check?
The player isn't showing on my post—what should I check?
- Confirm audio/video generation has completed in the BeyondWords dashboard
- Check the post is published and does not have the
#beyondwords-skiptag - Verify the embed code is in Site footer code injection and
targetmatches an element in your theme - Open the browser console for JavaScript errors—a missing
targetelement will prevent the player from loading