<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ZazzyAgent]]></title><description><![CDATA[ZazzyAgent]]></description><link>https://blog.zazzyagent.com</link><image><url>https://cdn.hashnode.com/uploads/logos/6a70344c223da09bdafba6b1/aac46227-6a6c-49ce-8713-aaa5b4bc6d6f.png</url><title>ZazzyAgent</title><link>https://blog.zazzyagent.com</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 09:31:47 GMT</lastBuildDate><atom:link href="https://blog.zazzyagent.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to Check Bot Error Logs in ZazzyAgent]]></title><description><![CDATA[Sometimes a flow doesn't behave the way you expect.
A message doesn't send.
An API call fails.
A JSON response causes an error.
A flow stops at a particular step.
Instead of guessing which part is bro]]></description><link>https://blog.zazzyagent.com/how-to-check-bot-error-logs-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-check-bot-error-logs-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 10:13:27 GMT</pubDate><content:encoded><![CDATA[<p>Sometimes a flow doesn't behave the way you expect.</p>
<p>A message doesn't send.</p>
<p>An API call fails.</p>
<p>A JSON response causes an error.</p>
<p>A flow stops at a particular step.</p>
<p>Instead of guessing which part is broken, check the <strong>Bot Error Logs</strong>.</p>
<p>The current platform provides an error-log area that records flow-related errors and provides information such as the error message and time, with an option to jump back to the affected flow.</p>
<h2>What are Bot Error Logs?</h2>
<p>Bot Error Logs show errors generated during automation execution.</p>
<p>They help answer:</p>
<blockquote>
<p>What went wrong?</p>
</blockquote>
<p>and:</p>
<blockquote>
<p>When did it happen?</p>
</blockquote>
<p>They can be especially useful for technical flow problems involving APIs, JSON, URLs and other configured components.</p>
<h2>Why should you check the logs?</h2>
<p>A customer saying:</p>
<blockquote>
<p>The bot isn't working.</p>
</blockquote>
<p>doesn't tell you where the problem is.</p>
<p>The error log may show something specific such as:</p>
<blockquote>
<p>JSON Decode Error</p>
</blockquote>
<p>or:</p>
<blockquote>
<p>403</p>
</blockquote>
<p>That immediately gives you a direction for troubleshooting.</p>
<h2>Open Bot Error Logs</h2>
<p>Open the relevant Bot Manager area.</p>
<p>Find the options menu.</p>
<p>Open:</p>
<p><strong>Bot Error Logs</strong></p>
<p>The exact placement may vary with the current dashboard, but the error log is available from the bot-management options.</p>
<h2>What information can you see?</h2>
<p>The current error log provides information such as:</p>
<ul>
<li><p>Error number</p>
</li>
<li><p>Error message</p>
</li>
<li><p>Error time</p>
</li>
<li><p>Action/edit option</p>
</li>
</ul>
<p>The error message is the most important part when diagnosing a problem.</p>
<h2>Use the timestamp</h2>
<p>The time of the error helps you match the log entry to a specific customer interaction.</p>
<p>For example:</p>
<blockquote>
<p>Customer reported a problem at 3:05 PM.</p>
</blockquote>
<p>Find the error around:</p>
<blockquote>
<p>3:05 PM.</p>
</blockquote>
<p>This can identify the failed flow execution.</p>
<h2>Open the affected flow</h2>
<p>Where the error entry provides an edit/jump option, use it to return to the flow that generated the error.</p>
<p>The current error-log interface provides a way to jump directly to the relevant flow from an error entry.</p>
<h2>Common error: JSON Decode Error</h2>
<p>This usually means ZazzyAgent received data that wasn't valid JSON or wasn't in the expected format.</p>
<p>A common place to investigate is:</p>
<ul>
<li><p>HTTP API</p>
</li>
<li><p>JSON-based integration</p>
</li>
<li><p>External data</p>
</li>
<li><p>Dynamic-list data</p>
</li>
</ul>
<p>Check the actual response/request structure.</p>
<h2>Common error: 403</h2>
<p>A 403 error generally indicates that access was denied.</p>
<p>Possible causes include:</p>
<ul>
<li><p>Authentication</p>
</li>
<li><p>Permission</p>
</li>
<li><p>Expired credential</p>
</li>
<li><p>Restricted URL</p>
</li>
</ul>
<p>Check the external system and credentials.</p>
<h2>Common error: 404</h2>
<p>A 404 usually means the requested URL/resource wasn't found.</p>
<p>Check:</p>
<ul>
<li><p>API URL</p>
</li>
<li><p>Webhook URL</p>
</li>
<li><p>Resource ID</p>
</li>
<li><p>Endpoint path</p>
</li>
</ul>
<p>A small URL mistake can cause this.</p>
<h2>Error logs and API troubleshooting</h2>
<p>If an API flow isn't working:</p>
<p>Don't immediately rebuild the flow.</p>
<p>First check:</p>
<pre><code class="language-text">Bot Error Logs
       ↓
Exact error
       ↓
Affected flow
       ↓
API configuration
</code></pre>
<p>This gives you evidence instead of guessing.</p>
<h2>Error logs and custom variables</h2>
<p>When a flow depends on dynamic customer data, also inspect the values being used.</p>
<p>For example:</p>
<pre><code class="language-text">order_id
customer_id
membership_status
</code></pre>
<p>If one of these values is missing or incorrect, the subsequent API call may fail.</p>
<p>The current debugging tools also expose per-user custom variables that can help when diagnosing dynamic data.</p>
<h2>Error logs vs customer support</h2>
<p>If a customer reports:</p>
<blockquote>
<p>The bot didn't reply.</p>
</blockquote>
<p>the error log tells you whether the platform recorded an execution error.</p>
<p>If there is no relevant error, investigate other causes such as:</p>
<ul>
<li><p>Trigger wasn't matched</p>
</li>
<li><p>Flow wasn't active</p>
</li>
<li><p>Message wasn't received</p>
</li>
<li><p>Channel-level issue</p>
</li>
<li><p>Routing issue</p>
</li>
</ul>
<p>Don't assume that every missing reply creates an error-log entry.</p>
<h2>Don't clear logs immediately</h2>
<p>The error log is useful evidence.</p>
<p>Don't clear it before investigating active problems.</p>
<p>The current platform provides a <strong>Clear Log</strong> action, but clearing removes the visible error history.</p>
<p>Investigate first.</p>
<h2>Use a fresh test after fixing</h2>
<p>After changing the flow:</p>
<ol>
<li><p>Save the flow.</p>
</li>
<li><p>Trigger it again.</p>
</li>
<li><p>Check whether the problem occurs.</p>
</li>
<li><p>Check the error log again.</p>
</li>
</ol>
<p>You want to know whether the same error reappeared.</p>
<h2>Example: Broken API URL</h2>
<p>Customer:</p>
<blockquote>
<p>Check my order.</p>
</blockquote>
<p>Flow:</p>
<p><strong>User Input</strong></p>
<p>→ Order Number</p>
<p>→ HTTP API</p>
<p>→ Error.</p>
<p>Open logs.</p>
<p>You see:</p>
<blockquote>
<p>404</p>
</blockquote>
<p>Check the API endpoint.</p>
<p>You discover the configured URL has the wrong path.</p>
<p>Fix it.</p>
<p>Run the test again.</p>
<h2>Example: Invalid JSON</h2>
<p>Your API returns something unexpected.</p>
<p>The log shows:</p>
<blockquote>
<p>JSON Decode Error.</p>
</blockquote>
<p>Check the external response.</p>
<p>You discover the response isn't valid JSON.</p>
<p>Fix the external API response or the parsing/mapping configuration.</p>
<h2>Example: Missing authentication</h2>
<p>The external server returns:</p>
<blockquote>
<p>403</p>
</blockquote>
<p>Check the authentication configuration.</p>
<p>Confirm the credential and permissions.</p>
<p>Then test again.</p>
<h2>Use logs alongside normal testing</h2>
<p>Don't rely only on the error log.</p>
<p>Use both:</p>
<p><strong>Customer test</strong></p>
<p><strong>Flow inspection</strong></p>
<p><strong>Error logs</strong></p>
<p>This gives you a much clearer picture.</p>
<h2>A practical troubleshooting process</h2>
<p>When a flow fails:</p>
<h3>Step 1</h3>
<p>Reproduce the problem.</p>
<h3>Step 2</h3>
<p>Record the approximate time.</p>
<h3>Step 3</h3>
<p>Open Bot Error Logs.</p>
<h3>Step 4</h3>
<p>Find the matching error.</p>
<h3>Step 5</h3>
<p>Read the exact error message.</p>
<h3>Step 6</h3>
<p>Open the affected flow.</p>
<h3>Step 7</h3>
<p>Fix the relevant component.</p>
<h3>Step 8</h3>
<p>Run the test again.</p>
<h3>Step 9</h3>
<p>Confirm the error no longer appears.</p>
<h2>Keep the problem specific</h2>
<p>Instead of saying:</p>
<blockquote>
<p>The bot is broken.</p>
</blockquote>
<p>Try to identify:</p>
<blockquote>
<p>The HTTP API call returns 403.</p>
</blockquote>
<p>or:</p>
<blockquote>
<p>The flow produces a JSON Decode Error.</p>
</blockquote>
<p>Specific errors usually lead to specific fixes.</p>
<h2>The core idea</h2>
<p>Bot Error Logs are the platform's evidence trail for flow execution problems.</p>
<p>When an automation behaves unexpectedly:</p>
<blockquote>
<p><strong>Check the evidence before changing the automation.</strong></p>
</blockquote>
<p>That one habit can save a lot of unnecessary rebuilding.</p>
]]></content:encoded></item><item><title><![CDATA[How to Use Google Sheet Data in ZazzyAgent Flow Builder]]></title><description><![CDATA[A Google Sheet can act as a simple external data source for your ZazzyAgent flows.
That means your flow doesn't always have to contain the information itself.
For example:

Customer asks for a service]]></description><link>https://blog.zazzyagent.com/google-sheet-data-flow-builder-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/google-sheet-data-flow-builder-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 10:12:21 GMT</pubDate><content:encoded><![CDATA[<p>A Google Sheet can act as a simple external data source for your ZazzyAgent flows.</p>
<p>That means your flow doesn't always have to contain the information itself.</p>
<p>For example:</p>
<blockquote>
<p>Customer asks for a service.</p>
</blockquote>
<p>Your flow can look up the service information from a Google Sheet and then use that information in the conversation.</p>
<p>This is particularly useful when your team needs to update the underlying information without constantly editing the chatbot.</p>
<p>The current platform supports Google Sheet Data Fetch inside Flow Builder and can use retrieved values in subsequent chatbot replies.</p>
<h2>When does this make sense?</h2>
<p>A Sheet is useful when:</p>
<ul>
<li><p>Information changes regularly.</p>
</li>
<li><p>Non-technical staff need to maintain it.</p>
</li>
<li><p>The data is relatively simple.</p>
</li>
<li><p>You don't need a full database.</p>
</li>
<li><p>The flow needs to retrieve a value during a conversation.</p>
</li>
</ul>
<h2>Example</h2>
<p>Your Sheet contains:</p>
<table>
<thead>
<tr>
<th>City</th>
<th>Contact Person</th>
<th>Phone</th>
</tr>
</thead>
<tbody><tr>
<td>Ahmedabad</td>
<td>Rahul</td>
<td>+91...</td>
</tr>
<tr>
<td>Mumbai</td>
<td>Priya</td>
<td>+91...</td>
</tr>
<tr>
<td>Delhi</td>
<td>Amit</td>
<td>+91...</td>
</tr>
</tbody></table>
<p>A customer chooses:</p>
<blockquote>
<p>Ahmedabad</p>
</blockquote>
<p>The flow can retrieve Rahul's information and use it in the response.</p>
<h2>Prepare your Sheet</h2>
<p>Create clear headers.</p>
<p>For example:</p>
<pre><code class="language-text">City
Contact Person
Phone
</code></pre>
<p>Avoid unclear headers such as:</p>
<pre><code class="language-text">Column1
Column2
Column3
</code></pre>
<p>Clean headers make mapping easier.</p>
<h2>Connect your Sheet</h2>
<p>Connect your Google account in the Google Sheets integration.</p>
<p>Then add the existing Sheet or create a new one.</p>
<p>For the complete connection process, see <a href="https://blog.zazzyagent.com/how-to-connect-google-sheets-zazzyagent">How to Connect Google Sheets to ZazzyAgent</a>.</p>
<h2>Create custom fields</h2>
<p>Decide what data you want to retrieve.</p>
<p>For the example above:</p>
<blockquote>
<p>Contact Person</p>
</blockquote>
<blockquote>
<p>Phone</p>
</blockquote>
<p>Create custom fields if needed.</p>
<h2>Create the Data Fetch configuration</h2>
<p>Open the Google Sheet Data Fetch settings.</p>
<p>Create a campaign.</p>
<p>Choose the relevant Sheet.</p>
<p>Configure the search and response mapping.</p>
<h2>Build the Flow</h2>
<p>Open Flow Builder.</p>
<p>Create the customer journey that should use the Sheet information.</p>
<p>For example:</p>
<pre><code class="language-text">Customer
   ↓
Choose City
   ↓
Google Sheet Data Fetch
   ↓
Contact Information
   ↓
Reply
</code></pre>
<h2>Use interactive choices</h2>
<p>You can use buttons or another suitable interactive element to let the customer choose what they want.</p>
<p>Example:</p>
<blockquote>
<p>Which city are you looking for?</p>
</blockquote>
<p><strong>Ahmedabad</strong></p>
<p><strong>Mumbai</strong></p>
<p><strong>Delhi</strong></p>
<p>The selected value can be used as the lookup value.</p>
<h2>Connect the Data Fetch component</h2>
<p>Place the Google Sheet Data Fetch component at the point where you need the external information.</p>
<p>Configure it to use the Data Fetch campaign you created.</p>
<p>The current Flow Builder documentation identifies <strong>Google Sheet Data Fetch</strong> as one of the available Flow Builder elements.</p>
<h2>Use the returned data</h2>
<p>Suppose the matching Sheet row is:</p>
<pre><code class="language-text">Ahmedabad | Rahul | +919...
</code></pre>
<p>The corresponding custom fields can then be used in your next message.</p>
<p>Example:</p>
<blockquote>
<p>Our Ahmedabad contact is Rahul.</p>
</blockquote>
<blockquote>
<p>You can reach him at +91...</p>
</blockquote>
<h2>Create a fallback</h2>
<p>Never assume there will always be a matching row.</p>
<p>Build a no-result response.</p>
<p>For example:</p>
<blockquote>
<p>I couldn't find information for that location. Please choose another city.</p>
</blockquote>
<h2>Use Sheet data in conditions</h2>
<p>The retrieved value can be used as part of your automation where your configured fields support conditions.</p>
<p>For example:</p>
<pre><code class="language-text">City = Ahmedabad
       ↓
Ahmedabad Flow

City = Mumbai
       ↓
Mumbai Flow
</code></pre>
<h2>Use it with AI</h2>
<p>AI can help determine what the customer wants before the Sheet lookup.</p>
<p>Example:</p>
<p>Customer:</p>
<blockquote>
<p>I need someone in Ahmedabad.</p>
</blockquote>
<p>The AI can understand:</p>
<blockquote>
<p>City = Ahmedabad</p>
</blockquote>
<p>Then your automation can retrieve the relevant Sheet data.</p>
<p>This combines natural-language understanding with structured business data.</p>
<h2>Use it with User Input</h2>
<p>Another approach is to collect the information first.</p>
<pre><code class="language-text">User Input
   ↓
City
   ↓
Google Sheet Data Fetch
   ↓
Return matching record
</code></pre>
<h2>Use it with APIs</h2>
<p>Google Sheet data can also become an intermediate step before another action.</p>
<p>For example:</p>
<pre><code class="language-text">Customer
   ↓
Sheet Lookup
   ↓
Provider Phone
   ↓
HTTP API
</code></pre>
<p>This can be useful when the Sheet contains information required by an external system.</p>
<h2>Example: Service marketplace</h2>
<p>Your Sheet contains:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>Provider</th>
<th>Area</th>
<th>Phone</th>
</tr>
</thead>
<tbody><tr>
<td>Plumber</td>
<td>Rahul</td>
<td>Ahmedabad</td>
<td>+91...</td>
</tr>
<tr>
<td>Electrician</td>
<td>Amit</td>
<td>Ahmedabad</td>
<td>+91...</td>
</tr>
</tbody></table>
<p>Customer:</p>
<blockquote>
<p>I need an electrician in Ahmedabad.</p>
</blockquote>
<p>Your automation can identify the relevant service and location, retrieve the matching record and present it.</p>
<h2>Example: Branch information</h2>
<p>Sheet:</p>
<table>
<thead>
<tr>
<th>City</th>
<th>Address</th>
<th>Phone</th>
</tr>
</thead>
<tbody><tr>
<td>Ahmedabad</td>
<td>Address A</td>
<td>+91...</td>
</tr>
<tr>
<td>Mumbai</td>
<td>Address B</td>
<td>+91...</td>
</tr>
</tbody></table>
<p>Customer selects:</p>
<p><strong>Mumbai</strong></p>
<p>The flow returns the Mumbai branch information.</p>
<h2>Example: Staff directory</h2>
<p>Sheet:</p>
<table>
<thead>
<tr>
<th>Department</th>
<th>Contact</th>
<th>Email</th>
</tr>
</thead>
<tbody><tr>
<td>Sales</td>
<td>Rahul</td>
<td>sales@...</td>
</tr>
<tr>
<td>Support</td>
<td>Priya</td>
<td>support@...</td>
</tr>
</tbody></table>
<p>A flow can retrieve the correct contact information based on the customer's selected department.</p>
<h2>Keep the Sheet as the source of truth</h2>
<p>If the information changes frequently, don't duplicate the same information in multiple flow messages.</p>
<p>For example, if a branch phone number changes:</p>
<p>Bad approach:</p>
<blockquote>
<p>Update ten chatbot messages.</p>
</blockquote>
<p>Better:</p>
<blockquote>
<p>Update the Google Sheet.</p>
</blockquote>
<p>Then the lookup uses the latest data.</p>
<h2>Data Fetch isn't a spreadsheet database</h2>
<p>Google Sheets is convenient, but it isn't automatically the right tool for every business.</p>
<p>Use it for relatively simple lookup data.</p>
<p>For complex, transactional systems, use an API or proper backend.</p>
<h2>Test the full flow</h2>
<p>Test:</p>
<ul>
<li><p>Valid lookup</p>
</li>
<li><p>No match</p>
</li>
<li><p>Multiple matches</p>
</li>
<li><p>Incorrect input</p>
</li>
<li><p>Empty data</p>
</li>
<li><p>Updated spreadsheet value</p>
</li>
</ul>
<h2>Common mistakes</h2>
<h3>Sheet is connected but flow doesn't return data</h3>
<p>Connection and Data Fetch configuration are separate steps.</p>
<h3>Correct Sheet, wrong campaign</h3>
<p>Check that the Flow uses the intended Data Fetch campaign.</p>
<h3>Correct row, empty response</h3>
<p>Check custom-field mapping.</p>
<h3>Button value doesn't match Sheet value</h3>
<p>Check the exact search term.</p>
<h2>A simple mental model</h2>
<pre><code class="language-text">Google Sheet
    ↓
Data Fetch
    ↓
Find Row
    ↓
Save Result
    ↓
Flow Builder
    ↓
Use Result
</code></pre>
<p>This turns Google Sheets into a simple operational data source for your conversations.</p>
]]></content:encoded></item><item><title><![CDATA[How to Use Google Sheet Data Fetch in ZazzyAgent]]></title><description><![CDATA[Google Sheets doesn't have to be only a place where you store customer information.
ZazzyAgent can also look up information from a Google Sheet during a conversation and use the result in the next ste]]></description><link>https://blog.zazzyagent.com/how-to-use-google-sheet-data-fetch-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-use-google-sheet-data-fetch-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 10:10:44 GMT</pubDate><content:encoded><![CDATA[<p>Google Sheets doesn't have to be only a place where you store customer information.</p>
<p>ZazzyAgent can also <strong>look up information from a Google Sheet during a conversation</strong> and use the result in the next step.</p>
<p>This is useful when your information changes regularly but doesn't need a full database or custom API.</p>
<p>For example:</p>
<blockquote>
<p>Customer asks for a plumber.</p>
</blockquote>
<p>Your ZazzyAgent flow can search your Google Sheet and return the relevant plumber's information.</p>
<p>The current Google Sheet Data Fetch feature supports retrieving spreadsheet data for use in chatbot replies across supported channels.</p>
<h2>What is Google Sheet Data Fetch?</h2>
<p>It lets a ZazzyAgent flow search connected spreadsheet data and use the matching information during the conversation.</p>
<p>The basic architecture is:</p>
<pre><code class="language-text">Customer
   ↓
Input / Selection
   ↓
Google Sheet Data Fetch
   ↓
Matching Row
   ↓
Custom Fields
   ↓
