Everything TestiFlow provides and how to embed it on your website.
Paste before </body>. Button, modal/drawer, and form are configured in the dashboard.
<script src="https://testiflow.site/embed.js" data-site-id="your-site-id-here" async></script>Collect link: https://testiflow.site/collect/your-site-id-here
Recommended. Auto-renders published testimonials. Publish them in the dashboard first.
<div
data-testiflow-wall="your-site-id-here"
data-layout="grid"
data-theme="saas"
data-limit="12"
>
</div>
<script src="https://testiflow.site/embed.js" async></script>Layouts
grid, carousel, marquee, list, bento, masonry, floating, columns
Themes
minimal, glass, bold, saas, dark, warm, ocean, sunset
Auto-resizing iframe. Also available in dashboard → Embed Studio.
<script src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.3.9/js/iframeResizer.min.js"></script>
<iframe
id="testiflow-wall"
src="https://testiflow.site/embed/w/your-site-id-here?theme=saas&layout=grid"
title="TestiFlow Wall of Love"
style="width:100%;border:0;min-height:400px"
loading="lazy"
></iframe>
<script>iFrameResize({ log: false, checkOrigin: false }, '#testiflow-wall');</script>Public SEO page: https://testiflow.site/w/your-public-slug
Package: @testiflow/react (see packages/react in repo)
import { TestiflowWall } from '@testiflow/react';
export default function Page() {
return <TestiflowWall siteId="your-site-id-here" layout="bento" theme="saas" limit={12} />;
}Customize in the app — not in embed code:
GET /api/public/walls/{slug} — public wall JSON
GET /api/testimonials?siteId= — published testimonials
GET /api/config/{siteId} — widget config
POST /api/analytics/events — track wall_view, button_click, etc.
POST /api/ai/enrich — AI summary & tags (auth required)
<meta http-equiv="Content-Security-Policy"
content="script-src 'self' 'unsafe-inline' https://testiflow.site https://cdn.jsdelivr.net;
connect-src 'self' https://testiflow.site;
frame-src https://testiflow.site;">embed.js (not only legacy script.js)Use iframe-resizer snippet from Embed Studio — avoid fixed 800px height.