Duck
Tutorials8 min read

How to Build a Conversational AI Service That Doesn't Suck

Samet Turan— Editor··8 min read

Stop using generic chatbots. Learn to build a production-ready conversational ai service with state management, memory, and real business logic.

Why Your Chatbot is Probably Useless

Let’s be honest. Most chatbots are glorified FAQ machines. They fail the moment a conversation requires remembering what was said two sentences ago. You ask to book a flight to New York, then ask “what’s the weather like there?” and it has no idea “there” is New York. This is a failure of state management, and it’s why customers hate your bot. This guide will show you how to build a proper conversational ai service that remembers context, handles complex dialogues, and actually performs tasks. No academic theory, just a working system you can build this afternoon.

The Core Components of a Real Conversational AI Service

Forget the marketing fluff. A useful conversational agent has five distinct jobs. If your system doesn’t do all five, it’s not an agent; it’s a script.

  • Intent Recognition: This is figuring out what the user wants. When they type “I need an appointment for Tuesday at 2pm,” the intent is `schedule_appointment`. This is the verb of the user’s request.
  • Entity Extraction: This is pulling out the key pieces of information. From the same sentence, the entities are `date: Tuesday` and `time: 2pm`. These are the nouns. Getting this right is critical.
  • State Management: This is the system’s memory. It tracks the conversation’s status. Has the user provided a date? A time? Have they confirmed? This is the component that separates a real tool from a toy. It’s the hardest part to get right.
  • Response Generation: Based on the intent, entities, and current state, the system formulates a reply. This could be asking for more information (“What day works for you?”) or confirming an action (“OK, you’re booked for Tuesday at 2pm.”).
  • Action Execution: This is where the system actually does something in the real world. It calls an API, updates a database, or writes to a calendar. A bot that can’t act is just a search bar with a personality.

Most builders only give you the first two and a weak version of the fourth. You’re left to figure out the rest.

What Most “No-Code” Chatbot Guides Get Wrong

Almost every tutorial I’ve seen focuses on the happy path. They show you how to build a linear, question-and-answer flow that works perfectly as long as the user behaves exactly as predicted. This is a fantasy.

The real world is messy. Users change their minds, ask clarifying questions, and go off on tangents. The fundamental flaw in most no-code chatbot platforms is that they are stateless. Each turn of the conversation is a new event, completely disconnected from the last. They have no memory. They force you to build brittle, tree-like structures that break the second a user deviates from the script.

This is why you see those infuriating bots that ask for your email address three times in one conversation. The `get_email` part of the flow has no idea that the `check_status` part of the flow already collected it. It’s maddening for the user and makes your business look incompetent. A true conversational ai service needs a persistent memory layer, even a simple one, to be effective.

You can’t just chain together a few blocks in a visual editor and call it an AI agent framework. You need a way to store and retrieve information about the user and the conversation *outside* of the chat tool itself.

Our Stack: Voiceflow, Make, and a Google Sheet

You don’t need a team of data scientists for this. I’ve built production systems for clients using a simple, powerful stack.

  • Voiceflow: This is our front-end and conversation designer. It has one of the best interfaces for mapping out conversational logic, intents, and entities. Its real power is the API block, which lets us hand off the hard work to a different system. The free plan is surprisingly capable, but I think the Pro plan at $50/month is a fair price for the features you get, like custom integrations.
  • Make (formerly Integromat): This is our backend and automation engine. It connects to pretty much any API you can think of. When Voiceflow captures the user’s intent, it will send the data to a Make webhook. Make will then run the business logic—checking a database, calling another API, whatever is needed. Its visual interface for API calls is much better than Zapier‘s, in my opinion.
  • Google Sheets: Yes, seriously. For many small-to-medium use cases, a Google Sheet is a perfectly adequate database for state management. We’ll use it to store session information and log outcomes. It’s free, easy to debug, and everyone understands it.

This stack gives you the best of both worlds: a great visual editor for conversation design and a powerful, flexible engine for backend automation. It’s a solid foundation for a no code ai operator playbook.

Step-by-Step: Building a Basic Appointment Booker