Reply
</code></pre>
<h2>When should you use it?</h2>
<p>Use Google Sheet Data Fetch when the information changes regularly and is easier for your team to maintain in a spreadsheet.</p>
<p>Examples:</p>
<ul>
<li><p>Service providers</p>
</li>
<li><p>Locations</p>
</li>
<li><p>Contact lists</p>
</li>
<li><p>Staff directories</p>
</li>
<li><p>Available services</p>
</li>
<li><p>Simple price tables</p>
</li>
<li><p>Branch information</p>
</li>
<li><p>Product information</p>
</li>
</ul>
<h2>Example: Service directory</h2>
<p>Imagine your Sheet contains:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>Person</th>
<th>Phone</th>
</tr>
</thead>
<tbody><tr>
<td>Plumber</td>
<td>Rahul</td>
<td>+91...</td>
</tr>
<tr>
<td>Electrician</td>
<td>Amit</td>
<td>+91...</td>
</tr>
<tr>
<td>Cleaner</td>
<td>Priya</td>
<td>+91...</td>
</tr>
</tbody></table>
<p>A customer says:</p>
<blockquote>
<p>Plumber</p>
</blockquote>
<p>ZazzyAgent can search the Sheet for the matching service and retrieve:</p>
<p><strong>Rahul</strong></p>
<p>and:</p>
<p><strong>+91...</strong></p>
<h2>Before you start</h2>
<p>You need:</p>
<ul>
<li><p>Connected Google account</p>
</li>
<li><p>Google Sheet</p>
</li>
<li><p>Clean column headings</p>
</li>
<li><p>Data you want to search</p>
</li>
<li><p>Appropriate custom fields for the values you want to use</p>
</li>
</ul>
<h2>Prepare your Google Sheet</h2>
<p>Keep the data structured.</p>
<p>Example:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>Name</th>
<th>Phone</th>
</tr>
</thead>
<tbody><tr>
<td>Plumber</td>
<td>Rahul</td>
<td>+919...</td>
</tr>
<tr>
<td>Electrician</td>
<td>Amit</td>
<td>+919...</td>
</tr>
</tbody></table>
<p>Avoid putting several unrelated values into one cell.</p>
<h2>Connect Google Sheets</h2>
<p>Connect your Google account through the Google Sheets integration.</p>
<p>Then add the existing Sheet or create a new one.</p>
<p>This step is different from actually configuring Data Fetch.</p>
<p>Your Sheet must already be available to ZazzyAgent.</p>
<h2>Create custom fields</h2>
<p>Suppose you want to retrieve:</p>
<p><strong>Name</strong></p>
<p><strong>Phone</strong></p>
<p>Create appropriate custom fields if they don't already exist.</p>
<p>For example:</p>
<blockquote>
<p>Provider Name</p>
</blockquote>
<blockquote>
<p>Provider Phone</p>
</blockquote>
<p>The Data Fetch result can then be saved into those fields.</p>
<h2>Create a Data Fetch campaign</h2>
<p>Open the Google Sheet Data Fetch configuration.</p>
<p>Create a new campaign.</p>
<p>Give it a useful name.</p>
<p>For example:</p>
<blockquote>
<p>Service Provider Lookup</p>
</blockquote>
<p>Avoid:</p>
<blockquote>
<p>Sheet Test</p>
</blockquote>
<h2>Select the Google Sheet</h2>
<p>Choose the Sheet containing the information you want to search.</p>
<p>Make sure it's the correct Sheet.</p>
<p>Businesses often have several spreadsheets.</p>
<h2>Configure the search</h2>
<p>Define what information the workflow should use to find the appropriate row.</p>
<p>For example:</p>
<pre><code class="language-text">Customer's selection
        ↓
Search Service column
        ↓
Matching row
</code></pre>
<p>The current Data Fetch workflow can search spreadsheet information based on the value received from the conversation and then make selected row data available through custom fields.</p>
<h2>Map the returned columns</h2>
<p>Suppose the matching row contains:</p>
<pre><code class="language-text">Service
Name
Phone
</code></pre>
<p>Map:</p>
<pre><code class="language-text">Name
 ↓
Provider Name

Phone
 ↓
Provider Phone
</code></pre>
<p>Now your flow can use the returned information.</p>
<h2>Use the data in a reply</h2>
<p>Your next message might say:</p>
<blockquote>
<p>We found a plumber for you.</p>
</blockquote>
<blockquote>
<p>Rahul</p>
</blockquote>
<blockquote>
<p>+91...</p>
</blockquote>
<p>The exact variable syntax depends on how the corresponding custom fields are exposed in your message configuration.</p>
<h2>Use it with buttons</h2>
<p>A particularly clean pattern is:</p>
<blockquote>
<p>What service do you need?</p>
</blockquote>
<p><strong>Plumber</strong></p>
<p><strong>Electrician</strong></p>
<p><strong>Cleaner</strong></p>
<p>The button selection becomes the search value.</p>
<p>The current Google Sheet Data Fetch workflow supports using interactive selections to search the configured Sheet and retrieve matching row data.</p>
<h2>Example flow</h2>
<pre><code class="language-text">Choose Service
      ↓
[Plumber]
[Electrician]
[Cleaner]
      ↓
Google Sheet Data Fetch
      ↓
Find matching row
      ↓
Save returned data
      ↓
Reply
</code></pre>
<h2>Keep the search column consistent</h2>
<p>Suppose your Sheet contains:</p>
<pre><code class="language-text">Plumber
Electrician
Cleaner
</code></pre>
<p>Your button text should correspond to those values if the workflow is designed to search using the button text.</p>
<p>If your Sheet says:</p>
<blockquote>
<p>Electrical Services</p>
</blockquote>
<p>while the button says:</p>
<blockquote>
<p>Electrician</p>
</blockquote>
<p>the lookup may not find the expected row unless your matching configuration accounts for the difference.</p>
<h2>What if there are duplicate matches?</h2>
<p>Suppose your Sheet contains:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>Name</th>
</tr>
</thead>
<tbody><tr>
<td>Plumber</td>
<td>Rahul</td>
</tr>
<tr>
<td>Plumber</td>
<td>Amit</td>
</tr>
</tbody></table>
<p>You need to decide how your workflow should handle multiple matches.</p>
<p>Don't assume a spreadsheet lookup is automatically the same as a database query.</p>
<p>Structure your data around the result you actually want.</p>
<h2>Keep Sheets clean</h2>
<p>Avoid:</p>
<ul>
<li><p>Blank header rows</p>
</li>
<li><p>Random columns</p>
</li>
<li><p>Inconsistent spellings</p>
</li>
<li><p>Duplicate entries</p>
</li>
<li><p>Mixed data types</p>
</li>
</ul>
<p>The cleaner the Sheet, the easier the automation is to maintain.</p>
<h2>Update the Sheet without rebuilding the flow</h2>
<p>One advantage of this setup is that your team can update the source data in Google Sheets.</p>
<p>For example:</p>
<blockquote>
<p>Rahul changes his phone number.</p>
</blockquote>
<p>Update the spreadsheet.</p>
<p>The lookup can use the updated information without you rewriting the entire chatbot flow.</p>
<p>This is one reason Data Fetch is useful for operational information that changes regularly.</p>
<h2>Data Fetch vs sending data to Google Sheets</h2>
<p>These are opposite directions.</p>
<h3>Data Fetch</h3>
<p>Google Sheet → ZazzyAgent.</p>
<h3>User Input to Sheet</h3>
<p>ZazzyAgent → Google Sheet.</p>
<p>Don't confuse the two.</p>
<h2>Data Fetch vs HTTP API</h2>
<p>Use:</p>
<p><strong>Google Sheet Data Fetch</strong></p>
<p>when your source is a spreadsheet.</p>
<p>Use:</p>
<p><strong>HTTP API</strong></p>
<p>when your source is an external application/API.</p>
<h2>Example: Branch locator</h2>
<p>Sheet:</p>
<table>
<thead>
<tr>
<th>City</th>
<th>Branch</th>
<th>Phone</th>
</tr>
</thead>
<tbody><tr>
<td>Ahmedabad</td>
<td>Branch A</td>
<td>+91...</td>
</tr>
<tr>
<td>Mumbai</td>
<td>Branch B</td>
<td>+91...</td>
</tr>
</tbody></table>
<p>Customer:</p>
<blockquote>
<p>Ahmedabad</p>
</blockquote>
<p>The flow searches the Sheet and returns the relevant branch information.</p>
<h2>Example: Service provider</h2>
<p>Customer:</p>
<blockquote>
<p>Electrician</p>
</blockquote>
<p>The flow finds the matching provider and returns the information.</p>
<h2>Example: Internal directory</h2>
<p>Customer:</p>
<blockquote>
<p>Sales</p>
</blockquote>
<p>The Sheet contains your sales contact.</p>
<p>The automation can retrieve and present it.</p>
<h2>What if no match is found?</h2>
<p>Plan for it.</p>
<p>For example:</p>
<blockquote>
<p>I couldn't find a matching service. Please choose another option or contact our team.</p>
</blockquote>
<p>A lookup should have a fallback path.</p>
<h2>Test these cases</h2>
<p>Test:</p>
<p><strong>Valid match</strong></p>
<p><strong>No match</strong></p>
<p><strong>Different capitalization</strong></p>
<p><strong>Extra spaces</strong></p>
<p><strong>Duplicate values</strong></p>
<p><strong>Empty result</strong></p>
<h2>Common problems</h2>
<h3>Nothing is returned</h3>
<p>Check the search value and Sheet data.</p>
<h3>Wrong row is returned</h3>
<p>Check for duplicate matches.</p>
<h3>Returned fields are empty</h3>
<p>Check the mapping from Sheet columns to custom fields.</p>
<h3>Data is outdated</h3>
<p>Update the Sheet.</p>
<h3>Flow works manually but not from the button</h3>
<p>Check the button text against the Sheet search value.</p>
<h2>The architecture</h2>
<pre><code class="language-text">Google Sheet
     ↓
Data Fetch Campaign
     ↓
Search
     ↓
Matching Row
     ↓
Custom Fields
     ↓
ZazzyAgent Reply
</code></pre>
<p>Google Sheet Data Fetch is essentially a simple way to turn a spreadsheet into a <strong>live lookup table inside your chatbot conversations</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[How to Map Webhook Data to Customer Fields in ZazzyAgent]]></title><description><![CDATA[Receiving a webhook is only the beginning.
An external system may send ZazzyAgent information such as:
{
  "name": "Rahul",
  "phone": "+919XXXXXXXXX",
  "email": "rahul@example.com",
  "lead_type": "]]></description><link>https://blog.zazzyagent.com/how-to-map-webhook-data-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-map-webhook-data-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 09:56:01 GMT</pubDate><content:encoded><![CDATA[<p>Receiving a webhook is only the beginning.</p>
<p>An external system may send ZazzyAgent information such as:</p>
<pre><code class="language-json">{
  "name": "Rahul",
  "phone": "+919XXXXXXXXX",
  "email": "rahul@example.com",
  "lead_type": "Enterprise"
}
</code></pre>
<p><a href="http://zazzyagent.com">ZazzyAgent</a> needs to know what each value means and where it should be stored or used.</p>
<p>That's what <strong>field mapping</strong> is for.</p>
<h2>What is webhook field mapping?</h2>
<p>Field mapping connects a value received from an external webhook to a field that ZazzyAgent can use.</p>
<p>For example:</p>
<pre><code class="language-text">Webhook:
customer_name
       ↓
ZazzyAgent:
Name
</code></pre>
<p>Another:</p>
<pre><code class="language-text">Webhook:
lead_type
       ↓
Custom Field:
Lead Type
</code></pre>
<h2>Why does mapping matter?</h2>
<p>Without correct mapping, the webhook can arrive successfully while your automation still doesn't work.</p>
<p>You may see:</p>
<blockquote>
<p>Webhook received.</p>
</blockquote>
<p>but later discover:</p>
<blockquote>
<p>Customer name is empty.</p>
</blockquote>
<p>or:</p>
<blockquote>
<p>The phone number wasn't found.</p>
</blockquote>
<p>The request arrived.</p>
<p>The problem is what happened <strong>after</strong> it arrived.</p>
<h2>Example webhook payload</h2>
<p>Suppose your website sends:</p>
<pre><code class="language-json">{
  "full_name": "Rahul Sharma",
  "customer_phone": "+919876543210",
  "service": "Consultation",
  "budget": "50000"
}
</code></pre>
<p>You could map:</p>
<table>
<thead>
<tr>
<th>Incoming field</th>
<th>ZazzyAgent destination</th>
</tr>
</thead>
<tbody><tr>
<td>full_name</td>
<td>Name</td>
</tr>
<tr>
<td>customer_phone</td>
<td>Phone</td>
</tr>
<tr>
<td>service</td>
<td>Service Interest</td>
</tr>
<tr>
<td>budget</td>
<td>Budget</td>
</tr>
</tbody></table>
<p>The exact available system fields and custom fields depend on your configuration.</p>
<h2>Step 1: Send a test webhook</h2>
<p>Before mapping anything, send a real sample request from the external system.</p>
<p>The sample should contain realistic values.</p>
<p>For example:</p>
<pre><code class="language-text">Name: Rahul Sharma
Phone: +919876543210
Service: Consultation
Budget: 50000
</code></pre>
<p>This makes it easier to identify each incoming field.</p>
<h2>Step 2: Inspect the received payload</h2>
<p>Look at the webhook data ZazzyAgent captured.</p>
<p>You may see fields such as:</p>
<pre><code class="language-text">full_name
customer_phone
service
budget
</code></pre>
<p>Pay attention to the exact names.</p>
<p>Don't assume:</p>
<pre><code class="language-text">phone
</code></pre>
<p>and:</p>
<pre><code class="language-text">customer_phone
</code></pre>
<p>are the same thing.</p>
<p>They are different field names unless you map them accordingly.</p>
<h2>Step 3: Decide where each value belongs</h2>
<p>For each incoming value, ask:</p>
<blockquote>
<p>Is this a standard customer property?</p>
</blockquote>
<p>or:</p>
<blockquote>
<p>Is this business-specific information?</p>
</blockquote>
<p>For example:</p>
<h3>Standard information</h3>
<p>Name</p>
<p>Phone</p>
<p>Email</p>
<h3>Business-specific information</h3>
<p>Budget</p>
<p>Service Interest</p>
<p>Company Size</p>
<p>Preferred Date</p>
<p>Use custom fields for information specific to your business.</p>
<h2>Step 4: Create custom fields where needed</h2>
<p>Suppose your webhook sends:</p>
<pre><code class="language-text">budget
</code></pre>
<p>and you don't already have a Budget field.</p>
<p>Create an appropriate custom field.</p>
<p>For example:</p>
<blockquote>
<p>Budget</p>
</blockquote>
<p>Then map the incoming <code>budget</code> value to it.</p>
<p>See <a href="https://blog.zazzyagent.com/zazzyagent-custom-fields-guide">ZazzyAgent Custom Fields Guide</a>.</p>
<h2>Step 5: Map the phone number carefully</h2>
<p>Phone mapping is especially important when the webhook will trigger a WhatsApp message.</p>
<p>Your workflow needs to know which customer the phone number belongs to.</p>
<p>Make sure the external system sends the number in the expected international format.</p>
<p>For example:</p>
<pre><code class="language-text">+919876543210
</code></pre>
<p>rather than an ambiguous local format.</p>
<h2>Step 6: Map the name</h2>
<p>If the incoming field is:</p>
<pre><code class="language-text">full_name
</code></pre>
<p>and your destination is the customer's name field, connect those values appropriately.</p>
<p>Then your automation can personalize messages where supported.</p>
<h2>Step 7: Map custom information</h2>
<p>Suppose the webhook contains:</p>
<pre><code class="language-text">service = Consultation
</code></pre>
<p>Create or select:</p>
<blockquote>
<p>Service Interest</p>
</blockquote>
<p>Then map:</p>
<pre><code class="language-text">service
   ↓
Service Interest
</code></pre>
<h2>Step 8: Use mapped data in the next step</h2>
<p>Once the information is stored correctly, your workflow can use it.</p>
<p>For example:</p>
<pre><code class="language-text">Webhook
   ↓
Map Lead Type
   ↓
Condition
   ↓
Enterprise?
 ↙       ↘
Yes       No
 ↓         ↓
Sales     Standard
</code></pre>
<h2>Use mapped webhook data in messages</h2>
<p>Suppose the webhook sends:</p>
<pre><code class="language-text">name = Rahul
</code></pre>
<p>You can use the stored customer value in a suitable message.</p>
<p>For example:</p>
<blockquote>
<p>Hi Rahul, thanks for your enquiry.</p>
</blockquote>
<h2>Use mapped data in conditions</h2>
<p>Suppose:</p>
<pre><code class="language-text">lead_type = Enterprise
</code></pre>
<p>You can route the conversation differently.</p>
<p>This is where mapping becomes more than simple data storage.</p>
<h2>Use mapped data with APIs</h2>
<p>Webhook data can also become the input to another API call.</p>
<p>For example:</p>
<pre><code class="language-text">Webhook
   ↓
Order Number
   ↓
HTTP API
   ↓
Order Status
</code></pre>
<p>See <a href="https://blog.zazzyagent.com/how-to-use-http-api-zazzyagent-flow-builder">How to Use HTTP API in ZazzyAgent Flow Builder</a>.</p>
<h2>Use mapped data with labels</h2>
<p>Suppose:</p>
<pre><code class="language-text">lead_type = Enterprise
</code></pre>
<p>Your automation can apply an appropriate label.</p>
<p>For example:</p>
<blockquote>
<p>Enterprise Lead</p>
</blockquote>
<h2>Check field types</h2>
<p>A common mistake is treating every value as plain text.</p>
<p>For example:</p>
<pre><code class="language-text">budget
</code></pre>
<p>may need to be treated as a number for numeric comparisons.</p>
<p>Likewise:</p>
<pre><code class="language-text">email
</code></pre>
<p>should be stored using an appropriate email field where available.</p>
<p>The field type affects how the data can be validated and used later.</p>
<h2>Check nested JSON</h2>
<p>External systems don't always send flat data.</p>
<p>You might receive:</p>
<pre><code class="language-json">{
  "customer": {
    "name": "Rahul",
    "phone": "+919876543210"
  }
}
</code></pre>
<p>Here, the information isn't directly at the top level.</p>
<p>You need to understand the payload structure before mapping it.</p>
<h2>What if the field is missing?</h2>
<p>Your external system may sometimes send:</p>
<pre><code class="language-text">name
phone
</code></pre>
<p>but omit:</p>
<pre><code class="language-text">email
</code></pre>
<p>Don't assume every webhook contains every field.</p>
<p>Your automation should account for missing values.</p>
<h2>What if a field is empty?</h2>
<p>An empty value is different from a missing value.</p>
<p>For example:</p>
<pre><code class="language-text">email = ""
</code></pre>
<p>means the field exists but contains no value.</p>
<p>You can use conditions or validation where appropriate.</p>
<h2>Common mapping mistakes</h2>
<h3>Correct webhook, wrong field</h3>
<p>The request arrived, but you're using the wrong field name.</p>
<h3>Phone isn't mapped</h3>
<p>ZazzyAgent cannot identify the intended WhatsApp recipient.</p>
<h3>Custom field doesn't exist</h3>
<p>Create the field before mapping.</p>
<h3>Wrong value type</h3>
<p>A numeric field may receive unexpected text.</p>
<h3>Nested data ignored</h3>
<p>The value exists inside another object in the JSON structure.</p>
<h2>Test with one customer first</h2>
<p>Don't test using 500 live leads.</p>
<p>Send one test request.</p>
<p>Check:</p>
<ul>
<li><p>Correct customer</p>
</li>
<li><p>Correct name</p>
</li>
<li><p>Correct phone</p>
</li>
<li><p>Correct custom fields</p>
</li>
<li><p>Correct next action</p>
</li>
</ul>
<p>Then move to production.</p>
<h2>A useful debugging sequence</h2>
<pre><code class="language-text">Webhook received?
       ↓
Correct payload?
       ↓
Correct field name?
       ↓
Correct destination?
       ↓
Value saved?
       ↓
Next automation uses it?
</code></pre>
<p>That sequence tells you where the problem actually is.</p>
<h2>The key idea</h2>
<p>A webhook delivers the data.</p>
<p><strong>Mapping gives the data meaning inside ZazzyAgent.</strong></p>
<p>Once the mapping is correct, the same information can drive messages, conditions, actions, APIs and customer management.</p>
]]></content:encoded></item><item><title><![CDATA[How to Send User Input Data to an External API in ZazzyAgent]]></title><description><![CDATA[A common ZazzyAgent workflow is:

Ask the customer for information → send that information to another system.

For example:

What's your name?


What's your email?


What service do you need?

After t]]></description><link>https://blog.zazzyagent.com/send-user-input-data-external-api-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/send-user-input-data-external-api-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 09:46:18 GMT</pubDate><content:encoded><![CDATA[<p>A common ZazzyAgent workflow is:</p>
<blockquote>
<p>Ask the customer for information → send that information to another system.</p>
</blockquote>
<p>For example:</p>
<blockquote>
<p>What's your name?</p>
</blockquote>
<blockquote>
<p>What's your email?</p>
</blockquote>
<blockquote>
<p>What service do you need?</p>
</blockquote>
<p>After the customer answers, you may want to send the information to your CRM, database or custom application.</p>
<p>The <strong>JSON API Connector</strong> can be used for this type of outgoing integration.</p>
<h2>What we're building</h2>
<p>We'll create:</p>
<pre><code class="language-text">Customer
   ↓
User Input Flow
   ↓
Collect Information
   ↓
JSON API Connector
   ↓
External Webhook
   ↓
External System
</code></pre>
<h2>Before you start</h2>
<p>You need:</p>
<ul>
<li><p>A ZazzyAgent Flow</p>
</li>
<li><p>User Input fields</p>
</li>
<li><p>A receiving webhook/API URL</p>
</li>
<li><p>Access to the JSON API Connector</p>
</li>
</ul>
<h2>Step 1: Build your User Input flow</h2>
<p>Create a flow that collects the information you need.</p>
<p>For example:</p>
<p><strong>Name</strong></p>
<p><strong>Email</strong></p>
<p><strong>Phone</strong></p>
<p><strong>Requirement</strong></p>
<p>Save each answer to the appropriate system/custom field.</p>
<h2>Step 2: Test the User Input first</h2>
<p>Before adding the API integration, make sure the flow successfully stores the customer responses.</p>
<p>This gives you a known-good starting point.</p>
<h2>Step 3: Prepare the external endpoint</h2>
<p>Create the endpoint that will receive your JSON data.</p>
<p>For testing, you can use a webhook inspection service.</p>
<p>For production, use your own secure API/webhook endpoint.</p>
<h2>Step 4: Open JSON API Connector</h2>
<p>Open the JSON API Connector in ZazzyAgent.</p>
<p>Create a new connector.</p>
<h2>Step 5: Name the connector</h2>
<p>Use a meaningful name.</p>
<p>For example:</p>
<blockquote>
<p>CRM – Lead Submission</p>
</blockquote>
<p>This makes it clear what the connector does.</p>
<h2>Step 6: Add your webhook URL</h2>
<p>Enter the external URL that should receive the data.</p>
<p>For example:</p>
<pre><code class="language-text">https://example.com/api/leads
</code></pre>
<p>Use your actual endpoint.</p>
<h2>Step 7: Choose the trigger</h2>
<p>Select:</p>
<p><strong>User Input Flow</strong></p>
<p>Then select the Flow that collects your lead information.</p>
<p>This tells ZazzyAgent:</p>
<blockquote>
<p>When this particular input flow completes, send the selected data.</p>
</blockquote>
<h2>Step 8: Select the fields</h2>
<p>Choose the information you want to send.</p>
<p>For example:</p>
<ul>
<li><p>First Name</p>
</li>
<li><p>Email</p>
</li>
<li><p>Phone</p>
</li>
<li><p>Requirement</p>
</li>
<li><p>Budget</p>
</li>
</ul>
<p>The connector can send system fields as well as customer/user-input information. (<a href="https://botsailor.com/help/en/blog/json-api-connector-in-botsailor-send-user-input-to-external-apis?utm_source=chatgpt.com">botsailor.com</a>)</p>
<h2>Step 9: Save</h2>
<p>Save the connector.</p>
<h2>Step 10: Run a test</h2>
<p>Start your User Input flow.</p>
<p>Enter test information:</p>
<blockquote>
<p>Rahul</p>
</blockquote>
<blockquote>
<p><a href="mailto:rahul@example.com">rahul@example.com</a></p>
</blockquote>
<blockquote>
<p>+919XXXXXXXXX</p>
</blockquote>
<blockquote>
<p>WhatsApp automation</p>
</blockquote>
<p>Then check your receiving endpoint.</p>
<h2>Step 11: Inspect the request</h2>
<p>You should see the information in JSON form.</p>
<p>The exact structure depends on your selected fields and ZazzyAgent's current payload format.</p>
<h2>Example business workflow</h2>
<p>Suppose your sales team uses a CRM.</p>
<p>Your ZazzyAgent lead flow collects:</p>
<pre><code class="language-text">Name
Email
Phone
Requirement
Budget
</code></pre>
<p>When the form finishes:</p>
<pre><code class="language-text">User Input Complete
        ↓
JSON API Connector
        ↓
CRM API
        ↓
New Lead
</code></pre>
<p>Now your sales team doesn't need to manually copy the lead.</p>
<h2>Use it with Instagram leads</h2>
<p>An Instagram AI Agent may qualify a customer.</p>
<p>Once the required information has been collected:</p>
<pre><code class="language-text">Instagram
    ↓
AI Agent
    ↓
Lead Qualification
    ↓
User Input / Saved Data
    ↓
JSON API
    ↓
CRM
</code></pre>
<p>The same architecture can be used for WhatsApp or other supported channels.</p>
<h2>Use it with website leads</h2>
<p>A website isn't the only place where this approach works.</p>
<p>Any ZazzyAgent conversation that produces structured information can potentially feed an external system.</p>
<h2>Send only the necessary data</h2>
<p>Suppose the CRM only requires:</p>
<ul>
<li><p>Name</p>
</li>
<li><p>Email</p>
</li>
<li><p>Phone</p>
</li>
</ul>
<p>Don't send twenty unrelated fields.</p>
<p>Smaller payloads are easier to maintain.</p>
<h2>Keep your external endpoint stable</h2>
<p>Don't change your endpoint URL casually after the connector is configured.</p>
<p>If the destination changes, update the connector and test it again.</p>
<h2>What if the external system doesn't receive anything?</h2>
<p>Check in this order:</p>
<h3>1. User Input completed</h3>
<p>Did the customer actually reach the end of the form?</p>
<h3>2. Connector is active/configured</h3>
<p>Is the correct connector attached to the intended User Input Flow?</p>
<h3>3. URL</h3>
<p>Is the webhook/API URL correct?</p>
<h3>4. Endpoint</h3>
<p>Is the receiving server online?</p>
<h3>5. Payload</h3>
<p>Did the request contain the expected fields?</p>
<h2>What if some fields are empty?</h2>
<p>Check whether:</p>
<ul>
<li><p>Customer actually provided them.</p>
</li>
<li><p>The field is mapped correctly.</p>
</li>
<li><p>The field is the correct system/custom field.</p>
</li>
<li><p>The User Input question saves the answer correctly.</p>
</li>
</ul>
<h2>What if you need custom authentication?</h2>
<p>If the receiving API requires authentication features that the JSON API Connector doesn't directly provide, use a secure backend relay.</p>
<p>For example:</p>
<pre><code class="language-text">ZazzyAgent
   ↓
Your secure webhook
   ↓
Authenticated server-side API call
   ↓
CRM
</code></pre>
<p>This avoids placing private API credentials in the customer-facing automation.</p>
<h2>Test with a real-looking payload</h2>
<p>Don't test only:</p>
<blockquote>
<p>Test User</p>
</blockquote>
<p>Use realistic values.</p>
<p>That lets you discover:</p>
<ul>
<li><p>Field formatting problems</p>
</li>
<li><p>Phone-number issues</p>
</li>
<li><p>Empty values</p>
</li>
<li><p>Unexpected characters</p>
</li>
<li><p>CRM validation errors</p>
</li>
</ul>
<h2>Add error handling</h2>
<p>Your external system can fail.</p>
<p>For example:</p>
<ul>
<li><p>Server unavailable</p>
</li>
<li><p>Invalid request</p>
</li>
<li><p>CRM error</p>
</li>
<li><p>Duplicate lead</p>
</li>
<li><p>Authentication failure</p>
</li>
</ul>
<p>Your business should decide what happens when that occurs.</p>
<h2>Don't tell the customer the API failed</h2>
<p>Avoid:</p>
<blockquote>
<p>HTTP 500</p>
</blockquote>
<p>Instead:</p>
<blockquote>
<p>We've received your information. Our team will process it shortly.</p>
</blockquote>
<p>Then let your technical system handle the failure internally.</p>
<h2>The final architecture</h2>
<pre><code class="language-text">Customer
   ↓
User Input
   ↓
Validate
   ↓
Save Fields
   ↓
JSON API Connector
   ↓
External System
   ↓
CRM / Database / Application
</code></pre>
<p>This is one of the simplest ways to turn a ZazzyAgent conversation into an automated business process.</p>
]]></content:encoded></item><item><title><![CDATA[What Is the JSON API Connector in ZazzyAgent?]]></title><description><![CDATA[ZazzyAgent can exchange customer information with external applications.
One of the integration options designed for this is the JSON API Connector.
It is useful when you want to take information coll]]></description><link>https://blog.zazzyagent.com/what-is-json-api-connector-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/what-is-json-api-connector-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 09:45:16 GMT</pubDate><content:encoded><![CDATA[<p>ZazzyAgent can exchange customer information with external applications.</p>
<p>One of the integration options designed for this is the <strong>JSON API Connector</strong>.</p>
<p>It is useful when you want to take information collected by a ZazzyAgent flow and send it to another system as JSON.</p>
<h2>What does the JSON API Connector do?</h2>
<p>The connector sends structured JSON data to a URL you provide.</p>
<p>For example:</p>
<pre><code class="language-text">Customer
   ↓
