Posts Tagged ‘Internet Technology Service’
Introducing Our AI Receptionist — It Talks, Books Appointments, and Never Misses a Call
Most small business owners know the feeling. You’re with a client, on a ladder, or elbows-deep in a job — and your phone rings. By the time you get to it, they’ve hung up. Or worse, they called a competitor who did answer.
The solution has been around for decades: hire a receptionist ($35,000+/year) or use a “virtual receptionist” service. But virtual receptionists were never actually virtual — they were call centers with scripts, hold music, and key-press menus that sent callers into a maze before anyone said a word.
We apply AI to offer something revolutionary.
The Problem With Traditional Virtual Receptionists
If you’ve ever called a business and heard “Press 1 for sales, press 2 for support, press 3 to speak with an operator,” you’ve experienced the old way. Here’s what’s wrong with it:
- Nobody wants to press 1. Key-press menus (IVR systems) have a 50-70% abandonment rate. Half your callers hang up before they ever reach a human.
- Generic and detached. Pre-recorded greetings sound like an airport announcement. They don’t know your business, your services, your pricing, or your availability.
- Expensive call centers. Traditional virtual receptionist services charge per-minute or per-call, and the person answering has never heard of your company. They’re reading a script. Customers can tell.
- 9-to-5 mentality. Most services operate during business hours. If a lead calls at 8 PM on a Saturday — and they will — nobody’s there.
- No booking, cant answer questions A traditional receptionist takes a message. They don’t book the appointment. They cant answer questions.
How Our AI Receptionist Is Different
Our AI receptionist answers the phone like a human. Because it is human-sounding. But it’s also connected, intelligent, and never sleeps.
Are you losing deals because of missed calls?
Check out our human sounding intelligent Phone Receptionist
A human-sounding conversational AI that answers your phone when you can’t, it can even books appointments, or answer questions, and its available 24/7. Never miss a lead again. Try it: (949) 750 8995
Integrates with your existing business phone number
Integration is seamless to your existing business so there is not interruption or changes, you’ll still get your calls, but when you cant answer, instead of voicemail your customers are greeted with our intelligent AI (that can take messages just like your existing voicemail)
It Actually Talks — No Press 1, No Menus
Callers are greeted by a natural, conversational voice. They say what they need — “I need to schedule a furnace inspection” — and the AI understands. It asks the right follow-ups just like a trained receptionist would. There’s no keypad mashing, no “please listen carefully as our options have changed.” Just a conversation.
It can be taught your Business
Our AI can be configured to understand your specific services, pricing, hours, and availability. When someone calls asking “how much does an emergency repair cost?” or “are you open on weekends?” — it answers correctly, consistently, every time. It never has a bad day, never forgets a detail.
It can check your schedule and Books Appointments — Right Into Your Calendar
This is the game-changer. The AI doesn’t just take messages. It checks availability, books the appointment, sends a confirmation text to the customer, and alerts you. No back-and-forth emails. No missed calendar entries. The call becomes a booked job, automatically.
24/7, Holidays, Weekends, Always
Leads don’t only call between 9 and 5. The Tuesday evening emergency call, the Saturday morning inquiry, the holiday weekend lead — our AI answers every single one. Your voicemail never picks up again
Traditional Receptionist vs. AI Receptionist
| Feature | Traditional Virtual Receptionist | Our AI Receptionist |
|---|---|---|
| Greeting | “Press 1 for sales…” | Natural conversation |
| Call abandonment | 50-70% hang up | Near zero |
| Business knowledge | Scripted, generic | Configured to your exact services & pricing |
| Books appointments | Rarely — takes messages | ✓Can Book into your calendar live |
| Availability | Business hours | 24/7/365 |
| Dynamically Transfer calls | Requires keypad press | Intelligently determined no key press required |
| Cost | $200-$800/month | Starts at $499 setup + $149/month |
| Setup time | Days to weeks | ~2 days |
Who Is This For?
Any business that gets phone calls and can’t answer every single one. We’ve set this up for:
- Home services — plumbers, electricians, HVAC contractors, roofers, landscapers
- Professional services — law firms, accountants, real estate agents, consultants
- Healthcare — dentists, chiropractors, physical therapists
- Auto shops — mechanics, body shops, detailers
- Restaurants & hospitality — reservations, catering inquiries, event bookings
If a missed call means a missed paycheck, this pays for itself the first week.
Try It Yourself — Right Now
We set up a live demo so you can hear exactly what your customers would hear. Call our demo plumbing company and book an appointment:
(949) 750-8995 — Call the Demo Now
You’ll hear the AI answer, ask about your plumbing needs, check availability, and book an appointment. It sounds so natural most people don’t realize they’re talking to artificial intelligence — they just know their problem got handled.
Simple Pricing, No Surprises
One-time setup starting at
$499
starting at $149/month
Takes ~2 days to get live. No contracts. Cancel anytime.
A full-time receptionist in Orange County costs $35,000-50,000/year. A traditional call-answering service runs $200-800/month and still can’t book appointments. Our AI receptionist costs a fraction and works harder than any of them.
Ready to Stop Missing Calls?
Every missed call is revenue you’ll never see. The businesses that answer — every time, any time — are the ones that win. Let’s get yours set up.
Call (949) 446-1716 or email Its@InternetTechnologyServices.com to get started. Or call the demo line above and hear it for yourself first and the demo will transfer you to us upon completion.
Case Study: Building Your Own Multi-Agent AI Sales Platform with Real-Time Human Support
Have you ever wanted to create a sophisticated AI sales system that combines multiple specialized AI agents while allowing human team members to monitor and step in when needed? In this DIY guide, I’ll walk you through how we built our own system using OpenAI’s Assistants API, WebSockets, PHP, and React.
What You’ll Need
- A web server with PHP support (we used WAMP)
- MySQL database
- OpenAI API key
- Basic knowledge of PHP, JavaScript, and React
- Familiarity with WebSockets
Step 1: Set Up Your Project Structure
Start by creating your project directory structure:
CopyInsert/your-project-name/
├── admin/
│ ├── index.php
│ └── login.php
├── vendor/
├── config.php
├── index.html
├── style.css
├── websocket_server.php
└── composer.json
Step 2: Configure Your Environment
Install required dependencies using Composer:
{ "require": { "cboden/ratchet": "^0.4.4", "openai/client": "^1.0.0", "phpmailer/phpmailer": "^6.8" } }
Create a config.php file with your database and API credentials:
<?php define(‘DB_HOST’, ‘localhost’); define(‘DB_USER’, ‘your_username’); define(‘DB_PASS’, ‘your_password’); define(‘DB_NAME’, ‘your_database’); define(‘OPENAI_API_KEY’, ‘your_openai_api_key’); // Define your OpenAI assistant IDs define(‘AISALESMANAGER’, ‘your_manager_assistant_id’); define(‘NEWSALESAGENT’, ‘your_new_sales_assistant_id’); define(‘EXISTINGSALESAGENT’, ‘your_existing_sales_assistant_id’); define(‘ESTIMATESAGENT’, ‘your_estimates_assistant_id’); // For email notifications define(‘SMTPUSER’, ‘your_smtp_username’); define(‘SMTPPASS’, ‘your_smtp_password’); ?>
Step 3: Set Up Your Database
Create your MySQL database with the necessary tables:
CREATE DATABASE your_database;
USE your_database;
CREATE TABLE conversation_summaries (
id INT AUTO_INCREMENT PRIMARY KEY,
thread_id VARCHAR(255) NOT NULL,
user_ip VARCHAR(45) NOT NULL,
summary TEXT,
current_agent VARCHAR(255),
status ENUM('active', 'completed') DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
thread_id VARCHAR(255) NOT NULL,
message_id VARCHAR(255) NOT NULL,
role ENUM('user', 'assistant', 'system', 'admin') NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX (thread_id)
);
Step 4: Create Your WebSocket Server
The heart of our system is the WebSocket server that handles real-time communication. Here’s how to build it:
Create websocket_server.php:
<?php require 'vendor/autoload.php'; require_once 'config.php'; use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use React\Socket\Server as SocketServer; use React\EventLoop\Factory; use Ratchet\ConnectionInterface; use Ratchet\MessageComponentInterface; class ConversationServer implements MessageComponentInterface { protected $clients; protected $clientThreadMap = []; // Map clients to thread IDs protected $userClients = []; // Track user clients private $conn; private $openAIClient; public function __construct() { $this->clients = new \SplObjectStorage; $this->userClients = new \SplObjectStorage; // Initialize database connection $this->conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); // Initialize OpenAI client $this->openAIClient = \OpenAI::client(OPENAI_API_KEY); } // Implement the required methods: onOpen, onMessage, onClose, onError // [Add implementation details here] } // Create and start the server $loop = Factory::create(); $socket = new SocketServer('0.0.0.0:8080', $loop); $server = new IoServer( new HttpServer( new WsServer( new ConversationServer() ) ), $socket, $loop ); echo "WebSocket server running at 0.0.0.0:8080\n"; $loop->run();
Step 5: Build Your User Interface
Create a user-friendly chat interface using React:
- In your
index.html, set up the basic structure:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>AI Sales Assistant</title> <script src="https://cdn.tailwindcss.com"></script> <link rel="stylesheet" href="style.css"> </head> <body> <div id="app"></div> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <script type="text/babel"> // Your React application code goes here </script> </body> </html> - Create your React chat component with WebSocket connection:
- function App() { const [messages, setMessages] = React.useState([]); const [threadId, setThreadId] = React.useState(null); const [inputValue, setInputValue] = React.useState(”); const [isProcessing, setIsProcessing] = React.useState(false); const socket = React.useRef(null); // Initialize WebSocket connection React.useEffect(() => { const wsProtocol = window.location.protocol === ‘https:’ ? ‘wss:’ : ‘ws:’; const wsHost = ‘localhost:8080’; const wsUrl = `${wsProtocol}//${wsHost}`; const newSocket = new WebSocket(wsUrl); // Handle WebSocket events (onopen, onmessage, onclose, onerror) // [Add implementation details here] socket.current = newSocket; return () => { if (newSocket) { newSocket.close(); } }; }, []); // Implement message handling and UI components // [Add implementation details here] return ( // Your chat UI JSX goes here ); } ReactDOM.render(<App />, document.getElementById(‘app’));
Step 6: Create the Admin Interface
Build an admin panel to monitor and manage conversations:
- Create
admin/index.php:phpCopyInsert<?php session_start(); require_once '../config.php'; // Implement authentication if (!isset($_SESSION['admin_authenticated'])) { // Show login form or authenticate // [Add implementation details] } // Fetch active conversations from database $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); $query = "SELECT * FROM conversation_summaries ORDER BY created_at DESC"; $result = $conn->query($query); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Admin Panel</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <!-- Implement your admin UI here --> <!-- Left panel for conversation list --> <!-- Right panel for viewing and participating in conversations --> <script> // JavaScript for WebSocket connection and admin functions // [Add implementation details] </script> </body> </html>
Step 7: Configure Your OpenAI Assistants
You’ll need to create four different assistants in the OpenAI platform:
- AI Sales Manager: Configure with instructions to identify user needs and direct to the appropriate specialized agent
- New Sales Agent: Specialize in handling new customer inquiries
- Existing Sales Agent: Optimize for returning customer interactions
- Estimates Agent: Focus on gathering requirements and generating estimates
For each assistant, use the OpenAI web interface to:
- Create a new assistant with appropriate name and description
- Set up the model (we recommend GPT-4)
- Add detailed instructions for the assistant’s role
- Enable structured output for agent handoffs
Step 8: Implementing Agent Handoffs
The key to our multi-agent system is the handoff mechanism. In your WebSocket server, implement handling for structured outputs:
private function processAssistantResponse($threadId, $runId) {
// Retrieve the run and check for structured output
$run = $this->openAIClient->threads()->runs()->retrieve(
threadId: $threadId,
runId: $runId
);
// Check for structured outputs indicating agent handoffs
if (property_exists($run, 'structured_outputs') && !empty($run->structured_outputs)) {
foreach ($run->structured_outputs as $output) {
if (property_exists($output, 'next_agent')) {
$nextAgent = $output->next_agent;
// Update the agent in the database
$this->updateConversationAgent($threadId, $nextAgent);
// Create a new run with the next agent
$this->openAIClient->threads()->runs()->create(
threadId: $threadId,
parameters: [
'assistant_id' => $nextAgent
]
);
return true; // Handoff initiated
}
}
}
return false; // No handoff
}
Step 9: Start Your WebSocket Server
Create a simple script to start your WebSocket server:
# start_websocket_server.bat
php websocket_server.php
Step 10: Testing Your System
- Start your WebSocket server
- Open your main site in one browser window
- Open the admin panel in another browser window
- Test the entire flow:
- Start a conversation as a user
- Observe the conversation in the admin panel
- Test agent handoffs by triggering different scenarios
- Test human takeover from the admin panel
Troubleshooting Common Issues
- WebSocket Connection Failures: Ensure your server allows WebSocket connections and that ports are properly configured
- OpenAI API Errors: Verify your API key and check OpenAI’s status page for service issues
- Database Connection Problems: Confirm your database credentials and that your tables are properly set up
- Agent Handoff Issues: Review your structured output format and ensure your assistants are properly configured
Listen to our Podcast

To learn more about us
We used AI to create a podcast introducing you to our company. Enjoy!
We build a TV Channel
Introducing the Makers Network on ROKU
(Note: The video above introduces the concept of the Makers Network channel.)
Through the “Makers Network” project, we bridge the gap between digital expertise and traditional TV broadcasting. We achieve this by creating our very own dedicated TV channel on the ROKU platform, providing access to its massive network of over 40 million subscribers.
This approach offers a powerful alternative to traditional advertising. Instead of simply paying for ad space, appealing content on the Makers Network creates the potential for your brand to not only gain exposure but potentially earn revenue through marketing efforts.
We understand that viewers watching TV in the comfort of their homes are often more receptive to marketing messages. Content can be strategically created to promote your brand and sell products, both directly and indirectly, leveraging this engaged audience.
ROKU provides significant flexibility and various options for integrating advertising within your channel. We specialize in developing a proper, tailored strategy that maximizes your brand’s reach and impact on this platform.
Let us help you bring your brand’s story to the big screen!
Case Study: Combating Robocalls with Robo-Bouncer
Case Study: Introducing the RoboBouncer – AI-Powered Call Screening
In this case study, we demonstrate how we bring our internet and programming skills to traditional telecommunications through a project we’ve dubbed the RoboBouncer.
The RoboBouncer is an intelligent bot designed to screen your incoming voice phone calls. When a call comes in, the system asks the caller to state their name and records it. It then places the caller on hold while simultaneously making an outbound call to your personal phone number. You are played the recorded name, and the system provides you with a clear option to either accept or reject the call.
With full programmatic control over call handling logic, the possibilities that the internet brings to traditional telephony are virtually endless. Beyond the RoboBouncer, we have experience setting up sophisticated phone systems, including:
- Interactive Voice Response (IVR) systems (e.g., company directories).
- Advanced lead transfer systems.
- High-volume outbound calling solutions.
To personally test out the RoboBouncer service, you are welcome to call our dedicated phone number: (949) 446-1716.
Following popular demand, we have also developed a commercial version that automates the deployment and setup of your own RoboBouncer instance. Click here to create your own RoboBouncer easily.
For those who are technically inclined, we have made the code and detailed information available in our BitBucket repository.
Creating a telephone call screening service using Twilio
This project demonstrates the creation of a call screening service utilizing the Twilio platform.
The Call Flow:
- Caller calls your Twilio Number: The system (the “agent”) answers and prompts the caller to speak their name, which is then recorded. The caller is subsequently placed in a queue (representing the “Inbound Call”).
- Outbound Call to You: Using the Twilio REST API, the system initiates an outbound call from your Twilio Number to your designated personal phone number.
- Playback and Options: When you answer, the recorded name of the caller is played back to you. You are then presented with the following options:
- Press 1 (DTMF) or Say “Accept” (SpeechResult): This action uses Twilio’s Dial verb to connect your phone to the caller who is waiting in the queue.
- Press 2 (DTMF) or Say “Reject” (SpeechResult): Using the REST API, the system notifies the waiting caller (e.g., with a message like “The person you are trying to reach is unavailable”) and then ends the call for both parties (hangs up on the caller in the queue and hangs up on your outbound call).
Technical Details:
- Uses the TWIML API and the Twilio Voice API PHP SDK.
- Utilizes the Queue resource and the Enqueue TwiML verb to place the caller on hold while the outbound call to you is made. Note: You could also use the Conference verb instead of Enqueue for potentially more options, simply by replacing Enqueue with Conference in the TwiML.
- To get started, follow this guide to set up your free Twilio account, get a phone number, and obtain your API SID and Token: https://www.twilio.com/docs/voice/quickstart/php
- Remember to configure the webhook for your Twilio phone number to point to your
step1.xmlfile (or select the appropriate TwiMLBin URL if using that).
Deployment Suggestion:
Setting up a dedicated web server isn’t strictly necessary. You can leverage Twilio’s own hosting features:
- Use Twilio TwiMLBins to host your XML files (like
step1.xml). Let Twilio handle the file hosting for you. - Use Twilio Functions for your server-side logic (converting the PHP logic to Javascript). The IVR Menu example in the Twilio documentation is a good starting blueprint for this.
I would strongly suggest using TwiMLBins for hosting XML files and, if you are capable, utilizing Twilio Functions for the server-side code to simplify your deployment.

