Skip to content

Conversation Skills

Conversation Skills are the discrete, callable actions a tenant’s chatbot can perform on behalf of a contact. Each service registers its skills with the Communications service, which routes incoming WhatsApp or email messages to the appropriate skill based on the active conversation menu, flow, or training phrases.

Skills are addressed by a fully-qualified name in the form <service>.<skill_name> (e.g. finance.ar_balance). The active set of skills available to a tenant depends on which Portal modules are enabled.

graph LR
    USER[Contact via WhatsApp / Email] --> COMM[Communications dispatcher]
    COMM --> AUTH{Verify caller}
    AUTH -->|unverified| FLOW[Lead-capture flow]
    AUTH -->|phone_matched / contact_confirmed| SKILL[Invoke skill endpoint]
    SKILL --> SVC[Service handler]
    SVC --> RESP[Formatted reply]
    RESP --> USER
  1. A contact sends a message on WhatsApp or email.
  2. The dispatcher resolves the caller to a Business Partner or Prospect.
  3. Based on the active Conversation Menu or Conversation Flow, a skill is selected.
  4. The dispatcher invokes the skill’s internal endpoint on the owning service.
  5. The service returns a localized response that is sent back to the contact.

The Conversation Menu Builder and Conversation Flows pages (under Communications) let tenants choose which skills are surfaced and in what order.

Skills declare the minimum verification level a caller must have to invoke them.

LevelMeaningTypical use
UnverifiedThe caller is anonymous; the system has no Business Partner or Contact match.Lead-capture skills (create a prospect, create an opening deal).
Phone MatchedThe caller’s phone number maps to a known Business Partner.Skills that act on the matched BP without requiring identity confirmation.
Contact ConfirmedThe caller has identified themselves and the contact identity is confirmed against the BP.Default for self-service reads (balance, invoices, tickets).

All user-facing skills support WhatsApp and email unless noted otherwise. Internal skills are invoked only by the dispatcher and are never exposed directly to a contact.

SkillDescriptionParametersVerificationMenu
bp.resolve_by_phoneResolves a WhatsApp/email caller phone to a BP and contact. Internal.phonePhone Matched
bp.resolve_by_nameResolves a free-text company name to a BP ID. Internal.name (≥ 3 chars)Phone Matched
bp.account_summaryCompact account snapshot — name, status, balances, primary contact, industry.bp_id, languageContact ConfirmedYes
SkillDescriptionParametersVerificationMenu
finance.ar_balanceOpen A/R balance with an aging breakdown (current, 1-30, 31-60, 61-90, 90+ days).bp_id, languageContact ConfirmedYes
finance.invoice_list_openLists up to 5 of the most recent open A/R invoices for the caller’s BP.bp_id, language, limit (1-10)Contact ConfirmedYes
SkillDescriptionParametersVerificationMenu
commerce.quotation_list_recentLists up to 5 recent Sales Quotations — number, amount, status, date.bp_id, language, limit (1-10)Contact ConfirmedYes
SkillDescriptionParametersVerificationMenu
items.searchFree-text item search via the universal search index.query, languageContact ConfirmedYes
items.stock_checkLookup an item by code or name and return the on-hand stock total.query, languageContact ConfirmedYes
items.find_by_codeExact-match item lookup by item_code (case-insensitive).code, languageContact ConfirmedYes
SkillDescriptionParametersVerificationMenu
crm.create_dealCreate a CRM deal for a BP or prospect. Stored with an optional product tag. Internal — invoked from lead-capture flows.bp_id, title, product?, amount (≥ 0), currency (default USD)Unverified
SkillDescriptionParametersVerificationMenu
prospects.create_or_findFind a prospect by phone, or create a new prospect when no match exists. Returns the prospect_id. Internal — invoked from lead-capture flows.name, phone, email?, company?Unverified
SkillDescriptionParametersVerificationMenu
projects.status_summaryPortfolio overview of the caller’s active projects.bp_id?, since?, language (es / en), open_task_limit?Contact ConfirmedYes
SkillDescriptionParametersVerificationChannelMenu
support.create_ticketCreate a service-desk ticket from WhatsApp. The orchestrator pre-fills bp_id.subject, description, priority (low / normal / high / urgent), bp_idPhone MatchedWhatsApp only
support.get_ticket_statusStatus, priority and last-update for a single ticket by number (e.g. SD-00012).ticket_numberContact ConfirmedAll
support.list_my_ticketsCaller’s last 5 tickets, ordered by most recent update. The orchestrator pre-fills bp_id.bp_idContact ConfirmedAll

Phase 1 skills declare an empty required_permissions list. Authorization is enforced through tenant scoping (a skill can only see data inside the caller’s tenant) and BP scoping (read skills are limited to the caller’s matched Business Partner). Role-based permission gating is reserved for future skills that perform write actions outside the caller’s own scope.

  • Each service registers its skills at startup with the Core backend. Communications fetches the active registry per tenant.
  • A skill’s endpoint path is validated against an allowlist of the form /api/internal/<service>/skills/<name>.
  • When a skill is retired or a tenant disables a module, Core publishes a core.chat_skills.changed event and Communications refreshes its cache.
  • The dispatcher re-validates skill availability at invocation time, so a stale menu entry cannot reach a retired skill.
  • Skill responses are always localized based on the language parameter, which the dispatcher derives from the contact’s preferred language.
  • Menu-surfaced skills are ordered by the menu position declared at registration. Tenants can reorder, hide or relabel them through the Conversation Menu Builder.
  • Internal skills (verification level Unverified with no menu position) are never selectable from a menu — they are invoked programmatically by a flow.