How to add video testimonials to a Ghost site (2026)
Ghost is built for writing. Custom widgets are first-class citizens through HTML cards and Code Injection — much friendlier to embeds than most CMS platforms, but with three different methods that suit three different use cases. This guide covers all three, plus the gotchas specific to Ghost themes and AMP rendering.
What you'll need
- A Ghost site (Ghost(Pro) hosted or self-hosted — both work identically for embeds).
- A GetPureProof account with at least one approved testimonial, and either a widget ID or a Space slug.
- 5–10 minutes.
Quick setup on the GetPureProof side
If you don't already have approved testimonials:
- Create a Space (gives you a recording link).
- Send the link to customers.
- Approve testimonials in your dashboard.
- Generate a widget, or use the Space iframe.
Full walkthrough: how GetPureProof works.
Grab your widget ID or Space slug. You'll paste it into Ghost in a moment.
Method 1: HTML card in the post editor (per-post embeds)
Use this for embedding testimonials inside a specific blog post — case-study posts, launch announcements, or product-update posts where social proof reinforces the message.
In the Ghost editor:
1. Open the post. Place your cursor where you want the widget.
2. Add an HTML card. Click the + icon in the editor → search for HTML → select the HTML card.
3. Paste the widget snippet:
<div class="pureproof-widget" data-widget-id="YOUR_WIDGET_ID"></div>
<script src="https://getpureproof.com/embed.js" async></script>
Replace YOUR_WIDGET_ID with the ID from your dashboard.
4. Click outside the card. Ghost renders a preview of the embedded HTML.
5. Publish or update the post.
The widget loads when the post is viewed publicly. Inside the editor's preview, it usually renders correctly — but always verify on the published live URL.
Method 2: Code Injection (site-wide)
Use this for embeds you want on every page or pages governed by your theme — the home page, a static /testimonials page, or footer-area testimonials across the whole site.
In Ghost Admin → Settings → Code Injection:
Site Footer injection. Add the embed script once, site-wide:
<script src="https://getpureproof.com/embed.js" async></script>
Then anywhere you want the widget to appear (in a Page's HTML card, in a theme template, in any post), add only the div:
<div class="pureproof-widget" data-widget-id="YOUR_WIDGET_ID"></div>
The script — already loaded site-wide — picks up any matching div on the page automatically.
Per-post Code Injection. Inside any post or page settings, expand the Code Injection section and add embeds that apply only to that post. Useful for one-off cases without polluting your global footer.
Method 3: Theme template (for self-hosted, advanced)
If you self-host Ghost and want testimonials embedded into your theme — say, on the home page above the post list, or in a permanent sidebar — edit the relevant .hbs template.
For example, to add a Wall of Love above the post list on home.hbs:
<div class="home-testimonials">
<div class="pureproof-widget" data-widget-id="YOUR_WIDGET_ID"></div>
</div>
{{!-- existing theme content below --}}
Make sure the embed script is loaded — either via Code Injection (Method 2) or directly in your theme's default.hbs:
<script src="https://getpureproof.com/embed.js" async></script>
</body>
Upload the modified theme via Ghost Admin → Design → Change theme → Upload theme. (Or use Ghost CLI for development workflows.)
Ghost-specific gotchas
- AMP rendering. Ghost has historically supported AMP versions of posts (
/amp/URL suffix). AMP doesn't allow arbitrary scripts, so the widget script won't run on AMP pages. If your traffic is AMP-heavy, either disable AMP in Ghost settings, or accept that AMP visitors won't see the widget. - Members-only content. If the post is gated to members, the widget loads after the gate is passed — non-members won't see it (because they can't see the post body at all). If you want testimonials visible to non-members, place them outside the gated section using Code Injection or theme placement.
- HTML card vs Markdown card. Use HTML cards for embeds. Markdown cards strip script tags as a security measure.
- Theme update overwrites. If you edit theme templates directly, theme updates from the original author overwrite your changes. Either fork the theme or move the embed to Code Injection where it's preserved across theme updates.
- Caching. Ghost(Pro) and most self-hosted setups use aggressive caching. After updating an embed, hard-refresh to see the change.
Going live
After embedding:
- View the post or page on the live URL.
- Test on desktop and mobile.
- Verify only approved testimonials appear (Pending, Rejected, and Archived items stay hidden).
- Run the page through Lighthouse — the widget loads asynchronously, so it shouldn't drag your Ghost site's typically-strong Core Web Vitals scores.
Closing thought
Ghost handles embeds about as cleanly as any CMS in this category. HTML cards for per-post embeds, Code Injection for site-wide, theme templates for advanced layouts — each method takes minutes, and once running, every approved testimonial appears in the widget automatically without further edits.
Two minutes from Ghost editor to embedded testimonial.
Set up your Space, paste the snippet into an HTML card, publish. Browser-recorded, async-loading, zero PageSpeed impact. Free plan available.
Start free