GoHighLevel
Deploy ReactionSDK overlays (tap, poll, rating, slider, and CTA on reaction-video) and/or ReactifySDK (recorded video reactions via reactify-video and threads) on GHL sites and funnels. This guide covers where to paste code, funnel placement, and verifying first render and overlay interactions.
Prerequisites
- ReactionSaaS account with API key and allowed origins including your GHL domain(s).
- Admin or agency access to Site settings → Custom Code and/or funnel step editors that expose Custom JavaScript or HTML.
- Template or thread IDs from the marketplace or Reactify dashboard.
Where to paste code
- Site-wide (recommended baseline) — In site settings, add the SDK script to the footer or tracking-code area so every published page can initialize the loader once. Restrict heavy UI to pages where you place embeds.
- Funnel step only — If you prefer isolation, paste the script + init block in the custom code section of a specific funnel step (often available on landing, sales, or custom steps). Repeat only if the builder strips global scripts on that step type.
- HTML / embed sections — Use
reaction-videowithoverlaysfor ReactionSDK. Usereactify-video/ thread embeds for ReactifySDK recorded reactions. Avoid duplicating the SDK loader on the same document.
Setup guide
- Load the SDK — Reference
sdk.jsorreactify.jsfrom your approved CDN withdeferwhere possible. - Initialize — On
DOMContentLoaded, callreactionSDK.initorReactify.init(same bundle) withapiKey,accountId,baseUrl,mode, andallowedOriginsincluding your live GHL hostname. - Attach to funnel pages — For opt-in steps, put the embed above or beside the native form. For VSL or offer steps, use a fullscreen-friendly preset or bottom overlay so the native checkout / CTA remains usable.
- Booking pages — If the calendar widget occupies the hero, use an inline reaction strip or sidebar block; do not cover the booking iframe.
- Publish — Publish the site or funnel, then test in a private window (not only the internal preview) so tracking code matches production.
Example snippet
<script src="https://reactify-cdn.s3.us-east-2.amazonaws.com/sdk.js" defer></script>
<script>
window.addEventListener('DOMContentLoaded', function () {
if (!window.Reactify) return;
Reactify.init({
apiKey: 'YOUR_API_KEY',
accountId: 'YOUR_ACCOUNT_ID',
baseUrl: 'https://api.reactionsaas.com',
mode: 'production',
allowedOrigins: [window.location.origin]
});
});
</script>
<reactify-video
thread-id="YOUR_THREAD_ID"
template="YOUR_TEMPLATE_SLUG"
></reactify-video>Verification
- First render — Open the live funnel URL; in devtools Network, confirm the SDK loads without CSP or mixed-content errors.
- First interaction — Tap an overlay or submit a poll; confirm the event appears in ReactionSaaS analytics or your connected pipeline.
- Lead-adjacent signal — When a visitor reacts then submits the GHL form, correlate timestamps in your CRM; the reaction event is independent of the native form webhook but should precede or align with the lead create event.
- Use the SDK playground with GoHighLevel context to mirror overlay settings before pasting into GHL.
Template platform_config
Marketplace templates can declare a GoHighLevel block inside platform_config (stored on the template document):
{
"gohighlevel": {
"embed_type": "funnel_custom_script",
"placements": [
"landing_page",
"funnel_step",
"opt_in_page",
"booking_page"
],
"script_surface": "site_wide_or_funnel_step"
}
}UI presets (reference)
- Fullscreen / CTA takeover — Loads after DOM ready; respects reduced motion; CTA unlocks after tap or minimum watch time. Events: install_completed, first_render, first_interaction, template_used, platform_used, verification_heartbeat.
- Inline lead-capture reaction — Lazy-load on scroll; reactions sync to thread; optional CTA mirrors form headline. Events: first_render, first_interaction, install_handoff_started, install_handoff_completed.
- Funnel conversion overlay — Dismissible; re-engages on return visit if configured in dashboard. Events: first_render, first_interaction, template_used, verification_heartbeat.
Troubleshooting
- Script not running — Some steps strip inline scripts; move initialization to site-wide custom code or a step type that explicitly allows JavaScript.
- Duplicate inits — Loading the SDK in both site footer and step custom code can double events. Keep a single init per page.
- Blank player — Confirm HTTPS video URLs, CORS for MP4s, and that the embed is not inside an iframe that blocks custom elements.
- 403 on API — Add the exact published origin (including
wwwvs apex) to allowed domains in the ReactionSaaS dashboard. - Page builder quirks — If a section re-renders on scroll, the embed may remount; prefer a stable HTML section or site-wide script with idempotent init guards.
FAQ
Does ReactionSaaS replace GHL forms? No. Reactions complement native opt-ins and booking widgets; you still capture leads through GHL.
OAuth into GHL? Not required for the script embed path. Future account-linking would be additive and would not replace custom code installs.
Can I scope to one funnel only? Yes—load the SDK only on steps where you paste init, or use URL-based logic in your init snippet if your plan allows custom JS.