ZazzyAgent User Input
   ↓
JSON API Connector
   ↓
Your Webhook
   ↓
Your Application
</code></pre>
<p>The receiving application can then process the information.</p>
<h2>What is JSON?</h2>
<p>JSON is a structured way of representing data.</p>
<p>For example:</p>
<pre><code class="language-json">{
  "name": "Rahul",
  "email": "rahul@example.com",
  "budget": "75000"
}
</code></pre>
<p>A receiving system can read these values programmatically.</p>
<h2>When should you use the JSON API Connector?</h2>
<p>Use it when an external system needs customer data from ZazzyAgent.</p>
<p>Examples:</p>
<ul>
<li><p>CRM integration</p>
</li>
<li><p>Lead processing</p>
</li>
<li><p>Internal applications</p>
</li>
<li><p>Database workflows</p>
</li>
<li><p>Custom backend automation</p>
</li>
<li><p>External notification systems</p>
</li>
<li><p>Zapier/automation workflows</p>
</li>
</ul>
<p>The current connector documentation specifically describes sending User Input data to an external webhook URL as JSON. (<a href="https://botsailor.com/help/en/blog/json-api-connector-in-botsailor-send-user-input-to-external-apis?utm_source=chatgpt.com">botsailor.com</a>)</p>
<h2>JSON API Connector vs HTTP API</h2>
<p>These are easy to confuse.</p>
<h3>HTTP API</h3>
<p>ZazzyAgent calls an external API.</p>
<pre><code class="language-text">ZazzyAgent
   ↓
External API
</code></pre>
<h3>JSON API Connector</h3>
<p>ZazzyAgent sends customer/event data to the configured endpoint.</p>
<pre><code class="language-text">ZazzyAgent
   ↓
Webhook / External System
</code></pre>
<p>The key question is:</p>
<blockquote>
<p>Who is initiating the request?</p>
</blockquote>
<h2>Typical JSON API workflow</h2>
<p>A common setup is:</p>
<pre><code class="language-text">User Input Flow
       ↓
Customer provides data
       ↓
JSON API Connector
       ↓
External webhook
       ↓
Your system processes data
</code></pre>
<h2>Step 1: Create your User Input Flow</h2>
<p>Build a flow that collects the information you need.</p>
<p>For example:</p>
<blockquote>
<p>Name</p>
</blockquote>
<blockquote>
<p>Email</p>
</blockquote>
<blockquote>
<p>Phone</p>
</blockquote>
<blockquote>
<p>Requirement</p>
</blockquote>
<p>Save those responses.</p>
<h2>Step 2: Create your receiving endpoint</h2>
<p>Your external application needs a URL that can receive the JSON request.</p>
<p>For testing, you can use a webhook inspection service or your own endpoint.</p>
<h2>Step 3: Create the JSON API connection</h2>
<p>Open the JSON API Connector in ZazzyAgent.</p>
<p>Create a connection.</p>
<p>Give it a clear name.</p>
<p>For example:</p>
<blockquote>
<p>CRM Lead Submission</p>
</blockquote>
<h2>Step 4: Enter the webhook URL</h2>
<p>Paste the URL where ZazzyAgent should send the JSON data.</p>
<h2>Step 5: Select the trigger</h2>
<p>Choose the relevant User Input Flow as the trigger.</p>
<p>This tells ZazzyAgent when to send the data.</p>
<h2>Step 6: Choose the fields</h2>
<p>Select the information you want to send.</p>
<p>For example:</p>
<ul>
<li><p>First Name</p>
</li>
<li><p>Last Name</p>
</li>
<li><p>Email</p>
</li>
<li><p>Phone</p>
</li>
<li><p>User Input fields</p>
</li>
</ul>
<p>The current connector allows you to select system fields, custom/user-input data or both. (<a href="https://botsailor.com/help/en/blog/json-api-connector-in-botsailor-send-user-input-to-external-apis?utm_source=chatgpt.com">botsailor.com</a>)</p>
<h2>Step 7: Save the configuration</h2>
<p>Save the connector after configuring it.</p>
<h2>Step 8: Test the flow</h2>
<p>Start your User Input flow.</p>
<p>Answer the questions.</p>
<p>Then inspect the receiving endpoint.</p>
<p>You should see the JSON request.</p>
<h2>Example</h2>
<p>Customer provides:</p>
<p><strong>Name:</strong> Rahul</p>
<p><strong>Email:</strong> <a href="mailto:rahul@example.com">rahul@example.com</a></p>
<p><strong>Requirement:</strong> WhatsApp automation</p>
<p>The receiving system may get:</p>
<pre><code class="language-json">{
  "first_name": "Rahul",
  "email": "rahul@example.com",
  "requirement": "WhatsApp automation"
}
</code></pre>
<p>The exact payload depends on the fields you've selected and your ZazzyAgent configuration.</p>
<h2>What can your external system do?</h2>
<p>After receiving the data, your application can:</p>
<ul>
<li><p>Create a CRM lead</p>
</li>
<li><p>Store a database record</p>
</li>
<li><p>Send an internal notification</p>
</li>
<li><p>Trigger another workflow</p>
</li>
<li><p>Start an email process</p>
</li>
<li><p>Create a task</p>
</li>
</ul>
<p>ZazzyAgent doesn't need to do everything itself.</p>
<p>The connector lets another application take over after the data is collected.</p>
<h2>Use JSON API with lead qualification</h2>
<p>A lead agent can collect:</p>
<ul>
<li><p>Name</p>
</li>
<li><p>Requirement</p>
</li>
<li><p>Budget</p>
</li>
<li><p>Timeline</p>
</li>
</ul>
<p>Then the connector sends the information to your CRM.</p>
<pre><code class="language-text">Instagram / WhatsApp
       ↓
AI / Flow
       ↓
Lead Qualification
       ↓
User Input
       ↓
JSON API
       ↓
CRM
</code></pre>
<h2>Use it with surveys</h2>
<p>A survey can collect:</p>
<ul>
<li><p>Rating</p>
</li>
<li><p>Feedback</p>
</li>
<li><p>Comment</p>
</li>
</ul>
<p>The connector sends those answers to your database or analytics system.</p>
<h2>Use it with custom applications</h2>
<p>This is especially useful if your business has software that isn't available as a native ZazzyAgent integration.</p>
<p>You can build a receiving endpoint and let ZazzyAgent send the data there.</p>
<h2>What about authentication?</h2>
<p>The current JSON API Connector documentation describes sending data to public or pre-authenticated endpoints through the connector. If your system requires custom authentication headers or tokens that the connector does not support directly, a secure backend relay is the safer architecture. (<a href="https://botsailor.com/help/en/blog/json-api-connector-in-botsailor-send-user-input-to-external-apis?utm_source=chatgpt.com">botsailor.com</a>)</p>
<p>Don't expose private credentials inside customer-facing flow messages.</p>
<h2>JSON API Connector vs Webhook Workflow</h2>
<p>These features can sound similar.</p>
<p>A <strong>Webhook Workflow</strong> is typically used to receive data/event information from another system and then start an automation in ZazzyAgent.</p>
<p>A <strong>JSON API Connector</strong> is used to send structured ZazzyAgent/customer data outward to a configured endpoint.</p>
<p>Think:</p>
<blockquote>
<p><strong>Webhook Workflow = incoming data</strong></p>
</blockquote>
<blockquote>
<p><strong>JSON API Connector = outgoing data</strong></p>
</blockquote>
<h2>JSON API vs Google Sheets</h2>
<p>Use Google Sheets when a spreadsheet is the destination and suits the workflow.</p>
<p>Use JSON API when you need programmatic integration with another application.</p>
<h2>Test before going live</h2>
<p>Always send a test submission.</p>
<p>Verify:</p>
<ul>
<li><p>Request arrives</p>
</li>
<li><p>JSON is valid</p>
</li>
<li><p>Correct fields are included</p>
</li>
<li><p>Values are correct</p>
</li>
<li><p>External system processes them correctly</p>
</li>
</ul>
<h2>Keep the payload small</h2>
<p>Only send information the receiving system needs.</p>
<p>There's no reason to send every available customer field if the receiving application only needs five.</p>
<h2>Name integrations clearly</h2>
<p>Good:</p>
<blockquote>
<p>CRM – New Lead</p>
</blockquote>
<blockquote>
<p>Booking System – Appointment Request</p>
</blockquote>
<p>Poor:</p>
<blockquote>
<p>Test JSON</p>
</blockquote>
<p>Clear names make maintenance much easier.</p>
<h2>The simplest mental model</h2>
<p>Remember:</p>
<pre><code class="language-text">Collect information
       ↓
Turn it into JSON
       ↓
Send it outward
       ↓
External system processes it
</code></pre>
<p>That's the main purpose of the JSON API Connector.</p>
]]></content:encoded></item><item><title><![CDATA[How to Build a Multi-Step Form in ZazzyAgent]]></title><description><![CDATA[Some customer processes require more than one answer.
For example, a lead form might need:

Name

Email

Requirement

Budget

Timeline


You can build this as a conversational multi-step form in Zazzy]]></description><link>https://blog.zazzyagent.com/multi-step-form-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/multi-step-form-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 09:44:03 GMT</pubDate><content:encoded><![CDATA[<p>Some customer processes require more than one answer.</p>
<p>For example, a lead form might need:</p>
<ol>
<li><p>Name</p>
</li>
<li><p>Email</p>
</li>
<li><p>Requirement</p>
</li>
<li><p>Budget</p>
</li>
<li><p>Timeline</p>
</li>
</ol>
<p>You can build this as a conversational multi-step form in ZazzyAgent.</p>
<p>The customer answers one question at a time and the flow moves to the next step.</p>
<h2>What is a multi-step form?</h2>
<p>A multi-step form is a series of User Input questions.</p>
<p>The architecture is:</p>
<pre><code class="language-text">Question 1
    ↓
Answer
    ↓
Question 2
    ↓
Answer
    ↓
Question 3
    ↓
Answer
    ↓
Confirmation
</code></pre>
<p>The current User Input documentation supports collecting several fields in sequence and saving their answers to system or custom fields. (<a href="https://botsailor.com/help/en/blog/multi-step-form-with-input-flow-in-botsailor?utm_source=chatgpt.com">botsailor.com</a>)</p>
<h2>When should you use one?</h2>
<p>Use a multi-step form when you need several pieces of information but want the customer to provide them conversationally.</p>
<p>Examples:</p>
<ul>
<li><p>Lead qualification</p>
</li>
<li><p>Appointment requests</p>
</li>
<li><p>Support requests</p>
</li>
<li><p>Registration</p>
</li>
<li><p>Surveys</p>
</li>
<li><p>Quote requests</p>
</li>
</ul>
<h2>Step 1: Decide what you need</h2>
<p>Start with the end result.</p>
<p>For example:</p>
<blockquote>
<p>Sales team needs a qualified lead.</p>
</blockquote>
<p>What information do they actually need?</p>
<p>Perhaps:</p>
<ul>
<li><p>Name</p>
</li>
<li><p>Email</p>
</li>
<li><p>Service</p>
</li>
<li><p>Budget</p>
</li>
<li><p>Timeline</p>
</li>
</ul>
<p>That's your form.</p>
<h2>Step 2: Create the first question</h2>
<p>Ask:</p>
<blockquote>
<p>What's your name?</p>
</blockquote>
<p>Save the answer into the appropriate name field.</p>
<h2>Step 3: Ask for email</h2>
<p>Next:</p>
<blockquote>
<p>What's the best email address to reach you?</p>
</blockquote>
<p>Use the appropriate email input type.</p>
<h2>Step 4: Ask about the requirement</h2>
<p>For example:</p>
<blockquote>
<p>What are you looking for?</p>
</blockquote>
<p>Save the response to:</p>
<blockquote>
<p>Requirement</p>
</blockquote>
<h2>Step 5: Ask the budget</h2>
<p>For example:</p>
<blockquote>
<p>What's your approximate budget?</p>
</blockquote>
<p>Save to:</p>
<blockquote>
<p>Budget</p>
</blockquote>
<h2>Step 6: Ask about timing</h2>
<p>For example:</p>
<blockquote>
<p>When are you hoping to get started?</p>
</blockquote>
<p>Save to:</p>
<blockquote>
<p>Timeline</p>
</blockquote>
<h2>Step 7: Confirm the information</h2>
<p>At the end, send a confirmation.</p>
<p>For example:</p>
<blockquote>
<p>Thanks, Rahul. I've recorded your requirement and budget. We'll use these details to help with the next step.</p>
</blockquote>
<h2>Step 8: Trigger the next automation</h2>
<p>After the form, you can:</p>
<ul>
<li><p>Add a label</p>
</li>
<li><p>Assign a sequence</p>
</li>
<li><p>Call an API</p>
</li>
<li><p>Trigger another flow</p>
</li>
<li><p>Assign a human</p>
</li>
<li><p>Transfer to an AI Agent</p>
</li>
</ul>
<p>The correct action depends on your process.</p>
<h2>Example: Lead qualification form</h2>
<pre><code class="language-text">Name
 ↓
Email
 ↓
Requirement
 ↓
Budget
 ↓
Timeline
 ↓
Confirmation
 ↓
Qualified Lead
</code></pre>
<h2>Example: Support form</h2>
<pre><code class="language-text">Name
 ↓
Issue Type
 ↓
Order Number
 ↓
Problem Description
 ↓
Confirmation
 ↓
Support Team
</code></pre>
<h2>Example: Appointment form</h2>
<pre><code class="language-text">Name
 ↓
Service
 ↓
Preferred Date
 ↓
Preferred Time
 ↓
Confirmation
</code></pre>
<h2>Don't ask everything at once</h2>
<p>A message such as:</p>
<blockquote>
<p>Please send your name, email, phone, company, requirement, budget and preferred date.</p>
</blockquote>
<p>creates unnecessary work for the customer.</p>
<p>One question at a time is easier to complete and validate.</p>
<h2>Use Quick Replies where possible</h2>
<p>Suppose the customer needs to choose:</p>
<blockquote>
<p>What service do you need?</p>
</blockquote>
<p>Use:</p>
<p><strong>Consultation</strong></p>
<p><strong>Demo</strong></p>
<p><strong>Installation</strong></p>
<p>instead of forcing them to type.</p>
<p>Then use User Input for information that needs free text.</p>
<h2>Use validation</h2>
<p>Each important input should use appropriate validation.</p>
<p>Examples:</p>
<p><strong>Email</strong></p>
<p>→ Email validation</p>
<p><strong>Phone</strong></p>
<p>→ Phone formatting</p>
<p><strong>Budget</strong></p>
<p>→ Numeric validation where appropriate</p>
<h2>Save every answer</h2>
<p>Give every important answer a destination.</p>
<p>For example:</p>
<pre><code class="language-text">Name       → First Name
Email      → Email
Requirement → Custom Field
Budget     → Custom Field
Timeline   → Custom Field
</code></pre>
<h2>Don't overwrite unrelated fields</h2>
<p>Make sure each question saves into its intended destination.</p>
<p>Accidentally saving:</p>
<blockquote>
<p>Budget</p>
</blockquote>
<p>into:</p>
<blockquote>
<p>City</p>
</blockquote>
<p>can create confusing customer records.</p>
<h2>Use conditions after the form</h2>
<p>Suppose:</p>
<p><strong>Budget = 100000</strong></p>
<p>After collecting the form:</p>
<pre><code class="language-text">Budget ≥ 100000
       ↓
Enterprise Sales
</code></pre>
<p>Otherwise:</p>
<blockquote>
<p>Standard Sales.</p>
</blockquote>
<h2>Use labels after the form</h2>
<p>You could add:</p>
<blockquote>
<p>Qualified Lead</p>
</blockquote>
<p>once all required information has been captured.</p>
<h2>Send data to your CRM</h2>
<p>Once the form is complete, use HTTP API or another integration method to send the information to your external system.</p>
<p>For example:</p>
<pre><code class="language-text">Multi-Step Form
      ↓
Customer Data
      ↓
HTTP API
      ↓
CRM
</code></pre>
<h2>Don't make forms too long</h2>
<p>A ten-question form may be appropriate for some businesses.</p>
<p>But if customers repeatedly abandon it, reduce the number of questions.</p>
<p>Only ask for information that changes what happens next.</p>
<h2>Give customers progress context</h2>
<p>When appropriate, tell customers what they're doing.</p>
<p>For example:</p>
<blockquote>
<p>Great. Just two more questions and we'll have everything we need.</p>
</blockquote>
<p>This helps them understand why the conversation continues.</p>
<h2>Handle incomplete conversations</h2>
<p>Customers may stop answering halfway through.</p>
<p>Design your follow-up strategy appropriately.</p>
<p>Don't assume every customer completes every step.</p>
<h2>Test the complete form</h2>
<p>Test:</p>
<ul>
<li><p>Correct answers</p>
</li>
<li><p>Invalid answers</p>
</li>
<li><p>Missing answers</p>
</li>
<li><p>Early abandonment</p>
</li>
<li><p>Each saved field</p>
</li>
<li><p>Confirmation</p>
</li>
<li><p>Final automation</p>
</li>
</ul>
<h2>Multi-step form vs WhatsApp Flow</h2>
<p>Use a conversational multi-step form when:</p>
<blockquote>
<p>One question at a time works well.</p>
</blockquote>
<p>Use a WhatsApp Flow when:</p>
<blockquote>
<p>A structured form interface is more convenient.</p>
</blockquote>
<p>Both can be valuable.</p>
<h2>The architecture</h2>
<pre><code class="language-text">Start
 ↓
