CRM Solid logo
GUIDE12 min read

How to install a live chat widget on any website

A 10-minute tutorial that gets a live chat widget on WordPress, Shopify, Webflow, Next.js, or any custom site, with brand theming, AI fallback for after-hours, business-hour scheduling, and proactive triggers that double your chat-open rate.

14-day free trial · No credit card required · Cancel anytime

What you will learn

Four widget skills by the end of this guide

Install on 5 stacks

WordPress, Shopify, Webflow, Next.js, plain HTML: the exact snippet for each.

Theme to your brand

Override colors, fonts, radius via JSON theme, or drop in custom CSS for full control.

AI fallback after-hours

Connect your trained bot so the widget responds at 2 AM the same as 2 PM.

Proactive triggers

The trigger rules that double chat-open rate vs a passive widget.

What you will need

Live chat installation is mostly a copy-paste job. The prerequisites below decide whether you finish in 10 minutes or spend 2 hours debugging.

  • A CRM Solid workspace (free trial works).
  • Editor access to your website (theme editor, CMS, or code repo).
  • The domain(s) you want the widget on (you can add more later).
  • Your brand colors, fonts, and an icon/logo for the chat button.
  • A trained AI bot if you want AI fallback (see the AI sales bot guide).
  • Your business hours and after-hours plan decision (AI / form / static).

Step 1: Create a widget in CRM Solid

Budget: 1 minute. In CRM Solid, go to Live Chat > Widgets > New. Give the widget a name (your website name is fine), set the primary domain (e.g., yourcompany.com), and pick a starting theme.

The panel generates an embed snippet that looks like this:

<script>
  (function(w,d,s,o){
    w._crmsolid = w._crmsolid || [];
    var js = d.createElement(s);
    js.src = "https://cdn.crmsolid.com/widget.js";
    js.async = true;
    js.setAttribute("data-widget-id", "wgt_abc123_yourwidget");
    d.head.appendChild(js);
  })(window, document, "script");
</script>

Save the snippet somewhere; you will paste it once per site.

Step 2: Install the embed snippet

Pick your stack and follow the relevant sub-section.

WordPress

  1. Install the "Insert Headers and Footers" plugin (or equivalent) if you do not already have one.
  2. Go to Settings > Insert Headers and Footers.
  3. Paste the snippet into the Body Footer box.
  4. Save changes and load any page on the front-end. The chat bubble should appear in the bottom-right within 1-2 seconds of page load.

Shopify

  1. In your Shopify admin, go to Online Store > Themes > Actions > Edit code.
  2. Open theme.liquid under Layout.
  3. Find the closing </body> tag near the bottom.
  4. Paste the snippet on the line immediately before </body>.
  5. Save. The widget loads on every page.

Webflow

  1. In Webflow, open Site Settings > Custom Code.
  2. Paste the snippet into the Footer Code box.
  3. Save changes and republish the site. The widget appears on every published page.

Next.js (App Router)

  1. Open app/layout.tsx in your editor.
  2. Import the Script component from next/script.
  3. Add it just before the closing </body>:
import Script from 'next/script';

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        {children}
        <Script
          id="crmsolid-widget"
          strategy="afterInteractive"
          dangerouslySetInnerHTML={{
            __html: `
              (function(w,d,s,o){
                w._crmsolid = w._crmsolid || [];
                var js = d.createElement(s);
                js.src = "https://cdn.crmsolid.com/widget.js";
                js.async = true;
                js.setAttribute("data-widget-id", "wgt_abc123_yourwidget");
                d.head.appendChild(js);
              })(window, document, "script");
            `,
          }}
        />
      </body>
    </html>
  );
}

Plain HTML

  1. Open the HTML file(s) you want the widget on.
  2. Paste the snippet just before </body>.
  3. Save and reload. If the widget does not appear, check the browser console for a CORS or CSP error and add cdn.crmsolid.com to your Content-Security-Policyscript-src directive.

Step 3: Theme the widget to match your brand

Budget: 3 minutes. In Widgets > (yours) > Theme, set:

  • Primary color: your main brand color (used for the chat bubble and send button).
  • Accent color: the second color (used for hovers and active states).
  • Border radius: 4 for sharp corners, 16 for rounded, 999 for fully rounded.
  • Font family: match your site if you have a custom font; otherwise system default works.
  • Position: bottom-right (default), bottom-left, or custom offset.
  • Welcome message: the first message visitors see when they open the chat (max 200 chars).
  • Agent name display: show team name or real agent name.