Let’s build a bot that can book a meeting. The goal is to collect a service type, a date, and a time, then confirm it.

  1. Design the Flow in Voiceflow: Start by creating a new project. You’ll need a few key things. First, create an `intent` called `request_appointment` with training phrases like “I need to book a time,” “schedule a meeting,” or “can I make an appointment.” Then, create `entities` to capture the necessary data: `@service_type`, `@date`, and `@time`. Voiceflow has built-in entities for date and time which makes this easy. Your conversation flow will have blocks that ask the user for each piece of information if it wasn’t provided in the first message.
  2. Store Variables: In Voiceflow, create variables to hold the data you collect, like `{service}`, `{date}`, and `{time}`. As the user provides information, you’ll use “Set Variable” steps to store it.
  3. Call the Make Webhook: Once all three variables are filled, add an “API” block. Set it to a POST request. For the URL, you’ll go into Make, create a new scenario, and add a “Custom Webhook” trigger. Make will give you a unique URL to paste into Voiceflow. In the API block’s body, you’ll send the data as JSON: {"service": "{service}", "date": "{date}", "time": "{time}", "user_id": "{user_id}"}. The `{user_id}` is a built-in Voiceflow variable that uniquely identifies the user.
  4. Build the Make Scenario: In Make, your webhook will now receive the data. Add a “Google Sheets” module with the “Add a Row” action. Connect it to a sheet you’ve prepared with columns for `UserID`, `Service`, `Date`, `Time`, and `Timestamp`. Map the data from the webhook to the corresponding columns.
  5. Return a Confirmation: The final step in Make is a “Webhook Response” module. This sends data back to Voiceflow. Set the body to something like {"status": "confirmed", "booking_id": "12345"}. Back in Voiceflow, in your API block, you can map this response to variables. For example, you can capture the `status` and use a “Condition” block to check if it equals “confirmed.” If it does, show the user a final confirmation message.

You now have a bot that doesn’t just talk; it acts.

How do you handle interruptions and topic changes?

This is where most simple bots fall apart. A user is halfway through booking, then asks, “what are your hours?” A linear flow breaks. Voiceflow handles this quite well, which is one of the specific features I love about it.

You create a separate, global intent for `check_hours`. You can attach this intent to a small conversational flow that answers the question. The key is the “Go to Block” step. After answering the question about hours, you can use this step to send the user right back to the exact point in the booking flow where they left off. It’s not perfect, but it’s a simple and effective way to manage context without writing a ton of code. You can build out these conversational “side quests” for all your common FAQs, making the main flows much cleaner and more resilient to user tangents.

Debugging When It Inevitably Breaks

This will break. My biggest gripe with this kind of stack is that debugging communication between services can be a nightmare. A failed API call from Voiceflow might just give you a generic “Error 400,” which is completely useless. You don’t know if the problem is a malformed URL, bad JSON, or an issue on the Make side.

Here’s my process for finding the problem fast.

First, test inside Voiceflow’s prototype tool. It has a debugger that shows you the exact state of all your variables at each step. Check that the variables you’re sending in the API call actually contain the data you expect. Nine times out of ten, the problem is a variable that’s empty or has the wrong name.

Second, check the Make scenario history. Open the run history and click on the webhook trigger. It will show you the exact data it received—the headers, the body, everything. If the data looks wrong there, the problem is in Voiceflow. If the data looks right, click on the next module in the sequence and check its input. This is how you trace the data flow and find where it went wrong.

My secret weapon is a dedicated debug log. During development, I add an extra “Google Sheets – Add a Row” module right after the webhook in Make. It writes the entire raw input to a separate “Debug Log” sheet. It’s a simple record of every single request that comes in. This has saved me more hours than I can count, especially when dealing with asynchronous systems (which, yes, is annoying to debug).

Building a truly effective conversational ai service takes more than just dragging and dropping a few blocks. It requires thinking about state, handling interruptions, and having a solid plan for debugging. The steps above are a real-world starting point, not a toy example.

For more on this exact angle, deeper coverage of AI agent platforms.

If you’d rather skip the build and deploy a working version in an afternoon, we’ve packaged this workflow as a blueprint at deepusecase.com/vault.

— The Colophon

One AI tool. Tested. Reviewed.
In your inbox every Sunday.

~3 minute read. Real outcomes from operators, not marketers.

Free. One email per Sunday. Unsubscribe in one click.