Input
 ↓
Validate
 ↓
Save
 ↓
Input
 ↓
Validate
 ↓
Save
 ↓
...
 ↓
Complete
 ↓
Automation
</code></pre>
<p>Once you understand this pattern, you can build lead forms, booking requests, support intake forms and surveys without creating a separate manual process for each one.</p>
]]></content:encoded></item><item><title><![CDATA[How to Validate User Input in ZazzyAgent]]></title><description><![CDATA[Collecting information is only useful when the information is correct.
Suppose your flow asks:

What's your email address?

A customer accidentally types:

rahul@

If your automation accepts it withou]]></description><link>https://blog.zazzyagent.com/validate-user-input-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/validate-user-input-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 09:42:55 GMT</pubDate><content:encoded><![CDATA[<p>Collecting information is only useful when the information is correct.</p>
<p>Suppose your flow asks:</p>
<blockquote>
<p>What's your email address?</p>
</blockquote>
<p>A customer accidentally types:</p>
<blockquote>
<p>rahul@</p>
</blockquote>
<p>If your automation accepts it without validation, the bad value can later be sent to your CRM, API or sales team.</p>
<p>Validation helps prevent that.</p>
<h2>What is input validation?</h2>
<p>Validation checks whether the customer's response matches the rules you've defined.</p>
<p>For example:</p>
<blockquote>
<p>Email must be a valid email address.</p>
</blockquote>
<p>or:</p>
<blockquote>
<p>Age must be a number.</p>
</blockquote>
<p>The current User Input functionality provides validation rules for supported input types. (<a href="https://botsailor.com/help/en/blog/setting-validation-rules-for-input-fields-in-botsailor?utm_source=chatgpt.com">botsailor.com</a>)</p>
<h2>Why validation matters</h2>
<p>Without validation:</p>
<pre><code class="language-text">Customer
   ↓
Bad data
   ↓
CRM / API
   ↓
Problem later
</code></pre>
<p>With validation:</p>
<pre><code class="language-text">Customer
   ↓
Validate
   ↓
Valid → Save
Invalid → Ask again
</code></pre>
<h2>Required vs optional</h2>
<p>These are different concepts.</p>
<h3>Required</h3>
<p>Customer must provide an answer.</p>
<p>Example:</p>
<blockquote>
<p>Name</p>
</blockquote>
<h3>Optional</h3>
<p>Customer can continue without answering.</p>
<p>Example:</p>
<blockquote>
<p>Additional comments</p>
</blockquote>
<p>Only make fields required when your workflow actually needs them.</p>
<h2>Validate email addresses</h2>
<p>If the field is intended to collect email, use the appropriate email input type or validation.</p>
<p>A valid example:</p>
<blockquote>
<p><a href="mailto:rahul@example.com">rahul@example.com</a></p>
</blockquote>
<p>An invalid example:</p>
<blockquote>
<p>rahul@</p>
</blockquote>
<p>This prevents obvious formatting problems.</p>
<h2>Validate phone numbers</h2>
<p>Phone numbers need careful handling.</p>
<p>Decide what format your business expects.</p>
<p>For WhatsApp-related workflows, international formatting is often important.</p>
<p>For example:</p>
<blockquote>
<p>+919XXXXXXXXX</p>
</blockquote>
<p>Rather than an ambiguous local format.</p>
<h2>Validate numbers</h2>
<p>Suppose you ask:</p>
<blockquote>
<p>What is your budget?</p>
</blockquote>
<p>You probably want a number.</p>
<p>A response such as:</p>
<blockquote>
<p>Maybe around fifty thousand</p>
</blockquote>
<p>is different from:</p>
<blockquote>
<p>50000</p>
</blockquote>
<p>Consider whether your workflow needs strict numeric input or whether free text is more appropriate.</p>
<h2>Set minimum and maximum values</h2>
<p>For fields that represent numbers or lengths, use sensible limits where supported.</p>
<p>Example:</p>
<blockquote>
<p>Company size must be greater than 0.</p>
</blockquote>
<p>or:</p>
<blockquote>
<p>PIN must contain exactly 6 digits.</p>
</blockquote>
<p>The exact available validation controls depend on the input type.</p>
<h2>Validate text length</h2>
<p>Some information shouldn't be extremely short.</p>
<p>For example:</p>
<blockquote>
<p>Describe your requirement.</p>
</blockquote>
<p>A one-character answer may not be useful.</p>
<p>You can use appropriate length rules where supported.</p>
<h2>Invalid response message</h2>
<p>A customer should understand what went wrong.</p>
<p>Bad:</p>
<blockquote>
<p>Invalid input.</p>
</blockquote>
<p>Better:</p>
<blockquote>
<p>Please enter a valid email address, such as <a href="mailto:name@example.com">name@example.com</a>.</p>
</blockquote>
<p>The message should explain what the customer needs to correct.</p>
<h2>Let customers try again</h2>
<p>A validation failure shouldn't end the conversation.</p>
<p>The usual structure is:</p>
<pre><code class="language-text">Question
   ↓
Customer answer
   ↓
Valid?
 ↙      ↘
Yes      No
 ↓        ↓
Save   Explain + retry
</code></pre>
<h2>Example: Email</h2>
<pre><code class="language-text">Enter your email address.
        ↓
User Input
        ↓
Valid?
 ↙       ↘
Yes       No
 ↓         ↓
Save      "Please enter a valid email."
</code></pre>
<h2>Example: OTP/PIN</h2>
<p>If you're asking for a fixed-length value:</p>
<blockquote>
<p>Enter your 6-digit PIN.</p>
</blockquote>
<p>You can validate the expected number and length where the input configuration supports it.</p>
<h2>Example: Age</h2>
<p>If your process requires an age:</p>
<blockquote>
<p>Enter your age.</p>
</blockquote>
<p>Your validation rules can prevent obviously invalid values.</p>
<h2>Validation before an API</h2>
<p>This is especially important.</p>
<p>Imagine:</p>
<pre><code class="language-text">Customer enters Order ID
        ↓
Validation
        ↓
HTTP API
</code></pre>
<p>The API only receives a value that meets your input requirements.</p>
<p>This reduces unnecessary API calls and bad requests.</p>
<h2>Validation before CRM submission</h2>
<p>The same principle applies when sending leads to a CRM.</p>
<p>Don't send:</p>
<blockquote>
<p>invalid-email@</p>
</blockquote>
<p>to your external system and discover the problem later.</p>
<p>Validate first.</p>
<h2>Validation and User Input</h2>
<p>Validation is part of the data-collection process.</p>
<p>A useful architecture is:</p>
<pre><code class="language-text">Ask
 ↓
Collect
 ↓
Validate
 ↓
Save
 ↓
Use
</code></pre>
<h2>Don't over-validate</h2>
<p>Validation should prevent bad data, not make the form impossible to complete.</p>
<p>For example, if a customer says:</p>
<blockquote>
<p>My budget is around ₹50,000.</p>
</blockquote>
<p>and your workflow doesn't require a strict number, don't force them through a rigid numeric field unnecessarily.</p>
<p>Use the least restrictive format that still gives you usable information.</p>
<h2>Test invalid answers</h2>
<p>Don't test only the correct answer.</p>
<p>For every important field, test:</p>
<p><strong>Correct</strong></p>
<p><strong>Empty</strong></p>
<p><strong>Too short</strong></p>
<p><strong>Too long</strong></p>
<p><strong>Wrong format</strong></p>
<p><strong>Unexpected value</strong></p>
<h2>Common validation problems</h2>
<h3>Correct input is rejected</h3>
<p>Your validation rule may be too restrictive.</p>
<h3>Invalid input is accepted</h3>
<p>The validation may not match the actual data requirement.</p>
<h3>Customer gets stuck</h3>
<p>Check that the invalid path lets them try again.</p>
<h3>Data is saved incorrectly</h3>
<p>Check the input type and destination field.</p>
<h2>Good validation design</h2>
<p>The customer should know:</p>
<blockquote>
<p>What information do you need?</p>
</blockquote>
<blockquote>
<p>What format should I use?</p>
</blockquote>
<blockquote>
<p>What happens if I make a mistake?</p>
</blockquote>
<p>That is much better than silently rejecting input.</p>
<h2>The rule to remember</h2>
<blockquote>
<p><strong>Validate data at the point where you collect it.</strong></p>
</blockquote>
<p>Fixing bad customer data later is usually harder than preventing it in the first place.</p>
]]></content:encoded></item><item><title><![CDATA[What Is User Input in ZazzyAgent? Complete Guide]]></title><description><![CDATA[A chatbot becomes much more useful when it can collect information from customers.
Instead of only saying:

Welcome! How can I help?

you can ask:

What is your name?


What service are you interested]]></description><link>https://blog.zazzyagent.com/what-is-user-input-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/what-is-user-input-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 15 Sep 2026 09:41:29 GMT</pubDate><content:encoded><![CDATA[<p>A chatbot becomes much more useful when it can collect information from customers.</p>
<p>Instead of only saying:</p>
<blockquote>
<p>Welcome! How can I help?</p>
</blockquote>
<p>you can ask:</p>
<blockquote>
<p>What is your name?</p>
</blockquote>
<blockquote>
<p>What service are you interested in?</p>
</blockquote>
<blockquote>
<p>What is your budget?</p>
</blockquote>
<blockquote>
<p>What is your email address?</p>
</blockquote>
<p>ZazzyAgent's <strong>User Input</strong> functionality lets a flow collect these answers and use them later in the automation.</p>
<h2>What is User Input?</h2>
<p>User Input is a component that pauses a conversation, asks the customer for information and saves the response.</p>
<p>The basic pattern is:</p>
<pre><code class="language-text">Question
   ↓
Customer responds
   ↓
User Input
   ↓
Save response
   ↓
Next step
</code></pre>
<h2>What can you collect?</h2>
<p>Depending on the configuration, you can collect information such as:</p>
<ul>
<li><p>Text</p>
</li>
<li><p>Email</p>
</li>
<li><p>Phone number</p>
</li>
<li><p>Numbers</p>
</li>
<li><p>Other supported input types</p>
</li>
</ul>
<p>The available input types depend on the current User Input configuration.</p>
<h2>Example: Lead form</h2>
<p>You could ask:</p>
<blockquote>
<p>What is your name?</p>
</blockquote>
<p>Customer:</p>
<blockquote>
<p>Rahul</p>
</blockquote>
<p>Then:</p>
<blockquote>
<p>What's your email?</p>
</blockquote>
<p>Customer:</p>
<blockquote>
<p><a href="mailto:rahul@example.com">rahul@example.com</a></p>
</blockquote>
<p>Then:</p>
<blockquote>
<p>What are you looking for?</p>
</blockquote>
<p>Customer:</p>
<blockquote>
<p>WhatsApp automation.</p>
</blockquote>
<p>The flow now has useful structured information about the lead.</p>
<h2>Why save the response?</h2>
<p>If you only display the question and don't save the answer, that information has limited value.</p>
<p>Saving it allows later parts of your automation to use the customer's response.</p>
<p>For example:</p>
<pre><code class="language-text">User Input
   ↓
Budget = 75000
   ↓
Condition
   ↓
Budget &gt; 50000
</code></pre>
<p>Now the conversation can branch according to the customer's answer.</p>
<h2>User Input vs a normal message</h2>
<p>These are different.</p>
<h3>Normal message</h3>
<blockquote>
<p>What is your budget?</p>
</blockquote>
<p>The bot asks a question but doesn't necessarily collect it into a structured field.</p>
<h3>User Input</h3>
<blockquote>
<p>What is your budget?</p>
</blockquote>
<p>Customer answers.</p>
<p>ZazzyAgent captures the answer and saves it according to your configuration.</p>
<h2>User Input vs Quick Reply</h2>
<p>Use <strong>Quick Reply</strong> when the customer should choose from predefined options.</p>
<p>Example:</p>
<p><strong>Small</strong></p>
<p><strong>Medium</strong></p>
<p><strong>Large</strong></p>
<p>Use <strong>User Input</strong> when the customer needs to provide their own answer.</p>
<p>Example:</p>
<blockquote>
<p>What is your budget?</p>
</blockquote>
<p>Customer types:</p>
<blockquote>
<p>₹75,000</p>
</blockquote>
<h2>User Input vs WhatsApp Flow</h2>
<p>A User Input step is useful for collecting individual answers within a conversation.</p>
<p>A WhatsApp Flow is better when you want a more structured form experience with multiple fields and screens.</p>
<p>Both solve data-collection problems, but they provide different customer experiences.</p>
<h2>Save to a system field</h2>
<p>Some inputs can be saved to existing customer information fields.</p>
<p>For example:</p>
<ul>
<li><p>Name</p>
</li>
<li><p>Email</p>
</li>
<li><p>Phone</p>
</li>
</ul>
<p>Where the appropriate system field is available, use it rather than creating unnecessary custom fields.</p>
<h2>Save to a custom field</h2>
<p>For business-specific information, use custom fields.</p>
<p>Examples:</p>
<p><strong>Budget</strong></p>
<p><strong>City</strong></p>
<p><strong>Property Type</strong></p>
<p><strong>Preferred Date</strong></p>
<p><strong>Requirement</strong></p>
<p>See <a href="https://blog.zazzyagent.com/zazzyagent-custom-fields-guide">ZazzyAgent Custom Fields Guide</a>.</p>
<h2>Example: Lead qualification</h2>
<pre><code class="language-text">What service do you need?
      ↓
User Input
      ↓
Save: Service Interest

What is your budget?
      ↓
User Input
      ↓
Save: Budget

When do you want to start?
      ↓
User Input
      ↓
Save: Timeline
</code></pre>
<p>Those values can then be used by your AI Agent, conditions, labels and other automation.</p>
<h2>Use User Input with conditions</h2>
<p>Suppose you ask:</p>
<blockquote>
<p>How many employees are in your company?</p>
</blockquote>
<p>Customer:</p>
<blockquote>
<p>250</p>
</blockquote>
<p>Save:</p>
<p><strong>Company Size = 250</strong></p>
<p>Then:</p>
<pre><code class="language-text">Company Size &gt; 100
        ↓
Enterprise Lead
</code></pre>
<p>Otherwise:</p>
<pre><code class="language-text">Standard Lead
</code></pre>
<h2>Use User Input with labels</h2>
<p>A customer could answer:</p>
<blockquote>
<p>I need a demo.</p>
</blockquote>
<p>Your automation can save the response and then add a suitable label.</p>
<p>This turns conversational information into structured customer data.</p>
<h2>Use User Input with sequences</h2>
<p>After collecting a customer's information, you can start a relevant sequence.</p>
<p>For example:</p>
<p><strong>Product Interest = Enterprise</strong></p>
<p>↓</p>
<p>Start:</p>
<blockquote>
<p>Enterprise Follow-up</p>
</blockquote>
<h2>Use User Input with APIs</h2>
<p>User Input becomes especially powerful when combined with HTTP APIs.</p>
<p>For example:</p>
<pre><code class="language-text">Customer enters Order Number
          ↓
Save Order Number
          ↓
HTTP API
          ↓
Check Order
          ↓
Customer receives status
</code></pre>
<p>See <a href="https://blog.zazzyagent.com/how-to-use-http-api-zazzyagent-flow-builder">How to Use HTTP API in ZazzyAgent Flow Builder</a>.</p>
<h2>Use the right question for the field</h2>
<p>Bad:</p>
<blockquote>
<p>Tell us your information.</p>
</blockquote>
<p>Better:</p>
<blockquote>
<p>What is your company name?</p>
</blockquote>
<p>Specific questions produce better data.</p>
<h2>Don't collect unnecessary information</h2>
<p>Every question adds friction.</p>
<p>Before adding a field, ask:</p>
<blockquote>
<p>Will my business use this information?</p>
</blockquote>
<p>If not, remove it.</p>
<h2>Use validation</h2>
<p>If you're collecting an email address, use an email input/validation configuration rather than accepting anything as text.</p>
<p>If you're collecting a number, configure it appropriately.</p>
<p>See <a href="https://blog.zazzyagent.com/validate-user-input-zazzyagent">How to Validate User Input in ZazzyAgent</a>.</p>
<h2>What happens if the customer gives invalid information?</h2>
<p>Your flow should handle it properly.</p>
<p>For example:</p>
<blockquote>
<p>Please enter a valid email address.</p>
</blockquote>
<p>Then let the customer try again.</p>
<h2>Multi-step data collection</h2>
<p>User Input can be used several times in the same flow.</p>
<p>For example:</p>
<pre><code class="language-text">Name
 ↓
Email
 ↓
Phone
 ↓
Requirement
 ↓
Budget
 ↓
Confirmation
</code></pre>
<p>This creates a simple conversational form.</p>
<h2>User Input and AI</h2>
<p>An AI Agent and User Input can work together.</p>
<p>For example, the AI can understand that a customer has already provided their:</p>
<blockquote>
<p>Name</p>
</blockquote>
<p>and avoid asking for it again.</p>
<p>The structured data remains useful for your automations.</p>
<h2>Test User Input</h2>
<p>Test every field.</p>
<p>Check:</p>
<ul>
<li><p>Question</p>
</li>
<li><p>Input type</p>
</li>
<li><p>Saved field</p>
</li>
<li><p>Validation</p>
</li>
<li><p>Next step</p>
</li>
<li><p>Invalid response behavior</p>
</li>
</ul>
<h2>The basic rule</h2>
<p>Remember:</p>
<blockquote>
<p><strong>Message = tell the customer something.</strong></p>
</blockquote>
<blockquote>
<p><strong>Quick Reply = let the customer choose.</strong></p>
</blockquote>
<blockquote>
<p><strong>User Input = collect information.</strong></p>
</blockquote>
<p>Once you understand that distinction, building data-driven flows becomes much easier.</p>
]]></content:encoded></item><item><title><![CDATA[WhatsApp Catalog Not Showing in ZazzyAgent? Troubleshooting Guide]]></title><description><![CDATA[You've created a WhatsApp catalog, but it isn't appearing where you expect in ZazzyAgent dashboard.
Don't create another catalog immediately.
First identify where the connection breaks.
The basic chai]]></description><link>https://blog.zazzyagent.com/whatsapp-catalog-not-showing-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/whatsapp-catalog-not-showing-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 14:05:38 GMT</pubDate><content:encoded><![CDATA[<p>You've created a WhatsApp catalog, but it isn't appearing where you expect in <a href="http://app.zazzyagent.com">ZazzyAgent</a> dashboard.</p>
<p>Don't create another catalog immediately.</p>
<p>First identify where the connection breaks.</p>
<p>The basic chain is:</p>
<pre><code class="language-text">Meta Business
      ↓
Catalog
      ↓
WhatsApp Business Account
      ↓
ZazzyAgent
      ↓
Flow Builder
      ↓
Catalog Component
</code></pre>
<h2>Problem 1: Catalog doesn't exist in Meta</h2>
<p>Open your Meta commerce/catalog area.</p>
<p>Confirm that the catalog exists.</p>
<p>If it doesn't, create and populate the catalog first.</p>
<h2>Problem 2: Catalog exists but has no products</h2>
<p>Open the catalog.</p>
<p>Check whether the products are actually there.</p>
<p>A catalog with no products won't give your Flow Builder anything useful to display.</p>
<h2>Problem 3: Wrong Meta business</h2>
<p>Businesses sometimes have multiple Meta business environments.</p>
<p>Make sure the catalog belongs to the business connected to your WhatsApp setup.</p>
<h2>Problem 4: Wrong WhatsApp Business Account</h2>
<p>Your ZazzyAgent WhatsApp connection needs to be associated with the correct WhatsApp Business Account.</p>
<p>If you manage multiple WABAs, verify which one contains the relevant phone number and commerce setup.</p>
<h2>Problem 5: Catalog permissions</h2>
<p>Check your Meta account's access to:</p>
<ul>
<li><p>Business</p>
</li>
<li><p>Catalog</p>
</li>
<li><p>WhatsApp Business Account</p>
</li>
</ul>
<p>If you can see a catalog in one Meta account but authorize ZazzyAgent using another account, the expected catalog may not appear.</p>
<h2>Problem 6: WhatsApp isn't connected correctly</h2>
<p>Confirm that the correct WhatsApp account is connected to ZazzyAgent.</p>
<p>See:</p>
<p><a href="https://blog.zazzyagent.com/why-cant-connect-whatsapp-number-zazzyagent">Can't Connect WhatsApp to ZazzyAgent? Troubleshooting Guide</a>.</p>
<h2>Problem 7: Catalog exists but doesn't appear in ZazzyAgent</h2>
<p>Check the connection/synchronization state.</p>
<p>Refresh the relevant ZazzyAgent page.</p>
<p>Then verify that you're working with the correct connected WhatsApp account.</p>
<h2>Problem 8: Wrong catalog selected</h2>
<p>If multiple catalogs exist, check which one is configured in the Catalog component.</p>
<p>You may simply be looking at a different catalog.</p>
<h2>Problem 9: Catalog appears but products don't</h2>
<p>Open the catalog in Meta.</p>
<p>Check:</p>
<ul>
<li><p>Product exists</p>
</li>
<li><p>Product is active/available</p>
</li>
<li><p>Product belongs to the correct catalog</p>
</li>
<li><p>Product information is complete</p>
</li>
</ul>
<p>The current catalogue flow requires products to exist in the connected catalog before they can be selected in the Flow Builder.</p>
<h2>Problem 10: Product was recently added</h2>
<p>If you've just added a product, allow the catalog information to synchronize before assuming the integration is broken.</p>
<p>Then refresh the catalog/product selection.</p>
<h2>Problem 11: Product was changed but old information appears</h2>
<p>Check the catalog itself first.</p>
<p>The product information comes from the catalogue.</p>
<p>Don't immediately rewrite the Flow.</p>
<h2>Problem 12: Catalog works outside the Flow but not inside it</h2>
<p>Check the Flow Builder configuration.</p>
<p>Make sure the structure is:</p>
<pre><code class="language-text">Interactive Message
       ↓