For deeper customization, switch to Custom CSS mode and drop CSS that targets the CSS variables:

/* Custom CSS, auto-scoped to the widget shadow DOM */
.crm-solid-widget {
  --crm-solid-bubble-bg: #5b21b6;
  --crm-solid-bubble-shadow: 0 8px 24px rgba(91,33,182,0.4);
  --crm-solid-header-bg: linear-gradient(135deg, #5b21b6, #06b6d4);
  --crm-solid-font-family: "Inter", system-ui, sans-serif;
  --crm-solid-radius-bubble: 24px;
  --crm-solid-radius-window: 16px;
}

Test on mobile, tablet, and desktop before going live. The widget's default responsive breakpoints handle most cases, but custom themes occasionally break on narrow phones.

Step 4: Configure proactive triggers

A widget that only opens when clicked has a 2-4% chat-open rate. A widget with smart proactive triggers gets 6-10%. Triggers are conditional pop-ups that nudge the visitor into starting a conversation.

In Widgets > (yours) > Triggers, add:

Trigger 1: Pricing page
  Condition: URL contains "/pricing"
  Wait:      10 seconds on page
  Message:   "Hi! Looking at pricing; anything I can clarify?"

Trigger 2: Exit intent
  Condition: mouse leaves viewport toward top
  Wait:      none
  Message:   "Hang on, got a quick question before you go?"

Trigger 3: Deep-read on long-form
  Condition: scroll position > 60% on /blog/* URLs
  Wait:      none
  Message:   "Enjoying this? Want to see how teams actually do it?"

Trigger 4: Demo page lingers
  Condition: URL contains "/demo" AND time-on-page > 30s
  Wait:      none
  Message:   "Want me to walk you through a live demo?"

Trigger 5: Second visit
  Condition: returning visitor on home page
  Wait:      none
  Message:   "Welcome back! Picking up where we left off?"

Start with 2-3 triggers. More than 5 starts to feel intrusive. The exit-intent trigger has the highest engagement rate across customer types; keep it on.

Step 5: Set business hours and after-hours behavior

Budget: 1 minute. In Widgets > (yours) > Schedule:

  • Timezone: your team's primary timezone.
  • Business hours: e.g., Mon-Fri 9:00 AM - 6:00 PM. You can set different hours per day.
  • Holiday calendar: upload your team holidays so the widget respects them.
  • After-hours behavior: pick one:
    • AI bot takeover: the trained AI bot handles the conversation until a human is available. Highest conversion if the bot is good.
    • Email-capture form: shows a form asking for email and message, replies in the morning.
    • Static message: "We are offline, back at 9 AM Eastern." Lowest engagement but simplest.

Step 6: Wire up AI fallback to your bot

If you have a trained AI bot from the AI sales bot guide, connect it as the after-hours fallback.

In Widgets > (yours) > AI fallback:

  1. Toggle "Enable AI fallback".
  2. Pick the bot persona from the dropdown.
  3. Set the trigger: always-on, after-hours-only, or fallback-when-no-agent-online.
  4. Set the handoff signal: when the AI hands off to a human, the agent picks up the existing thread with full context.
  5. Enable disclosure mode: the bot introduces itself as "automated assistant", recommended for trust and regulatory compliance.
Tip: always-on AI fallback works better than after-hours-only for B2B. Visitors expect instant response; having the AI take the first turn even during business hours (with quick handoff to a human) keeps engagement up.

Step 7: Test on a staging URL before production

Budget: 5 minutes. CRM Solid lets you create a staging variant of the widget that only loads on a staging domain.

  1. In Widgets > (yours) > Variants > Add staging, set the staging domain (e.g., staging.yourcompany.com).
  2. Install the staging widget snippet on your staging site.
  3. Test:
    • Widget loads within 2 seconds.
    • Theme matches expectations on mobile + desktop.
    • Proactive triggers fire on the right pages.
    • Business-hours and after-hours behavior switches at the right time.
    • AI fallback responds correctly.
    • Agent receives the chat in the unified inbox.
    • Conversation persists across page navigations.

Fix anything that fails on staging. Going to production with unresolved issues turns into a long Friday afternoon.

Step 8: Deploy to production and watch metrics

Deploy the embed snippet to production. Open Live Chat > Widgets > (yours) > Analytics and watch:

  • Chat-open rate: target 5-10% of unique visitors. Below 3%, your triggers are not firing well or the bubble is too subtle.
  • First-response time: target < 60 seconds during business hours, < 5 minutes with AI fallback.
  • Conversation completion rate: target ≥ 70% of opened chats reach a clear outcome (qualified, booked, not-fit, opt-out).
  • AI fallback handoff rate: 30-50% is healthy (see the AI bot guide).
  • Conversion to demo / signup: the bottom-line metric; track which page hosted the conversation that converted.

Adjust theme, triggers, and AI fallback based on the data during week 1. Most teams iterate twice in the first month, then settle into a stable config.

CRM Solid widget vs Intercom vs Drift vs Tidio

What you get from a CRM-first widget vs a standalone live-chat product.

CapabilityCRM SolidRecommendedIntercomDriftTidio
Channel surface
Web widget
Telegram in same inbox
X (Twitter) DMs in same inbox
WhatsApp Business in same inbox
AI
Custom persona AI bot
RAG grounding from your docs
Multi-channel AI handoff
Pricing
Pricing model
FlatPer-seat + MAUPer-seat + MAUPer-conversation
Starts at
$29$74/seat$2,500/year$29

The CRM Solid widget is one channel in a unified inbox. The conversation that starts as live chat can continue via email, Telegram, or X; same thread, same context.

“We installed the widget on our Shopify store on a Sunday and had 14 chats by Monday lunch; three of which became orders. The setup took 8 minutes from clicking 'New widget' to the bubble appearing on the site.”
Priya Adesanya
Founder · Solely Studios

Live chat widget FAQ

The eight questions developers and marketers ask in the first 30 minutes of widget setup.

The CRM Solid widget script is 18 KB gzipped and loads asynchronously after page interactive. On a Lighthouse test against a typical Next.js site, it adds 0-1 points to total blocking time and zero to Largest Contentful Paint. It does not block render, fonts, or any other critical asset.
Yes. The widget is a single embed script with no backend integration required. It establishes a real-time SignalR connection directly to CRM Solid's servers. Plain HTML, Webflow, Framer, Carrd, and similar static sites all work the same way.
CRM Solid persists the conversation by visitor ID (cookie-based by default; can be promoted to logged-in user ID). If the visitor returns within 30 days, the chat history reloads automatically. If they reply via email or another channel in the meantime, the threads merge into the unified contact record.
Yes. Each domain you connect gets its own widget configuration (theme, business hours, AI fallback) but the conversations all flow into the same unified inbox. Agents see which site each chat came from. Useful for agencies and multi-brand companies.
The widget supports three consent modes: always-on (no consent banner; only legal in regions without strict prior-consent laws), implicit-on-interaction (the chat does not load until the user clicks the bubble), and explicit cookie-consent integration (responds to your existing CMP). Most EU sites should use implicit-on-interaction.
Yes. You can override colors, fonts, border radius, button shapes, and chat bubble styling via a JSON theme. For advanced customization, the widget exposes a CSS-variable surface; you can drop CSS into your site that targets these variables and override anything. Custom CSS is auto-scoped to the widget shadow DOM.
You configure business hours and an "after-hours behavior." Options: AI bot takes the conversation (using your trained persona from the AI bot guide), a form collects email and queues for next business day, or a static message tells the visitor when you will reply. The first two convert better than the third.
Yes. The script bootstraps from a single tag in your <head> regardless of framework. For SPAs that navigate without full page reloads, the widget detects route changes automatically and persists the chat across pages. Demo and code samples available for React, Vue, Svelte, Angular, Next.js, and Nuxt.
Ready to ship

Get live chat on your site in 10 minutes

A 14-day trial includes the widget, all themes, AI fallback, proactive triggers, and the unified inbox. Embed snippet ready in 60 seconds.

Trusted by 2,500+ teams · GDPR-ready · 99.95% uptime

We value your privacy

We use cookies to improve our site, analyze traffic, and personalize ads. You can accept all, reject non-essential, or customize your choices. Read our Cookie Policy.