A map of how the assistant handles a call. We will walk through this together on our kickoff call.
flowchart TD
HEADER([INBOUND VOICE AGENT]):::header
ICS([Inbound Call Starts]):::pill
A1("Agent: Greeting, ask for name
(Agent says it's an AI & call is being recorded)"):::agent
A2("Agent: Ask reason for the call"):::agent
BR{Branch}:::branch
HEADER --> ICS --> A1 --> A2 -->|USER: gives reason| BR
%% ===== Main branches =====
B_REC("Questions about Recreational Classes"):::agent
B_COMP("Questions about Competitive & Teams"):::agent
B_CAMP("Questions about Summer Camps"):::agent
B_PARTY("Questions about Birthday Parties"):::agent
B_ADULT("Questions about Adult Classes"):::agent
B_TRIAL("Questions about Free Trial"):::agent
B_GEN("General Questions"):::agent
BR --> B_REC & B_COMP & B_CAMP & B_PARTY & B_ADULT & B_TRIAL & B_GEN
%% ---------- Recreational Classes ----------
REC_FAQ["Rec Class FAQ"]:::topic
REC_TYPES["Class types / levels"]:::topic
REC_CUR["Current Schedule"]:::topic
REC_TRIAL("Request a free trial"):::agent
REC_DRESS["Dress code question"]:::topic
REC_DSMS("Sends Dress Code Link via SMS"):::agent
REC_TFORM("Sends Free-Trial Registration Form via SMS"):::agent
REC_LEVEL("Recommends class by age + experience
Older & new: full-year → assessment;
partial-year → register by age"):::agent
REC_ANS("Agent: Attempt to answer question"):::agent
REC_SMS("Sends Schedule / Register Link via SMS"):::agent
REC_PH("Agent confirms Phone number"):::agent
REC_FN[("Function: SEND SMS")]:::func
REC_DIR("Agent: Directs Caller to registration portal"):::agent
REC_CANT("If Agent can't answer question"):::agent
REC_MSG("Offer to take a message for a call back"):::agent
REC_EMAIL("Instruct caller to send email with questions"):::agent
B_REC --> REC_FAQ & REC_TYPES & REC_CUR & REC_DRESS & REC_TRIAL
REC_FAQ --> REC_ANS
REC_TYPES --> REC_LEVEL --> REC_ANS
REC_CUR --> REC_ANS
REC_ANS --> REC_SMS --> REC_PH --> REC_FN
REC_ANS --> REC_DIR
REC_ANS --> REC_CANT --> REC_MSG & REC_EMAIL
REC_TRIAL --> REC_TFORM --> REC_PH
REC_DRESS --> REC_DSMS --> REC_PH
%% ---------- Competitive & Teams (minimal — no program detail) ----------
COMP_INT("Interested in Competitive / Teams"):::agent
COMP_MIN["Agent gives minimal info only:
Part-Time Competitive + DLDC Competitive exist,
both by audition/placement. No hours/pricing."]:::topic
COMP_TRY("Sends Competitive Assessment Form via SMS
(a team member follows up)"):::agent
COMP_ABS("Caller reports student absent from class"):::agent
COMP_PH("Agent confirms Phone number"):::agent
COMP_SFN[("Function: SEND SMS")]:::func
COMP_NOTE("Agent: Takes notes and notifies staff"):::agent
COMP_FN[("Function: NOTIFY studio email")]:::func
COMP_FD["Studio Email"]:::topic
B_COMP --> COMP_INT & COMP_ABS
COMP_INT --> COMP_MIN --> COMP_TRY --> COMP_PH --> COMP_SFN
COMP_ABS --> COMP_NOTE --> COMP_FN --> COMP_FD
%% ---------- Summer Camps ----------
CAMP_PRICE["Camp Pricing"]:::topic
CAMP_FAQ["Camp FAQ"]:::topic
CAMP_BOOK["Camp Booking / Dates"]:::topic
CAMP_ANS("Agent: Attempt to answer question"):::agent
CAMP_CANT("If Agent can't answer question"):::agent
CAMP_MSG("Offer to take a message for a call back"):::agent
CAMP_EMAIL("Instruct caller to send email with questions"):::agent
CAMP_SMS("Sends Booking Link via SMS"):::agent
CAMP_PH("Agent confirms Phone number"):::agent
CAMP_FN[("Function: SEND SMS")]:::func
CAMP_DIR("Agent: Directs Caller online booking page"):::agent
B_CAMP --> CAMP_PRICE & CAMP_FAQ & CAMP_BOOK
CAMP_FAQ --> CAMP_ANS --> CAMP_CANT --> CAMP_MSG & CAMP_EMAIL
CAMP_BOOK --> CAMP_SMS --> CAMP_PH --> CAMP_FN
CAMP_BOOK --> CAMP_DIR
%% ---------- Birthday Parties ----------
PARTY_BOOK["Party Booking Dates"]:::topic
PARTY_PRICE["Party Pricing"]:::topic
PARTY_FAQ["Party FAQ"]:::topic
PARTY_DIR("Agent: Directs Caller to party form"):::agent
PARTY_SMS("Sends Booking Link via SMS"):::agent
PARTY_PH("Agent confirms Phone number"):::agent
PARTY_FN[("Function: SEND SMS")]:::func
PARTY_ANS("Agent: Attempt to answer question"):::agent
PARTY_CANT("If Agent can't answer question"):::agent
PARTY_MSG("Offer to take a message for a call back"):::agent
PARTY_EMAIL("Instruct caller to send email with questions"):::agent
B_PARTY --> PARTY_BOOK & PARTY_PRICE & PARTY_FAQ
PARTY_BOOK --> PARTY_DIR
PARTY_BOOK --> PARTY_SMS --> PARTY_PH --> PARTY_FN
PARTY_FAQ --> PARTY_ANS --> PARTY_CANT --> PARTY_MSG & PARTY_EMAIL
%% ---------- Adult Classes ----------
ADULT_SCHED["Adult Class Schedule"]:::topic
ADULT_FAQ["Adult Class FAQ"]:::topic
ADULT_PRICE["Adult Class Pricing"]:::topic
ADULT_REG["How to register"]:::topic
ADULT_ANS("Agent: Attempt to answer question"):::agent
B_ADULT --> ADULT_SCHED & ADULT_FAQ & ADULT_PRICE & ADULT_REG
ADULT_SCHED --> ADULT_ANS
ADULT_FAQ --> ADULT_ANS
ADULT_PRICE --> ADULT_ANS
ADULT_REG --> ADULT_ANS
%% ---------- Free Trial (texted registration form) ----------
TRIAL_EXPL("Explains free trial for new students"):::agent
TRIAL_SMS("Sends Free-Trial Registration Form via SMS"):::agent
TRIAL_PH("Agent confirms Phone number"):::agent
TRIAL_FN[("Function: SEND SMS")]:::func
TRIAL_FD["Family fills the form (name, age, class);
studio is notified & a live person books the trial"]:::topic
B_TRIAL --> TRIAL_EXPL --> TRIAL_SMS --> TRIAL_PH --> TRIAL_FN --> TRIAL_FD
%% ---------- General Questions ----------
GEN_HOURS["Opening hours"]:::topic
GEN_CLOS["Closure dates"]:::topic
GEN_STAFF("Talk to Front Desk"):::agent
GEN_HANS("Agent: Attempt to answer question"):::agent
GEN_CFN[("Function: Agent checks closure dates")]:::func
GEN_CANS("Agent: Attempt to answer question"):::agent
GEN_BR{Branch}:::branch
GEN_CB("Agent: Offer to have the front desk call them back"):::agent
GEN_NFN[("Function: NOTIFY front desk")]:::func
GEN_TR["Transfer: Front desk phone number & availability"]:::topic
GEN_TFN[("Function: TRANSFER CALL")]:::func
B_GEN --> GEN_HOURS & GEN_CLOS & GEN_STAFF
GEN_HOURS --> GEN_HANS
GEN_CLOS --> GEN_CFN --> GEN_CANS
GEN_STAFF --> GEN_BR
GEN_BR -->|Front desk is NOT available| GEN_CB --> GEN_NFN
GEN_BR -->|Front desk is available| GEN_TR --> GEN_TFN
%% ---------- Close (anchored to the bottom, below every branch) ----------
ENDQ("Agent: Ask if there are any more questions"):::agent
ENDC([Call End]):::pill
%% invisible links pull the close block beneath all branches
REC_FN ~~~ ENDQ
COMP_FD ~~~ ENDQ
CAMP_FN ~~~ ENDQ
PARTY_FN ~~~ ENDQ
ADULT_ANS ~~~ ENDQ
TRIAL_FN ~~~ ENDQ
GEN_TFN ~~~ ENDQ
ENDQ --> ENDC
N_END["Every branch ends here:
agent asks if anything else, then ends the call"]:::note
ENDQ -.- N_END
classDef header fill:#37B26B,stroke:#2f7d45,color:#ffffff,font-weight:bold;
classDef pill fill:#6B7280,stroke:#4b5563,color:#ffffff;
classDef agent fill:#D6C9F5,stroke:#7C3AED,color:#2A2150;
classDef topic fill:#D9583B,stroke:#B23A22,color:#ffffff;
classDef func fill:#F5DFA0,stroke:#CAA23C,color:#5b4a14;
classDef branch fill:#BFE8C9,stroke:#3FA45A,color:#14532d,font-weight:bold;
classDef note fill:#CFE6FB,stroke:#5B9BD5,color:#1e3a5f;