Catalog
</code></pre>
<p>The current catalogue setup uses the Interactive Template's ecommerce connection to add the Catalog component.</p>
<h2>Problem 13: Catalog component doesn't appear</h2>
<p>Check whether you're adding it from the appropriate Interactive/ecommerce section.</p>
<p>Don't look for it among unrelated standard text elements.</p>
<h2>Problem 14: Flow works but catalog doesn't display</h2>
<p>Test the Flow in isolation.</p>
<p>Use a simple flow:</p>
<pre><code class="language-text">Trigger
 ↓
Interactive
 ↓
Catalog
</code></pre>
<p>If that works, the problem is probably somewhere else in your larger flow.</p>
<h2>Problem 15: Some products appear and others don't</h2>
<p>Compare the products inside Meta.</p>
<p>Check whether the missing products:</p>
<ul>
<li><p>Belong to the selected catalog</p>
</li>
<li><p>Are available for the connected setup</p>
</li>
<li><p>Have complete product information</p>
</li>
<li><p>Are being selected in the intended product section</p>
</li>
</ul>
<h2>Problem 16: The wrong product section appears</h2>
<p>Check your multiple-product configuration.</p>
<p>You may have connected a different section or product group than intended.</p>
<h2>Problem 17: Catalog is correct but customers don't see it</h2>
<p>Test the actual WhatsApp conversation.</p>
<p>Don't rely only on the Flow Builder preview.</p>
<p>Check:</p>
<p><strong>Flow executes</strong></p>
<p>→ <strong>Interactive message arrives</strong></p>
<p>→ <strong>Catalog appears</strong></p>
<p>→ <strong>Product appears</strong></p>
<p>→ <strong>Customer can interact</strong></p>
<h2>Troubleshoot in order</h2>
<p>Use this sequence:</p>
<h3>Meta</h3>
<p>Does the catalog exist?</p>
<p>↓</p>
<h3>Products</h3>
<p>Are the products inside it?</p>
<p>↓</p>
<h3>WhatsApp</h3>
<p>Is the correct WABA connected?</p>
<p>↓</p>
<h3>ZazzyAgent</h3>
<p>Is the correct WhatsApp account connected?</p>
<p>↓</p>
<h3>Flow</h3>
<p>Is the Catalog component correctly configured?</p>
<p>↓</p>
<h3>Customer</h3>
<p>Does the actual WhatsApp message display correctly?</p>
<h2>Don't change multiple things simultaneously</h2>
<p>Suppose the catalog isn't showing.</p>
<p>Don't:</p>
<ul>
<li><p>Create a new catalog.</p>
</li>
<li><p>Reconnect WhatsApp.</p>
</li>
<li><p>Delete your Flow.</p>
</li>
<li><p>Create new products.</p>
</li>
<li><p>Change Meta permissions.</p>
</li>
</ul>
<p>all at once.</p>
<p>You'll lose track of what actually fixed the problem.</p>
<p>Change one thing, test, then continue.</p>
<h2>Quick checklist</h2>
<p><strong>Meta</strong></p>
<ul>
<li><p>[ ] Correct business</p>
</li>
<li><p>[ ] Catalog exists</p>
</li>
<li><p>[ ] Products exist</p>
</li>
</ul>
<p><strong>WhatsApp</strong></p>
<ul>
<li><p>[ ] Correct WABA</p>
</li>
<li><p>[ ] Correct phone number</p>
</li>
<li><p>[ ] Correct permissions</p>
</li>
</ul>
<p><strong>ZazzyAgent</strong></p>
<ul>
<li><p>[ ] Correct WhatsApp account connected</p>
</li>
<li><p>[ ] Catalog available</p>
</li>
<li><p>[ ] Correct catalog selected</p>
</li>
</ul>
<p><strong>Flow Builder</strong></p>
<ul>
<li><p>[ ] Interactive component exists</p>
</li>
<li><p>[ ] Catalog connected</p>
</li>
<li><p>[ ] Correct products selected</p>
</li>
<li><p>[ ] Flow saved</p>
</li>
</ul>
<p><strong>Testing</strong></p>
<ul>
<li><p>[ ] Flow triggered</p>
</li>
<li><p>[ ] Catalog displayed</p>
</li>
<li><p>[ ] Products displayed</p>
</li>
<li><p>[ ] Customer interaction works</p>
</li>
</ul>
<h2>The most important diagnostic rule</h2>
<p>When a catalog isn't working, separate:</p>
<blockquote>
<p><strong>Catalog problem</strong></p>
</blockquote>
<p>from:</p>
<blockquote>
<p><strong>Flow problem</strong></p>
</blockquote>
<p>If the catalog itself is wrong, fix Meta.</p>
<p>If the catalog is correct but the Flow isn't displaying it, fix the ZazzyAgent configuration.</p>
<p>That distinction saves a lot of unnecessary troubleshooting.</p>
<p>For more help contact: <a href="https://api.whatsapp.com/message/CEYO3OWH3U7KE1">ZazzyAgent Support</a></p>
]]></content:encoded></item><item><title><![CDATA[How to Show WhatsApp Catalog Products in ZazzyAgent Flow Builder]]></title><description><![CDATA[Once your WhatsApp catalog is connected to ZazzyAgent, you can use it inside a Flow Builder automation.
This allows customers to browse products as part of a conversation.
A simple flow can look like:]]></description><link>https://blog.zazzyagent.com/show-whatsapp-catalog-products-zazzyagent-flow</link><guid isPermaLink="true">https://blog.zazzyagent.com/show-whatsapp-catalog-products-zazzyagent-flow</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 14:01:59 GMT</pubDate><content:encoded><![CDATA[<p>Once your WhatsApp catalog is connected to <a href="http://app.zazzyagent.com">ZazzyAgent</a>, you can use it inside a Flow Builder automation.</p>
<p>This allows customers to browse products as part of a conversation.</p>
<p>A simple flow can look like:</p>
<pre><code class="language-text">Customer
   ↓
Trigger
   ↓
Interactive Message
   ↓
Catalog
   ↓
Product Selection
   ↓
Next Step
</code></pre>
<h2>Before you begin</h2>
<p>Make sure:</p>
<ul>
<li><p>WhatsApp is connected.</p>
</li>
<li><p>Your catalog exists.</p>
</li>
<li><p>Products have been added.</p>
</li>
<li><p>The catalog is available to the connected WhatsApp account.</p>
</li>
</ul>
<p>See <a href="https://blog.zazzyagent.com/how-to-connect-whatsapp-catalog-zazzyagent">How to Connect a WhatsApp Catalog to ZazzyAgent</a>.</p>
<h2>Step 1: Create a Flow</h2>
<p>Open Flow Builder.</p>
<p>Create a new flow.</p>
<p>Give it a useful name.</p>
<p>For example:</p>
<blockquote>
<p>Product Catalogue</p>
</blockquote>
<p>rather than:</p>
<blockquote>
<p>Test 7</p>
</blockquote>
<h2>Step 2: Add a trigger</h2>
<p>Choose the appropriate trigger for your flow.</p>
<p>For example:</p>
<blockquote>
<p>products</p>
</blockquote>
<p>This lets a test customer start the flow by sending:</p>
<blockquote>
<p>products</p>
</blockquote>
<h2>Step 3: Add an Interactive Message</h2>
<p>Add the appropriate Interactive Template/message component.</p>
<p>This provides the introductory part of the catalog experience.</p>
<p>Example:</p>
<blockquote>
<p>Here are some of our available products.</p>
</blockquote>
<h2>Step 4: Connect the Catalog</h2>
<p>Use the ecommerce/catalog connection from the interactive component.</p>
<p>Add the Catalog component.</p>
<p>The current configuration workflow connects the interactive component's ecommerce section to the Catalog element.</p>
<h2>Step 5: Select your catalog</h2>
<p>Open the Catalog component.</p>
<p>Choose the catalog you've connected to your WhatsApp setup.</p>
<h2>Step 6: Choose how many products to show</h2>
<p>You can configure the catalogue to present individual products or multiple products.</p>
<h3>Single product</h3>
<p>Use when you know exactly which product should be displayed.</p>
<h3>Multiple products</h3>
<p>Use when customers need to browse several products.</p>
<p>The current catalogue component supports both approaches.</p>
<h2>Example: One product</h2>
<p>Customer:</p>
<blockquote>
<p>Tell me about Product A.</p>
</blockquote>
<p>Your flow:</p>
<pre><code class="language-text">Customer
   ↓
Product A
   ↓
Catalog
   ↓
Product A
</code></pre>
<p>The customer sees the relevant product from the connected catalog.</p>
<h2>Example: Multiple products</h2>
<p>Customer:</p>
<blockquote>
<p>Show me your products.</p>
</blockquote>
<p>Your flow displays several products.</p>
<p>The customer can browse them and select the one they're interested in.</p>
<h2>Step 7: Create the next step</h2>
<p>Think about what should happen after the customer interacts with the catalog.</p>
<p>For example:</p>
<p><strong>Product selected</strong></p>
<p>→ Send additional information</p>
<p>or:</p>
<p><strong>Product selected</strong></p>
<p>→ Start another flow</p>
<p>or:</p>
<p><strong>Product selected</strong></p>
<p>→ Continue to an AI assistant</p>
<p>The right choice depends on your use case.</p>
<h2>Example: Product information</h2>
<pre><code class="language-text">Catalog
   ↓
Customer selects product
   ↓
Product information
   ↓
Ask if they need help
</code></pre>
<h2>Example: Lead generation</h2>
<p>A customer sees a service/product.</p>
<p>Then:</p>
<blockquote>
<p>Would you like a quotation?</p>
</blockquote>
<p><strong>Yes</strong></p>
<p>→ Lead form.</p>
<p><strong>No</strong></p>
<p>→ Continue browsing.</p>
<h2>Example: AI-assisted product enquiry</h2>
<pre><code class="language-text">Customer
   ↓
AI Agent
   ↓
Understands interest
   ↓
Relevant catalog
   ↓
Customer selects product
   ↓
Continue conversation
</code></pre>
<p>This can make the catalog feel like part of a conversational shopping assistant.</p>
<h2>Don't duplicate the catalog into your flow</h2>
<p>The purpose of using the Catalog component is to reference the structured catalog.</p>
<p>Don't manually recreate all product information in text nodes unless there's a specific reason.</p>
<h2>Update products in the catalog</h2>
<p>If:</p>
<blockquote>
<p>Product A price changes.</p>
</blockquote>
<p>update Product A in your connected catalog.</p>
<p>Your Flow doesn't need to become a second product database.</p>
<h2>Multiple product sections</h2>
<p>For broader catalog presentations, organize products logically.</p>
<p>For example:</p>
<p><strong>Shoes</strong></p>
<p><strong>Shirts</strong></p>
<p><strong>Accessories</strong></p>
<p>Instead of showing unrelated products all at once.</p>
<p>The current catalogue workflow supports product sections and multiple-product configurations.</p>
<h2>Use the catalog after a category selection</h2>
<p>A useful pattern is:</p>
<pre><code class="language-text">What are you looking for?
       ↓
[Shoes]
[Clothing]
[Accessories]
       ↓
Relevant Catalog
</code></pre>
<p>This creates a much cleaner customer experience than displaying your entire catalog immediately.</p>
<h2>Catalog and customer intent</h2>
<p>A catalog should appear at the right point in the conversation.</p>
<p>Don't send a product catalog to someone who is asking:</p>
<blockquote>
<p>How do I contact support?</p>
</blockquote>
<p>Use conditions, routing or AI to determine whether the customer is actually looking for products.</p>
<h2>Test the flow</h2>
<p>Test:</p>
<ul>
<li><p>Trigger</p>
</li>
<li><p>Interactive message</p>
</li>
<li><p>Catalog</p>
</li>
<li><p>First product</p>
</li>
<li><p>Other products</p>
</li>
<li><p>Next step</p>
</li>
</ul>
<p>Make sure each path behaves correctly.</p>
<h2>Common problems</h2>
<h3>Catalog component is empty</h3>
<p>Check the connected catalog and Meta access.</p>
<h3>Product isn't available</h3>
<p>Check whether the product belongs to the selected catalog.</p>
<h3>Wrong product appears</h3>
<p>Check your product selection in the Catalog configuration.</p>
<h3>Updated product information isn't showing</h3>
<p>Check the catalog itself and allow the updated information to propagate.</p>
<h2>A clean architecture</h2>
<pre><code class="language-text">Customer Intent
      ↓
Flow
      ↓
Interactive Message
      ↓
Catalog
      ↓
Relevant Product(s)
      ↓
Customer Selection
      ↓
Next Automation
</code></pre>
<p>The Catalog should be treated as a structured data source inside your conversational workflow—not as a replacement for the Flow Builder itself.</p>
]]></content:encoded></item><item><title><![CDATA[How to Connect a WhatsApp Catalog to ZazzyAgent]]></title><description><![CDATA[Before you can use products inside ZazzyAgent's WhatsApp Catalog component, your catalog needs to exist in the appropriate Meta commerce setup.
The overall process is:
Meta Business
     ↓
Commerce Ca]]></description><link>https://blog.zazzyagent.com/how-to-connect-whatsapp-catalog-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-connect-whatsapp-catalog-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:57:57 GMT</pubDate><content:encoded><![CDATA[<p>Before you can use products inside ZazzyAgent's WhatsApp Catalog component, your catalog needs to exist in the appropriate Meta commerce setup.</p>
<p>The overall process is:</p>
<pre><code class="language-text">Meta Business
     ↓
Commerce Catalog
     ↓
Products
     ↓
WhatsApp Business Account
     ↓
ZazzyAgent
     ↓
Flow Builder
</code></pre>
<h2>Before you start</h2>
<p>You should have:</p>
<ul>
<li><p>A Meta business environment</p>
</li>
<li><p>A connected WhatsApp Business Account</p>
</li>
<li><p>Access to the relevant business assets</p>
</li>
<li><p>Products you want to display</p>
</li>
</ul>
<p>Your Meta permissions need to be sufficient to manage the relevant catalog/business assets.</p>
<h2>Step 1: Open Meta Commerce Manager</h2>
<p>Log in to the Meta business environment that manages your business assets.</p>
<p>Open the commerce/catalog management area.</p>
<p>The exact navigation can change as Meta updates its interface, so look for the current <strong>Commerce Manager</strong> or <strong>Catalog</strong> area.</p>
<h2>Step 2: Create or select a catalog</h2>
<p>If you already have a catalog, use the existing one.</p>
<p>You don't need to create a new catalog simply because you're connecting ZazzyAgent.</p>
<p>If you don't have one, create a catalog appropriate for your business.</p>
<h2>Step 3: Add your products</h2>
<p>Add the products you want customers to see.</p>
<p>Depending on your setup, product information can include:</p>
<ul>
<li><p>Name</p>
</li>
<li><p>Price</p>
</li>
<li><p>Description</p>
</li>
<li><p>Images</p>
</li>
<li><p>Product link</p>
</li>
<li><p>Product ID</p>
</li>
</ul>
<p>Make sure the product information is accurate before testing it in ZazzyAgent.</p>
<h2>Step 4: Check your business permissions</h2>
<p>Make sure the business and catalog are accessible to the Meta account you're using.</p>
<p>If the catalog exists but isn't available during connection, don't immediately create another one.</p>
<p>First check permissions and business ownership.</p>
<h2>Step 5: Check your WhatsApp Business Account</h2>
<p>Your WhatsApp business setup needs access to the appropriate catalogue.</p>
<p>The catalog and WhatsApp business configuration need to be associated correctly before ZazzyAgent can use the products.</p>
<h2>Step 6: Connect WhatsApp to ZazzyAgent</h2>
<p>Your WhatsApp account should already be connected to <a href="http://app.zazzyagent.com">ZazzyAgent</a>.</p>
<p>If it isn't, start with:</p>
<p><a href="https://blog.zazzyagent.com/how-to-get-whatsapp-api-and-connect-whatsapp-to-zazzyagent">How to Get WhatsApp API and Connect WhatsApp to ZazzyAgent</a>.</p>
<h2>Step 7: Open the catalog area in ZazzyAgent</h2>
<p>Once your WhatsApp account is connected, open the relevant catalogue/ecommerce area inside ZazzyAgent.</p>
<p>The connected catalog should become available for use.</p>
<p>The current platform workflow provides an ecommerce catalog area associated with the connected WhatsApp setup.</p>
<h2>Step 8: Select the catalog</h2>
<p>If multiple catalogs are available, choose the one containing the products you want to use.</p>
<p>Double-check the selection.</p>
<p>Businesses can have multiple catalogs for different purposes.</p>
<h2>Step 9: Create a test Flow</h2>
<p>Don't immediately put the catalog into your main production automation.</p>
<p>Create a small test flow.</p>
<p>For example:</p>
<blockquote>
<p>Send <code>catalog</code></p>
</blockquote>
<p>↓</p>
<p>Show catalog.</p>
<p>This lets you verify the connection without disturbing your existing customer journey.</p>
<h2>Step 10: Add an Interactive Message</h2>
<p>Open Flow Builder.</p>
<p>Create or open the test flow.</p>
<p>Add the appropriate Interactive Template/message component.</p>
<p>The current catalogue workflow uses an Interactive Template as the entry point before connecting the ecommerce/catalog component.</p>
<h2>Step 11: Add the Catalog component</h2>
<p>From the appropriate interactive/ecommerce connection point, add the Catalog component.</p>
<p>Open its configuration.</p>
<h2>Step 12: Select your connected catalog</h2>
<p>Choose the catalog you connected earlier.</p>
<p>You should then be able to configure the products you want to present.</p>
<h2>Step 13: Select products</h2>
<p>Depending on the flow design, you can present:</p>
<ul>
<li><p>One product</p>
</li>
<li><p>Multiple products</p>
</li>
<li><p>A particular group of products</p>
</li>
</ul>
<p>The current Flow Builder catalogue configuration supports single and multiple product selections.</p>
<h2>Step 14: Save the flow</h2>
<p>Save your flow.</p>
<p>Check the entire connection:</p>
<pre><code class="language-text">Trigger
 ↓
Interactive Message
 ↓
Catalog
 ↓
Product
</code></pre>
<h2>Step 15: Test from WhatsApp</h2>
<p>Send the trigger message from a test WhatsApp account.</p>
<p>Confirm that the catalogue content appears.</p>
<p>Then interact with the product.</p>
<h2>Check the product information</h2>
<p>Verify:</p>
<ul>
<li><p>Image</p>
</li>
<li><p>Product name</p>
</li>
<li><p>Price</p>
</li>
<li><p>Description</p>
</li>
<li><p>Product selection</p>
</li>
</ul>
<p>If something is wrong, first check the catalog itself.</p>
<p>Don't assume the Flow Builder created the product information.</p>
<h2>Catalog connection troubleshooting</h2>
<h3>Catalog doesn't appear</h3>
<p>Check:</p>
<ul>
<li><p>Correct Meta Business</p>
</li>
<li><p>Correct WhatsApp Business Account</p>
</li>
<li><p>Catalog permissions</p>
</li>
<li><p>Catalog ownership/access</p>
</li>
<li><p>WhatsApp connection</p>
</li>
</ul>
<h3>Catalog appears but products are missing</h3>
<p>Check whether those products actually belong to the selected catalog.</p>
<h3>Product information is outdated</h3>
<p>Update the product in the catalog rather than recreating the flow.</p>
<h3>Wrong catalog appears</h3>
<p>Check which Meta business/catalog was selected during setup.</p>
<h2>Don't create duplicate catalogs</h2>
<p>If you already have a working catalog, reuse it unless there's a real business reason to create another.</p>
<p>Multiple duplicate catalogs can make product management confusing.</p>
<h2>Keep one source of truth</h2>
<p>A good setup is:</p>
<pre><code class="language-text">Meta Catalog
    ↓
Products
    ↓
ZazzyAgent
    ↓
Multiple Flows
</code></pre>
<p>Instead of:</p>
<pre><code class="language-text">Flow 1 → Product data
Flow 2 → Product data
Flow 3 → Product data
</code></pre>
<p>The first architecture is much easier to maintain.</p>
<h2>After the connection works</h2>
<p>You can use the catalog in more advanced flows such as:</p>
<blockquote>
<p>Customer asks about a product.</p>
</blockquote>
<p>↓</p>
<p>AI/Flow determines the relevant category.</p>
<p>↓</p>
<p>Catalog presents the available products.</p>
<p>↓</p>
<p>Customer selects a product.</p>
<p>↓</p>
<p>Next step provides information or continues the configured journey.</p>
<p>That's where the catalogue becomes part of a broader conversational system rather than simply a product list.</p>
]]></content:encoded></item><item><title><![CDATA[What Is WhatsApp Catalog in ZazzyAgent? Complete Guide]]></title><description><![CDATA[A WhatsApp Catalog lets your business present products directly inside a WhatsApp conversation.
Instead of manually sending:

Product photo


Product name


Price


Description

one message at a time,]]></description><link>https://blog.zazzyagent.com/what-is-whatsapp-catalog-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/what-is-whatsapp-catalog-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:56:06 GMT</pubDate><content:encoded><![CDATA[<p>A WhatsApp Catalog lets your business present products directly inside a WhatsApp conversation.</p>
<p>Instead of manually sending:</p>
<blockquote>
<p>Product photo</p>
</blockquote>
<blockquote>
<p>Product name</p>
</blockquote>
<blockquote>
<p>Price</p>
</blockquote>
<blockquote>
<p>Description</p>
</blockquote>
<p>one message at a time, you can connect a Meta/WhatsApp catalog to ZazzyAgent and use it inside your automated conversations.</p>
<p>Customers can browse products and interact with them directly from WhatsApp.</p>
<h2>What is the Catalog?</h2>
<p>A catalog is a collection of products managed through Meta's commerce tools and associated with your WhatsApp business setup.</p>
<p>A product can contain information such as:</p>
<ul>
<li><p>Product name</p>
</li>
<li><p>Product image</p>
</li>
<li><p>Description</p>
</li>
<li><p>Price</p>
</li>
<li><p>Product identifier</p>
</li>
<li><p>Other catalogue information</p>
</li>
</ul>
<p><a href="http://zazzyagent.com">ZazzyAgent</a> can use the connected catalog inside supported WhatsApp automation.</p>
<h2>Why connect a catalog to ZazzyAgent?</h2>
<p>The catalog gives your chatbot access to a structured product presentation.</p>
<p>For example:</p>
<p>Customer:</p>
<blockquote>
<p>Show me your products.</p>
</blockquote>
<p>Your flow can display:</p>
<p><strong>Product A</strong></p>
<p><strong>Product B</strong></p>
<p><strong>Product C</strong></p>
<p>The customer doesn't have to ask for each product separately.</p>
<h2>Catalog vs images</h2>
<p>You could simply send product images.</p>
<p>But an image is just an image.</p>
<p>A catalog product contains structured product information that can be presented through WhatsApp's commerce experience.</p>
<p>That's useful when customers want to browse actual products rather than look at a collection of unrelated images.</p>
<h2>Catalog vs Carousel</h2>
<p>These are different features.</p>
<h3>Carousel</h3>
<p>You manually configure cards in the flow.</p>
<p>Each card can contain content and an action.</p>
<h3>Catalog</h3>
<p>Products come from your connected WhatsApp catalog.</p>
<p>This makes catalog particularly useful when your products are already maintained in Meta's commerce environment.</p>
<h2>Where does the catalog come from?</h2>
<p>The catalog is managed through Meta's commerce infrastructure.</p>
<p>ZazzyAgent connects to the appropriate WhatsApp/Meta business setup and can then use the catalog in supported flows.</p>
<p>You don't normally create every product again inside every bot flow.</p>
<h2>What does ZazzyAgent do?</h2>
<p><a href="http://app.zazzyagent.com">ZazzyAgent</a> gives your automation a way to <strong>use the catalog inside a customer conversation</strong>.</p>
<p>For example:</p>
<pre><code class="language-text">Customer
   ↓
