<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: abhinavpanse</title>
    <description>The latest articles on DEV Community by abhinavpanse (@abhinavpanse).</description>
    <link>https://dev.to/abhinavpanse</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F519312%2F36ff4c53-e31e-4888-b58a-0ced6852c333.gif</url>
      <title>DEV Community: abhinavpanse</title>
      <link>https://dev.to/abhinavpanse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhinavpanse"/>
    <language>en</language>
    <item>
      <title>How to add an AI support agent to your SaaS app</title>
      <dc:creator>abhinavpanse</dc:creator>
      <pubDate>Tue, 10 Nov 2026 18:31:45 +0000</pubDate>
      <link>https://dev.to/abhinavpanse/how-to-add-an-ai-support-agent-to-your-saas-app-2bpa</link>
      <guid>https://dev.to/abhinavpanse/how-to-add-an-ai-support-agent-to-your-saas-app-2bpa</guid>
      <description>&lt;p&gt;Most AI support agents answer in paragraphs. Your user asks "how do I export my contacts?" and gets three sentences telling them to open Settings, then Data, then Export. Then they go hunting for each button.&lt;/p&gt;

&lt;p&gt;I build &lt;a href="https://clickalong.ai/?utm_source=devto&amp;amp;utm_medium=listing" rel="noopener noreferrer"&gt;Clickalong&lt;/a&gt;, an AI support agent that answers from your docs and then points at each button in your app until the task is done. This post shows how to add it to a SaaS app, from a plain HTML page up to a React app with signed-in users.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create a workspace and load your docs
&lt;/h2&gt;

&lt;p&gt;Sign up at clickalong.ai and paste your help center link. Clickalong imports the articles, and the agent answers only from them.&lt;/p&gt;

&lt;p&gt;No help center yet? Write articles in the dashboard, or let your coding agent draft them with our open-source skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add clickalong/clickalong-agent-skills --skill write-clickalong-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Add the widget
&lt;/h2&gt;

&lt;p&gt;On a plain HTML site, one tag goes before &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://clickalong.ai/widget.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"pk_your_key"&lt;/span&gt;
  &lt;span class="na"&gt;data-clickalong&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your key is on the Install page in the dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. In a React app, use the SDK
&lt;/h2&gt;

&lt;p&gt;Bundled apps get a typed loader, &lt;code&gt;@clickalong/sdk&lt;/code&gt;. It has no dependencies, does nothing during server rendering, and is safe under React Strict Mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm install @clickalong/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="s2"&gt;"use client"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;Clickalong&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;"@clickalong/sdk"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nc"&gt;ClickalongWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Clickalong&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"pk_your_key"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Clickalong&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;identify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Render it once in your root layout: &lt;code&gt;app/layout.tsx&lt;/code&gt; in Next.js, &lt;code&gt;app/root.tsx&lt;/code&gt; in React Router. Conversations now follow the user across devices, and your team sees who they're talking to.&lt;/p&gt;

&lt;p&gt;Want the Verified badge? Pass a &lt;code&gt;userHash&lt;/code&gt; as well. It's an HMAC-SHA256 of the lowercased email, computed on your server with the identity secret from Settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Pass app state
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nc"&gt;Clickalong&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These values show next to the conversation, so whoever picks up a handed-over chat sees the user's plan without asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Teach it the clicks
&lt;/h2&gt;

&lt;p&gt;This is the part that makes it more than a chatbot. Install the &lt;a href="https://chromewebstore.google.com/detail/clickalong-recorder/mlmmampfbhgplpnblnhfpidmficcifcb" rel="noopener noreferrer"&gt;Clickalong Recorder&lt;/a&gt; Chrome extension, click through a task once (say, changing a plan), and save it as a tour. Next time a user asks how to change their plan, the agent answers and then walks them through it, one highlighted button at a time.&lt;/p&gt;

&lt;p&gt;No recorded tour for a task? The agent can still guide from your help articles with "Show me".&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An AI support agent that answers from your docs, in the user's language&lt;/li&gt;
&lt;li&gt;Guided tours that point at the real buttons in your app&lt;/li&gt;
&lt;li&gt;A shared inbox for chats the AI hands over&lt;/li&gt;
&lt;li&gt;One flat price per workspace with unlimited conversations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The widget and inbox are free. The AI agent starts on the Mini plan, and guided tours and "Show me" start on Essentials. &lt;a href="https://clickalong.ai/pricing?utm_source=devto&amp;amp;utm_medium=listing" rel="noopener noreferrer"&gt;See pricing&lt;/a&gt; or &lt;a href="https://clickalong.ai/?utm_source=devto&amp;amp;utm_medium=listing" rel="noopener noreferrer"&gt;start free&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
