The AI Phone Stack for Client Work: Inbound + Outbound Together

The AI Phone Stack for Client Work: Inbound + Outbound Together

5 min read
Yanis Mellata
Guides

The Client Asked for "Phone AI" — That's Two Products

A client hires you to "handle the phone stuff" for their business. You scope it out and realize it's actually two unrelated problems wearing the same word:

  1. Someone has to answer the phone. A customer calls in, asks about hours, wants to book an appointment, needs a question answered. This has to happen live, in real time, every time the phone rings.
  2. Someone has to place calls out. A reminder the day before an appointment. A follow-up when someone no-shows. A verification call to confirm details before a job.

No platform does both of these well, because they're architecturally different problems. Inbound needs always-on infrastructure that can pick up a call in under a second, any time of day. Outbound is triggered — something happens in your system, and then a call goes out. Trying to force one platform to do both usually means overpaying for capabilities you don't use on one side.

This post maps both halves and how they connect.

Inbound: Someone Has to Pick Up

Inbound is the harder infrastructure problem. You need a number that's always live, a system that answers in a couple rings, and a conversational flow that can actually resolve what the caller needs — not just take a message.

Building this yourself means telephony (Twilio or similar), speech-to-text, an LLM in the loop, text-to-speech, and a state machine for call flow — before you've handled a single real caller. That's weeks of infrastructure for a feature the client thinks of as "just answer the phone."

NextPhone is built specifically for this half: it answers, qualifies the caller, and books the appointment straight into the client's calendar. No flow builder, no telephony account to provision, no voice pipeline to maintain. You point the client's number at it and it works.

Outbound: Someone Has to Follow Up

Outbound is a different shape of problem. Nothing is happening until your system decides a call needs to go out — a booking was just made and needs a reminder, a customer went quiet and needs a check-in, a job needs confirming before a technician drives out.

This is where AgentPhone fits: an API that takes a phone number and an objective, places the call, and returns structured results — outcome, summary, full transcript. Your code decides when to call; AgentPhone handles the actual conversation.

import httpx

response = httpx.post("https://agentphone.app/api/v1/calls",
  headers={"x-api-key": "YOUR_KEY", "Content-Type": "application/json"},
  json={
    "to_phone_number": "+14155551234",
    "objective": "Remind the customer about their appointment tomorrow at 2pm. Confirm they'll attend or ask if they need to reschedule.",
    "business_name": "Client Business Name",
  }
)

No dashboard to configure, no agent to build inside a platform — it's a function call your reminder job invokes.

Wiring the Two Together

The two halves connect at exactly one point: an event on one side triggers an action on the other.

The most common pattern for client work — an appointment gets booked inbound, a reminder needs to go out before it happens:

  1. NextPhone answers an inbound call and books an appointment.
  2. That booking fires a webhook to your backend (or you poll NextPhone's calendar integration).
  3. Your backend schedules a job for the day before the appointment.
  4. When that job runs, it calls AgentPhone with the customer's number and the appointment details as the objective.
  5. AgentPhone places the reminder call and returns the outcome — confirmed, needs reschedule, or no answer — which you can feed back into the client's calendar or CRM.
def on_appointment_booked(appointment):
    # appointment came from NextPhone's booking webhook
    schedule_reminder_call(
        run_at=appointment.start_time - timedelta(days=1),
        payload={
            "to_phone_number": appointment.customer_phone,
            "objective": f"Confirm {appointment.customer_name}'s appointment "
                         f"tomorrow at {appointment.start_time:%-I:%M %p}. "
                         f"Ask them to confirm or let you know if they need to reschedule.",
            "business_name": appointment.business_name,
        },
    )

def run_reminder_call(payload):
    result = httpx.post("https://agentphone.app/api/v1/calls",
        headers=AGENTPHONE_HEADERS, json=payload).json()
    # poll for completion, then update the appointment record with result["data"]["outcome"]

Everything in the middle — the webhook, the scheduler, the job runner — is normal application code. Neither NextPhone nor AgentPhone needs to know the other exists. They're just two tools your system calls at different points in the workflow.

Why Not Just Use One Platform for Both

Voice AI platforms like Vapi, Retell, and Bland can technically do inbound and outbound call handling in one system — see our full platform comparison if that's the direction you need. That's the right call if you're building a custom voice product from scratch and want full control over both directions in one place.

For client work, that's usually more than the job needs. The client doesn't want a voice platform to configure — they want their phone answered and their no-show rate down. A done-for-you receptionist plus a simple API call for reminders gets there with a fraction of the build time, and each half stays replaceable if the client's needs change later.

Putting It Together for a Client

A realistic scope for this kind of engagement:

  • Week 1: Set up NextPhone for the client's inbound line — greeting, qualifying questions, calendar integration.
  • Week 1–2: Build the webhook/scheduler layer that watches for new bookings.
  • Week 2: Wire the reminder job to AgentPhone, test the objective phrasing against real appointment types.
  • Ongoing: Extend outbound to no-show follow-ups, review requests, or re-engagement calls — same AgentPhone integration, different trigger.

Two products, one client outcome: the phone gets answered, and the follow-through happens without anyone on the client's team making a call.

Ready to give your agent a phone?

Get Your API Key →

Written by Yanis Mellata, Founder & CEO