ZazzyAgent Flow
   ↓
Catalog
   ↓
Products
   ↓
Customer selects product
</code></pre>
<h2>When should I use a catalog?</h2>
<p>A catalog works well when customers need to browse products.</p>
<p>Examples:</p>
<ul>
<li><p>Clothing</p>
</li>
<li><p>Electronics</p>
</li>
<li><p>Furniture</p>
</li>
<li><p>Food products</p>
</li>
<li><p>Beauty products</p>
</li>
<li><p>Accessories</p>
</li>
<li><p>Consumer goods</p>
</li>
</ul>
<p>It can also be useful for services or offerings that can be represented as catalog items, depending on your business setup.</p>
<h2>Do I need a catalog before using the Catalog component?</h2>
<p>Yes.</p>
<p>The Catalog component needs a connected catalog to display products.</p>
<p>You should first make sure your WhatsApp catalog exists and contains the products you want to show.</p>
<p>The current setup documentation requires the catalog to be created before connecting and using it in a flow.</p>
<h2>Can I show every product?</h2>
<p>You can configure the catalogue experience to show the products or product sections appropriate for the flow.</p>
<p>You don't have to send your entire product catalogue every time.</p>
<p>For example:</p>
<blockquote>
<p>Customer asks about shoes.</p>
</blockquote>
<p>Your flow can present the relevant products rather than unrelated items.</p>
<h2>Single product vs multiple products</h2>
<p>The Catalog component supports selecting individual products as well as using a multiple-products configuration.</p>
<h3>Single product</h3>
<p>Useful when:</p>
<blockquote>
<p>Customer asks about one specific product.</p>
</blockquote>
<h3>Multiple products</h3>
<p>Useful when:</p>
<blockquote>
<p>Customer wants to browse several options.</p>
</blockquote>
<p>The current flow configuration supports both individual and multiple-product selections.</p>
<h2>Example: Product enquiry</h2>
<p>Customer:</p>
<blockquote>
<p>Do you have running shoes?</p>
</blockquote>
<p>Your flow can display relevant products from the connected catalog.</p>
<p>The customer can then explore the available product information.</p>
<h2>Example: Product menu</h2>
<p>Your flow could begin:</p>
<blockquote>
<p>What are you looking for?</p>
</blockquote>
<p><strong>Shoes</strong></p>
<p><strong>Clothing</strong></p>
<p><strong>Accessories</strong></p>
<p>Customer selects:</p>
<p><strong>Shoes</strong></p>
<p>↓</p>
<p>Show relevant catalog products.</p>
<p>This keeps the initial conversation simple.</p>
<h2>Catalog and AI</h2>
<p>The catalog can also work alongside an AI Agent.</p>
<p>For example:</p>
<p>Customer:</p>
<blockquote>
<p>I'm looking for a black running shoe under ₹5,000.</p>
</blockquote>
<p>The AI can understand the customer's request.</p>
<p>Your workflow can then guide the customer toward relevant product information or catalog content where your configured setup supports it.</p>
<p>The catalog provides the structured product data; the AI provides conversational understanding.</p>
<h2>Catalog and Flow Builder</h2>
<p>A common architecture is:</p>
<pre><code class="language-text">Trigger
   ↓
Interactive Message
   ↓
E-commerce / Catalog
   ↓
Products
</code></pre>
<p>The current Flow Builder reference uses an Interactive Template and then connects its ecommerce socket to the Catalog component.</p>
<h2>Catalog information should stay in the catalog</h2>
<p>Don't manually copy every product's:</p>
<ul>
<li><p>Name</p>
</li>
<li><p>Price</p>
</li>
<li><p>Image</p>
</li>
<li><p>Description</p>
</li>
</ul>
<p>into dozens of different bot flows.</p>
<p>Whenever possible, maintain the product information in its proper catalog source and use the catalog inside the flow.</p>
<p>This makes product management much easier.</p>
<h2>What happens when a product changes?</h2>
<p>For example:</p>
<blockquote>
<p>Product price changes from ₹999 to ₹1,099.</p>
</blockquote>
<p>The correct place to maintain that product information is the catalog.</p>
<p>You shouldn't need to rebuild every flow that references the product simply because the product information changed.</p>
<h2>Catalog is not the same as a flow</h2>
<p>Remember:</p>
<p><strong>Catalog</strong></p>
<p>= product data.</p>
<p><strong>Flow</strong></p>
<p>= conversation logic.</p>
<p><strong>Catalog component</strong></p>
<p>= the point where your flow presents catalog content.</p>
<p>This separation is important.</p>
<h2>Catalog is not the same as the AI</h2>
<p>The AI decides how to converse.</p>
<p>The catalog contains structured product information.</p>
<p>They can work together, but they serve different purposes.</p>
<h2>A useful architecture</h2>
<pre><code class="language-text">Product Information
       ↓
Meta Catalog
       ↓
ZazzyAgent
       ↓
Flow Builder
       ↓
Customer
</code></pre>
<p>Once you understand that relationship, configuring catalogue-based automation becomes much easier.</p>
]]></content:encoded></item><item><title><![CDATA[API Errors in ZazzyAgent Flow Builder: Troubleshooting Guide]]></title><description><![CDATA[An API-powered automation introduces another system into your workflow.
That means there are now more places where something can go wrong.
Your Flow may be correct while the external API is returning ]]></description><link>https://blog.zazzyagent.com/api-errors-zazzyagent-flow-builder</link><guid isPermaLink="true">https://blog.zazzyagent.com/api-errors-zazzyagent-flow-builder</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:52:17 GMT</pubDate><content:encoded><![CDATA[<p>An API-powered automation introduces another system into your workflow.</p>
<p>That means there are now more places where something can go wrong.</p>
<p>Your Flow may be correct while the external API is returning an error.</p>
<p>Or the API may work while ZazzyAgent is mapping the response incorrectly.</p>
<p>The fastest way to troubleshoot is to identify exactly where the failure occurs.</p>
<h2>The complete API path</h2>
<p>Think of the workflow as:</p>
<pre><code class="language-text">Flow
 ↓
Request
 ↓
Authentication
 ↓
External API
 ↓
Response
 ↓
Response Mapping
 ↓
Next Flow Step
</code></pre>
<p>Check each layer separately.</p>
<h2>Problem 1: API verification fails</h2>
<p>If the API cannot be verified while setting it up, check:</p>
<ul>
<li><p>Endpoint</p>
</li>
<li><p>HTTP method</p>
</li>
<li><p>Authentication</p>
</li>
<li><p>Request parameters</p>
</li>
<li><p>Required headers</p>
</li>
<li><p>Request body</p>
</li>
</ul>
<p>The current API workflow validates the integration before saving it and reports errors when verification fails.</p>
<h2>Problem 2: Authentication error</h2>
<p>Common symptoms include:</p>
<blockquote>
<p>401 Unauthorized</p>
</blockquote>
<p>or:</p>
<blockquote>
<p>403 Forbidden</p>
</blockquote>
<p>Check your:</p>
<ul>
<li><p>API key</p>
</li>
<li><p>Bearer token</p>
</li>
<li><p>Authentication header</p>
</li>
<li><p>Account permissions</p>
</li>
<li><p>Credential status</p>
</li>
</ul>
<p>Make sure the credential belongs to the correct external system.</p>
<h2>Problem 3: Wrong HTTP method</h2>
<p>Your external API may require:</p>
<p><strong>POST</strong></p>
<p>while your ZazzyAgent configuration uses:</p>
<p><strong>GET</strong></p>
<p>Check the external API documentation.</p>
<h2>Problem 4: Missing parameter</h2>
<p>Suppose the API requires:</p>
<pre><code class="language-text">order_id
</code></pre>
<p>but your request sends:</p>
<pre><code class="language-text">phone
</code></pre>
<p>The API can reject the request.</p>
<p>Check every required parameter.</p>
<h2>Problem 5: Dynamic value isn't being sent</h2>
<p>Your API may depend on customer information collected earlier.</p>
<p>For example:</p>
<blockquote>
<p>Customer enters order number.</p>
</blockquote>
<p>If that value isn't mapped into the API request, the API won't know which order to look up.</p>
<p>Check:</p>
<p><strong>User Input</strong></p>
<p>→ <strong>Saved Field</strong></p>
<p>→ <strong>API Request</strong></p>
<h2>Problem 6: API returns an error</h2>
<p>Your external system may return:</p>
<pre><code class="language-json">{
  "error": "Order not found"
}
</code></pre>
<p>Don't display the raw error to the customer.</p>
<p>Create a customer-friendly fallback.</p>
<p>For example:</p>
<blockquote>
<p>I couldn't find that order number. Please check the number and try again.</p>
</blockquote>
<h2>Problem 7: API returns no data</h2>
<p>The API may successfully respond but contain an empty result.</p>
<p>Example:</p>
<pre><code class="language-json">{
  "appointments": []
}
</code></pre>
<p>Your automation needs an appropriate path:</p>
<blockquote>
<p>No appointments are available for that date. Please choose another date.</p>
</blockquote>
<h2>Problem 8: API response mapping fails</h2>
<p>The API may return:</p>
<pre><code class="language-text">order_status
</code></pre>
<p>while your mapping expects:</p>
<pre><code class="language-text">status
</code></pre>
<p>The API worked.</p>
<p>The mapping did not.</p>
<p>Check the exact response structure.</p>
<h2>Problem 9: Dynamic list is empty</h2>
<p>If you're using an API-powered dynamic list, inspect the data at every step.</p>
<p>Check:</p>
<ol>
<li><p>API returned data.</p>
</li>
<li><p>Data was captured.</p>
</li>
<li><p>Custom field contains the response.</p>
</li>
<li><p>JSON structure is correct.</p>
</li>
<li><p>List mapping matches the response.</p>
</li>
<li><p>List is connected to the active branch.</p>
</li>
</ol>
<h2>Problem 10: API works in testing but fails in the live flow</h2>
<p>This usually indicates that the live request is different from your test request.</p>
<p>Check:</p>
<ul>
<li><p>Dynamic values</p>
</li>
<li><p>Customer data</p>
</li>
<li><p>Request parameters</p>
</li>
<li><p>Authentication</p>
</li>
<li><p>Headers</p>
</li>
<li><p>URL variables</p>
</li>
</ul>
<h2>Problem 11: API takes too long</h2>
<p>An external system may be slow.</p>
<p>Don't assume a fixed Delay solves an API timeout.</p>
<p>A Delay only waits.</p>
<p>It does not make a failed API request succeed.</p>
<p>The API itself needs to respond correctly within the available execution time.</p>
<h2>Problem 12: API returns unexpected data</h2>
<p>A third-party API may change its response structure.</p>
<p>For example:</p>
<p>Old:</p>
<pre><code class="language-text">status
</code></pre>
<p>New:</p>
<pre><code class="language-text">order_status
</code></pre>
<p>Your mapping can stop working even though the API endpoint still responds.</p>
<p>Check the current response whenever an integration suddenly stops working.</p>
<h2>Problem 13: Wrong customer data is returned</h2>
<p>Check which customer information is being used in the request.</p>
<p>For example, if the API request accidentally uses a static order number, every customer could receive the same result.</p>
<p>Dynamic values should come from the appropriate customer input or stored field.</p>
<h2>Problem 14: API works but customer receives no reply</h2>
<p>The API step may be successful while the next Flow node isn't connected correctly.</p>
<p>Check:</p>
<p><strong>API</strong></p>
<p>→ <strong>Response</strong></p>
<p>→ <strong>Next message</strong></p>
<p>Also verify conditions between those steps.</p>
<h2>Problem 15: Don't expose technical errors</h2>
<p>Avoid sending customers:</p>
<blockquote>
<p>HTTP 500 Internal Server Error</p>
</blockquote>
<p>Instead say:</p>
<blockquote>
<p>We couldn't retrieve that information right now. Please try again or contact support.</p>
</blockquote>
<p>Technical details belong in logs/debugging, not customer-facing replies.</p>
<h2>Build a fallback path</h2>
<p>A reliable API workflow should include a failure strategy.</p>
<p>For example:</p>
<pre><code class="language-text">API Call
   ↓
Successful?
 ↙       ↘
Yes       No
 ↓         ↓
Continue   Friendly
          Error Message
</code></pre>
<h2>Test failure scenarios</h2>
<p>Don't test only the happy path.</p>
<p>Test:</p>
<ul>
<li><p>Valid input</p>
</li>
<li><p>Invalid input</p>
</li>
<li><p>Missing input</p>
</li>
<li><p>API error</p>
</li>
<li><p>Empty response</p>
</li>
<li><p>Expired authentication</p>
</li>
<li><p>Wrong response structure</p>
</li>
</ul>
<h2>Use logs when available</h2>
<p>When debugging a webhook/API workflow, inspect the relevant logs and payload information available in ZazzyAgent.</p>
<p>The current workflow documentation specifically recommends checking webhook logs for receipt, timestamps, payloads and failures.</p>
<h2>A useful debugging order</h2>
<p>Always work from left to right:</p>
<p><strong>Did the Flow run?</strong></p>
<p>↓</p>
<p><strong>Was the API called?</strong></p>
<p>↓</p>
<p><strong>Was the request correct?</strong></p>
<p>↓</p>
<p><strong>Did the external system respond?</strong></p>
<p>↓</p>
<p><strong>Was the response correct?</strong></p>
<p>↓</p>
<p><strong>Was it mapped?</strong></p>
<p>↓</p>
<p><strong>Did the next Flow step run?</strong></p>
<p>This prevents guessing.</p>
<h2>The key rule</h2>
<p>When an API-powered automation breaks:</p>
<blockquote>
<p><strong>Don't troubleshoot the whole flow at once.</strong></p>
</blockquote>
<p>Find the exact point where the data stopped moving.</p>
<p>That is usually where the problem is.</p>
]]></content:encoded></item><item><title><![CDATA[How to Create a Dynamic List Using API Data in ZazzyAgent]]></title><description><![CDATA[A normal list is useful when the options are fixed.
For example:

Mumbai

Delhi

Pune

Bengaluru


But what if the available options change constantly?
For example:

Available appointments today.

The]]></description><link>https://blog.zazzyagent.com/dynamic-list-api-zazzyagent-flow-builder</link><guid isPermaLink="true">https://blog.zazzyagent.com/dynamic-list-api-zazzyagent-flow-builder</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:50:02 GMT</pubDate><content:encoded><![CDATA[<p>A normal list is useful when the options are fixed.</p>
<p>For example:</p>
<ul>
<li><p>Mumbai</p>
</li>
<li><p>Delhi</p>
</li>
<li><p>Pune</p>
</li>
<li><p>Bengaluru</p>
</li>
</ul>
<p>But what if the available options change constantly?</p>
<p>For example:</p>
<blockquote>
<p>Available appointments today.</p>
</blockquote>
<p>The answer might change every few minutes.</p>
<p>This is where a <strong>Dynamic List</strong> becomes useful.</p>
<h2>What is a dynamic list?</h2>
<p>A dynamic list creates interactive options using data provided by another source.</p>
<p>A common architecture is:</p>
<pre><code class="language-text">Customer
   ↓
HTTP API
   ↓
Fresh Data
   ↓
Dynamic List
   ↓
Customer selects an option
</code></pre>
<p>The current Flow Builder supports dynamic lists driven by external API data and mapped fields.</p>
<h2>When should you use a dynamic list?</h2>
<p>Use one when the choices change.</p>
<p>Examples:</p>
<ul>
<li><p>Available appointments</p>
</li>
<li><p>Available products</p>
</li>
<li><p>Delivery slots</p>
</li>
<li><p>Service locations</p>
</li>
<li><p>Agents</p>
</li>
<li><p>Restaurants</p>
</li>
<li><p>Hotel rooms</p>
</li>
<li><p>Classes</p>
</li>
<li><p>Courses</p>
</li>
<li><p>Inventory</p>
</li>
</ul>
<h2>Example: Appointment availability</h2>
<p>Customer:</p>
<blockquote>
<p>I want to book today.</p>
</blockquote>
<p>Your automation calls:</p>
<p><strong>Appointment API</strong></p>
<p>The API returns:</p>
<pre><code class="language-text">10:00 AM
1:00 PM
4:00 PM
</code></pre>
<p>ZazzyAgent generates the list.</p>
<p>The customer chooses:</p>
<blockquote>
<p>1:00 PM</p>
</blockquote>
<p>The workflow continues with that selection.</p>
<h2>Step 1: Create the API</h2>
<p>Create an HTTP API configuration that returns the information you need.</p>
<p>See <a href="https://blog.zazzyagent.com/how-to-use-http-api-zazzyagent-flow-builder">How to Use HTTP API in ZazzyAgent Flow Builder</a>.</p>
<h2>Step 2: Store the response</h2>
<p>Configure your workflow so the API response can be used by the dynamic list.</p>
<p>The current dynamic-list workflow uses structured response data stored in a custom field before mapping the list values.</p>
<h2>Step 3: Prepare your data</h2>
<p>Your API might return data like:</p>
<pre><code class="language-json">[
  {
    "name": "10:00 AM",
    "description": "Available",
    "id": "1000"
  },
  {
    "name": "1:00 PM",
    "description": "Available",
    "id": "1300"
  },
  {
    "name": "4:00 PM",
    "description": "Available",
    "id": "1600"
  }
]
</code></pre>
<p>Your list can use:</p>
<p><strong>name</strong></p>
<p>as the visible title.</p>
<p><strong>description</strong></p>
<p>as supporting text.</p>
<p><strong>id</strong></p>
<p>as an internal value.</p>
<h2>Step 4: Configure the dynamic list</h2>
<p>Open the appropriate list component in Flow Builder.</p>
<p>Configure the source data.</p>
<p>Map the fields returned by the API to the fields expected by the list.</p>
<h2>Step 5: Set the visible title</h2>
<p>Choose which API field the customer should see as the main option.</p>
<p>For example:</p>
<blockquote>
<p>name</p>
</blockquote>
<p>produces:</p>
<p><strong>10:00 AM</strong></p>
<h2>Step 6: Add a description</h2>
<p>If your data contains a description, use it to provide additional context.</p>
<p>Example:</p>
<p><strong>10:00 AM</strong></p>
<blockquote>
<p>Available</p>
</blockquote>
<p>or:</p>
<p><strong>10:00 AM</strong></p>
<blockquote>
<p>Limited availability</p>
</blockquote>
<h2>Step 7: Map the selected value</h2>
<p>The list should return enough information to identify what the customer selected.</p>
<p>For example:</p>
<blockquote>
<p>1300</p>
</blockquote>
<p>could represent the 1:00 PM slot.</p>
<p>You can then use that value in the next API call.</p>
<h2>Example: Booking process</h2>
<pre><code class="language-text">Customer
   ↓
Choose Date
   ↓
HTTP API
   ↓
Available Slots
   ↓
Dynamic List
   ↓
Customer selects 1:00 PM
   ↓
Booking API
   ↓
Confirmation
</code></pre>
<p>This is much better than manually creating a fixed list of appointment times.</p>
<h2>Example: Product availability</h2>
<p>Your API returns:</p>
<pre><code class="language-text">Product A
Product B
Product C
</code></pre>
<p>The customer sees:</p>
<p><strong>Product A</strong></p>
<p><strong>Product B</strong></p>
<p><strong>Product C</strong></p>
<p>The list updates whenever your underlying system changes.</p>
<h2>Example: Delivery slots</h2>
<p>The API returns today's available windows:</p>
<pre><code class="language-text">9 AM – 12 PM
12 PM – 3 PM
3 PM – 6 PM
</code></pre>
<p>The customer chooses one.</p>
<p>The next API call can attempt to reserve it.</p>
<h2>Dynamic list vs normal list</h2>
<h3>Normal list</h3>
<p>You define the options manually.</p>
<p>Best for:</p>
<ul>
<li><p>Fixed categories</p>
</li>
<li><p>Permanent choices</p>
</li>
<li><p>Small menus</p>
</li>
</ul>
<h3>Dynamic list</h3>
<p>The options come from changing data.</p>
<p>Best for:</p>
<ul>
<li><p>Availability</p>
</li>
<li><p>Inventory</p>
</li>
<li><p>Real-time records</p>
</li>
<li><p>Customer-specific results</p>
</li>
</ul>
<h2>Dynamic list vs carousel</h2>
<p>Use:</p>
<p><strong>Dynamic List</strong></p>
<p>when the customer mainly needs to choose from text.</p>
<p>Use:</p>
<p><strong>Carousel</strong></p>
<p>when the customer needs to browse visual cards.</p>
<h2>Dynamic list and customer-specific data</h2>
<p>A particularly powerful use case is retrieving different options for different customers.</p>
<p>For example:</p>
<blockquote>
<p>Show appointments for Rahul's assigned sales representative.</p>
</blockquote>
<p>The API can return only the relevant results.</p>
<p>Then the dynamic list displays those options.</p>
<h2>Dynamic list and conditions</h2>
<p>You can also filter the result before displaying it.</p>
<p>For example:</p>
<p><strong>Customer Type = Enterprise</strong></p>
<p>→ Enterprise appointment options.</p>
<p><strong>Customer Type = Standard</strong></p>
<p>→ Standard appointment options.</p>
<h2>Dynamic list and AI</h2>
<p>AI can help determine what the customer wants.</p>
<p>For example:</p>
<p>Customer:</p>
<blockquote>
<p>I want to book tomorrow afternoon.</p>
</blockquote>
<p>AI identifies:</p>
<p><strong>Date = Tomorrow</strong></p>
<p><strong>Time Preference = Afternoon</strong></p>
<p>The automation then calls the availability API and displays the relevant dynamic list.</p>
<h2>Common dynamic-list problems</h2>
<h3>List is empty</h3>
<p>Check:</p>
<ul>
<li><p>API response</p>
</li>
<li><p>Stored custom field</p>
</li>
<li><p>JSON structure</p>
</li>
<li><p>Mapping</p>
</li>
</ul>
<h3>Wrong titles appear</h3>
<p>Check the title-field mapping.</p>
<h3>Wrong option is selected</h3>
<p>Check the ID/value mapping.</p>
<h3>API returns data but list doesn't display it</h3>
<p>Check whether the returned data is in the expected structure.</p>
<h3>Options are outdated</h3>
<p>Check when the API is being called.</p>
<p>The list is only as current as the source data being retrieved.</p>
<h2>Test with realistic data</h2>
<p>Don't test only with:</p>
<pre><code class="language-text">Option 1
Option 2
</code></pre>
<p>Use real API response structures.</p>
<p>Also test:</p>
<ul>
<li><p>Empty result</p>
</li>
<li><p>One result</p>
</li>
<li><p>Multiple results</p>
</li>
<li><p>Unexpected value</p>
</li>
<li><p>API failure</p>
</li>
</ul>
<h2>The architecture to remember</h2>
<pre><code class="language-text">External System
      ↓
