The Core Stack: Voiceflow, Airtable, and an LLM
Forget the all-in-one platforms that promise the world and deliver a glorified FAQ bot. To build an ai customer service agent that actually closes tickets, you need to assemble a stack from components that are excellent at their specific jobs. This isn’t as complicated as it sounds. I run this exact setup for a few of my own projects.
Here’s the breakdown:
- The Brain (Logic): We’ll use Voiceflow. It’s a visual, no-code platform for designing and building AI agents. You map out conversations like a flowchart, which is perfect for handling the branching logic of customer support without writing a line of code.
- The Memory (Knowledge): We’ll use Airtable. This is your structured knowledge base. Instead of feeding an AI a messy 50-page PDF of your policies, you’ll give it clean, organized data from a database. This is the single biggest difference between a useful agent and one that hallucinates refund policies.
- The Mouth (Language): We’ll use an API from OpenAI (GPT-4o) or Anthropic (Claude 3 Sonnet). This is the Large Language Model that does the talking. Voiceflow connects to it, feeds it the right data from Airtable, and gets back a human-like response.
Why this stack? It separates concerns. Voiceflow handles the *how* (the conversation flow). Airtable handles the *what* (the source of truth). The LLM handles the *style* (the conversation itself). This modularity is key. When your return policy changes, you update one row in Airtable, and the entire agent is instantly updated. No retraining, no re-deploying complex code.
What Most Guides Get Wrong About Knowledge Bases
Almost every tutorial I’ve seen on this topic starts with a critical mistake. They tell you to just upload your documents—PDFs, Word docs, website exports—into a vector database and call it a day. This is the fastest path to a frustrating and useless bot.
AI Side Hustles
Practical setups for building real income streams with AI tools. No coding needed. 12 tested models with real numbers.
Get the Guide → $14
Here’s why that’s a terrible idea.
When you just dump unstructured text, the AI has to guess. It sees three different paragraphs about shipping from three different documents and tries to blend them. The result? It confidently tells a customer that you offer free overnight shipping to Antarctica. It invents features. It creates a support nightmare that a human has to clean up later.
The correct approach is to treat your knowledge base like a database, not a filing cabinet. This is why we use Airtable. You create a base with specific, structured tables for your information:
- A `FAQs` table with `Question` and `Answer` columns.
- A `Products` table with `ProductName`, `SKU`, `Price`, and `Description` columns.
- An `Orders` table with `OrderID`, `CustomerEmail`, `Status`, and `TrackingURL` columns.
This is more work upfront. Yes, it is annoying. But it’s the only way to ensure your agent pulls from a single source of truth. By feeding the LLM a clean, specific piece of data (like a single Airtable record), you constrain its ability to make things up. You’re giving it facts to report, not a book to interpret. This is the foundation of a reliable ai agent framework.
A Concrete Example: Handling a “Where’s My Order?” Request
Let’s make this real. A “where is my order?” (WISMO) request is the most common e-commerce support ticket. Here’s how you automate it correctly.
Step 1: Set up your Airtable Base.
Create a base named `Orders`. Add four fields: `OrderID` (single line text), `CustomerEmail` (email), `Status` (single-select with options like ‘Processing’, ‘Shipped’, ‘Delivered’), and `TrackingURL` (URL).
Step 2: Design the Voiceflow Logic.
In Voiceflow, you’ll drag and drop blocks to create the flow:
- Listen: Start with a block that listens for keywords like “order status” or “where is my stuff”.
- Capture: Ask the user for their Order ID. Use a ‘Capture’ block to save their reply to a variable called `{order_id}`.
- API Call: This is the magic. Use the ‘API’ block to make a GET request to the Airtable API. You’ll query your `Orders` table, filtering where the `OrderID` field matches the `{order_id}` variable the user just gave you.
- Condition: Check if the API call found anything. If it returned data, proceed. If not, tell the user you couldn’t find the order and ask them to check the number.
- Prompt LLM: If data was found, use the ‘AI Response’ block. This is where you send the context to OpenAI or Anthropic.
Step 3: Write a Constraining Prompt.
Do not just ask the LLM to “summarize this data.” You need to give it strict instructions. Here’s a prompt that works:
You are a customer service agent for ACME Widgets. You will be provided with JSON data for a customer's order. Your ONLY task is to state the order status and provide the tracking link from the data. Do not add conversational filler. Do not apologize unless the status is 'Delayed'. If the tracking link is available, present it clearly. If the data is empty, state: 'I was unable to find that order ID. Please double-check the number and try again.'
Here is the order data: {api_response_data}
This prompt is specific. It tells the model what to do, what *not* to do, and how to handle the failure case. The agent will now give direct, accurate answers based only on your Airtable data.