HTTP API
      ↓
Structured Response
      ↓
Custom Field / Mapping
      ↓
Dynamic List
      ↓
Customer Choice
      ↓
Next Action
</code></pre>
<p>This turns <a href="http://app.zazzyagent.com">ZazzyAgent</a> into an interface for your live business data.</p>
]]></content:encoded></item><item><title><![CDATA[How to Use API Response Data in ZazzyAgent]]></title><description><![CDATA[Calling an API is only useful if you can do something with the information it returns.
Suppose your API returns:
{
  "name": "Rahul",
  "status": "Shipped",
  "tracking": "TRK12345"
}

ZazzyAgent need]]></description><link>https://blog.zazzyagent.com/how-to-use-api-response-data-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-use-api-response-data-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:47:40 GMT</pubDate><content:encoded><![CDATA[<p>Calling an API is only useful if you can do something with the information it returns.</p>
<p>Suppose your API returns:</p>
<pre><code class="language-json">{
  "name": "Rahul",
  "status": "Shipped",
  "tracking": "TRK12345"
}
</code></pre>
<p>ZazzyAgent needs to know which pieces of that response you want to use.</p>
<p>This is where <strong>Response Mapping</strong> becomes important.</p>
<h2>What is response mapping?</h2>
<p>Response mapping connects information returned by an API to fields that ZazzyAgent can use.</p>
<p>For example:</p>
<pre><code class="language-text">API response
    ↓
status
    ↓
Order Status
</code></pre>
<p>Then your automation can use the stored value later.</p>
<p>Our current API integration supports mapping returned response data into custom fields.</p>
<h2>Why map API responses?</h2>
<p>Mapped data can be used for:</p>
<ul>
<li><p>Customer messages</p>
</li>
<li><p>Conditions</p>
</li>
<li><p>Personalization</p>
</li>
<li><p>Dynamic lists</p>
</li>
<li><p>Subsequent automation</p>
</li>
<li><p>Customer records</p>
</li>
</ul>
<h2>Example: Order API</h2>
<p>API returns:</p>
<pre><code class="language-json">{
  "order_status": "Out for Delivery"
}
</code></pre>
<p>Map:</p>
<blockquote>
<p><code>order_status</code></p>
</blockquote>
<p>to:</p>
<blockquote>
<p><code>Order Status</code></p>
</blockquote>
<p>Then your flow can use the stored value.</p>
<h2>Example: Customer API</h2>
<p>API returns:</p>
<pre><code class="language-json">{
  "customer_name": "Rahul",
  "customer_type": "VIP"
}
</code></pre>
<p>You could map:</p>
<p><strong>customer_name</strong></p>
<p>→ Customer Name</p>
<p><strong>customer_type</strong></p>
<p>→ Customer Type</p>
<p>Then a condition could check:</p>
<pre><code class="language-text">Customer Type = VIP
</code></pre>
<h2>Map only the fields you actually need</h2>
<p>An API may return 30 pieces of information.</p>
<p>You may only need three.</p>
<p>For example:</p>
<ul>
<li><p>Status</p>
</li>
<li><p>Tracking number</p>
</li>
<li><p>Delivery date</p>
</li>
</ul>
<p>Don't create unnecessary fields for every response property.</p>
<h2>Custom fields are useful here</h2>
<p>Suppose your API returns:</p>
<p><strong>appointment_date</strong></p>
<p>You can save it into:</p>
<blockquote>
<p>Appointment Date</p>
</blockquote>
<p>Then a later step can use that value.</p>
<h2>Use response data in messages</h2>
<p>Suppose the API returns:</p>
<pre><code class="language-text">status = Confirmed
</code></pre>
<p>Your next message could communicate the result to the customer.</p>
<p>The exact variable syntax depends on how the field is exposed within the relevant ZazzyAgent message component.</p>
<h2>Use response data in conditions</h2>
<p>This is one of the most useful patterns.</p>
<p>Example:</p>
<pre><code class="language-text">API
 ↓
Order Status
 ↓
Condition
 ↓
┌───────────────┐
Confirmed       Pending
 ↓                 ↓
Confirmation      Wait message
</code></pre>
<h2>Use response data in dynamic lists</h2>
<p>An API can return multiple records.</p>
<p>For example:</p>
<pre><code class="language-json">[
  {
    "name": "10:00 AM",
    "id": "1000"
  },
  {
    "name": "2:00 PM",
    "id": "1400"
  }
]
</code></pre>
<p>Those values can be turned into interactive options in supported dynamic-list workflows.</p>
<h2>API response data and customer profiles</h2>
<p>Mapping information into customer fields means the data can become part of the customer record.</p>
<p>For example:</p>
<p><strong>Last Order Status</strong></p>
<blockquote>
<p>Shipped</p>
</blockquote>
<p>Now the information isn't only used for the current reply.</p>
<p>It can remain available for later automation where appropriate.</p>
<h2>Handle missing values</h2>
<p>Suppose your API normally returns:</p>
<pre><code class="language-text">tracking_number
</code></pre>
<p>but some orders haven't shipped yet.</p>
<p>Your automation needs to account for that.</p>
<p>Don't assume the field will always contain a value.</p>
<p>You can use conditions to determine which path should run.</p>
<h2>Handle unexpected responses</h2>
<p>An API may sometimes return:</p>
<pre><code class="language-text">error
</code></pre>
<p>or:</p>
<pre><code class="language-text">null
</code></pre>
<p>Build your automation to handle these situations.</p>
<h2>Don't save everything permanently</h2>
<p>Not every API response belongs in the customer's profile.</p>
<p>Ask:</p>
<blockquote>
<p>Will this information be useful later?</p>
</blockquote>
<p>If no, it may only need to exist for the current flow.</p>
<p>If yes, consider mapping it into a custom field.</p>
<h2>Example: Lead scoring</h2>
<p>Your CRM API returns:</p>
<pre><code class="language-text">lead_score = 87
</code></pre>
<p>Map:</p>
<p><strong>87</strong></p>
<p>→ <strong>Lead Score</strong></p>
<p>Then:</p>
<pre><code class="language-text">Lead Score &gt; 80
        ↓
High Intent
</code></pre>
<p>You can then:</p>
<ul>
<li><p>Add a label</p>
</li>
<li><p>Notify sales</p>
</li>
<li><p>Assign a human</p>
</li>
<li><p>Trigger another flow</p>
</li>
</ul>
<h2>Example: Inventory</h2>
<p>API returns:</p>
<pre><code class="language-text">stock = 4
</code></pre>
<p>Condition:</p>
<p><strong>Stock &gt; 0</strong></p>
<p>→ Available</p>
<p>Otherwise:</p>
<p>→ Out of Stock</p>
<p>The customer gets current information rather than a manually maintained message.</p>
<h2>Test mapped values</h2>
<p>Always verify that:</p>
<ul>
<li><p>API returned the expected property.</p>
</li>
<li><p>Mapping points to the correct field.</p>
</li>
<li><p>The field receives the expected value.</p>
</li>
<li><p>The next step uses the correct field.</p>
</li>
</ul>
<h2>Common mistakes</h2>
<h3>Wrong response property</h3>
<p>The API may return:</p>
<blockquote>
<p>order_status</p>
</blockquote>
<p>while you mapped:</p>
<blockquote>
<p>status</p>
</blockquote>
<p>Check the actual response.</p>
<h3>Nested data</h3>
<p>Your API may return information inside nested objects.</p>
<p>Understand the response structure before mapping.</p>
<h3>Missing field</h3>
<p>Don't assume every response contains every value.</p>
<h3>Wrong field type</h3>
<p>A date, number and text may behave differently when used in conditions.</p>
<h2>The complete pattern</h2>
<pre><code class="language-text">Customer Input
      ↓
HTTP API
      ↓
API Response
      ↓
Response Mapping
      ↓
Custom/System Data
      ↓
Condition / Message / Dynamic List
      ↓
Customer
</code></pre>
<p>This is the basic architecture behind many real-time ZazzyAgent integrations.</p>
]]></content:encoded></item><item><title><![CDATA[How to Use HTTP API in ZazzyAgent Flow Builder]]></title><description><![CDATA[Your ZazzyAgent automation can do much more than send predefined messages.
It can also communicate with external systems using an HTTP API.
For example, a customer asks:

Can you check my order?

Inst]]></description><link>https://blog.zazzyagent.com/how-to-use-http-api-zazzyagent-flow-builder</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-use-http-api-zazzyagent-flow-builder</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:45:33 GMT</pubDate><content:encoded><![CDATA[<p>Your <a href="http://app.zazzyagent.com">ZazzyAgent</a> automation can do much more than send predefined messages.</p>
<p>It can also communicate with external systems using an <strong>HTTP API</strong>.</p>
<p>For example, a customer asks:</p>
<blockquote>
<p>Can you check my order?</p>
</blockquote>
<p>Instead of replying with a fixed message, your automation can call your order system, receive the current information and use the result in the conversation.</p>
<p>That's the basic purpose of HTTP API integration.</p>
<h2>What is an HTTP API?</h2>
<p>An API allows one system to communicate with another system.</p>
<p>In a ZazzyAgent flow, the basic architecture can look like:</p>
<pre><code class="language-text">Customer
   ↓
ZazzyAgent Flow
   ↓
HTTP API
   ↓
External System
   ↓
API Response
   ↓
ZazzyAgent
   ↓
Customer
</code></pre>
<h2>What can you use an API for?</h2>
<p>Common examples include:</p>
<ul>
<li><p>Checking order status</p>
</li>
<li><p>Looking up customer information</p>
</li>
<li><p>Checking appointment availability</p>
</li>
<li><p>Retrieving product information</p>
</li>
<li><p>Sending lead data to a CRM</p>
</li>
<li><p>Creating a support ticket</p>
</li>
<li><p>Checking account status</p>
</li>
<li><p>Retrieving prices</p>
</li>
<li><p>Connecting custom business software</p>
</li>
</ul>
<p>The current API integration supports HTTP methods including GET, POST, PUT and DELETE, along with response mapping back into subscriber/customer fields.</p>
<h2>When should you use an API?</h2>
<p>Use an API when ZazzyAgent needs information or an operation that belongs to another system.</p>
<p>For example:</p>
<blockquote>
<p>"What is my order status?"</p>
</blockquote>
<p>The information belongs to your ecommerce system.</p>
<p>ZazzyAgent should retrieve it rather than maintain a separate manually updated copy.</p>
<h2>Example: Order lookup</h2>
<p>Customer:</p>
<blockquote>
<p>Order 12345 status?</p>
</blockquote>
<p>Your flow can:</p>
<ol>
<li><p>Capture the order number.</p>
</li>
<li><p>Call the order API.</p>
</li>
<li><p>Send the order number to the external system.</p>
</li>
<li><p>Receive the response.</p>
</li>
<li><p>Map the response.</p>
</li>
<li><p>Reply to the customer.</p>
</li>
</ol>
<p>Example response:</p>
<blockquote>
<p>Your order #12345 is out for delivery.</p>
</blockquote>
<h2>Example: Appointment availability</h2>
<p>Customer:</p>
<blockquote>
<p>Can I book tomorrow?</p>
</blockquote>
<p>Your automation can call:</p>
<p><strong>Booking API</strong></p>
<p>and retrieve available slots.</p>
<p>For example:</p>
<pre><code class="language-text">API Response

10:00 AM
1:00 PM
4:30 PM
</code></pre>
<p>The available options can then be presented to the customer.</p>
<h2>Create an HTTP API integration</h2>
<p>Open the HTTP API/integration area in ZazzyAgent.</p>
<p>Create a new API configuration.</p>
<p>Give it a meaningful name.</p>
<p>For example:</p>
<blockquote>
<p>Check Appointment Availability</p>
</blockquote>
<p>rather than:</p>
<blockquote>
<p>API 1</p>
</blockquote>
<h2>Choose the HTTP method</h2>
<p>Depending on what your external system expects, choose the appropriate method:</p>
<p><strong>GET</strong></p>
<p>Usually used to retrieve data.</p>
<p><strong>POST</strong></p>
<p>Usually used to send information or create something.</p>
<p><strong>PUT</strong></p>
<p>Usually used to update information.</p>
<p><strong>DELETE</strong></p>
<p>Used to delete information where your external system supports that operation.</p>
<p>The API must be configured according to the requirements of the external service.</p>
<h2>Enter the endpoint</h2>
<p>Provide the API endpoint.</p>
<p>For example:</p>
<pre><code class="language-text">https://api.example.com/orders
</code></pre>
<p>Use the actual endpoint supplied by your system.</p>
<h2>Add authentication</h2>
<p>Your API may require authentication.</p>
<p>Examples include:</p>
<ul>
<li><p>API key</p>
</li>
<li><p>Bearer token</p>
</li>
<li><p>Other supported authentication methods</p>
</li>
</ul>
<p>Store credentials using the secure configuration available in ZazzyAgent rather than putting secrets into customer-facing messages.</p>
<h2>Add request parameters</h2>
<p>Suppose your endpoint expects:</p>
<pre><code class="language-text">order_id
12345
</code></pre>
<p>Your Flow can pass the customer's captured order number as the request value.</p>
<p>This lets the same API configuration work for different customers.</p>
<h2>Use dynamic customer data</h2>
<p>API requests become much more useful when the request can use information collected earlier in the flow.</p>
<p>Example:</p>
<pre><code class="language-text">User Input
   ↓
Save Order Number
   ↓
HTTP API
   ↓
Use Order Number
</code></pre>
<p>Now each customer can retrieve their own information.</p>
<h2>Example: Lead submission</h2>
<p>Suppose a website or chatbot collects:</p>
<ul>
<li><p>Name</p>
</li>
<li><p>Email</p>
</li>
<li><p>Phone</p>
</li>
<li><p>Requirement</p>
</li>
</ul>
<p>An HTTP API can send this information to your CRM.</p>
<p>The flow becomes:</p>
<pre><code class="language-text">Customer
   ↓
User Input
   ↓
Save Fields
   ↓
HTTP API
   ↓
CRM
</code></pre>
<h2>Read the API response</h2>
<p>Calling the API is only half the process.</p>
<p>You also need to understand the response.</p>
<p>For example:</p>
<pre><code class="language-json">{
  "status": "shipped",
  "tracking_number": "TRK12345"
}
</code></pre>
<p>You might want to use:</p>
<p><strong>status</strong></p>
<p>and:</p>
<p><strong>tracking_number</strong></p>
<p>in the next step of your flow.</p>
<h2>Response Mapping</h2>
<p>Response mapping lets you map returned API data into the appropriate customer/subscriber fields.</p>
<p>Our current API functionality supports syncing returned response data into subscriber fields through response mapping.</p>
<p>For example:</p>
<pre><code class="language-text">API status
    ↓
Order Status custom field
</code></pre>
<h2>Show API data to the customer</h2>
<p>Suppose your API returns:</p>
<pre><code class="language-text">name = Rahul
status = Shipped
date = September 10
</code></pre>
<p>Your next message can use the mapped information.</p>
<p>For example:</p>
<blockquote>
<p>Hi Rahul. Your order is shipped and is expected on September 10.</p>
</blockquote>
<h2>Use an API in a condition</h2>
<p>You can combine API results with Flow Builder conditions.</p>
<p>For example:</p>
<pre><code class="language-text">API
 ↓
Appointment Available?
 ↓
YES → Show booking options
NO  → Ask customer to choose another date
</code></pre>
<p>This creates genuinely dynamic automation.</p>
<h2>API errors</h2>
<p>Your workflow needs to account for failures.</p>
<p>Possible problems include:</p>
<ul>
<li><p>Invalid API URL</p>
</li>
<li><p>Authentication failure</p>
</li>
<li><p>Timeout</p>
</li>
<li><p>Invalid request</p>
</li>
<li><p>External server error</p>
</li>
<li><p>Unexpected response</p>
</li>
<li><p>Missing data</p>
</li>
</ul>
<p>Don't build a workflow that assumes every API call will succeed.</p>
<h2>Test the API before using it in a flow</h2>
<p>The current API integration workflow verifies the API configuration before allowing the integration to be saved.</p>
<p>Test:</p>
<ul>
<li><p>Request</p>
</li>
<li><p>Authentication</p>
</li>
<li><p>Parameters</p>
</li>
<li><p>Response</p>
</li>
<li><p>Response fields</p>
</li>
</ul>
<p>before connecting it to a customer-facing flow.</p>
<h2>API and Flow Builder</h2>
<p>A typical API-powered automation looks like:</p>
<pre><code class="language-text">Trigger
   ↓
Collect Input
   ↓
HTTP API
   ↓
Response
   ↓
Condition
   ↓
Customer Reply
</code></pre>
<p>This is one of the most powerful patterns available in Flow Builder.</p>
<h2>API vs Webhook</h2>
<p>These are related but different.</p>
<h3>HTTP API</h3>
<p>ZazzyAgent actively calls another system.</p>
<h3>Webhook</h3>
<p>Another system sends information to ZazzyAgent.</p>
<p>Think:</p>
<blockquote>
<p><strong>API = ZazzyAgent asks.</strong></p>
</blockquote>
<blockquote>
<p><strong>Webhook = another system tells ZazzyAgent.</strong></p>
</blockquote>
<p>See <a href="https://blog.zazzyagent.com/what-is-a-webhook-zazzyagent">What Is a Webhook in ZazzyAgent?</a>.</p>
<h2>API vs Google Sheets</h2>
<p>Google Sheets can be useful for simple structured data.</p>
<p>An API is usually better when you need real-time communication with another application.</p>
<p>For example:</p>
<p><strong>Simple internal data</strong></p>
<p>→ Google Sheets</p>
<p><strong>Live booking system</strong></p>
<p>→ API</p>
<h2>API security</h2>
<p>Never expose private API credentials in:</p>
<ul>
<li><p>Customer messages</p>
</li>
<li><p>Public URLs</p>
</li>
<li><p>System Prompt text intended for customers</p>
</li>
<li><p>Flow messages</p>
</li>
</ul>
<p>Use the secure API configuration available in the platform.</p>
<h2>Best practices</h2>
<p>Keep APIs focused.</p>
<p>For example:</p>
<blockquote>
<p>Check Order Status</p>
</blockquote>
<p>is better than an undocumented endpoint that does ten unrelated things.</p>
<p>Make the expected request and response structure clear.</p>
<p>Also design a fallback response for errors.</p>
<h2>A complete example</h2>
<p>Customer:</p>
<blockquote>
<p>I want to know my appointment availability.</p>
</blockquote>
<p>Flow:</p>
<p><strong>Ask date</strong></p>
<p>↓</p>
<p><strong>Save date</strong></p>
<p>↓</p>
<p><strong>Call HTTP API</strong></p>
<p>↓</p>
<p>API returns:</p>
<pre><code class="language-text">10:00
13:00
16:30
</code></pre>
<p>↓</p>
<p>Show available options</p>
<p>↓</p>
<p>Customer selects one</p>
<p>↓</p>
<p>Continue booking.</p>
<p>That's the difference between a static chatbot and an automation connected to live business data.</p>
]]></content:encoded></item><item><title><![CDATA[How to Use Delay in ZazzyAgent Flows]]></title><description><![CDATA[Automation can sometimes feel unnatural when several messages arrive immediately one after another.
For example:

Hi!


Welcome to our business.


What would you like to do?


Choose an option.

All f]]></description><link>https://blog.zazzyagent.com/ow-to-use-delay-zazzyagent-whatsapp-flow</link><guid isPermaLink="true">https://blog.zazzyagent.com/ow-to-use-delay-zazzyagent-whatsapp-flow</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:29:27 GMT</pubDate><content:encoded><![CDATA[<p>Automation can sometimes feel unnatural when several messages arrive immediately one after another.</p>
<p>For example:</p>
<blockquote>
<p>Hi!</p>
</blockquote>
<blockquote>
<p>Welcome to our business.</p>
</blockquote>
<blockquote>
<p>What would you like to do?</p>
</blockquote>
<blockquote>
<p>Choose an option.</p>
</blockquote>
<p>All four messages arriving instantly can feel like a machine dumping text into the customer's chat.</p>
<p>A <strong>Delay</strong> can create a more natural sequence.</p>
<h2>What is Delay?</h2>
<p>A Delay tells ZazzyAgent to wait before continuing to the next step in a flow.</p>
<p>For example:</p>
<pre><code class="language-text">Message
  ↓
Wait 3 seconds
  ↓
Next Message
</code></pre>
<p>The current WhatsApp flow troubleshooting documentation also identifies Delay as a flow element whose placement and timing can affect when subsequent messages are sent.</p>
<h2>Why use Delay?</h2>
<p>Delay can be useful for:</p>
<ul>
<li><p>Creating natural pacing</p>
</li>
<li><p>Separating multiple messages</p>
</li>
<li><p>Waiting before a follow-up</p>
</li>
<li><p>Preventing messages from appearing all at once</p>
</li>
<li><p>Creating short pauses before an action</p>
</li>
</ul>
<h2>Example: Welcome sequence</h2>
<p>Instead of:</p>
<pre><code class="language-text">Message 1
Message 2
Message 3
</code></pre>
<p>use:</p>
<pre><code class="language-text">Message 1
   ↓
Delay
   ↓
Message 2
   ↓
Delay
   ↓
Message 3
</code></pre>
<p>The conversation feels more like a person or well-designed assistant communicating step by step.</p>
<h2>How to add a Delay</h2>
<p>Open the relevant flow in Flow Builder.</p>
<p>Add a Delay element between the two steps where you want the pause.</p>
<p>Configure the amount of time.</p>
<p>Then connect the Delay to the next step.</p>
<h2>Choose sensible timing</h2>
<p>The correct delay depends on what you're trying to accomplish.</p>
<p>For example:</p>
<p><strong>1–3 seconds</strong></p>
<p>can make a short message sequence feel less abrupt.</p>
<p>A longer delay may be appropriate when the automation is intentionally waiting for something.</p>
<p>Don't add delays randomly.</p>
<h2>Don't fake human typing excessively</h2>
<p>A small pause can improve readability.</p>
<p>But adding:</p>
<blockquote>
<p>15 seconds</p>
</blockquote>
<blockquote>
<p>20 seconds</p>
</blockquote>
<blockquote>
<p>30 seconds</p>
</blockquote>
<p>between ordinary messages simply to pretend a human is typing can frustrate customers.</p>
<p>The purpose is better pacing, not deception.</p>
<h2>Use Delay between related messages</h2>
<p>Example:</p>
<blockquote>
<p>Thanks for your enquiry.</p>
</blockquote>
<p><strong>Delay</strong></p>
<blockquote>
<p>Let me show you our available options.</p>
</blockquote>
<p><strong>Delay</strong></p>
<blockquote>
<p>Which one are you interested in?</p>
</blockquote>
<p>This is easier to read than three simultaneous messages.</p>
<h2>Delay before a follow-up</h2>
<p>Suppose a customer starts a booking process.</p>
<p>You may want:</p>
<blockquote>
<p>Please complete the form.</p>
</blockquote>
<p>Then later:</p>
<blockquote>
<p>Need help completing it?</p>
</blockquote>
<p>A delay can create that pause where appropriate.</p>
<h2>Delay before launching a Flow</h2>
<p>In some workflows, you may want a short pause before another structured experience begins.</p>
<p>For example:</p>
<pre><code class="language-text">"Great! Let's get your details."
       ↓
Delay
       ↓
WhatsApp Flow
</code></pre>
<p>This can make the transition feel cleaner.</p>
<h2>Delay and external APIs</h2>
<p>Be careful when an API is involved.</p>
<p>A delay does not automatically mean:</p>
<blockquote>
<p>Wait until the API finishes.</p>
</blockquote>
<p>An API operation and a Delay are different things.</p>
<p>If your workflow depends on an API response, make sure your API step and response handling are configured correctly rather than assuming a fixed delay will always be enough.</p>
<h2>Delay and Webhooks</h2>
<p>The same principle applies to webhook workflows.</p>
<p>Don't use:</p>
<blockquote>
<p>Wait 5 seconds.</p>
</blockquote>
<p>as a substitute for knowing whether an external process actually completed.</p>
<p>Use delays for timing.</p>
<p>Use API/webhook logic for system events.</p>
<h2>Delay and broadcasts</h2>
<p>Be careful with timing when sending messages to many customers.</p>
<p>Large automation systems can have additional sending, rate and platform constraints.</p>
<p>A delay inside a customer journey should not be treated as a universal solution to messaging limits.</p>
<h2>Where should the Delay go?</h2>
<p>Consider:</p>
<pre><code class="language-text">Correct:
Message
  ↓
Delay
  ↓
Next Message
</code></pre>
<p>The Delay must be in the actual branch being executed.</p>
<p>If you place it on another branch, it won't affect the path you're testing.</p>
<p>This is a common source of confusion when a flow appears to ignore a delay.</p>
<h2>Example: Product presentation</h2>
<pre><code class="language-text">Welcome
   ↓
Delay 2 sec
   ↓
Product Introduction
   ↓
Delay 2 sec
   ↓
Product Options
</code></pre>
<h2>Example: Support flow</h2>
<pre><code class="language-text">Customer chooses Support
       ↓
"Sure, I'll help."
       ↓
Delay
       ↓
"Please choose your issue:"
       ↓
Buttons
</code></pre>
<p>The short pause separates acknowledgement from the next instruction.</p>
<h2>Example: Lead qualification</h2>
<pre><code class="language-text">Customer submits details
       ↓
Delay
       ↓
"Thanks, we've received your information."
       ↓
Next step
</code></pre>
<h2>When not to use Delay</h2>
<p>Don't add delays:</p>
<ul>
<li><p>Everywhere</p>
</li>
<li><p>Between every single message</p>
</li>
<li><p>To hide slow integrations</p>
</li>
<li><p>To compensate for broken logic</p>
</li>
<li><p>To imitate human behaviour excessively</p>
</li>
</ul>
<p>If your customer needs information immediately, give it immediately.</p>
<h2>Delay troubleshooting</h2>
<h3>Delay has no effect</h3>
<p>Check whether the Delay is actually connected to the path being tested.</p>
<h3>Message appears too quickly</h3>
<p>Check the configured duration.</p>
<h3>Flow seems stuck</h3>
<p>Make sure the Delay is not configured for an unexpectedly long period and that the next node is connected.</p>
<h3>Only one branch has a delay</h3>
<p>Remember that each branch has its own path.</p>
<p>A delay in one branch won't affect another.</p>
<h2>Good automation pacing</h2>
<p>A useful rule is:</p>
<blockquote>
<p><strong>Use delays where they improve comprehension, not simply because you can.</strong></p>
</blockquote>
<p>The customer should feel that the conversation has a natural rhythm without being made to wait unnecessarily.</p>
]]></content:encoded></item><item><title><![CDATA[How to Use CTA URL Buttons in ZazzyAgent Whatsapp]]></title><description><![CDATA[Sometimes the best next step isn't another WhatsApp message.
You may want the customer to:

Open your website

Book an appointment

View a product page

Complete a form

Make a payment

Read documenta]]></description><link>https://blog.zazzyagent.com/how-to-use-cta-url-button-zazzyagent-whatsapp</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-use-cta-url-button-zazzyagent-whatsapp</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:28:05 GMT</pubDate><content:encoded><![CDATA[<p>Sometimes the best next step isn't another WhatsApp message.</p>
<p>You may want the customer to:</p>
<ul>
<li><p>Open your website</p>
</li>
<li><p>Book an appointment</p>
</li>
<li><p>View a product page</p>
</li>
<li><p>Complete a form</p>
</li>
<li><p>Make a payment</p>
</li>
<li><p>Read documentation</p>
</li>
<li><p>Visit a landing page</p>
</li>
</ul>
<p>A <strong>CTA URL Button</strong> gives the customer a clear button that opens an external URL.</p>
<p>The current Flow Builder supports CTA URL buttons for WhatsApp chatbot and supported live-chat workflows.</p>
<h2>What is a CTA URL button?</h2>
<p>CTA means:</p>
<p><strong>Call to Action</strong></p>
<p>A CTA URL button is a clickable action that takes the customer to a web address.</p>
<p>Example:</p>
<blockquote>
<p>Ready to book your appointment?</p>
</blockquote>
<p><strong>Book Now</strong></p>
<p>The button opens:</p>
<blockquote>
<p>your booking page</p>
</blockquote>
<h2>When should you use a CTA URL?</h2>
<p>Use it when the customer needs to leave WhatsApp for a specific reason.</p>
<p>Examples:</p>
<p><strong>Book Appointment</strong></p>
<p>→ Booking website</p>
<p><strong>View Product</strong></p>
<p>→ Product page</p>
<p><strong>Make Payment</strong></p>
<p>→ Payment page</p>
<p><strong>Read Guide</strong></p>
<p>→ Documentation</p>
<p><strong>Apply Now</strong></p>
<p>→ Application form</p>
<h2>Create a CTA URL message</h2>
<p>Open Flow Builder.</p>
<p>Create or edit your WhatsApp flow.</p>
<p>Select the CTA URL Button message type.</p>
<p>The current setup uses the CTA URL Button message option inside the bot flow editor.</p>
<h2>Add the message content</h2>
<p>Write a short body message.</p>
<p>Example:</p>
<blockquote>
<p>You can choose your appointment time on our booking page.</p>
</blockquote>
<p>Then add the CTA button:</p>
<p><strong>Book Appointment</strong></p>
<h2>Enter the URL</h2>
<p>Add the destination URL.</p>
<p>Make sure it is the exact page you want customers to visit.</p>
<p>Good:</p>
<blockquote>
<p>Your booking page</p>
</blockquote>
<p>Poor:</p>
<blockquote>
<p>Homepage</p>
</blockquote>
<p>when the customer actually needs to book an appointment.</p>
<h2>Send customers to the right page</h2>
<p>A common mistake is sending everyone to the homepage.</p>
<p>Instead, use a deep link where possible.</p>
<p>For example:</p>
<p><strong>Product enquiry</strong></p>
<p>→ Specific product page</p>
<p><strong>Booking request</strong></p>
<p>→ Booking page</p>
<p><strong>Support question</strong></p>
<p>→ Support portal</p>
<h2>CTA for lead generation</h2>
<p>Example:</p>
<blockquote>
<p>Want to request a quote?</p>
</blockquote>
<p><strong>Request Quote</strong></p>
<p>→ Landing page with the quote form.</p>
<p>This can complement your ZazzyAgent lead-generation automation.</p>
<h2>CTA for bookings</h2>
<p>Example:</p>
<blockquote>
<p>Choose a convenient time for your appointment.</p>
</blockquote>
<p><strong>Book Appointment</strong></p>
<p>→ Online booking system.</p>
<h2>CTA for payments</h2>
<p>Example:</p>
<blockquote>
<p>Your payment link is ready.</p>
</blockquote>
<p><strong>Make Payment</strong></p>
<p>→ Secure payment page.</p>
<p>Only send customers to a payment URL you trust and control.</p>
<h2>CTA for product pages</h2>
<p>Example:</p>
<blockquote>
<p>Here's the product you asked about.</p>
</blockquote>
<p><strong>View Product</strong></p>
<p>→ Product URL.</p>
<p>This is particularly useful after an AI Agent answers a product question.</p>
<h2>CTA vs WhatsApp Flow</h2>
<p>Use CTA URL when the next step belongs on your website.</p>
<p>Use a WhatsApp Flow when you want the customer to complete a structured form inside WhatsApp.</p>
<p>For example:</p>
<h3>WhatsApp Flow</h3>
<blockquote>
<p>Collect name, email and requirement.</p>
</blockquote>
<h3>CTA URL</h3>
<blockquote>
<p>Customer needs a full booking interface.</p>
</blockquote>
<h2>CTA vs button that starts a flow</h2>
<p>A flow button keeps the customer inside the automated conversation.</p>
<p>A CTA URL takes the customer to another destination.</p>
<p>Choose based on what you want the customer to do next.</p>
<h2>Use clear button labels</h2>
<p>Good:</p>
<p><strong>Book Appointment</strong></p>
<p><strong>View Product</strong></p>
<p><strong>Get Directions</strong></p>
<p><strong>Complete Application</strong></p>
<p>Poor:</p>
<p><strong>Click</strong></p>
<p>The customer should understand the destination.</p>
<h2>Add context before the CTA</h2>
<p>Don't send:</p>
<blockquote>
<p>[Click Here]</p>
</blockquote>
<p>Instead:</p>
<blockquote>
<p>You can see all available appointment slots here.</p>
</blockquote>
<p><strong>View Availability</strong></p>
<p>The customer knows what will happen.</p>
<h2>Track the customer's journey</h2>
<p>When someone clicks your CTA, they leave the ZazzyAgent conversation for the external website.</p>
<p>Where your website supports it, use appropriate analytics or tracking so you can understand what happens after the click.</p>
<h2>Don't send broken URLs</h2>
<p>Before enabling your automation, open the link yourself.</p>
<p>Check:</p>
<ul>
<li><p>Correct URL</p>
</li>
<li><p>Page loads</p>
</li>
<li><p>Mobile experience</p>
</li>
<li><p>HTTPS</p>
</li>
<li><p>Relevant content</p>
</li>
<li><p>No login problems unless intended</p>
</li>
</ul>
<h2>Test from a phone</h2>
<p>A URL that works on a desktop should also be tested on a mobile device.</p>
<p>WhatsApp customers are usually interacting from their phones.</p>
<h2>Common problems</h2>
<h3>Button doesn't appear</h3>
<p>Check that the CTA URL message is configured correctly.</p>
<h3>Button opens wrong page</h3>
<p>Check the exact URL.</p>
<h3>Website doesn't load</h3>
<p>Test the destination URL independently.</p>
<h3>Customer doesn't know why they should click</h3>
<p>Rewrite the message and button text.</p>
<h2>Example: Lead generation</h2>
<pre><code class="language-text">Interested in a Demo?
        ↓
CTA URL
"Book Your Demo"
        ↓
Website Booking Page
</code></pre>
<h2>Example: Product enquiry</h2>
<pre><code class="language-text">Customer asks about Product A
        ↓
AI / Bot
        ↓
Product information
        ↓
"View Product"
        ↓
Product page
</code></pre>
<h2>The rule to remember</h2>
<p>Use a CTA URL when:</p>
<blockquote>
<p><strong>The customer's next action is better completed on your website than inside WhatsApp.</strong></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[How to Create WhatsApp Carousel Messages in ZazzyAgent]]></title><description><![CDATA[Sometimes one WhatsApp message isn't enough.
You may want to show:

Several products

Different service packages

Multiple offers

Different properties

Several plans


Instead of sending separate mes]]></description><link>https://blog.zazzyagent.com/how-to-create-whatsapp-carousel-zazzyagent</link><guid isPermaLink="true">https://blog.zazzyagent.com/how-to-create-whatsapp-carousel-zazzyagent</guid><dc:creator><![CDATA[ZazzyAgent]]></dc:creator><pubDate>Tue, 08 Sep 2026 13:26:37 GMT</pubDate><content:encoded><![CDATA[<p>Sometimes one WhatsApp message isn't enough.</p>
<p>You may want to show:</p>
<ul>
<li><p>Several products</p>
</li>
<li><p>Different service packages</p>
</li>
<li><p>Multiple offers</p>
</li>
<li><p>Different properties</p>
</li>
<li><p>Several plans</p>
</li>
</ul>
<p>Instead of sending separate messages one after another, you can use a <strong>Carousel</strong>.</p>
<p>A carousel presents multiple cards that customers can browse through.</p>
<p>The current Flow Builder supports WhatsApp Carousel Templates for bot flows and other supported messaging workflows.</p>
<h2>What is a Carousel?</h2>
<p>A carousel is a horizontally browsable collection of cards.</p>
<p>Each card can contain information such as:</p>
<ul>
<li><p>Image</p>
</li>
<li><p>Title</p>
</li>
<li><p>Description</p>
</li>
<li><p>Button/action</p>
</li>
</ul>
<p>For example:</p>
<pre><code class="language-text">[ Product A ] [ Product B ] [ Product C ]
    image         image         image
   Details       Details       Details
</code></pre>
<p>The customer can browse the cards and choose the one they're interested in.</p>
<h2>When should you use a Carousel?</h2>
<p>Use a carousel when customers need to compare several visual options.</p>
<p>Great examples include:</p>
<h3>Products</h3>
<p>Show multiple products.</p>
<h3>Services</h3>
<p>Show different packages.</p>
<h3>Properties</h3>
<p>Show several properties for sale or rent.</p>
<h3>Plans</h3>
<p>Show different subscription or service plans.</p>
<h3>Offers</h3>
<p>Show current promotions.</p>
<h2>Create a Carousel</h2>
<p>Open your WhatsApp Flow Builder.</p>
<p>Create or open the flow where you want the carousel.</p>
<p>Select the Carousel Template component.</p>
<h2>Add your first card</h2>
<p>Start with the most important option.</p>
<p>Add:</p>
<p><strong>Image</strong></p>
<p><strong>Title</strong></p>
<p><strong>Description</strong></p>
<p><strong>Action/button</strong></p>
<p>Example:</p>
<blockquote>
<p>Premium Plan</p>
</blockquote>
<blockquote>
<p>Advanced automation for growing businesses.</p>
</blockquote>
<p><strong>Learn More</strong></p>
<h2>Add more cards</h2>
<p>Continue adding the options you want customers to browse.</p>
<p>For example:</p>
<p><strong>Starter</strong></p>
<p><strong>Growth</strong></p>
<p><strong>Enterprise</strong></p>
<p>Each card should represent a meaningful choice.</p>
<h2>Make every card consistent</h2>
<p>Use a similar structure for all cards.</p>
<p>For example:</p>
<pre><code class="language-text">Card 1
Image
Title
Description
Button

Card 2
Image
Title
Description
Button

Card 3
Image
Title
Description
Button
</code></pre>
<p>Don't make one card extremely detailed and another almost empty.</p>
<p>Consistency makes the carousel easier to scan.</p>
<h2>Use strong images</h2>
<p>Carousel messages are highly visual.</p>
<p>Use images that:</p>
<ul>
<li><p>Clearly show the product/service</p>
</li>
<li><p>Have similar dimensions</p>
</li>
<li><p>Are good quality</p>
</li>
<li><p>Don't contain excessive text</p>
</li>
</ul>
<p>For products, actual product images are generally better than generic graphics.</p>
<h2>Write short descriptions</h2>
<p>Don't turn each card into a full product page.</p>
<p>Example:</p>
<blockquote>
<p>Premium WhatsApp automation with AI, shared inbox and advanced workflows.</p>
</blockquote>
<p>is better than several paragraphs inside the card.</p>
<p>The purpose is to get the customer to choose.</p>
<h2>Add a clear button</h2>
<p>Good:</p>
<p><strong>View Details</strong></p>
<p><strong>Get Quote</strong></p>
<p><strong>Buy Now</strong></p>
<p><strong>Book Demo</strong></p>
<p>Poor:</p>
<p><strong>Click Here</strong></p>
<h2>Connect each card</h2>
<p>A carousel becomes useful when its actions lead somewhere.</p>
<p>For example:</p>
<pre><code class="language-text">Card: Starter
       ↓
Starter Details

Card: Growth
       ↓
Growth Details

Card: Enterprise
       ↓
Talk to Sales
</code></pre>
<h2>Carousel for product discovery</h2>
<p>A customer asks:</p>
<blockquote>
<p>Show me your products.</p>
</blockquote>
<p>Your automation can respond with:</p>
<p><strong>Product A</strong></p>
<p><strong>Product B</strong></p>
<p><strong>Product C</strong></p>
<p>The customer chooses one.</p>
<p>Then the corresponding product flow starts.</p>
<h2>Carousel for services</h2>
<p>A service business could show:</p>
<p><strong>Consultation</strong></p>
<p><strong>Installation</strong></p>
<p><strong>Maintenance</strong></p>
<p>Each card can lead to:</p>
<p><strong>More information</strong></p>
<p>or:</p>
<p><strong>Book Now</strong></p>
<h2>Carousel and AI</h2>
<p>An AI Agent can be used before or after the carousel.</p>
<p>Example:</p>
<p>Customer:</p>
<blockquote>
<p>I'm looking for a plan for a small business.</p>
</blockquote>
<p>AI:</p>
<blockquote>
<p>I can show you some options.</p>
</blockquote>
<p>↓</p>
<p>Carousel:</p>
<p><strong>Starter</strong></p>
<p><strong>Growth</strong></p>
<p><strong>Business</strong></p>
<p>The customer can then choose.</p>
<h2>Carousel and lead qualification</h2>
<p>A carousel can be the beginning of a sales journey.</p>
<p>Example:</p>
<p><strong>Service A</strong></p>
<p>→ Request Quote</p>
<p>→ Lead Qualification</p>
<p><strong>Service B</strong></p>
<p>→ Request Quote</p>
<p>→ Lead Qualification</p>
<p>This creates a visual entry point into a structured sales process.</p>
<h2>Carousel vs interactive list</h2>
<p>Use a <strong>Carousel</strong> when the options are visual.</p>
<p>Use a <strong>List</strong> when the customer mainly needs to choose from text.</p>
<p>Example:</p>
<h3>Carousel</h3>
<p>Products with images.</p>
<h3>List</h3>
<p>Cities:</p>
<ul>
<li><p>Mumbai</p>
</li>
<li><p>Pune</p>
</li>
<li><p>Delhi</p>
</li>
<li><p>Bengaluru</p>
</li>
</ul>
<h2>Carousel vs separate messages</h2>
<p>Sending:</p>
<blockquote>
<p>Product A</p>
</blockquote>
<p>then:</p>
<blockquote>
<p>Product B</p>
</blockquote>
<p>then:</p>
<blockquote>
<p>Product C</p>
</blockquote>
<p>creates a long conversation.</p>
<p>A carousel keeps the choices together.</p>
<h2>Don't put everything into one carousel</h2>
<p>If you have 30 products, displaying everything in one carousel may not be useful.</p>
<p>Instead:</p>
<p><strong>Product Categories</strong></p>
<p>↓</p>
<p>Customer chooses category</p>
<p>↓</p>
<p>Show relevant carousel.</p>
<h2>Example: Real estate</h2>
<p>Customer:</p>
<blockquote>
<p>Show me available properties.</p>
</blockquote>
<p>Your bot can display:</p>
<p><strong>2BHK Andheri</strong></p>
<p><strong>3BHK Bandra</strong></p>
<p><strong>2BHK Powai</strong></p>
<p>Each card could have:</p>
<p><strong>View Property</strong></p>
<p>The next step can show details or open a website.</p>
<h2>Example: Restaurant</h2>
<p>Customer:</p>
<blockquote>
<p>Show me your special dishes.</p>
</blockquote>
<p>Carousel:</p>
<p><strong>Pizza</strong></p>
<p><strong>Burger</strong></p>
<p><strong>Pasta</strong></p>
<p>Each card can show an image and description.</p>
<h2>Test each card</h2>
<p>This is important.</p>
<p>Test:</p>
<ul>
<li><p>First card</p>
</li>
<li><p>Middle card</p>
</li>
<li><p>Last card</p>
</li>
<li><p>Every button</p>
</li>
<li><p>Every destination</p>
</li>
</ul>
<p>Make sure customers don't accidentally enter the wrong flow.</p>
<h2>Common problems</h2>
<h3>Carousel doesn't appear</h3>
<p>Check whether the carousel is configured for the correct WhatsApp account and message workflow.</p>
<h3>Card image doesn't appear</h3>
<p>Check the media configuration.</p>
<h3>Button opens the wrong flow</h3>
<p>Check the action connected to that card.</p>
<h3>Carousel is too long</h3>
<p>Reduce the number of cards or introduce categories.</p>
<h2>Best carousel structure</h2>
<pre><code class="language-text">Question
   ↓
Carousel
   ↓
Visual Options
   ↓
Customer selects
   ↓
Relevant Flow
</code></pre>
<p>A carousel is most useful when the customer needs to <strong>browse before deciding</strong>.</p>
]]></content:encoded></item></channel></rss>