# VINSI.AI Documentation > VINSI.AI is a business communications platform: AI phone agents (inbound, outbound, batch calling), a business phone system (softphone, desk phones, hunt groups, call queues, voicemail, fax), a CRM, a ticket system, QA call scoring, and VINSI Meet video meetings. Guidance for AI assistants: - Dashboard (where users click): https://dashboard.vinsi.ai. Video meetings: https://meet.vinsi.ai. Docs: https://docs.vinsi.ai. - REST API base URL: https://dashboard.vinsi.ai. Authenticate every request with the header `x-api-key: `. Admins create keys in Settings → API Keys (shown once). - Machine-readable API spec: https://docs.vinsi.ai/openapi.json - Every page below is available as Markdown by adding .md to its path. All pages in one file: https://docs.vinsi.ai/llms-full.txt - Most features are configured in the dashboard UI; the guides give exact menu paths, button labels, and field names. Only the endpoints in the API Reference section are available to API keys. ## Overview - [Get to know the VINSI products](https://docs.vinsi.ai/vinsi-products.md): An overview of all VINSI products and what each one does ## Getting Started - [Your First Phone Agent](https://docs.vinsi.ai/getting-started/first-phone-agent.md): Learn how to create and configure your first AI phone agent from scratch - [How to Use the Dashboard](https://docs.vinsi.ai/getting-started/howto-use-dashboard.md): Use the AI agent dashboard: overview metrics, geographic and agent performance analytics, filters, and reports - [Using VINSI with AI Assistants](https://docs.vinsi.ai/getting-started/ai-assistants.md): llms.txt, Markdown pages, and the OpenAPI spec so Claude, ChatGPT, Gemini, and coding agents can use these docs and the API ## Step-By-Step Guides - [Setting up an email campaign](https://docs.vinsi.ai/step-guides/email-campaign.md): Learn how to create an email campaign from scratch - [Running a batch call campaign](https://docs.vinsi.ai/step-guides/batch-call.md): Step-by-step guide to launching an AI-powered batch calling campaign ## Organizations - [Manage Organization](https://docs.vinsi.ai/organization/manageOrganization.md): Organization settings, members, custom roles and permissions, and transferring ownership - [Permission Groups](https://docs.vinsi.ai/organization/permissionGroups.md): Create roles like Supervisor or Call Center Agent, set their permissions once, and assign whole teams - [Invite Team Members](https://docs.vinsi.ai/organization/inviteTeamMembers.md): Add and manage team members to collaborate on your AI phone agent organization - [Delete Organization](https://docs.vinsi.ai/organization/deleteOrganization.md): Permanently remove your organization and all associated data from the platform ## Account & Billing - [Account Settings](https://docs.vinsi.ai/account/settings.md): Update your profile image and name, sign in, reset or change your password, change your sign-in email, set your language, or delete your account. - [Billing & Plans](https://docs.vinsi.ai/account/billing.md): Support plans, buying minutes, auto recharge, invoices, and cancelling subscriptions - [API Keys](https://docs.vinsi.ai/account/apiKeys.md): Create, use, and revoke API keys for the VINSI API ## AI Phone Agents - [Create an AI Phone Agent](https://docs.vinsi.ai/ai-phone-agents/create-agent.md): Step-by-step guide to creating and configuring a new AI phone agent - [AI Agent Wizard & Templates](https://docs.vinsi.ai/ai-phone-agents/agent-wizard.md): Start new agents fast: generate a call flow from your business details or a PDF/DOCX, or begin from one of 7 templates. - [Voices](https://docs.vinsi.ai/ai-phone-agents/voices.md): Browse and preview AI voices, then give agents one voice or a rotating set using Cycling or Random selection mode. - [Website Widget](https://docs.vinsi.ai/ai-phone-agents/website-widget.md): Embed your AI agent on your website for browser voice calls, text chat, or instant Call me callbacks. Setup, domains, install. - [Setting Up Phone Numbers](https://docs.vinsi.ai/ai-phone-agents/setting-up-phone-numbers.md): Configure phone numbers for your AI agents to make and receive calls - [What is SIP Trunking?](https://docs.vinsi.ai/ai-phone-agents/what-is-sip-trunking.md): Understand SIP trunking technology and how it enables AI phone communications - [Batch Calling](https://docs.vinsi.ai/telephony/batchCall.md): Reach large contact lists automatically using AI-powered batch calling campaigns ## Phone Connections - [Connecting Your Phone System](https://docs.vinsi.ai/phone-connections/overview.md): Compare the ways to connect numbers and phone systems to VINSI AI agents, and pick the one that fits - [Twilio](https://docs.vinsi.ai/ai-phone-agents/elastic-sip-trunking.md): Connect numbers in your own Twilio account with an Elastic SIP Trunk - [Telnyx](https://docs.vinsi.ai/phone-connections/telnyx.md): Use numbers bought in VINSI, or connect numbers in your own Telnyx account with a SIP trunk - [Mitel](https://docs.vinsi.ai/phone-connections/mitel.md): Link Mitel MiVoice Business through VINSI's SBC so AI agents can transfer to extensions - [3CX](https://docs.vinsi.ai/phone-connections/3cx.md): Forward 3CX calls to an AI agent, or link 3CX with a SIP trunk for extension transfers - [Zoom Phone](https://docs.vinsi.ai/phone-connections/zoom.md): Forward Zoom Phone calls to an AI agent and transfer callers back to your team ## AI Assistant - [Chat](https://docs.vinsi.ai/ai-assistant/chat.md): Chat with an AI agent that has access to your organization's knowledge base - [Knowledge Base](https://docs.vinsi.ai/ai-assistant/knowledge-base.md): Upload and manage documents that power your organization's AI assistant - [Widgets & Settings](https://docs.vinsi.ai/ai-assistant/widgets.md): Embed your AI Assistant on your websites as a floating or inline chat, and set its name, logo, persona and rate limit. ## QA Calls - [Dashboard](https://docs.vinsi.ai/qa/dashboard.md): Get an at-a-glance view of your QA call activity, scores, and performance trends - [Campaigns](https://docs.vinsi.ai/qa/campaigns.md): Create and manage QA campaigns to evaluate calls against defined criteria and scoring rules - [Upload](https://docs.vinsi.ai/qa/upload.md): Upload call recordings to be scored and reviewed within your QA campaigns - [Results](https://docs.vinsi.ai/qa/results.md): Review scored call results, agent performance, and QA feedback across your campaigns - [Agents](https://docs.vinsi.ai/qa/agents.md): Manage and track the agents being evaluated within your QA call campaigns - [Extensions](https://docs.vinsi.ai/qa/extensions.md): Score QA calls by phone extension: add extensions, link each to a campaign, and set files per run. - [Analytics](https://docs.vinsi.ai/qa/analytics.md): Analyze QA performance trends, scoring patterns, and agent improvement over time - [QA Tools](https://docs.vinsi.ai/qa/tools.md): Agent benchmarks, score distribution, low performers, volume vs score, and QA alerts for scored calls. - [QA Admin](https://docs.vinsi.ai/qa/admin.md): Admin-only QA settings: evaluation mode, score tiers, score display, and analysis run history with unmatched recordings. ## Tickets - [Adding Tickets](https://docs.vinsi.ai/tickets/overview.md): Create and track support tickets for your customers and team - [Ticket Dashboard](https://docs.vinsi.ai/tickets/dashboard.md): Get an at-a-glance view of ticket health, priorities, and workload across your team - [Ticket & Task Management](https://docs.vinsi.ai/tickets/tickets.md): View and manage all submitted tickets across your organization - [Catalog](https://docs.vinsi.ai/tickets/catalog.md): Browse and manage the service catalog for categorizing and routing ticket requests - [Workflow](https://docs.vinsi.ai/tickets/workflow.md): Configure automated workflows to route, escalate, and resolve tickets efficiently - [Knowledge Base](https://docs.vinsi.ai/tickets/knowledge-base.md): Access and manage articles and documentation to help resolve common issues faster - [Assets](https://docs.vinsi.ai/tickets/assets.md): Track hardware and equipment, assign it to people, import/export CSV, and print QR labels that let anyone open a ticket. - [Requester Portal](https://docs.vinsi.ai/tickets/portal.md): Requesters sign in with an emailed one-time code to track the status and details of their tickets. - [Analytics](https://docs.vinsi.ai/tickets/analytics.md): Analyze ticket trends, resolution times, and team performance with detailed reports - [Admin](https://docs.vinsi.ai/tickets/admin.md): Configure ticketing system settings, permissions, and team management options ## CRM - [Dashboard](https://docs.vinsi.ai/crm/dashboard.md): Get a real-time snapshot of your pipeline value, contacts, engagements, and personal workload - [Contacts](https://docs.vinsi.ai/crm/contacts.md): View, manage, and organize all your CRM contacts — leads and customers — in one place - [Companies](https://docs.vinsi.ai/crm/companies.md): Track and manage all the companies your team works with, including clients and prospects - [Deals](https://docs.vinsi.ai/crm/deals.md): Track every deal in your pipeline from first contact to closed won - [Activities](https://docs.vinsi.ai/crm/activities.md): Log and review all the interactions your team has had with contacts and companies - [Tasks](https://docs.vinsi.ai/crm/tasks.md): Add to-dos to CRM activities, assign owners and due dates, track overdue work and move tasks through a list or Kanban board. - [Calendar](https://docs.vinsi.ai/crm/calendar.md): See Google, Microsoft and VINSI events in one calendar; schedule meetings linked to CRM records, send invites and set reminders. - [Documents](https://docs.vinsi.ai/crm/documents.md): Access and manage all documents associated with your CRM contacts, companies, and deals - [Engagements](https://docs.vinsi.ai/crm/engagements.md): Manage and track every customer engagement from initial outreach through to close - [Invoices](https://docs.vinsi.ai/crm/invoices.md): Create, manage, and track invoices linked to your CRM contacts, companies, and deals - [Overview](https://docs.vinsi.ai/crm/admin.md): Overview of CRM Administration - [Team Settings](https://docs.vinsi.ai/crm/admin/team-settings.md): Connect Google and Microsoft, configure timezone, email settings, and manage CRM team access - [CRM Configuration](https://docs.vinsi.ai/crm/admin/crm-configuration.md): Manage pipelines, lead statuses, dispositions, contact sources, and custom fields - [Email Templates](https://docs.vinsi.ai/crm/email-templates.md): Create reusable email templates with merge tags for consistent, personalized outreach - [Invoice Settings](https://docs.vinsi.ai/crm/admin/invoice-settings.md): Configure invoice company profile and connect Stripe for payment collection - [Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation.md): Import contacts, run email campaigns, build workflows, and monitor email reports - [Admin Reports](https://docs.vinsi.ai/crm/reports.md): View 20+ built-in CRM reports with charts across contacts, deals, orders, calls, and more - [Phone](https://docs.vinsi.ai/crm/admin/phone.md): Manage phone numbers, call logs, softphone settings, and AI Coach profiles - [Phone Settings](https://docs.vinsi.ai/crm/softphone.md): Phone Settings tabs at a glance, getting started, and links to every phone system guide ## Telephony - [Overview](https://docs.vinsi.ai/telephony/telephonyOverview.md): Complete overview of telephony features and capabilities for AI phone agents - [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls.md): Set up and test outbound calling functionality for your AI phone agents - [Phone Numbers & Caller ID](https://docs.vinsi.ai/telephony/phoneNumbers.md): Buy and release numbers, the default main line, outbound caller ID, and CNAM caller ID names - [Softphone](https://docs.vinsi.ai/telephony/softphone.md): Make and receive calls in the browser: setup, dialing, transfer, conference, missed calls, and audio settings - [Desk Phones](https://docs.vinsi.ai/telephony/deskPhones.md): Provision Fanvil desk phones, shared lines, busy-lamp keys, feature codes, and troubleshooting - [Voicemail](https://docs.vinsi.ai/telephony/voicemail.md): Set up AI voicemail greetings, email notifications with transcripts, and listen from softphone, dashboard, or *97 - [Text Messages](https://docs.vinsi.ai/telephony/textMessages.md): Send and receive texts and picture messages from personal or shared team inboxes, with unread email alerts and delivery tips. - [Call Logs & Recordings](https://docs.vinsi.ai/telephony/callLogs.md): Search calls, play and download recordings, read transcripts and summaries, and export - [Fax](https://docs.vinsi.ai/telephony/fax.md): Set up fax numbers, send PDFs, and receive faxes by email - [Phone Dashboard & My Call Log](https://docs.vinsi.ai/telephony/phoneDashboard.md): Phone menu, usage charts for calls, texts and faxes, exportable reports, and your personal call history. - [Business Hours](https://docs.vinsi.ai/telephony/businessHours.md): Open hours and after-hours routing to voicemail, an AI phone agent, or another queue - [Hunt Groups](https://docs.vinsi.ai/telephony/huntGroups.md): Ring a team when a number is called: ring all, linear, round robin, longest idle, or by skill, with business hours and voicemail - [Call Queues](https://docs.vinsi.ai/telephony/queues.md): Hold callers in line until an agent is free: agent status, wrap-up, callbacks, supervisor wallboard, listen/whisper/barge, and reports - [Skills-Based Routing](https://docs.vinsi.ai/telephony/skillsRouting.md): Create skills, rate members Primary/Secondary/Training, and ring the best-suited people first - [Call Center](https://docs.vinsi.ai/telephony/callCenter.md): Supervisor wallboard, listen/whisper/barge, alerts, reason and disposition codes, and queue and agent reports - [Call Screening](https://docs.vinsi.ai/telephony/callScreening.md): Screen spam calls and block specific callers org-wide or per number ## VINSI Video Meetings - [Scheduling Meetings](https://docs.vinsi.ai/meet/overview.md): Schedule VINSI Meet video meetings, send invites, connect Google or Outlook calendars, and custom backgrounds - [Joining & In-Meeting Controls](https://docs.vinsi.ai/meet/joining.md): Join from an invite, waiting room, screen share, captions and translation, chat, breakout rooms, and host controls - [Recording & AI Summaries](https://docs.vinsi.ai/meet/recording.md): Record meetings, find and download recordings, and generate AI meeting summaries - [Remote Control](https://docs.vinsi.ai/meet/remote-control.md): Install VINSI Remote and give or take control of a shared screen during a meeting ## Tools - [DTMF](https://docs.vinsi.ai/tools/dtmf.md): Enable dual-tone multi-frequency (DTMF) input for interactive voice response systems - [Function](https://docs.vinsi.ai/tools/function.md): Create custom functions and tools to extend your AI phone agent capabilities - [After Call Actions](https://docs.vinsi.ai/tools/after-call-actions.md): Automatically email your team or create a VINSI Desk ticket when a call ends with a chosen disposition, plus the webhook payload. ## API Integration - [HubSpot](https://docs.vinsi.ai/api-integration/hubspot.md): Connect your AI phone agents with HubSpot CRM for seamless contact management - [Salesforce](https://docs.vinsi.ai/api-integration/salesforce.md): Integrate Salesforce CRM to sync call data and automate workflows with AI agents - [GoHighLevel](https://docs.vinsi.ai/api-integration/gohighlevel.md): Connect GoHighLevel platform to manage leads and campaigns with AI phone agents - [Epic](https://docs.vinsi.ai/api-integration/epic.md): Connect AI phone agents to Epic on FHIR for patient lookup and appointment scheduling - [Vinsi CRM](https://docs.vinsi.ai/api-integration/vinsi-crm.md): Connect your AI phone agents to the Vinsi CRM platform ## API Reference - [Calls](https://docs.vinsi.ai/api-docs/calls.md): Retrieve a list of all calls made by your AI phone agents with filtering options - [Call by ID](https://docs.vinsi.ai/api-docs/call-id.md): Get detailed information about a specific call using its unique identifier - [Start Outbound Call](https://docs.vinsi.ai/api-docs/call-outbound.md): Have an AI phone agent call a phone number now, with optional variables and a voicemail message - [Export Call](https://docs.vinsi.ai/api-docs/export-calls.md): Export call logs and recordings in various formats for analysis and compliance - [Signed URL](https://docs.vinsi.ai/api-docs/signed-url.md): Generate secure, time-limited URLs for accessing call recordings and media files - [All Agents](https://docs.vinsi.ai/api-docs/agents.md): Retrieve a complete list of all AI phone agents in your organization - [Agent by ID](https://docs.vinsi.ai/api-docs/agent-id.md): Get detailed configuration and settings for a specific AI phone agent - [Create Agent](https://docs.vinsi.ai/api-docs/agent-create.md): Programmatically create a new AI phone agent with custom configurations via API - [Update Agent](https://docs.vinsi.ai/api-docs/agent-update.md): Modify existing AI phone agent settings, voice, and behavior through the API - [Delete Agent](https://docs.vinsi.ai/api-docs/agent-delete.md): Permanently remove an AI phone agent from your organization using the API - [All Voices](https://docs.vinsi.ai/api-docs/voices.md): Browse available voice options and languages for your AI phone agents - [All Phone Numbers](https://docs.vinsi.ai/api-docs/phone-numbers.md): List all phone numbers registered and available in your organization - [Phone Number by ID](https://docs.vinsi.ai/api-docs/phone-number-id.md): Get a single phone number with its assigned agent and routing details - [Update Phone Number](https://docs.vinsi.ai/api-docs/phone-number-update.md): Assign an AI agent or fallback number to a phone number - [Get By Area Code](https://docs.vinsi.ai/api-docs/phone-numbers-area-code.md): Search and filter available phone numbers by specific area code or region - [Create Phone Number](https://docs.vinsi.ai/api-docs/phone-number-create.md): Provision and register a new phone number for your AI agents via API - [Get Contacts](https://docs.vinsi.ai/api-docs/crm-contacts.md): List CRM contacts with search, filters, and pagination - [Contact by ID](https://docs.vinsi.ai/api-docs/crm-contact-id.md): Get a single CRM contact by its ID - [Find Contact by Phone](https://docs.vinsi.ai/api-docs/crm-contact-lookup-by-phone.md): Look up a CRM contact by phone number - [Create Contact](https://docs.vinsi.ai/api-docs/crm-contact-create.md): Create a new CRM contact - [Update Contact](https://docs.vinsi.ai/api-docs/crm-contact-update.md): Update an existing CRM contact - [Delete Contact](https://docs.vinsi.ai/api-docs/crm-contact-delete.md): Delete a CRM contact - [Get Companies](https://docs.vinsi.ai/api-docs/crm-companies.md): List CRM companies with search, filters, and pagination - [Company by ID](https://docs.vinsi.ai/api-docs/crm-company-id.md): Get a single CRM company by its ID - [Create Company](https://docs.vinsi.ai/api-docs/crm-company-create.md): Create a new CRM company - [Update Company](https://docs.vinsi.ai/api-docs/crm-company-update.md): Update an existing CRM company - [Delete Company](https://docs.vinsi.ai/api-docs/crm-company-delete.md): Delete a CRM company, optionally with its related records - [Get Deals](https://docs.vinsi.ai/api-docs/crm-deals.md): List CRM deals with filters and pagination - [Deal by ID](https://docs.vinsi.ai/api-docs/crm-deal-id.md): Get a single CRM deal by its ID - [Create Deal](https://docs.vinsi.ai/api-docs/crm-deal-create.md): Create a new CRM deal - [Update Deal](https://docs.vinsi.ai/api-docs/crm-deal-update.md): Update an existing CRM deal - [Delete Deal](https://docs.vinsi.ai/api-docs/crm-deal-delete.md): Delete a CRM deal - [Get Activities](https://docs.vinsi.ai/api-docs/crm-activities.md): List CRM activities with filters and pagination - [Activity by ID](https://docs.vinsi.ai/api-docs/crm-activity-id.md): Get a single CRM activity by its ID - [Create Activity](https://docs.vinsi.ai/api-docs/crm-activity-create.md): Create a new CRM activity - [Update Activity](https://docs.vinsi.ai/api-docs/crm-activity-update.md): Update an existing CRM activity - [Delete Activity](https://docs.vinsi.ai/api-docs/crm-activity-delete.md): Delete a CRM activity - [Get Activity Tasks](https://docs.vinsi.ai/api-docs/crm-activity-tasks.md): List the tasks on a CRM activity - [Activity Task by ID](https://docs.vinsi.ai/api-docs/crm-activity-task-id.md): Get a single activity task by its ID - [Create Activity Task](https://docs.vinsi.ai/api-docs/crm-activity-task-create.md): Add a task to a CRM activity - [Update Activity Task](https://docs.vinsi.ai/api-docs/crm-activity-task-update.md): Update an activity task - [Delete Activity Task](https://docs.vinsi.ai/api-docs/crm-activity-task-delete.md): Delete an activity task - [All Tools](https://docs.vinsi.ai/api-docs/tools.md): List all custom tools and functions configured for your AI phone agents - [Tool by ID](https://docs.vinsi.ai/api-docs/tool-id.md): Retrieve detailed configuration and parameters for a specific tool by its ID - [Create Tool](https://docs.vinsi.ai/api-docs/tool-create.md): Create custom tools to extend AI agent functionality and integrate external APIs - [Update Tool](https://docs.vinsi.ai/api-docs/tool-update.md): Modify existing tool configurations, parameters, and integration settings - [Delete Tool](https://docs.vinsi.ai/api-docs/tool-delete.md): Remove a custom tool from your AI phone agent's available capabilities --- # Get to know the VINSI products VINSI is a unified platform built for businesses that run on communication. Each product is purpose-built for a specific part of your operation — from AI-powered telephony and CRM to quality assurance, helpdesk, automation, outbound engagement, and video meetings. They work independently, and even better together. Filter the docs by product Every page in these docs is tagged to the product it belongs to. Use the filter button in the top bar to instantly narrow the left navigation down to only the pages relevant to a specific product — so you're never wading through sections that don't apply to what you're working on. Click any product below to try it now. ## VINSI VOICE Ditch RingCentral. Ditch Vonage. **VINSI Voice** is a full enterprise phone system replacement — not an add-on. It brings the infrastructure your business depends on together with AI built directly on top of it, so every call your team makes or receives is smarter from the moment it connects. Whether you're routing inbound calls, qualifying leads automatically, or deploying conversational AI agents that handle entire interactions end-to-end, VINSI Voice handles it at enterprise scale — without the complexity of stitching together multiple vendors. Smart call routingIVR replacementLead qualificationSMS messagingMultilingual supportConversational AI voice agentsEnterprise call telephony --- ## VINSI CRM **VINSI CRM** centralizes every customer relationship, sales pipeline, invoice, payment, and document into one connected platform. No more jumping between spreadsheets, inboxes, and disconnected tools to get a complete picture of where a deal or customer stands. From first contact to closed deal and beyond, your team has everything they need in one place — with full activity history, pipeline visibility, integrated invoicing, and 20+ built-in reports to understand exactly how your revenue is moving. --- ## VINSI DESK When customers need help, every second counts. **VINSI Desk** centralizes every support interaction into one operational view — so your team always knows what's open, what's urgent, and what needs to happen next. Route incoming requests through a customizable service catalog, enforce SLA targets, track resolution times, and give every agent the full context they need to resolve issues on the first contact. No tickets fall through the cracks, and no customer is left waiting without a reason. --- ## VINSI CONNECT **VINSI Connect** gives your organization one secure, searchable environment for your knowledge base and internal communication. When the answer your team needs is buried across shared drives, inboxes, and chat threads, response quality suffers and resolution times climb. Connect brings that knowledge into a structured, accessible library — so agents resolve issues faster, onboarding is consistent, and the right information reaches the right person every time. --- ## VINSI QA & CALL SCORING Manual QA means reviewing a fraction of your calls, missing patterns, and finding out about problems after they've already cost you customers. **VINSI QA** automatically reviews 100% of customer interactions — scoring every call against your defined criteria, surfacing what your agents are doing well, and flagging what needs to change. Stop sampling and start knowing. With full call coverage and automated scoring, your QA process becomes a continuous feedback loop rather than a periodic report — so performance improves consistently, not just when someone is watching. --- ## VINSI INSIGHTS **VINSI Insights** connects communication data, CRM activity, support operations, workflow performance, and revenue metrics into one real-time business intelligence environment. Most tools give you data. Insights gives you answers. Whether you're tracking pipeline health, monitoring QA scores, measuring ticket resolution performance, or understanding the ROI on your outbound campaigns, Insights surfaces it all in a single view — so the decisions that matter get made faster and with confidence. --- ## VINSI FLOW **VINSI Flow** connects automation across your entire operation so every process runs exactly when it should, every time, without anyone having to trigger it manually. From customer onboarding to internal escalations, Flow ensures nothing slips through the cracks because someone forgot a step. Build workflows that span your CRM, ticketing system, communication channels, and third-party integrations — and let them run in the background while your team focuses on the work that actually requires a human. Communication triggersNotification automationInternal task managementOnboarding automationEscalation automationWorkflow automationCustomer journey automation --- ## VINSI ENGAGE **VINSI Engage** reaches your past customers by name — with personalized offers, reminders, and re-engagement calls that sound like they came straight from your team. Not blasts. Conversations. Whether you're running an outbound call campaign, sending a targeted email sequence, or following up via SMS, Engage gives you the tools to reach the right people with the right message at the right time — and to do it at a scale that would be impossible to manage manually. Outbound callsSMS campaignsEmail campaigns ## VINSI VIDEO MEETINGS **VINSI Video Meetings** (VINSI Meet) brings face-to-face conversations into the same platform as your phones and CRM. Schedule a meeting, send invites, and meet with your team or your customers right in the browser — no downloads required. Hosts can record meetings and generate AI summaries, everyone can turn on live captions and translation, and meetings link back to the contact record in your CRM. When a customer needs hands-on help, share your screen, draw on it, or let them take remote control. Start at [meet.vinsi.ai](https://docs.vinsi.ai/meet/overview). Video meetings up to 50 peopleGoogle & Outlook calendar invitesWaiting roomScreen share & annotationRecordingAI meeting summariesLive captions & translationBreakout roomsVirtual backgroundsRemote control --- # Create your first AI Phone Agent Step-by-step guide to creating, configuring, and testing a new AI phone agent in VINSI.AI. Created April 11, 2025 · Updated September 16, 2026 ## Overview AI phone agents answer inbound calls and place outbound calls on behalf of your business, collect structured information from callers, and respond using natural, human-like voice interactions. This guide walks through the complete setup process—from creating a new agent to testing its behavior before going live. ## Create New Agent 1. Log into the VINSI AI SaaS platform 2. Navigate to **AI Phone Agents** ("Manage your AI phone agents") 3. Click **Add New AI Agent** 4. In the **Create New Agent** sheet, choose a template or start from scratch | Option | What it does | | -------------------- | ------------------------------------------------------------------------------------------------------------------- | | **Start from blank** | An empty agent you configure yourself | | **Workflow** | Build a node-based workflow agent (limited availability — contact VINSI support) | | **AI Agent Wizard** | Answer "What type of company is this?", add "Extra details (optional)", and optionally upload a PDF or DOCX | | **Templates** | Virtual Receptionist, Customer Service, Restaurant Order, Hotel Booking, Car Rental, Medical Check-in, Order Status | The AI Phone Agents list shows **Agent Name**, **Voice**, **Status** (Active/Inactive), and **Last Updated**, with **Edit**, **Clone**, and **Delete** actions. In the editor, click the pencil next to the agent name ("Edit Agent Name") to rename it; the **Agent ID** appears beneath. Use the **Inbound Agent** and **Outbound Agent** tabs to configure each direction. ## Welcome Message The welcome message is the first thing callers hear. It should clearly identify your business and establish the purpose of the call. "Thank you for calling Pizzeria Matteo. My name is Giselle. Will this be for dine-in, pickup, or delivery?" Keep the message concise, professional, and easy to understand. ## Instructions The **Instructions** editor defines how your agent behaves during calls. Write clear operational instructions rather than marketing language. - Specify what information the agent must collect - Define how different scenarios should be handled - Set the order in which questions are asked - Include relevant policies or procedures The editor includes Find, text size, a **Developer View** toggle, full-screen mode, and a character count. Press `{` to quickly insert tool references. Example: instruct the agent to always collect the caller's phone number first, followed by their name and order details. ## AI Voice Voice selection impacts trust and perceived quality. The **🎙 Voice** section of the Settings panel includes: - **AI Voices** — select one or more voices; use **Preview** to listen - **Voice Selection Mode** — Cycling or Random - **Allow Interruptions** — Yes, Yes (Except Welcome Message), or No - **Turn Detection Sensitivity** — Very Low to Maximum; **Edit** opens VAD mode (Slow/Normal/Fast) and advanced options The **🧠 Knowledge** section holds the **Knowledge Base** (Add/Edit, with Generate Knowledge), **Language**, and **Timezone**. ## Tools & Data Tools enable your agent to perform actions beyond conversation. The **⚙️ Tools & Data** section includes: - **Tools** - **Waiting Sound** — Hold Music, Keyboard Typing, or Silent - **First Action Tool** - **Pre-call Tool** (with a Pre-call Welcome Message) - **Dispositions** - **Key Terms** — Speech Recognition Bias, up to 100 terms - **After Call Webhook** - **Call Data** — Label, Key, Type (string, number, boolean), and Description On the **Outbound Agent** tab you'll also find **Voicemail Message**, **End call if IVR or AI agent detected**, and **Enable Do Not Call tool** (lets the AI add the caller to the DNC list mid-call). ## Telephony & Business Hours These sections appear after the agent is saved for the first time. - **☎️ Telephony** — **Phone Numbers** with a **Manage** link (opens "Assign a Phone Number"), a **Set as default** radio per number ("Use this number as the outbound caller ID"), and **Max Call Time (Minutes)** (default 0 = no limit, separate for inbound and outbound) - **🕒 Business Hours** — **Enforce Business Hours** switch and a weekly schedule; click **Edit** to set open/close times per day and add breaks. The time zone comes from the Knowledge section. Need a number? See [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers). For outbound setup, see [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls). ## Integration & Website Widget - **🔌 Integration** — **Select Integration** currently offers Go High Level (enter the Sub-Account ID and click Save) - **🌐 Website Widget** — choose **Channels** (Voice, Text chat, Call me), set Chat instructions, Starter messages (one per line), and **Allowed domains**. Click **Get Widget Embed Code** to customize text, colors, shape, position, and icon, then **Copy Code**. **Note:** The widget won't load if Allowed domains is empty. ## Saving & Testing Click **Save** to persist your settings. There is no separate Publish step. The header shows when the agent was **Last saved**, and you'll be prompted if you try to leave with unsaved changes. **History** opens **Agent History**, where you can **Rollback** to an earlier snapshot. - **Talk** (Inbound Agent tab) — test the agent in your browser; click the red **End** button to hang up. The gear icon opens **Audio Settings** for microphone and speaker. - **Call Me** (Outbound Agent tab) — have the agent call your phone. See [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls). Talk and Call Me require a saved agent, instructions, and wallet credits. --- # How to Use the Dashboard Learn how to monitor call activity, analyze AI agent performance, and export reports using the VINSI.AI dashboard. Created September 18, 2025 · Updated September 16, 2026 ## Filters The **Dashboard** has four tabs: **Overview**, **Geographic**, **Agent Performance**, and **Reports**. The filters at the top apply to the data you see: - **Day / Week / Month** and a date range - **Call Direction** — All, Inbound, or Outbound - **Agent** - **Batch** (e.g. `B-###`) — hidden when Call Direction is Inbound ## Overview The **General Overview Dashboard** provides a high-level summary of your call activity. Click **Refresh Data** to reload; the **Last updated** time is shown next to it. - Total Call Minutes - Number of Calls - Call Success Rate - Successful Calls / Tickets Created - All Active Calls Below the cards, the **Call Dispositions** chart (click a slice for details) and **Average Call Duration by Agent** chart are followed by an **Agent Performance** grid listing Agent Name, Call Count, and Average Duration. ## Geographic The Geographic tab shows where calls come from on a map. - Toggle between **United States** and **Global** views - Toggle the map between **Calls** and **Duration** - Summary cards: Total Calls, Active Regions, Top Performing State, International Calls - Top 5 States by volume and by average duration, Time Zone Distribution, Top Countries, and Language Distribution ## Agent Performance The Agent Performance tab provides detailed insights into how your AI agents are performing. Use **Analysis View** to switch between Overview, Agents, Voices, and Languages. - Total Agents - Top Performer - Avg Success Rate - Total Calls Charts include Agent Call Distribution, Daily Call Volume by Top Agents, Voice Performance Analysis, and Language Distribution Analysis. ## Reports The Reports tab offers ready-made reports grouped by category. | Category | Reports | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | | **Call Activity** | All Calls, Inbound Calls, Outgoing Calls, Web Call Sessions, Daily Call Volume, Hourly Call Distribution, Longest Calls, Short Calls (under 30s) | | **Outcomes & Quality** | Transferred Calls, Transfer Destinations, Failed / Error Calls, Disposition Summary, Scored Calls, Audited Calls, Flagged / Favorite Calls | | **Agents** | Agent Performance Summary, Agent Activity by Day, Language Usage | | **Campaigns & Outbound** | Batch Campaign Summary, Batch Call Detail | | **Callers & Usage** | Repeat Callers, Monthly Usage | Reports can be exported to Excel (up to 10,000 rows). --- # Using VINSI with AI Assistants These docs are published in formats Claude, ChatGPT, Gemini, and coding agents can read directly — so they can answer questions about VINSI and build integrations with the API. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Every page on this site is also available as plain Markdown, and the whole site is indexed in an `llms.txt` file — the standard way for AI tools to discover documentation. The API Reference is also published as an OpenAPI specification. These files are regenerated every time the docs are updated. ## Machine-Readable Docs | URL | What it is | | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | [/llms.txt](https://docs.vinsi.ai/llms.txt) | Index: what VINSI is, how the API works, and a link and summary for every page. | | [/llms-full.txt](https://docs.vinsi.ai/llms-full.txt) | Every page in one Markdown file — paste or attach it to give an assistant full context. | | /.md | Markdown for a single page — add .md to any docs URL, e.g. [/telephony/queues.md](https://docs.vinsi.ai/telephony/queues.md). | | [/openapi.json](https://docs.vinsi.ai/openapi.json) | OpenAPI 3.1 spec for the REST API. | | [/sitemap.xml](https://docs.vinsi.ai/sitemap.xml) | All documentation pages. | ## Pointing an Assistant at VINSI Assistants that can browse will read the docs when you give them the link. For example: Example prompt ``` Read https://docs.vinsi.ai/llms.txt and the pages it links to. Then walk me through setting up a call queue for my support team with business hours and a callback option. ``` - **Chat assistants** (Claude, ChatGPT, Gemini): share the `llms.txt` link, or attach `llms-full.txt` if browsing is off. - **Coding agents** (Claude Code, Cursor, Codex): add `https://docs.vinsi.ai/llms.txt` to your project instructions so the agent looks things up before writing integration code. - **Custom GPTs, Gemini Gems, Claude Projects**: add `llms-full.txt` as a knowledge file. ## Using the API - Base URL: `https://dashboard.vinsi.ai` - Authentication: header `x-api-key: sk_…` — see [API Keys](https://docs.vinsi.ai/account/apiKeys). - Request and response bodies are JSON. ### What the API Can and Can't Do The documented endpoints cover AI phone agents, calls, phone numbers, tools, and voices (see API Reference in the sidebar). Most other features — phone system setup, queues, CRM administration, billing, and organization settings — are managed in the dashboard. For those, an assistant should guide you through the exact menus and buttons described in these guides rather than calling the API. ## OpenAPI for Tools & Agents Import `https://docs.vinsi.ai/openapi.json` into tools that accept OpenAPI — for example a ChatGPT custom GPT action, an MCP or agent framework that turns OpenAPI into tools, Postman, or a code generator. Configure the `x-api-key` header as API-key authentication. ## Keeping Keys Safe - Never paste an API key into a chat. Give assistants a placeholder and set the real key in your code's environment variables. - Create a separate key for each tool or agent so you can revoke one without affecting others. - Review what an agent will do before letting it place calls or change agents with a live key. --- # Setting Up an Email Campaign A complete walkthrough for creating and sending a bulk email campaign from the VINSI CRM. Created May 20, 2026 ## Overview Email Campaigns let you send bulk emails to CRM contacts or imported CSV lists, with built-in email verification and send rate controls to protect deliverability. For a detailed breakdown of each setting, see the [Email Campaigns](https://docs.vinsi.ai/crm/admin/data-automation#crm-da-email-campaigns) section in CRM Admin. **Before you begin:** Email Campaigns require a configured SMTP server to deliver emails. Set this up first under **CRM Admin → Team Settings →** [Email Settings](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-email-settings). To get started, navigate to **CRM → Admin → Data & Automation → Email Campaigns** and click **New Campaign**. The campaign wizard takes you through 5 steps. ## Step 1 — Recipients Choose who receives the campaign. There are two ways to select recipients: ### CRM Contacts Pull recipients directly from your CRM. Use **\+ Add Filter** to narrow your list. Each filter has: - **Field** — Lead Status, Type, Source, Disposition, Last Work Date, or Created Date. - **Condition** — is, is not, is empty, or is not empty. - **Value** — for Lead Status: New, Open, In Progress, Open Deal, Unqualified, Attempted to Contact, Connected, Bad Timing, or Unassigned. Add multiple filters to further refine your audience, then click **Apply Filters** to load matching contacts. Leave filters empty to include all contacts. ### Upload CSV Upload a CSV file of recipients. The file must contain an `email` column; `firstName` and `lastName` are optional. Click the upload area to select your file, or use **Download Example CSV** to get a correctly formatted template. When ready, click **Next: Compose Email →** to continue. ## Step 2 — Compose Write your email content. - **Subject Line** — enter the email subject. - **Email Body** — write your message using the rich text editor (supports bold, italic, underline, strikethrough, lists, alignment, links, and images). Switch to **HTML** mode for direct HTML editing. Use the **Templates** button to quickly load a saved [email template](https://docs.vinsi.ai/crm/email-templates). - **Personalization tags** — insert dynamic content using `{{firstName}}`, `{{lastName}}`, `{{name}}`, `{{last_name}}`, `{{full_name}}`, `{{email}}`, or `{{company}}` anywhere in the subject or body. Click **Next: Send Settings →** to continue. ## Step 3 — Send Settings Control delivery speed and timing. ### Send Rate Controls Set how fast emails go out to avoid being flagged by your email provider. Configure three limits: - **Per Minute** — default 10 (recommended: 5–15 for shared SMTP) - **Per Hour** — default 200 (recommended: 100–300 for most providers) - **Per Day** — default 1000 (recommended: 500–2000 depending on your plan) An **Estimated Send Time** banner updates in real time based on your recipient count and rate settings. ### Send Schedule Choose **Send Now** to start immediately, or **Schedule for Later** to queue the campaign for a future date and time. When Schedule for Later is selected, two fields appear: a **Date** picker and a **Time** picker (12-hour format). Your detected timezone (e.g. _America/Los\_Angeles_) is shown beneath the time field. Click **Next: Review →** to continue. ## Step 4 — Review Confirm your campaign before sending. A summary shows your **Recipients** count, **Subject**, **Rate Limits**, **Send Via** (your configured SMTP), and **Schedule**. An **Email Preview** renders the full email below. Click **Schedule Campaign** (or **Send Campaign** if sending immediately) to confirm. ## Step 5 — Sending The campaign is queued and emails begin going out according to your rate settings. You can monitor progress from the **Campaign History** page. **Note:** If your SMTP server is not configured in [Email Settings](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-email-settings), this step will fail and no emails will be delivered. --- # Running a Batch Call Campaign A complete walkthrough for launching an AI-powered outbound batch calling campaign from VINSI. Created May 21, 2026 Updated: September 16, 2026 ## Overview Batch calling lets an outbound AI phone agent call a whole list of contacts for you. You pick the agent and caller ID, load your recipients, choose when the calls go out, and then track progress and results. For full details on every field, see the [Batch Call reference page](https://docs.vinsi.ai/telephony/batchCall). What we'll cover 1. Prepare an AI agent with outbound configured 2. Assign it a phone number that can call out 3. Open Batch Calls and start a new batch 4. Set the name, agent, and voicemail handling 5. Add recipients 6. Send now, schedule, or pace the calls 7. Save and launch 8. Monitor progress 9. Review results and reports 1 ## Prepare an Outbound Agent You need an AI agent with outbound configured. See [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls) for how to set up an outbound agent. 2 ## Assign a Phone Number Assign a phone number that can call out to your outbound agent. This number becomes the caller ID for the batch. See [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers) to get a number. Only numbers with an assigned agent and outbound capability appear in the batch call form. If your number is missing in Step 4, check its agent assignment. 3 ## Open Batch Calls 1. In the **AI Phone Agent** product, select **Batch Calls** in the top navigation. 2. The **Batch Calls** page ("Manage outbound call campaigns") lists existing batches with their ID (e.g. B-123), agent, schedule, Status, and Progress. 3. Click **New Batch Call** to open the **Create Batch Call** form. Editing or deleting a batch call requires an organization admin or the `batch_calls` write permission. 4 ## Name, Agent & Voicemail Batch Call Name Give the campaign a name you can find later in the Batch Calls list. Outbound Agent Open **Select an Agent**. Each option is a phone number shown as _Agent Name - (xxx) xxx-xxxx_. Picking one sets both the agent and the caller ID. Enable Voicemail Detection Off by default. Check it to reveal the **Voicemail Message** text box and enter the message to use when a call reaches voicemail. 5 ## Add Recipients Under **Add Recipients**, pick a source. **Upload CSV** is the default. Upload CSV 1. Click **Download the template** to get `template.csv`. 2. Fill it in. Keep the headers exactly as provided. 3. Click **Choose a csv file** and pick your `.csv` (up to 50mb). 4. Review the editable grid. Use **Add column** / **Add row**, or right-click to delete a row or column (`name` and `phoneNumber` can't be deleted). 5. Click **Save CSV changes**. Saving is blocked while any header or cell is empty. 6. Check that **Recipients Loaded: N** matches your list. | Column | Required | Notes | | ------------- | -------- | ----------------------------------------------- | | name | | Recipient name. Can't be deleted from the grid. | | phoneNumber | | Number to call. Can't be deleted from the grid. | | Extra columns | | Become per-recipient variables for the agent. | Avoid commas inside values. Other sources - **HubSpot** — if not connected, click **Connect to HubSpot** (Settings → HubSpot). Then choose a **Pipeline** and **Stage** (required) and click **Fetch Contacts**. The form shows **Contacts imported: N**. - **Salesforce** — click **Connect to Salesforce** if needed, choose an **Object Filter**, and use **Add Filter** (Field, Operator, Parameter, Remove). With two or more filters, enter **Filter Logic** (e.g. `1 and 2`) and click **Apply**. Set **Include Do Not Call Clients** (default No), then click **Get Contacts from {object}**. **Save Filter** keeps the filter. - **GoHighLevel** — click **Connect to GoHighLevel API** if needed, then **Get Contacts** and select contacts (**Contacts selected: N**). Requires the agent's GoHighLevel Sub-Account ID in the agent's Integration section. - **VinsiSaaS CRM** — click **Connect to Vinsi CRM API** if needed, then **Add Contacts**. In **Contacts from CRM**, tick contacts and click **Add Contacts**. - **External Source** — fill in the request settings (server URL required, method, headers, parameters, timeout) and click **Execute request**. Numbers on **CRM Admin → Do Not Call Registry** are skipped automatically and show as **DNC Skipped**. 6 ## Choose When to Call When to send the calls **Send Now** (default) starts dialing after you save. **Schedule** asks for: - **Start Date** (required, today or later) - **Has End Date** → **End Date** - **Start Time** and **End Time** (required) - **Select Time Zone** (required) - **Select the days** — Mon through Sun, within the date range Spread calls over time (progressive pacing) Available for one-time batches only (no weekdays selected). When checked: - **Contacts per wave** (default 50) and **Every (minutes)** (default 60). - **Only dispatch within a daily time window** — default 09:00–18:00 in the batch time zone. Contacts outside the window wait; they aren't skipped. - **Distribute by day of week** (optional) — click **Add day** and set a weekday and quota. If a contact was already attempted on an earlier rule day, choose **Distribute** (called once) or **Repeat**. For Repeat, pick **Only retry contacts who didn't answer (recommended)** or **Call everyone again**. - **Retry if disposition is** — comma-separated, e.g. _No Answer, Voicemail, Busy_. Leave empty for no retries. - **Retry after (hours)** (default 2) and **Max attempts per contact** (default 2). Reserved Concurrency for Other Calls A stepper from 1 to 5 (default 1). 7 ## Save & Launch 1. Optional: click **Warm up agent** to pre-load the agent. It's ready in about 5–10 seconds. 2. Click **Save Batch Call**. 8 ## Monitor the Batch A running batch shows "The batch call is executing..." with a progress bar and a **Cancel Execution** button. **Save Batch Call** is disabled while it runs. There is no pause. To stop a running batch, use **Cancel Execution**. From the Batch Calls list, open a row's actions: - **View Contacts** — each recipient shows **Sent**, **DNC Skipped**, or **Error**. - **View call tracking** (pacing batches only) — filter by status (Pending, Queued, Dispatched, Answered, No Answer, Retry Scheduled, DNC, Max Attempts, Error). Columns: Name, Phone Number, Status, Attempts, Wave, Last Disposition, Last Attempt, Next Attempt. The list's **Status** column shows Scheduled, Running, Completed, or Canceled. 9 ## Review Results - [Call Logs](https://docs.vinsi.ai/telephony/callLogs) — use the **Batch** filter, then **Export**. - **Dashboard** — filter by batch (`B-###`). - **Dashboard → Reports** — **Batch Campaign Summary** and **Batch Call Detail**, both with **Export to Excel**. --- # Manage Organization Organization settings, members, custom roles and permissions, and ownership. Created: September 16, 2026 Updated: September 18, 2026 ## Overview Open your avatar menu and choose **Manage Organization**. Tabs: **General**, **Members**, **Invitations**, and **Organization Chart** (admins and owner). Changes require the Admin role. | Role | Can do | | ---------- | ------------------------------------------------------------------------------- | | **Owner** | Everything an admin can, plus transfer or delete the organization. | | **Admin** | Full access to every feature; manage settings, members, invitations, and roles. | | **Member** | Only the areas granted by their permissions or custom role. | ## General Settings | Setting | What it does | | --------------------- | -------------------------------------------------------------------------------------------- | | **Organization name** | Shown across the app and in emails. Click **Save**. | | **Default dashboard** | Where members land after signing in. | | **Time Zone** | Used for voicemail and missed-call emails, ticket reminders, business hours, and scheduling. | | **Logo** | Square image up to 2 MB — **Upload image**, then **Upload**. | The side panel shows the **Org ID** (with a copy button — support may ask for it), members, and **Max allowed members**. ## Members The **Members** tab lists everyone with their **Role** and **Last Login**. Search by name or email, and click a name for their profile details. To add people, see [Invite Team Members](https://docs.vinsi.ai/organization/inviteTeamMembers). ### Change a Member's Role 1. Click the member's **Role** button (you can't change the owner or yourself). 2. Choose **Admin** or **Member**. 3. For Members, pick a custom role or adjust **Read** / **Write** permissions. 4. Click **Update**. ### Remove a Member Click the trash icon and **Remove Member**. They immediately lose access to the organization. This can't be undone — invite them again to restore access. Reassign their phone number and records first if needed. ## Roles & Permissions Custom roles (e.g. Manager, Seller) let you give the same permissions to many Members. Owners and admins always see everything. Custom roles are also called **permission groups**, and there's a quicker way to manage them: **CRM → Admin → CRM Team** lets you create a role, set its permissions, and assign it to many members at once. Roles created there appear on this chart automatically. See [Permission Groups](https://docs.vinsi.ai/organization/permissionGroups). ### Create Custom Roles 1. Open the **Organization Chart** tab and click **New Role**. 2. Enter a name and click **Add**. Role names are saved in capitals. 3. Drag and connect roles in the chart to set the hierarchy under Owner → Admin. 4. Click **Save Roles**. 5. Click the gear next to the role, set its permissions, and click **Save Permissions**. Click **Save Roles** before configuring a new role's permissions — the gear won't work until the role is saved. **Rename or delete a role** with the buttons in the top-right corner of its box on the chart: the pencil (or a double-click on the name) renames it in place — press **Enter** to save or **Escape** to cancel — and the **×** deletes it after a confirmation. Both take effect straight away, without **Save Roles**. Renaming keeps the role's permissions, its members and its connections; deleting takes members out of the role but leaves their current permissions in place. **Remove a link** between two roles by clicking the line so it turns blue and pressing **Delete** or **Backspace**, or by right-clicking it and choosing **Delete link**. Then click **Save Roles**. Links are reporting lines — a role sees the contacts and companies of the roles directly below it — and saving updates that straight away. ### Permission Areas | Area | Includes | | ------------------- | --------------------------------------------------------------------------------------------------------- | | **AI Phone Agents** | Agents (prompt, knowledge base, turn detection), Call Logs, Phone Numbers, Batch Calls, Tools, Billing | | **AI Assistance** | New Chat, Knowledge Base | | **Ticket System** | Tickets, Tasks, Catalog, Workflow, Knowledge Base, Analytics, Chat Widget, Admin | | **CRM** | Contacts, Companies, Deals, Activities, Documents, and each CRM Admin card, custom tab, and custom object | | **QA Calls** | Campaigns, Upload, Results, Agents, Analytics | | **Phone** | Softphone, Text Messages, Fax, Call Logs | **Read** lets a member view an area; **Write** lets them change it. ## Transfer Ownership Only the owner can do this, from **General → Danger Zone**: 1. Click **Transfer**. 2. Choose the **Member to Transfer To** and type the organization name to confirm. The new owner becomes an admin-owner and you become a Member. To delete the organization instead, see [Delete Organization](https://docs.vinsi.ai/organization/deleteOrganization). --- # Permission Groups Set up roles like Supervisor or Call Center Agent once, then give a whole team the same access in one step. Created: September 18, 2026 Updated: September 18, 2026 ## Overview A **permission group** is a saved set of permissions with a name — for example **SUPERVISOR** or **CALL CENTER AGENT**. Instead of ticking the same boxes for every person, you set the permissions on the group once and put people in it. When you later change the group, everyone in it changes with it. You manage groups from **CRM → Admin → Team Settings → CRM Team**, which has two tabs: **Permission Groups**, where you create groups and set their permissions, and **Members**, where you put people in them. Each tab shows how many it holds. Permission groups and the **custom roles** on the [Organization Chart](https://docs.vinsi.ai/organization/manageOrganization#manageOrganization-roles) are the same thing. A group you create on the CRM Team panel appears on the chart, and a role you draw on the chart appears in the group list. Use whichever screen suits the job. ## Before You Start - **You need to be an organization Admin or Owner.** Other members can see the group list, but not the New Group, Permissions, Rename or Delete buttons, the group pickers, or the selection boxes. - **Groups are for Members only.** Admins and Owners already have access to everything, so they can't be put in a group and have no group picker on their row. - The member list comes from your organization. To add people, see [Invite Team Members](https://docs.vinsi.ai/organization/inviteTeamMembers). ## Create a Group 1. Open **CRM → Admin**, then the **CRM Team** card under Team Settings, and switch to the **Permission Groups** tab. (Direct link: `/crm/admin?panel=crm-team&tab=groups`.) 2. Click **New Group**. 3. Type a name, such as _Supervisor_. Press **Enter** or click **Create**. Press **Escape** or click **Cancel** to back out. The group appears in the list with **0 members**. Names are saved in capitals, so _Supervisor_ becomes **SUPERVISOR**, and extra spaces are tidied up. | Rule | Detail | | -------- | ------------------------------------------------------------------------- | | Length | Up to 100 characters. | | Unique | No two groups in your organization can share a name (after capitalising). | | Reserved | **ADMIN**, **MEMBER** and **OWNER** are taken by the built-in roles. | ## Set the Group's Permissions **A new group grants nothing until you do this.** If you assign people to a group that has no permissions set, they end up with no access. Set the permissions first, then assign. 1. On the **Permission Groups** tab, click **Permissions** on the group's row. A window titled _Permissions — SUPERVISOR_ opens. 2. Tick **Read** and **Write** for each area the group should reach. It's the same permission list as for an individual member: AI Phone Agents, AI Assistance, Ticket System, CRM, QA Calls and Phone, each with its own sub-items. 3. Click **Save Permissions**. A confirmation tells you how many members were updated. Saving pushes the new permissions to **everyone already in the group** straight away, so this is also how you change a whole team's access later. As in the member permissions window, a section has to be switched on before its sub-items, and **Write** needs **Read**. ## Assign Members Assigning happens on the **Members** tab. ### One Member 1. Find the person in the member list. The search box matches name, email, role and group. 2. In the group picker on their row, choose the group. It applies straight away. Choose **No group** to take someone out of their group. Using the picker doesn't open the member's permissions window; clicking anywhere else on the row still does. ### Several Members at Once 1. Tick the box at the start of each person's row, or use **Select everyone on this page**. Your selection is kept as you move between pages, so you can pick people from several pages. 2. The bar above the list shows how many are selected. Choose the group from its drop-down. 3. Click **Apply**. A message confirms how many members were moved. Choose **No group** before clicking Apply to take everyone selected out of their group instead. **Clear** empties the selection. You can move up to 200 members in one go. ### What Assigning Does | Action | Effect on the member's permissions | | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | Put someone in a group | **Replaced** with the group's permissions. Anything they had before that the group doesn't grant is removed. | | Move someone to a different group | Replaced with the new group's permissions. | | Choose **No group** | **Kept as they are.** Only the group label is removed, so nobody loses access by accident. Adjust them individually afterwards if needed. | ## Example: Supervisor & Call Center Agent A common setup for a call center. The permissions below are a **starting point**, not a rule — adjust them to how your team works. 1. Create two groups: **Supervisor** and **Call Center Agent**. 2. Click **Permissions** on each and set them, for example: | Area | CALL CENTER AGENT | SUPERVISOR | | ------------------------------------------- | ----------------- | ------------ | | Phone → Softphone, Text Messages, Call Logs | Read + Write | Read + Write | | CRM → Contacts, Companies, Activities | Read + Write | Read + Write | | CRM → Deals | Read | Read + Write | | Ticket System → Tickets, Tasks | Read + Write | Read + Write | | QA Calls → Results, Analytics | — | Read | | AI Phone Agents → Call Logs | — | Read | | CRM → Admin | — | — | 1. Select all the agents in the member list, choose **CALL CENTER AGENT**, and click **Apply**. 2. Do the same for your supervisors with **SUPERVISOR**. Try it on one person first and check with them that they can reach what they need, before moving the whole team. ## Rename or Delete a Group | Task | How | What happens to its members | | ------ | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | Rename | Click **Rename**, type the new name, press **Enter** or click **Save**. | They move with it. Nothing about their access changes. | | Delete | Click **Delete** and confirm with **Yes, delete**. The warning tells you how many members are in the group. | They're taken out of the group but **keep the permissions they have now**. Deleting can't be undone. | Each group's row shows how many members it has, which makes unused groups easy to spot and tidy away. ## Reading the Member List Each member's role button shows their role and, if they have one, their group. The same labels appear in **Manage Organization → Members**. | Label | Meaning | | ------------------- | --------------------------------------------- | | Owner | Created the organization. Full access. | | Admin | Full access and can manage the organization. | | Member | Access set individually, not through a group. | | Member · SUPERVISOR | Access comes from the SUPERVISOR group. | Click the role button, or anywhere on the row, to open that person's own permissions window. ## Groups and the Organization Chart The [Organization Chart](https://docs.vinsi.ai/organization/manageOrganization#manageOrganization-roles) under **Manage Organization** shows the same groups as boxes, and lets you connect them to set who reports to whom. The two stay in step: - A group created on the CRM Team panel is added to the chart below Admin. Drag it into place and connect it if you use reporting lines. - Renaming a group renames its box and keeps its connections. - Deleting a group removes its box and its connections. - On the chart itself, each role box has a pencil and an **×** in its corner to rename or delete it, with the same effect as doing it here. Reporting lines can only be drawn on the chart. The CRM Team panel is the quicker place to create groups, set their permissions and move people between them. ## Things to Know - **Group changes overwrite individual changes.** If you adjust one person's permissions and later save the group's permissions again, that person is reset to match the group. For a one-off exception, take them out of the group first. - **A permission nobody granted is denied.** If a member can't see a screen, the group (or the member) needs that area switched on — there's no “allowed by default”. - **Assigning replaces, removing keeps.** Putting someone in a group can narrow their access; taking them out never does. - **Admins are skipped.** Admins and Owners have no selection box. If someone is made an Admin while you have them selected, they're left alone and a message tells you how many were skipped. - **Reload the Organization Chart before saving it.** If the chart has been open in another tab while groups were changed here, reload it first — **Save Roles** saves exactly what's on its canvas. ## Troubleshooting | Message or problem | What to do | | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | _A group with that name already exists_ | Pick another name. Names are compared in capitals, so _supervisor_ and _SUPERVISOR_ clash. | | _That name is reserved — pick another_ | ADMIN, MEMBER and OWNER belong to the built-in roles. | | _Group names are limited to 100 characters_ | Shorten the name. | | _Admins and owners already have full access — groups apply to members only_ | Nothing to do: that person already has everything. | | _That group no longer exists_ | Someone deleted it in the meantime. Reopen the panel to refresh the list. | | _Admin access required_ | Only Admins and Owners can manage groups. Ask one of them. | | No New Group button or group pickers | You're signed in as a Member. Group management is for Admins and Owners. | | Someone in a group can't see a screen | Open the group's **Permissions**, switch that area on, and save. Everyone in the group gets it. | | A member lost access after joining a group | Expected: joining replaces their permissions with the group's. Add what's missing to the group, or take them out. | --- # Invite Team Members Invite people to your organization, choose what they can access, and manage pending invitations. Created: April 17, 2025 Updated: September 16, 2026 ## Invite a Team Member Only organization admins can invite members. 1. Open your avatar menu and choose **Manage Organization**. 2. On the **Members** or **Invitations** tab, click **Invite Member**. 3. Enter the person's **Email Address**. 4. Choose a **Role**: **Admin** (manages the organization and team, sees everything) or **Member** (uses the application with the permissions you choose). 5. For Members, set their permissions (below). 6. Click **Send Invitation**. Invite one person at a time. Repeat for each teammate. ### Choosing Permissions For a Member, either pick a custom role in **Select a custom role for the user** — which fills in that role's permissions — or tick **Read** and **Write** for each area in the **Permissions** list (AI Phone Agents, AI Assistance, Ticket System, CRM, QA Calls, Phone). A section must be turned on before its sub-items, and Write requires Read. See [Roles & Permissions](https://docs.vinsi.ai/organization/manageOrganization#manageOrganization-roles). ## What the Invitee Sees 1. They receive an email titled **Invitation to join {Organization}**. 2. They click **Accept Invitation**. 3. New users create a VINSI account using the invited email address. Existing users sign in and are added to the organization. Ask invitees to check spam if the email doesn't arrive, and to accept with the same email address you invited. ## Managing Invitations - The **Invitations** tab lists invites by **Status**: Pending (default), Accepted, Revoked, or All. - Click **Revoke** to cancel a pending invite — the link stops working. - To resend, revoke the pending invite and invite the person again. ## Member Limits & Extra Seats Your plan sets how many people can be in the organization. **Pending invitations count toward the limit.** | Plan | Members | | ------------------------ | --------- | | No plan / VINSI Voice | 1 | | VINSI Professional | 5 | | VINSI Premium | 10 | | VINSI Elite / Enterprise | Unlimited | At the limit, **Invite Member** is disabled and a warning offers **Purchase Additional Seats** ($49/month per seat). Choose 1–50 seats and complete checkout. To cancel extra seats later, go to **Settings → Manage Plans → All Subscriptions**. See [Billing & Plans](https://docs.vinsi.ai/account/billing). --- # Delete Organization Everything you need to know about how to delete an organization. Created: April 21, 2025 Updated: September 16, 2026 ## How to Delete an Organization Only the organization owner can delete it. 1. Open your avatar menu and choose **Manage Organization**. 2. On the **General** tab, scroll to the **Danger Zone**. 3. Click **Delete Organization**. 4. Type the name of your organization exactly (case-sensitive) and confirm. Want to hand the organization to someone else instead? Use **Transfer** in the Danger Zone — see [Transfer Ownership](https://docs.vinsi.ai/organization/manageOrganization#manageOrganization-transfer). ### Important Notes You can only delete an organization if you own at least one other organization. Permanently delete the organization and all its contents. This action cannot be undone. --- # Account Settings Update your profile picture and name, change your sign-in email, pick your display language, or delete your account. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Click your profile picture (or initials) in the top-right corner and choose **Settings**. The **Settings** menu on the left opens on **Account**, where you manage your own profile. These settings apply to you only, not your whole organization. ## Your Profile ### Profile Image 1. Under **Profile Image**, click **Upload Image** (or **Change Image** if you already have one). 2. Choose a JPEG, PNG, GIF, or WebP file up to 5 MB. The image saves right away — you'll see **Profile image updated** and your header picture changes. Click **Remove** to go back to your initials. ### Name 1. Edit the **Name** field with your full name. 2. Click **Save Changes**. You'll see **Your settings have been updated successfully**. The first word becomes your first name and everything after it your last name. ### Change Your Sign-in Email The **Email** field is read-only. It's the address you sign in with and where notifications are sent. To change it: 1. Click **Change sign-in email** under the Email field. Your account profile window opens. 2. Add the new email address and enter the verification code sent to it. 3. Make the new address your primary email, then remove the old one if you no longer need it. ### User ID & Call Concurrency Limit | Field | Details | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------- | | User ID | Your unique identifier in VINSI. Read-only — share it with VINSI support when asked. | | Call Concurrency Limit | The maximum number of calls allowed at the same time for your account. Read-only — contact VINSI support to change it. | ## Signing In & Your Password On the **Sign in** page, enter your **Email**. Then either enter your password and click **Sign in**, or click **Email me a sign-in code** and enter the **Verification code** from your email (use **Send a new code** if it doesn't arrive). ### Reset or Change Your Password 1. On the **Sign in** page, click **Forgot password?** (sign out first if you're signed in). 2. Enter your **Email Address** and click **Send Reset Code**. 3. Enter the 6-digit **Verification Code** from your email and click **Verify Code**. 4. Enter a **New Password** (at least 8 characters), type it again in **Confirm Password**, and save. This is your VINSI sign-in password. Desk phone passwords are different — see [Desk Phones](https://docs.vinsi.ai/telephony/deskPhones#deskPhones-status). ## Language Choose **Language** in the Settings menu. - **Use browser language automatically** is on by default. The app follows your browser's language and shows it as **Detected language**. If your browser language isn't supported, English is used. - Turn the switch off to pick a language yourself under **Select language**. Supported languages: English, Español, Português, Français, Italiano, and Deutsch. Your language choice is saved in this browser only. On another browser or device, set it again. ## Delete Your Account Deleting your account is permanent and can't be undone. You're signed out and can no longer sign in with this account. 1. In the **Delete Account** section, type your full name exactly as it appears in the **Name** field (the box shows it as a hint). 2. Click **Delete Account**. 3. In the **Delete ACCOUNT** dialog, click **Yes, Delete Account**. ### If You Created Organizations If you created any organizations, a **Confirmation Required** dialog appears next. Clicking **Yes, proceed** also deletes every organization you created, and their other members lose access to them. To keep an organization running, click **No, cancel** and [transfer ownership](https://docs.vinsi.ai/organization/manageOrganization#manageOrganization-transfer) before deleting your account. ## Other Settings The Settings menu also includes: | Menu item | What it's for | Learn more | | ----------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Manage Plans** | Your support plan, phone credits, phone numbers, and subscriptions. | [Billing & Plans](https://docs.vinsi.ai/account/billing#billing-manage) | | **API Keys** | Create and revoke API keys. | [API Keys](https://docs.vinsi.ai/account/apiKeys) | | **API Integration** | Connect **Epic on FHIR**, **HubSpot**, **Salesforce**, **GoHighLevel**, or **Vinsi SaaS CRM**. | [Epic](https://docs.vinsi.ai/api-integration/epic), [HubSpot](https://docs.vinsi.ai/api-integration/hubspot), [Salesforce](https://docs.vinsi.ai/api-integration/salesforce), [GoHighLevel](https://docs.vinsi.ai/api-integration/gohighlevel), [Vinsi CRM](https://docs.vinsi.ai/api-integration/vinsi-crm) | | **Balance Auto Reload** | Auto recharge and low-balance email notifications. | [Auto Recharge](https://docs.vinsi.ai/account/billing#billing-auto-recharge) | | **Language** | Display language. | [Language](https://docs.vinsi.ai/account/settings#accountSettings-language) above | ## Troubleshooting | Problem | What to do | | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | "Unsupported image type. Use JPEG, PNG, GIF, or WebP." | Save the picture in one of those formats and upload again. | | "File too large. Maximum size is 5 MB." | Resize or compress the image first. | | "Failed to load user data. Please try refreshing the page." | Refresh the page. If it keeps happening, sign out and back in. | | Delete Account button stays disabled | The name you typed must match the Name field exactly, including capital letters and spaces. | | Can't edit the Email field | That's expected — use **Change sign-in email**. | | Language changed back | Turn off **Use browser language automatically**, then pick a language. It's saved per browser. | --- # Billing & Plans Choose a support plan, buy call minutes, set up auto recharge, and find invoices. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Open your avatar menu and choose **Billing** (admins and members with Billing permission). Your minute balance shows in the avatar menu as **Available Minutes** — click it to buy more. Payments are processed securely by Stripe. | Where | What you do there | | ---------------------------------- | ------------------------------------------------------------------ | | **Billing** | Usage, billing history, invoices, buy minutes, and purchase plans. | | **Settings → Manage Plans** | View and cancel your plan and other subscriptions. | | **Settings → Balance Auto Reload** | Auto recharge and low-balance emails. | ## Support Plans Plans include team seats, monthly minutes, onboarding, and support. Plan minutes reset monthly. | Plan | Price | Users | Minutes / month | | ------------------ | ------------ | --------- | --------------- | | VINSI Voice | $299/month | 1 | 500 | | VINSI Professional | $499/month | 5 | 2,000 | | VINSI Premium | $999/month | 10 | 5,000 | | VINSI Elite | $1,999/month | Unlimited | 10,000 | | VINSI Enterprise | Contact us | Unlimited | Custom | Additional users are $49/user/month; additional minutes are $0.30/minute. ### Purchase a Plan 1. Click **Purchase Plans** in the top bar, or go to **Billing** and open the plans. Plans are on the **Business** and **Enterprise** tabs. 2. Click **Purchase Support Plan** on the plan you want. 3. Read the **Support Service Agreement** to the end (you can **Download Agreement**), then tick **I have read and agree to the Support Services Agreement**. VINSI Voice also lets you add users and monthly minutes here. 4. Review the order summary and click **Proceed to Secure Checkout**. After payment you'll see **Thank You for Your Purchase!**, and a VINSI Success Manager will reach out to schedule onboarding. To change plans, contact VINSI support — or cancel your current plan in Manage Plans and purchase the new one when it ends. ## Minutes AI agent calls and faxes (1 minute each) use minutes. Plan minutes are used first, then purchased minutes. The Billing page shows **Previous Month**, **Current Month**, **Plan Minutes** (used / total), and **Purchased Minutes**. ### Buy Minutes 1. Click **Available Minutes** (or **Buy Minutes**) in the avatar menu. 2. Pick 500, 1,000, 2,500, 5,000, or 10,000 minutes, or enter an exact amount. 3. Optionally enter a **Discount Code** and click **Apply**. 4. Click **Secure Checkout** and pay. Minutes are **$0.30 each**. ### Auto Recharge Avoid running out mid-campaign. Admins can set this in **Settings → Balance Auto Reload → Auto Recharge**: 1. Set **When balance goes below** (minutes). 2. Set **Bring my balance back up to** — each recharge buys enough minutes to reach this balance (it must be higher than the trigger). 3. Click **Save**. If no card is saved, you'll be asked to add one. Balances are checked hourly. Use **Disable auto recharge** to turn it off. The **Balance Notifications** tab sets the balance at which your organization's owner and admins get a low-balance email — one email each time the balance drops below it. ## Other Charges | Item | Price | Where | | ---------------- | -------------- | ---------------------------------------------------------------------------------------------------- | | Phone number | $3/month each | [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers#phoneNumbers-buy) | | Additional seats | $49/month each | [Manage Organization](https://docs.vinsi.ai/organization/inviteTeamMembers#inviteTeamMembers-limits) | | VINSI Meet | $14.99/month | [meet.vinsi.ai](https://docs.vinsi.ai/meet/overview#meet-billing) | ## Billing History & Invoices The **Billing History** grid lists **Date**, **Amount**, **Description**, **Type**, **Status**, and **Invoice**. Filter by type (Minutes Purchase, Phone Number Purchase, Support Plan, and more), search descriptions, or pick a date range (Today, This Week, This Month, Previous Month, This Quarter, or custom). Click **Invoice** (or **Receipt**) to open or download it. If you see **Unable to connect to billing service. Displaying sample data.**, the rows shown aren't real — click **Retry Connection**. ## Manage & Cancel Subscriptions Go to **Settings → Manage Plans** (admins): - **Support Plan** — shows your plan and remaining plan minutes. **Cancel Support Plan** keeps the plan active until the end of the billing period. - **Phone Numbers** — release numbers you no longer need (unassign agents first). - **All Subscriptions** — every subscription (seats, add-ons) with renewal dates and **Cancel**. ## FAQ | Question | Answer | | --------------------------------------- | ---------------------------------------------------------------------------- | | Do unused plan minutes roll over? | No — plan minutes reset monthly. Purchased minutes stay until used. | | How do I update my card? | Contact VINSI support; a new card can also be entered at your next checkout. | | Why can't I see Billing? | You need the Admin role or Billing permission. | | What happens when I run out of minutes? | AI calls and faxes stop until you buy minutes or auto recharge runs. | --- # API Keys Create keys to use the VINSI API for calls, agents, phone numbers, tools, and CRM data. Created: September 16, 2026 Updated: September 16, 2026 ## Overview API keys belong to your organization. Every request to the [API Reference](https://docs.vinsi.ai/api-docs/calls) endpoints needs one. Manage keys in **Settings → API Keys** (avatar menu → Settings). ## Create an API Key Only organization admins can create and revoke keys. 1. Go to **Settings → API Keys**. 2. Click **\+ Add API Key**. 3. Enter an **API Key Name** that says where it's used (e.g. "Website booking form"). 4. Click **Add API Key**. 5. In **Copy your new API key**, click **Copy** and store the key somewhere safe, then click **Done**. The full key is shown **only once**. Afterwards the list shows it masked. If you lose a key, revoke it and create a new one. Keys start with `sk_`. The list shows each key's **Name**, masked **Key**, **Created At**, and **Last Used**. ## Using Your Key Send the key in the `x-api-key` header. The base URL is `https://dashboard.vinsi.ai`. Example request ``` curl https://dashboard.vinsi.ai/api/agents \ -H "x-api-key: sk_your_key_here" ``` ### What Keys Can Access | Area | Paths | | ------------------ | --------------------------------------------------------------------------------------------------- | | Calls | /api/calls | | Agents | /api/agents | | Voices & AI models | /api/voices, /api/aimodels | | Phone numbers | /api/phone-numbers | | Tools | /api/tools | | CRM | /api/crm/contacts, /api/crm/companies, /api/crm/deals, /api/crm/activities, /api/crm/activity-tasks | See the API Reference in the sidebar for each endpoint's parameters and examples. ### Errors | Status | Meaning | | -------------------------- | -------------------------------------------------------------- | | 401 Invalid api key | The key is missing, mistyped, or revoked. | | 402 subscription\_inactive | Your organization's subscription isn't active — check Billing. | ## Revoke a Key Organization admins can click the trash icon and **Revoke API Key**. Anything using the key stops working immediately. This can't be undone — create a new key and update your integration. ## Best Practices - Use a separate key for each integration so you can revoke one without breaking others. - Keep keys on your server — never put them in website code, mobile apps, or public repositories. - Revoke keys you no longer use; check **Last Used** to find them. - If a key may have leaked, revoke it right away and create a new one. --- # Create your first AI Phone Agent Step-by-step guide to creating, configuring, and testing a new AI phone agent in VINSI.AI. Created April 11, 2025 · Updated September 16, 2026 ## Overview AI phone agents answer inbound calls and place outbound calls on behalf of your business, collect structured information from callers, and respond using natural, human-like voice interactions. This guide walks through the complete setup process—from creating a new agent to testing its behavior before going live. ## Create New Agent 1. Log into the VINSI AI SaaS platform 2. Navigate to **AI Phone Agents** ("Manage your AI phone agents") 3. Click **Add New AI Agent** 4. In the **Create New Agent** sheet, choose a template or start from scratch | Option | What it does | | -------------------- | ------------------------------------------------------------------------------------------------------------------- | | **Start from blank** | An empty agent you configure yourself | | **Workflow** | Build a node-based workflow agent (limited availability — contact VINSI support) | | **AI Agent Wizard** | Answer "What type of company is this?", add "Extra details (optional)", and optionally upload a PDF or DOCX | | **Templates** | Virtual Receptionist, Customer Service, Restaurant Order, Hotel Booking, Car Rental, Medical Check-in, Order Status | The AI Phone Agents list shows **Agent Name**, **Voice**, **Status** (Active/Inactive), and **Last Updated**, with **Edit**, **Clone**, and **Delete** actions. In the editor, click the pencil next to the agent name ("Edit Agent Name") to rename it; the **Agent ID** appears beneath. Use the **Inbound Agent** and **Outbound Agent** tabs to configure each direction. ## Welcome Message The welcome message is the first thing callers hear. It should clearly identify your business and establish the purpose of the call. "Thank you for calling Pizzeria Matteo. My name is Giselle. Will this be for dine-in, pickup, or delivery?" Keep the message concise, professional, and easy to understand. ## Instructions The **Instructions** editor defines how your agent behaves during calls. Write clear operational instructions rather than marketing language. - Specify what information the agent must collect - Define how different scenarios should be handled - Set the order in which questions are asked - Include relevant policies or procedures The editor includes Find, text size, a **Developer View** toggle, full-screen mode, and a character count. Press `{` to quickly insert tool references. Example: instruct the agent to always collect the caller's phone number first, followed by their name and order details. ## AI Voice Voice selection impacts trust and perceived quality. The **🎙 Voice** section of the Settings panel includes: - **AI Voices** — select one or more voices; use **Preview** to listen - **Voice Selection Mode** — Cycling or Random - **Allow Interruptions** — Yes, Yes (Except Welcome Message), or No - **Turn Detection Sensitivity** — Very Low to Maximum; **Edit** opens VAD mode (Slow/Normal/Fast) and advanced options The **🧠 Knowledge** section holds the **Knowledge Base** (Add/Edit, with Generate Knowledge), **Language**, and **Timezone**. ## Tools & Data Tools enable your agent to perform actions beyond conversation. The **⚙️ Tools & Data** section includes: - **Tools** - **Waiting Sound** — Hold Music, Keyboard Typing, or Silent - **First Action Tool** - **Pre-call Tool** (with a Pre-call Welcome Message) - **Dispositions** - **Key Terms** — Speech Recognition Bias, up to 100 terms - **After Call Webhook** - **Call Data** — Label, Key, Type (string, number, boolean), and Description On the **Outbound Agent** tab you'll also find **Voicemail Message**, **End call if IVR or AI agent detected**, and **Enable Do Not Call tool** (lets the AI add the caller to the DNC list mid-call). ## Telephony & Business Hours These sections appear after the agent is saved for the first time. - **☎️ Telephony** — **Phone Numbers** with a **Manage** link (opens "Assign a Phone Number"), a **Set as default** radio per number ("Use this number as the outbound caller ID"), and **Max Call Time (Minutes)** (default 0 = no limit, separate for inbound and outbound) - **🕒 Business Hours** — **Enforce Business Hours** switch and a weekly schedule; click **Edit** to set open/close times per day and add breaks. The time zone comes from the Knowledge section. Need a number? See [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers). For outbound setup, see [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls). ## Integration & Website Widget - **🔌 Integration** — **Select Integration** currently offers Go High Level (enter the Sub-Account ID and click Save) - **🌐 Website Widget** — choose **Channels** (Voice, Text chat, Call me), set Chat instructions, Starter messages (one per line), and **Allowed domains**. Click **Get Widget Embed Code** to customize text, colors, shape, position, and icon, then **Copy Code**. **Note:** The widget won't load if Allowed domains is empty. ## Saving & Testing Click **Save** to persist your settings. There is no separate Publish step. The header shows when the agent was **Last saved**, and you'll be prompted if you try to leave with unsaved changes. **History** opens **Agent History**, where you can **Rollback** to an earlier snapshot. - **Talk** (Inbound Agent tab) — test the agent in your browser; click the red **End** button to hang up. The gear icon opens **Audio Settings** for microphone and speaker. - **Call Me** (Outbound Agent tab) — have the agent call your phone. See [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls). Talk and Call Me require a saved agent, instructions, and wallet credits. --- # AI Agent Wizard & Templates Get a new AI phone agent started fast: generate a call flow from a description of your business or a document, or begin from a ready-made template. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Go to **AI Phone Agents** and click **Add New AI Agent**. The **Create New Agent** sheet opens ("Choose a template to get started or create from scratch"). Click a card to continue, or the × to close. Every option opens the same agent editor, described in [Create your first AI Phone Agent](https://docs.vinsi.ai/getting-started/first-phone-agent). The difference is how much is filled in for you. ## Which Option to Choose | Card | Best when | Saved right away? | | -------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------- | | **Start from blank** | You already know what to write, or you're pasting an existing script. | No — click Save | | **AI Agent Wizard** | You want a custom first draft for your business, optionally from your own SOP or call-flow document. | No — click Save | | **A template** | Your use case matches one of the examples and you want to edit a working sample. | Yes — created immediately | ## Start from Blank "Create a custom AI phone agent from scratch." The editor opens with the name **New Agent**, the welcome message "Thank you for calling. How can I help you today?" on both tabs, empty instructions, a default voice, language English (US), and time zone America/Los\_Angeles. Nothing is created until you click **Save**. ## AI Agent Wizard "Describe your company type and (optionally) attach a PDF or DOCX workflow." AI writes a welcome message and a step-by-step call flow for you. 1. Click the **AI Agent Wizard** card. The template cards are replaced by the wizard form. 2. Fill in the fields below. Only the company type is required. 3. Click **Generate Agent**. It shows **Generating...** — this can take up to a minute or two, especially with a document. 4. On "Generated! Redirecting to setup...", the agent editor opens with the draft filled in. 5. Review and edit, rename the agent, then click **Save**. Click **Cancel** or **Close** to go back to the template cards. ### Wizard Fields | Field | What to enter | | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **What type of company is this?** (required) | Company name and what it does, e.g. _Bright Smiles Dental — general dentistry & implants_ or _ACME HVAC — residential heating & cooling service_. | | **Extra details (optional)** | Hours and holidays, locations and service area, transfer rules, languages, pricing/quote policy, booking rules, top FAQs, required info (e.g. VIN or year/make/model). | | **Attach PDF or Word .docx (optional)** | A workflow, call flow, or business-details document. The AI treats it as the primary source. Max 15 MB; .pdf or .docx. Click **Remove** to detach it. | | **Tone** | **Friendly** (default), **Formal**, or **Upbeat**. | ### What It Generates - **Welcome Message** — a one-line greeting. - **Instructions** — a numbered, step-by-step call flow, including transfer/escalation steps and what to do with requests the agent can't handle. The same text is placed on both the **Inbound Agent** and **Outbound Agent** tabs. It's written for callers phoning you, so rewrite the Outbound tab if the agent will place calls. Everything else — voice, knowledge base, tools, dispositions, phone numbers — uses the blank-agent defaults and is yours to set. The draft may include steps like transferring calls or booking appointments. The agent can only do those if you add the matching [tools](https://docs.vinsi.ai/tools/function) (Transfer Call, Function, etc.). Remove or adjust any step it can't perform, and check facts like prices and hours. ### Tips for Better Results - Be specific: "La Palma — Mexican restaurant (pickup & delivery)" beats "restaurant". - List the information the agent must collect, in order. - Upload a text-based PDF or DOCX. Scanned images without selectable text can't be read and are ignored. Very long documents are shortened, so put the call flow first. - Put reference facts (menus, price lists, policies) in the agent's **Knowledge Base** after generating. ## Templates Clicking a template creates and saves a new active agent straight away, then opens it in the editor. Templates fill in the name, welcome message, and instructions on the **Inbound Agent** tab. The **Outbound Agent** tab starts empty. | Template | Agent name | Set up for | | ------------------------ | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Virtual Receptionist** | Virtual Receptionist | Greeting callers for a small business, collecting name and callback number, answering simple questions, routing calls, and taking messages (recipient, message, callback time) with read-back. | | **Customer Service** | Customer Service Agent | General support: basic help with common issues, collecting order/account number and issue details for escalation, confirming, and promising follow-up. | | **Restaurant Order** | Restaurant Order Agent | Dine-in, pickup, or delivery orders for a sample restaurant: phone, name, address, items, sides, drinks and desserts, total, payment, ready time. | | **Hotel Booking** | Hotel Booking Agent | New reservations (dates, room type, guests, requests, contact), rate quotes, modifications and cancellations, 24-hour cancellation policy. | | **Car Rental** | Car Rental Agent | Pickup/drop-off, dates, vehicle class, age rules, insurance, sample daily rates, changes, and fuel/late/cancellation policies. | | **Medical Check-in** | Medical Check-in Agent | Clinic/urgent-care appointments: who the visit is for, reason, patient details, insurance, symptom screening, provider/location, date and time, what to bring. | | **Order Status** | Order Status Agent | Order lookup by order/tracking number (or name, email, ZIP), delivery status and ETA, late, missing, or damaged orders, and returns. | ### Customize a Template Templates are examples. Before going live: 1. Replace sample business names (e.g. _Matteo's Kitchen_, _Sunset Inn_, _FastCars Rental_, _QuickShip_), prices, and policies with your own. 2. The welcome messages introduce the agent as **Giselle** — change the name or choose a matching voice in [🎙 Voice](https://docs.vinsi.ai/ai-phone-agents/voices). 3. Templates tell the agent to use only English or Spanish. Edit that line if you need something different, and set **Language**. 4. Steps like taking card payments, looking up orders, or transferring calls need real [tools](https://docs.vinsi.ai/tools/function); otherwise remove them. 5. Fill in the Outbound Agent tab if you'll use **Call Me**, batch calls, or the widget's Call me. 6. Add **Dispositions** and **Call Data** so results are easy to report and act on. Because a template agent is saved immediately, closing the editor still leaves it in your list. Delete it from **AI Phone Agents** if you don't want it. ## Next Steps - Test with **Talk**, then assign a phone number — [Create your first AI Phone Agent](https://docs.vinsi.ai/getting-started/first-phone-agent). - Choose voices — [Voices](https://docs.vinsi.ai/ai-phone-agents/voices). - Add actions — [Function](https://docs.vinsi.ai/tools/function) and [DTMF](https://docs.vinsi.ai/tools/dtmf) tools. - Email or ticket results automatically — [After Call Actions](https://docs.vinsi.ai/tools/after-call-actions). - Call out — [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls) and [Batch Calls](https://docs.vinsi.ai/telephony/batchCall). - Put the agent on your site — [Website Widget](https://docs.vinsi.ai/ai-phone-agents/website-widget). ## Troubleshooting | Problem | What to do | | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | **Generate Agent** is disabled / "Please enter a company type." | Fill in **What type of company is this?** | | "Please upload a PDF or Word (.docx) file." | Convert .doc, Google Docs, or other files to PDF or DOCX. | | "File is too large. Max 15 MB." | Remove images or split the document. | | Draft ignores my document | The file probably has no selectable text (a scan). Export a text PDF or paste the key points into **Extra details**. | | "Failed to generate agent content." or another error | Try again in a minute. If it keeps failing, use **Start from blank** or a template and contact support. | | Wizard text lost after leaving the editor | Wizard and blank agents aren't saved until you click **Save**. Generate again. | --- # Voices Browse and preview the AI voices available to your agents, then give an agent one voice or a rotating set of voices. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Open **Voices** from the AI Phone Agent menu ("Browse and preview available AI voices"). The library is read-only: you listen to voices here, and you pick them for an agent in the agent editor. Every member of your organization can open the Voices page. All voices are provided by VINSI.AI, so the **Provider** column always shows **VINSI.AI**. The list includes the shared voice library plus any custom voices VINSI has added for your organization. ## Browse the Voice Library The library is a table with 10 voices per page (you can switch to 5, 25, or 50). Click a column header to sort. | Column | What it shows | | --------------- | ----------------------------------------------------------------------------------------------------------------- | | **Preview** | Play/pause button for a sample of the voice. | | **Voice Name** | The name you'll see in the agent editor. The person icon is blue for male, pink for female, and gray for unknown. | | **Gender** | Male, Female, or blank if unknown. | | **Provider** | Always VINSI.AI. | | **Description** | Style and best use (for example accent, age, or tone). Hover to read a long description. | | **Languages** | A flag for each language the voice supports. Hover a flag to see the language name. | On a phone, voices appear as cards with the name, gender, description, and a play button. ### Search and Filter - **Search by name or description...** — type part of a voice name or a word from its description, such as _British_, _calm_, or _narration_. - **Gender filter** — choose **All Genders**, **Male**, or **Female**. ### Preview a Voice Click the play button in the **Preview** column, or click anywhere on the row. Click again (pause) to stop. Only one preview plays at a time — other play buttons are disabled until the current sample ends or you stop it. Previews are high-quality audio. On a phone call the voice sounds a little narrower, so test your final choice with **Talk** or **Call Me** in the agent editor. ## Use Voices in an Agent 1. Open **AI Phone Agents** and click **Edit** on an agent (or create one). 2. Choose the **Inbound Agent** or **Outbound Agent** tab. Each direction has its own voices. 3. In the Settings panel, open **🎙 Voice**. In **AI Voices**, pick one or more voices from the list ("Select a voice..."). Remove a voice with its ×. 4. Or click **Preview** to open **Voices Preview**: the full library with search, gender filter, and play buttons. Tick the **Selected** checkbox for each voice you want, then click **Close**. 5. Click **Save**. Every agent needs at least one voice on each tab. New blank agents start with a default voice already selected. The AI Phone Agents list shows each agent's voice in the **Voice** column. The rest of the Voice section — **Allow Interruptions** and **Turn Detection Sensitivity** — is covered in [Create your first AI Phone Agent](https://docs.vinsi.ai/getting-started/first-phone-agent). ### Multiple Voices: Cycling or Random When you select two or more voices, **Voice Selection Mode** appears. The agent picks one voice when a call starts and keeps it for the whole call. | Mode | How the voice is chosen | Good for | | --------------------- | ------------------------------------------------------- | -------------------------------------------- | | **Cycling** (default) | Takes turns through your voices in order, one per call. | An even spread, e.g. A/B testing two voices. | | **Random** | Picks one of your voices at random for each call. | A natural "team of receptionists" feel. | If your welcome message or instructions give the agent a name (for example "My name is Giselle"), pick voices that fit that name and gender, or remove the name. ## Custom Voices There's no self-service voice cloning or upload. If you need a specific or cloned voice (for example your brand voice), contact VINSI support. Once it's added for your organization it appears in the Voices page and in **AI Voices** like any other voice, and only your organization can see it. ## Choosing a Voice - Check the **Languages** flags match the agent's **Language** (in 🧠 Knowledge). - Pick a calm, clear voice for support and healthcare; a brighter voice for sales and hospitality. - Use the same voice for inbound and outbound if callers should recognize your agent. - Test with a real phone call before going live. ## Troubleshooting | Problem | What to do | | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | "\[Inbound\]: At least one voice is required" (or \[Outbound\]) when saving | Select at least one voice on that tab's **🎙 Voice** section. | | "Could not play audio for …" | Try again in a moment, or check your browser isn't blocking audio for the site. | | Play buttons are grayed out | Another preview is playing. Stop it first. | | Voice list is disabled in the editor | A test call is in progress. End it to change voices. | | Voice Selection Mode is missing | It only appears when two or more voices are selected. | | "Failed to load voices" | Click **Retry** or refresh the page. | --- # Website Widget Put your AI agent on any website as a floating button. Visitors can talk to it in the browser, chat by text, or ask it to call their phone. Created: September 16, 2026 Updated: September 16, 2026 ## Overview The widget is configured per agent in the agent editor, under **🌐 Website Widget** in the Settings panel. You choose the channels, list the websites allowed to show it, then copy a short code snippet into your site. The button opens a panel with your agent's name and a _Powered by VINSI.AI_ footer. New to the agent editor? Start with [Create your first AI Phone Agent](https://docs.vinsi.ai/getting-started/first-phone-agent). ## Before You Start - **Save the agent.** Until it's saved, the section shows "Save your agent first to generate the widget embed code." - Give it a **Welcome Message** and **Instructions**, and test it with **Talk**. - Widget voice calls and Call me callbacks use your organization's minutes like any other call. - For **Call me**, assign a phone number to the agent under **☎️ Telephony** (see [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls)). ## Choose Channels Under **Channels**, turn on any combination. New agents start with Voice only. | Channel | What the visitor does | Uses | | ------------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | **Voice** | Clicks the microphone and talks with the agent in the browser (microphone permission required). | The agent's voice, welcome message, and instructions | | **Text chat** | Types messages and reads the agent's replies. | **Chat instructions**, or the voice instructions if empty | | **Call me** | Enters a phone number and gets a call from the agent right away. | The agent's **Outbound Agent** tab | With more than one channel on, the panel shows **Voice**, **Text**, and **Call me** buttons so visitors can switch. It opens on Voice first, then Text, then Call me. ### Chat Instructions Appears when **Text chat** is on. These instructions are used only in text chat, so you can drop voice-only guidance (like spelling things out loud) and ask for short, well-formatted replies. Leave it empty to reuse the agent's main instructions. Click the expand button for the full-screen **Edit Chat Instructions** editor. ### Starter Messages Appears only when **Text chat** is the _only_ channel. Starter messages are tappable suggestions shown under the greeting, e.g. _Book a service_, _Get a quote_, _Ask a question_. - One per line, up to **4**; each is cut to 40 characters. - Leave empty and suggestions are generated from the agent's instructions. - In chat-only mode the panel opens with the agent's **Welcome Message** as the first chat bubble. ## Allowed Domains List every website where the widget may appear — one per line or separated by commas. The helper text shows how many entries you have. If **Allowed domains** is empty, the widget won't load anywhere. This protects your agent (and your minutes) from being embedded on other people's sites. | Entry | Allows | | ---------------- | ------------------------------------------------------------------------ | | acme.com | https://acme.com and any subdomain such as www.acme.com or shop.acme.com | | support.acme.com | That subdomain and its own subdomains only | | localhost:3000 | Local testing on that exact port | - Enter the host only. `https://` and any path are ignored. - Plain domain entries require your site to use HTTPS. - Click **Save** on the agent after changing domains. Changes apply on the next page load of your website. ## Get the Embed Code 1. Click **Get Widget Embed Code** to open **Embed Widget on Your Website**. 2. Under **Customize Your Widget**, set the options below. The **Preview** shows the button. 3. Click **Copy Code** ("Embed code copied to clipboard!"). | Option | Choices | Default | | ---------------- | -------------------------------------------------------------------------- | ----------- | | **Button Text** | Any short label | Let's Talk | | **Button Color** | Color picker or hex code | #000000 | | **Button Shape** | Pill (Fully Rounded), Rounded Corners, Square, Circle (icon only, no text) | Pill | | **Shadow** | Add shadow to button | On | | **Button icon** | Chat bubble or Phone | Chat bubble | The copied code looks like this (your agent ID is filled in): Embed code ``` ``` Channels, instructions, starter messages, and allowed domains are read live from the agent, so you don't need to re-copy the code after changing them. Re-copy only if you change the button's look. ## Install on Your Website 1. Add your site's domain to **Allowed domains** and save the agent. 2. Paste the code before the closing `` tag of your website — in your site template or footer so it appears on every page. 3. Publish your site, open it in a new tab, and click the button to test each channel. | Platform | Where to paste | | ------------------- | ------------------------------------------------------------------------------------------ | | WordPress | A footer-scripts plugin or your theme's footer (Custom HTML block works for a single page) | | Wix / Squarespace | Custom code / code injection, placed in the footer (body end), on all pages | | Webflow | Project Settings → Custom Code → Footer Code | | Shopify | Online Store → Themes → Edit code → theme.liquid, before | | Custom site / React | Your main HTML template before | ## What Visitors See - A floating button in the bottom-right corner of every page. - **Voice** — "Click to talk", then "Connecting..." and "Call in progress". The red button hangs up. - **Text** — "Type your message..." and **Send**. After 3 minutes without a message the chat ends ("Conversation ended"). - **Call me** — "Leave your number and we'll call you right away." - Closing the panel with × ends the voice call or chat. ### How Call Me Works 1. The visitor enters a US/Canada phone number and clicks **Call me**. 2. VINSI immediately places an outbound call using the agent's **Outbound Agent** tab — its welcome message, instructions, voice, and voicemail message — from the agent's default outbound number (**Set as default** under ☎️ Telephony). 3. The visitor sees "Great! We're calling you now at …" and their phone rings. Fill in the Outbound Agent tab before enabling Call me — write the welcome message as a callback ("Hi, this is Giselle from Acme returning your request from our website…"). Numbers on your Do Not Call list are not called. ## Conversations and Follow-up Widget conversations appear in [Call Logs](https://docs.vinsi.ai/telephony/callLogs). Text chats are saved when they end, with a summary, a disposition chosen from the agent's **Dispositions**, and any **Call Data** fields found in the chat. They also trigger the agent's **After Call Webhook**, so [After Call Actions](https://docs.vinsi.ai/tools/after-call-actions) (emails and tickets) work for chats too. ## Troubleshooting | Problem | What to do | | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | | Button shows but the panel is blank or refuses to connect | Your site's domain isn't in **Allowed domains** (or the list is empty). Add it, save the agent, and reload your site. | | Works on www. but not another host | Add the parent domain (e.g. acme.com) so all subdomains are allowed. | | Doesn't work on an http:// site | Use HTTPS. Browsers also block the microphone on insecure pages. | | No button at all | Check the snippet is in the published page (view source), the script tag is included, and agent-id is correct. | | "Unable to Connect" / "Origin not allowed" | Allowed domains problem — see the first row. | | "Agent not found or inactive" | The agent was deleted or deactivated. Use an active agent's embed code. | | Voice: nothing happens after "Click to talk" | The visitor must allow microphone access in the browser. | | Call me shows an error under the number (e.g. "Could not place the call") | Assign a phone number to the agent and set a default outbound number, then try again. | | Call me: button stays disabled | Enter a complete 10-digit US/Canada number. | | Starter messages don't show | They only show when Text chat is the only channel, before the visitor sends a message. | | Chat answers sound like a phone script | Write **Chat instructions** for text. | --- # Setting Up Phone Numbers & SIP Trunks Learn how to purchase phone numbers, assign AI agents, or connect your own SIP trunk to handle inbound and outbound calls in VINSI.AI. Created September 18, 2025 · Updated September 16, 2026 ## Phone Numbers VINSI.AI allows you to purchase and manage phone numbers directly from the dashboard. Open **Phone Numbers** in the AI Phone Agent product (it is also available under **CRM → Admin → Phone Numbers**). The page subtitle reads "Manage your phone numbers and agent assignments". The table lists **Phone Number**, **Trunk**, **Agent**, **Date Added**, and **Actions**. Use the search box ("Search by phone number or agent...") to find a number. The Trunk badge shows your own trunk name, or **VINSI.AI AGENT**, **VINSI.AI PHONE**, or **VINSI.AI FAX**. 1. Click ![Get Phone Number](https://docs.vinsi.ai/images/ai-phone-agents/symbols/phone-numbers/get-phone-number.svg) to purchase a new phone number 2. Enter a 3-digit **Area Code** 3. Click **Search Available Numbers** 4. Optionally narrow the results with "Filter by city or state…" 5. Click a number, then click **Subscribe & Buy ($3/mo)** 6. Complete the Stripe checkout. Once purchased, the phone number will appear in the phone numbers table Numbers cost $3/month each, and you can cancel anytime. Buttons on this page require an organization admin or the phone\_numbers write permission. ## Assign AI Agent A number doesn't have to be assigned to an AI agent—it can also be a member's line, a hunt group, a queue, or a fax number. See [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers) for those uses. To have an AI agent answer a number: 1. Locate the phone number in the phone numbers table 2. Use the dropdown in the **Agent** column 3. Select the AI agent you want to assign (choose **No Agent** to clear it) 4. The selected agent will now manage calls for that number **Note:** If the number is already in use, you'll see "This number is in use". Click **Assign agent anyway** to assign it regardless. ## Number Actions | Action | Notes | | ----------------------------- | ---------------------------------------------------------------------- | | **Edit SIP Trunk** | Manually configured SIP trunks | | **Set Caller-ID Name (CNAM)** | Telnyx numbers | | **Repair routing** | Telnyx numbers with an agent assigned | | **Release Phone Number** | Paid numbers also cancel their subscription. Unassign the agent first. | ## Using Your Own SIP Trunk If you prefer to use your own SIP infrastructure instead of purchasing a phone number, you can connect a SIP trunk. 1. Click ![Add SIP Trunk](https://docs.vinsi.ai/images/ai-phone-agents/symbols/phone-numbers/add-sip-trunk.svg) from the Phone Numbers section 2. Fill in the **Configure SIP Trunk** fields: ![Configure SIP Trunk modal](https://docs.vinsi.ai/images/ai-phone-agents/vinsi-screenshots/configure-sip-trunk.png) - **Trunk Name** (required) — a label to identify this SIP trunk in your account - **Phone Number** (required) — enter the number in E.164 format (e.g. `+18001234567`) - **Inbound Call Setup** — to receive inbound calls, set your **Origination SIP URI** at your provider to the URI shown in the modal, with **weight = 1** and **priority = 1** - **SIP Termination URI** (required) — the SIP URI where outbound calls will be terminated (e.g. `sip:example.com:5060`) - **SIP Username / SIP Password** (optional) — credentials if your provider requires authentication 3. Click **Configure Trunk** to save and activate the SIP trunk To change a trunk later, use **Edit SIP Trunk** and click **Save Changes**. Leave the password blank to keep the current one. For more details, see the related article: [Elastic SIP Trunking With Twilio](https://docs.vinsi.ai/ai-phone-agents/elastic-sip-trunking). --- # SIP Trunking Learn what SIP trunking is, how it works in VINSI.AI, and how to configure trunks for inbound and outbound calling. Created April 18, 2025 · Updated April 22, 2025 ## What Is SIP Trunking SIP trunking (Session Initiation Protocol trunking) is a digital method for making and receiving phone calls over the internet instead of traditional phone lines. It allows businesses to connect their communications systems to the Public Switched Telephone Network (PSTN) using IP-based infrastructure, enabling scalable, flexible, and cost-effective voice communication. For a deeper technical explanation, refer to our custom telephony guide. ## VINSI SIP Endpoint When configuring SIP trunking with VINSI.AI, you will use the following SIP endpoint: SIP Endpoint `sip:lk.vinsi.ai` This endpoint is used to route SIP traffic between your communications infrastructure and VINSI.AI. ## Terms and Definitions ### Trunk Name The Trunk Name is a unique identifier assigned to a SIP trunk. It helps distinguish between multiple trunks within VINSI.AI and simplifies management and configuration. You can choose any descriptive name that fits your organization, such as `MainOfficeTrunk` or `SalesDeptTrunk`. ## SIP Termination URI A SIP Termination URI (Uniform Resource Identifier) is the address used by your communications system to route outbound SIP traffic to a SIP trunk provider. This URI acts as the destination endpoint for calls leaving your system and being sent to the PSTN through the SIP trunk. ## Authentication (Username & Password) Authentication credentials are optional depending on your call flow. - **Inbound-only calls:** Username and password are not required - **Outbound calls:** Username and password are recommended Note: It is possible to use an unsecured termination URI without authentication. This configuration should only be used when appropriate security controls are in place. --- # Batch Call Run outbound call campaigns that reach a large contact list automatically using AI-powered phone agents. [Ready to launch a batch call campaign?Click here to see how to set up a batch call — step by step.](https://docs.vinsi.ai/step-guides/batch-call) Created: June 3, 2025 Updated: September 16, 2026 ## Overview A batch call dials a list of recipients with one of your outbound AI agents. You can send the calls right away, schedule them for specific days and times, or spread them out over time with progressive pacing and automatic retries. Batch Call Form ![/images/batch-call-form.png](https://docs.vinsi.ai/images/batch-call-form.png) ## Getting Started Prerequisites: - An AI agent with outbound configured. See [Outbound Calls](https://docs.vinsi.ai/telephony/outboundCalls). - A phone number assigned to that agent that can call out. See [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers). To open Batch Calls: 1. Open the **AI Phone Agent** product. 2. In the top navigation, select **Batch Calls** (`/batch-calls`). 3. Click **New Batch Call** to open the **Create Batch Call** form. ## Batch Calls List The **Batch Calls** page ("Manage outbound call campaigns") lists every campaign in your organization. Use the **Search by name, agent or phone...** box to find a batch. | Column | Description | | --------------------- | -------------------------------------------------------- | | **ID** | Batch identifier, e.g. B-123. | | **Name** | The batch call name. | | **Phone Number** | The caller ID used for the calls. | | **Agent** | The outbound AI agent placing the calls. | | **Start At / End At** | The scheduled date range. | | **Time / End Time** | The daily start and end times. | | **Scheduled Days** | The weekdays the batch runs on. | | **Status** | Scheduled, Running, Completed, or Canceled. | | **Progress** | How far the batch has progressed through its recipients. | | **Actions** | Row actions (see below). | Row actions: - **Edit Batch Call** — you can also click the row. - **View Contacts** — see each recipient and its send status. - **View call tracking** — available for batches that use progressive pacing only. - **Delete Batch Call** Editing or deleting a batch call requires an organization admin or the `batch_calls` write permission. ## Create Batch Call Form The form fields appear in this order: 1. **Batch Call Name** (required). 2. **Outbound Agent** (required, "Select an Agent"). Each option is a phone number shown as _Agent Name - (xxx) xxx-xxxx_. Picking one sets both the agent and the caller ID. Only numbers with an assigned agent and outbound capability appear. 3. **Enable Voicemail Detection** (off by default). When checked, a **Voicemail Message** text box appears. 4. **Add Recipients** — Upload CSV (default), HubSpot, Salesforce, GoHighLevel, VinsiSaaS CRM, or External Source. See [Recipients](https://docs.vinsi.ai/telephony/batchCall#batchCall-recipients). 5. **When to send the calls** — **Send Now** (default) or **Schedule**. See [Scheduling](https://docs.vinsi.ai/telephony/batchCall#batchCall-schedule). 6. **Spread calls over time (progressive pacing)** — available for one-time batches only (no weekdays selected). See [Progressive Pacing](https://docs.vinsi.ai/telephony/batchCall#batchCall-pacing). 7. **Reserved Concurrency for Other Calls** — stepper, default 1, minimum 1, maximum 5. Form footer buttons: - **Warm up agent** (optional) — pre-loads the agent so it is ready in about 5–10 seconds. - **Save Batch Call** ## Recipients Choose a source under **Add Recipients**: - Upload CSV (default) - HubSpot - Salesforce - GoHighLevel - VinsiSaaS CRM - External Source ### Upload CSV 1. Click **Download the template** to get `template.csv`. Its headers are exactly `name,phoneNumber`. 2. Click **Choose a csv file** and select a `.csv` file (up to 50mb). 3. Review the file in the editable grid. Use **Add column** and **Add row** to add data, and right-click to delete a row or column. The `name` and `phoneNumber` columns can't be deleted. 4. Click **Save CSV changes**. Saving is blocked while any header or cell is empty. 5. Confirm the **Recipients Loaded: N** count matches your list. Extra columns become per-recipient variables for the agent. Avoid commas inside values. ### HubSpot 1. Select **HubSpot** under Add Recipients. 2. If HubSpot isn't connected yet, click **Connect to HubSpot** (Settings → HubSpot). Batch Call Form ![/images/batch-call-hubspot-connect.png](https://docs.vinsi.ai/images/batch-call-hubspot-connect.png) 3. Once connected, choose a **Pipeline** and **Stage** (both required). 4. Click **Fetch Contacts**. The form shows **Contacts imported: N**. ### Salesforce 1. Select **Salesforce** under Add Recipients and click **Connect to Salesforce** if needed. 2. Choose the **Object Filter**. 3. Click **Add Filter** to add filter rows. Each row has **Field**, **Operator**, **Parameter**, and **Remove**. Operators: Equals, Not Equals to, Greater Than, Less or equals, Greater or equals, Includes. 4. With two or more filters, enter **Filter Logic** (for example `1 and 2`) and click **Apply**. 5. Set **Include Do Not Call Clients** to Yes or No (default No). 6. Click **Get Contacts from {object}** to load contacts. Use **Save Filter** to keep the filter. ### GoHighLevel 1. Select **GoHighLevel** under Add Recipients and click **Connect to GoHighLevel API** if needed. 2. Click **Get Contacts** and select the contacts to call. 3. The form shows **Contacts selected: N**. GoHighLevel requires the agent's **GoHighLevel Sub-Account ID** to be set in the agent's Integration section. ### VinsiSaaS CRM 1. Select **VinsiSaaS CRM** under Add Recipients and click **Connect to Vinsi CRM API** if needed. 2. Click **Add Contacts** to open **Contacts from CRM** (Contact, Title, Phone, Email). 3. Tick the contacts you want and click **Add Contacts**. ### External Source 1. Select **External Source** under Add Recipients. 2. Fill in the request settings: server URL (required), method, headers, parameters, and timeout. 3. Click **Execute request**. Warning: Dialing phone numbers automatically without prior consent violates FCC regulations and may result in penalties. ## Scheduling Under **When to send the calls**, **Send Now** is the default. Choose **Schedule** to set: - **Start Date** (required, today or later) - **Has End Date** — reveals **End Date** - **Start Time** and **End Time** (required) - **Select Time Zone** (required) - **Select the days** — Mon through Sun, within the date range ## Progressive Pacing Check **Spread calls over time (progressive pacing)** to dial in waves instead of all at once. Pacing is available for one-time batches only (no weekdays selected). | Setting | Default | Description | | -------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------- | | **Contacts per wave** | 50 | How many contacts are dispatched in each wave. | | **Every (minutes)** | 60 | Time between waves. | | **Only dispatch within a daily time window** | 09:00–18:00 | Uses the batch time zone. Contacts outside the window wait; they are not skipped. | | **Distribute by day of week** | Optional | Click **Add day** and set a weekday and quota. | | **Retry if disposition is** | Empty | Comma-separated dispositions, e.g. _No Answer, Voicemail, Busy_. Leave empty for no retries. | | **Retry after (hours)** | 2 | Delay before a retry. | | **Max attempts per contact** | 2 | Upper limit on attempts for each contact. | When using day-of-week rules, choose what happens when a contact was already attempted on an earlier rule day: - **Distribute** — each contact is called once. - **Repeat** — on repeat days, choose **Only retry contacts who didn't answer (recommended)** or **Call everyone again**. ## Monitoring While a batch is running, the form shows "The batch call is executing..." with a progress bar and a **Cancel Execution** button. **Save Batch Call** is disabled while the batch runs. Batches can't be paused — only canceled. **View Contacts** shows each recipient with a status of **Sent**, **DNC Skipped**, or **Error**. **View call tracking** (pacing batches only) shows each contact's progress. Filter by status: Pending, Queued, Dispatched, Answered, No Answer, Retry Scheduled, DNC, Max Attempts, Error. | Column | | ---------------- | | Name | | Phone Number | | Status | | Attempts | | Wave | | Last Disposition | | Last Attempt | | Next Attempt | ## Results & Reports - [Call Logs](https://docs.vinsi.ai/telephony/callLogs) — filter by **Batch** and use **Export**. - **Dashboard** — filter by batch (`B-###`). - **Dashboard → Reports** — **Batch Campaign Summary** and **Batch Call Detail**, both with **Export to Excel**. ## Do Not Call Numbers listed in **CRM Admin → Do Not Call Registry** are skipped and show as **DNC Skipped** in View Contacts. --- # Connecting Your Phone System How VINSI AI agents connect to the phone numbers and phone systems you already use — Twilio, Telnyx, Mitel, 3CX and Zoom Phone. Created: September 18, 2026 Updated: September 18, 2026 ## Overview An AI agent needs a phone number that callers can reach, and a way to hand calls to your people. You can give it a number from VINSI, connect a number you already have with a carrier, or connect the phone system your team already works in. Which route suits you depends mostly on **where your numbers live today** and **whether the AI needs to reach your staff by extension**. ## Ways to Connect | Method | What it is | Set up by | | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | | **A number from VINSI** | Buy a number in **Phone Numbers → Add Phone Number**. It runs on the Telnyx network and is ready to use straight away. | You, in a few minutes | | **SIP trunk from your carrier** | Keep your number with your own carrier account (Twilio, Telnyx and similar) and connect it with **Phone Numbers → Add SIP Trunk**. | You, following the carrier guide | | **Phone system through VINSI's SBC** | A SIP connection between your office phone system and VINSI's Session Border Controller, so the AI can transfer to extensions and call out through your system. | VINSI, with your phone system admin | | **Call forwarding** | Your phone system forwards incoming calls to a VINSI number. No SIP setup at all. | Your phone system admin, in minutes | ## Which One Fits | You use | Recommended route | AI transfers to | Guide | | ---------------------------- | ------------------------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------ | | Nothing yet | A number from VINSI | Any phone number | [Setting Up Phone Numbers](https://docs.vinsi.ai/ai-phone-agents/setting-up-phone-numbers) | | Twilio | SIP trunk (Elastic SIP Trunking) | Any phone number | [Twilio](https://docs.vinsi.ai/ai-phone-agents/elastic-sip-trunking) | | Telnyx (your own account) | SIP trunk | Any phone number | [Telnyx](https://docs.vinsi.ai/phone-connections/telnyx) | | Mitel MiVoice Business / MBG | Phone system through VINSI's SBC | Extensions and phone numbers | [Mitel](https://docs.vinsi.ai/phone-connections/mitel) | | 3CX | Call forwarding, or VINSI's SBC for extension transfers | Phone numbers (extensions with the SBC route) | [3CX](https://docs.vinsi.ai/phone-connections/3cx) | | Zoom Phone | Call forwarding | Direct numbers and call-queue numbers | [Zoom Phone](https://docs.vinsi.ai/phone-connections/zoom) | ## Terms Used on These Pages | Term | Meaning | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | SIP trunk | An internet phone line between two phone systems. See [What is SIP Trunking?](https://docs.vinsi.ai/ai-phone-agents/what-is-sip-trunking) | | Origination | Calls coming _in_ from the phone network. Your carrier sends them to VINSI's address. | | Termination | Calls going _out_ to the phone network. VINSI sends them to your carrier's address. | | SBC | Session Border Controller — a SIP gateway that sits between two phone systems and handles security, addressing and audio. | | DID / direct number | A phone number that reaches one person or queue directly, rather than an internal extension. | | E.164 | The full international number format VINSI uses, e.g. +18005551234. | ## Current Limits - **SIP trunks take US and Canada numbers.** The Add SIP Trunk form accepts `+1` followed by 10 digits. Contact VINSI if you need to connect numbers from other countries. - **Phone system connections through the SBC are set up with VINSI.** They aren't self-service yet, because each system needs its dial plan and security matched on both sides. - **Call forwarding covers incoming calls only.** The AI transfers and dials out through VINSI, so it reaches your staff on their full phone numbers rather than internal extensions. --- # Connect Twilio (Elastic SIP Trunking) Keep your phone numbers in your own Twilio account and let VINSI AI agents answer and make calls on them. Created: August 26, 2025 Updated: September 18, 2026 ## Overview A Twilio Elastic SIP Trunk connects your Twilio numbers to VINSI in both directions: Twilio sends incoming calls to VINSI (**origination**), and VINSI sends the AI's outgoing calls and transfers out through Twilio (**termination**). The number stays in your Twilio account and on your Twilio bill. Not on Twilio? See [Connecting Your Phone System](https://docs.vinsi.ai/phone-connections/overview) for the other options. ## Before You Start - A Twilio account with at least one voice-capable US or Canada number. - A VINSI AI agent to answer the number. See [Create an AI Phone Agent](https://docs.vinsi.ai/ai-phone-agents/create-agent). - Open VINSI's **Phone Numbers** page and click **Add SIP Trunk**. The **Configure SIP Trunk** window shows your **Origination SIP URI** under _Inbound Call Setup_ — keep it open, you'll need it in step 3. ## 1\. Create the Trunk 1. Log in to the [Twilio Console](https://console.twilio.com). 2. Find **Elastic SIP Trunking** in the left menu (or search for it) and click **Manage** → **Trunks**. 3. Create a new trunk and give it a name you'll recognise, such as _VINSI AI_. 4. Under **General Settings**, turn on **Call Transfer (SIP REFER)** so the AI can hand calls to your team, and **Call Recording** if you want Twilio to keep its own recordings. 5. Click **Save**. ![/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step1.png](https://docs.vinsi.ai/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step1.png) ## 2\. Termination (Outbound) This is the address VINSI uses to send calls out through Twilio. 1. Open the trunk's **Termination** tab. 2. Choose a **Termination SIP URI**, for example `vinsi-acme.pstn.twilio.com`. Note it down — this is the value for VINSI's **SIP Termination URI** field. 3. Under **Authentication**, create a **Credential List** with a username and password, and attach it to the trunk. 4. Click **Save**. **Use a Credential List, not an IP Access Control List.** VINSI's outgoing calls don't always come from the same IP address, so IP-only authentication will reject some calls. Save the password somewhere safe — Twilio won't show it again. ![/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step2.png](https://docs.vinsi.ai/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step2.png) ## 3\. Origination (Inbound) This tells Twilio where to send calls that come in on your number. 1. Open the trunk's **Origination** tab and click **Add new Origination URI**. 2. Paste the **Origination SIP URI** from VINSI's Configure SIP Trunk window. Keep the `sip:` at the start. 3. Set **Priority** to **1** and **Weight** to **1**. 4. Click **Add**. ![/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step5.png](https://docs.vinsi.ai/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step5.png) ## 4\. Add Your Number 1. Open the trunk's **Numbers** tab and click **Add a Number**. 2. Pick an existing Twilio number, or buy one. Calls to it now go through the trunk instead of any webhook it used before. ![/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step5-1.png](https://docs.vinsi.ai/images/ai-phone-agents/vinsi-screenshots/sip-twilio-step5-1.png) ## 5\. Connect It in VINSI Back in VINSI's **Configure SIP Trunk** window, fill in: | Field | What to enter | | ------------------- | ---------------------------------------------------------------------------------------------------- | | Trunk Name | Any name, e.g. _Twilio – Main line_. | | Phone Number | Your Twilio number in full format, e.g. +18005551234. | | SIP Termination URI | Your Twilio termination address from step 2 with sip: in front, e.g. sip:vinsi-acme.pstn.twilio.com. | | SIP Username | The Credential List username from step 2. | | SIP Password | The Credential List password from step 2. | 1. Click **Configure Trunk**. The number appears in your list. 2. Assign it to an agent. See [Setting Up Phone Numbers](https://docs.vinsi.ai/ai-phone-agents/setting-up-phone-numbers). ## 6\. Test - **Incoming:** call the number from your mobile. The AI agent should answer. - **Outgoing:** open the agent and click **Call Me** to have the AI ring your phone. - **Transfer:** ask the AI to transfer you, and check the call reaches the right person. Each test call appears in **Call Logs** with its recording and transcript. ## Troubleshooting | Problem | Check | | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Incoming calls don't reach the AI | The number is on the trunk's Numbers tab; the Origination URI matches VINSI's exactly, including sip:; the number is assigned to an agent in VINSI. | | The AI can't call out | The Credential List is attached to the trunk's Termination; the username and password in VINSI match it; the Termination URI in VINSI matches Twilio's, with sip: in front. | | Calls to some countries fail | Turn those destinations on in Twilio's **Voice Geographic Permissions**. | | Transfers don't connect | **Call Transfer (SIP REFER)** is enabled in the trunk's General Settings. | | _Please enter a valid E.164 format phone number_ | Enter the number as +1 followed by 10 digits. The form takes US and Canada numbers. | | _Please enter a valid SIP URI_ | Start the Termination URI with sip:, with no spaces, e.g. sip:vinsi-acme.pstn.twilio.com. | --- # Connect Telnyx Use Telnyx numbers with VINSI AI agents — either numbers you buy inside VINSI, or numbers in your own Telnyx account. Created: September 18, 2026 Updated: September 18, 2026 ## Overview VINSI's own phone numbers run on the Telnyx network, so there are two situations: | Your numbers are… | What to do | | -------------------------- | ---------------------------------------------------------------------------------------- | | Bought in VINSI | Nothing to connect. They're already on Telnyx and fully set up. | | In your own Telnyx account | Connect them with a SIP trunk, below. They stay in your account and on your Telnyx bill. | ## Numbers Bought in VINSI On the **Phone Numbers** page, click **Add Phone Number**, search by area code, and pick a number. Each number is **$3/month**, billed separately. VINSI sets up incoming calls, outgoing calls and call recording for you. Then assign it to an agent — see [Setting Up Phone Numbers](https://docs.vinsi.ai/ai-phone-agents/setting-up-phone-numbers). Numbers hosted by VINSI are signed with the highest STIR/SHAKEN verification level, which helps keep outgoing calls from being labelled “Spam Likely”. ## Your Own Telnyx Account You'll create a SIP connection in Telnyx that sends incoming calls to VINSI and lets VINSI place outgoing calls with a username and password. Before you start, open VINSI's **Phone Numbers** page and click **Add SIP Trunk**: the **Configure SIP Trunk** window shows your **Origination SIP URI** under _Inbound Call Setup_. Telnyx renames its portal menus from time to time. If a label below doesn't match, look for the setting described next to it — the values you need don't change. ### 1\. Set Up the Telnyx Connection 1. In the [Telnyx Portal](https://portal.telnyx.com), go to **Voice → SIP Trunking** and create a new connection named, for example, _VINSI AI_. 2. **Inbound:** set the connection to deliver calls to the host in VINSI's Origination SIP URI (the part after `sip:`), on port 5060. 3. **Outbound:** turn on **credential authentication** and set a username and password. Save the password somewhere safe. 4. Create or choose an **Outbound Voice Profile** that allows the countries you'll call, and assign the connection to it. Telnyx won't place outgoing calls on a connection without one. **Authenticate with a username and password, not by IP address.** VINSI's outgoing calls don't always come from the same IP address, so IP-only authentication will reject some calls. ### 2\. Point Your Number at It In **Numbers → My Numbers**, open your number and set its connection to the one you just created. ### 3\. Connect It in VINSI In VINSI's **Configure SIP Trunk** window, fill in: | Field | What to enter | | ------------------- | ----------------------------------------------------- | | Trunk Name | Any name, e.g. _Telnyx – Main line_. | | Phone Number | Your Telnyx number in full format, e.g. +18005551234. | | SIP Termination URI | sip:sip.telnyx.com | | SIP Username | The username from step 1. | | SIP Password | The password from step 1. | Click **Configure Trunk**, then assign the number to an agent — see [Setting Up Phone Numbers](https://docs.vinsi.ai/ai-phone-agents/setting-up-phone-numbers). ### 4\. Test - **Incoming:** call the number from your mobile. The AI agent should answer. - **Outgoing:** open the agent and click **Call Me** to have the AI ring your phone. - **Transfer:** ask the AI to transfer you, and check the call reaches the right person. Each test call appears in **Call Logs** with its recording and transcript. ## Troubleshooting | Problem | Check | | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Incoming calls don't reach the AI | The number is assigned to the new connection in Telnyx; the connection sends inbound calls to VINSI's origination host; the number is assigned to an agent in VINSI. | | The AI can't call out | The connection has an Outbound Voice Profile; credential authentication is on; the username and password in VINSI match. | | Calls to some countries fail | Add those destinations to the Outbound Voice Profile's allowed countries. | | _Please enter a valid E.164 format phone number_ | Enter the number as +1 followed by 10 digits. The form takes US and Canada numbers. | --- # Connect Mitel Link a Mitel MiVoice Business system to VINSI so AI agents can transfer to your extensions and call out through your own lines. Created: September 18, 2026 Updated: September 18, 2026 ## Overview VINSI connects to Mitel through a SIP trunk between your Mitel system (usually through a MiVoice Border Gateway) and VINSI's Session Border Controller (SBC). Because the dial plan and security have to match on both sides, **this connection is set up together with the VINSI team** rather than from a form. This page explains what's involved so your Mitel administrator knows what to expect. ## What You Can Do | Capability | Detail | | ---------------------------------- | ---------------------------------------------------------------------------------------------------------- | | Transfer to extensions | AI agents transfer callers straight to a Mitel extension (2 to 6 digits), with hold music while it rings. | | Call extensions | An agent can place a call to an extension, for example to reach an on-call person. | | Outbound calls with your caller ID | Optionally, the AI's outside calls go out through your Mitel, so recipients see your company's own number. | | Encrypted signalling | SIP over TLS between your system and VINSI. | Callers reach the AI on a VINSI number or a carrier number connected to VINSI. To send your existing main number to the AI, have your Mitel route or forward it to that number. See [Connecting Your Phone System](https://docs.vinsi.ai/phone-connections/overview) for the options. ## How It Connects 1. The AI agent decides to transfer or dial, for example to extension 2150. 2. VINSI sends the call to its SBC, which signs in to your trunk and translates the number into your dial plan. 3. Your Mitel receives the call on the trunk and rings the extension, or dials out to the phone network. Your system only ever talks to VINSI's SBC, at a fixed address you can lock the trunk to. VINSI provides that address during setup. ## What VINSI Needs From You | Item | Example / notes | | ----------------------------------------------------------- | -------------------------------------------------------------------- | | Public address of your SIP peer (MBG) | A public IP address or hostname that VINSI's SBC can reach. | | Port and transport | TLS on port 5061 is recommended. UDP on 5060 also works. | | Extension range | For example 2000–2999, and any extensions that should be off-limits. | | Outside dialling format (if the AI calls out through Mitel) | How your system expects outside numbers, e.g. 9 \+ 1 \+ 10 digits. | | Caller ID to present | The number recipients should see on outside calls. | | A test extension | An extension someone can answer during testing. | | A technical contact | Someone who can make trunk changes during the test window. | ## What Your Mitel Admin Configures - **A SIP trunk / SIP peer** to VINSI's SBC, authenticated by its IP address. - **Direct dial-in to extensions.** Calls arriving on the trunk must reach the extension number as sent. If the trunk strips or “absorbs” digits, calls fail with _Number Unobtainable_. - **Class of Restriction (COR)** for the trunk that allows what you want the AI to do — internal calls only, or local and long-distance too. - **Codec G.711 μ-law (PCMU).** - **Public addressing on the MBG.** The gateway should advertise its public address, not its internal LAN address, in its SIP messages. - If using TLS, trust VINSI's certificate authority (Let's Encrypt) rather than pinning a single certificate, which renews every few months. ## Firewall Settings **Turn off the SIP helper (SIP ALG) on the firewall in front of your Mitel**, or use TLS so the firewall can't read the SIP traffic. Firewall SIP helpers — FortiGate's “session helper” is a common one — rewrite call details in flight and cause some calls to have no audio, one-way audio, or to drop after about 30 seconds. - Allow SIP from VINSI's SBC address on the trunk port (5061 for TLS, or 5060). - Allow the RTP audio port range your MBG uses, in both directions. ## Setup Steps 1. Send VINSI the details in [What VINSI Needs From You](https://docs.vinsi.ai/phone-connections/mitel#mitel-need). 2. VINSI sends back the SBC address and configures its side of the trunk. 3. Your admin builds the trunk, COR and firewall rules above. 4. Test together: VINSI rings your test extension; someone answers and confirms two-way audio. 5. If the AI will call out through Mitel, test an outside call and check the caller ID shown. 6. Add transfers to extensions in your agents (below), then run a live test call. ## Using Extensions in Your Agents **Only use extension numbers after VINSI confirms your trunk is live.** Extension transfers are switched on per account as part of setup. Once it is, enter an extension anywhere an agent asks for a transfer destination — just the digits, for example `2150`, with no `+` or area code. VINSI routes any 2–6 digit destination over your trunk. Full phone numbers still go out as normal calls. See [Create an AI Phone Agent](https://docs.vinsi.ai/ai-phone-agents/create-agent) for where transfer destinations are set. ## Troubleshooting | Symptom | Usual cause | | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | 404 _Number Unobtainable_ when dialling an extension | The trunk is stripping digits, or isn't allowed to dial in to extensions. | | Some calls have no audio, or audio one way only | A firewall SIP helper is rewriting the call. Turn it off, or switch the trunk to TLS. | | Calls drop after about 30 seconds | The MBG is advertising its internal address, or a firewall SIP helper is blocking call acknowledgements. | | Answered calls have dead air | A firewall SIP helper is blocking call set-up messages. Turn it off, or use TLS. | | 486 busy on outside calls only | The trunk's COR doesn't allow that kind of call (often long distance). | | Calls stop working right after moving to TLS | Re-associate the TLS connection with the IP-authorised trunk on the Mitel side. | | No calls get through at all | A firewall or intrusion-prevention rule is blocking VINSI's SBC address. Check allowed and blocked lists on both sides. | --- # Connect 3CX Put a VINSI AI agent in front of your 3CX phone system — by forwarding calls, or with a SIP trunk for transfers to extensions. Created: September 18, 2026 Updated: September 18, 2026 ## Overview 3CX can hand calls to a VINSI AI agent in two ways. Most teams start with **call forwarding**, which takes minutes and needs no SIP configuration. If you need the AI to transfer callers to 3CX **extensions**, the two systems are linked with a SIP trunk through VINSI's Session Border Controller (SBC), set up together with the VINSI team. ## Choose a Route | | Call forwarding | SIP trunk through VINSI's SBC | | ------------------ | -------------------------------------------------------------- | --------------------------------------- | | Setup | Your 3CX admin, a few minutes | VINSI and your 3CX admin together | | Calls in to the AI | Yes | Yes | | AI transfers to | Full phone numbers (DIDs, ring groups or queues with a number) | 3CX extensions and phone numbers | | AI calls out using | A VINSI number | A VINSI number, or your 3CX lines | | Best for | Getting started, and most receptionist setups | Transfers to many individual extensions | ## Route 1: Call Forwarding ### Set It Up 1. In VINSI, get a number for the agent (**Phone Numbers → Add Phone Number**) and assign it to the agent. See [Setting Up Phone Numbers](https://docs.vinsi.ai/ai-phone-agents/setting-up-phone-numbers). 2. In the 3CX admin console, set the inbound rule for the number callers dial — or the digital receptionist option you want the AI to handle — to forward to that VINSI number as an external number. 3. Call your main number from a mobile and check the AI answers. Forwarded calls leave 3CX on one of your SIP trunk lines, so they count toward your trunk's simultaneous calls and your carrier's outbound minutes. ### Transfers Back to Your Team The AI reaches your people by dialling a **full phone number**, not an extension. Give each transfer destination in your agent a number that rings in 3CX: a user's direct number, or a ring group or queue that has its own number. **Don't transfer to the number that forwards to the AI.** The call would come straight back to the agent. Use a different number for transfers. ## Route 2: SIP Trunk Through VINSI's SBC 3CX connects to VINSI's SBC as a generic SIP trunk. The AI can then transfer to extensions by number — just the digits, 2 to 6 long — and, optionally, make outside calls through your own 3CX lines. This works the same way as the [Mitel connection](https://docs.vinsi.ai/phone-connections/mitel). Contact VINSI to set it up. ### What VINSI Needs From You | Item | Notes | | ---------------------------------------------------- | ---------------------------------------------------- | | Your 3CX public address | The FQDN or public IP of your 3CX, and its SIP port. | | Extension range | Which extensions the AI may reach. | | Outside dialling format (if calling out through 3CX) | Any prefix your outbound rules expect. | | Caller ID to present | The number recipients should see on outside calls. | | A test extension and a technical contact | For the joint test. | ### What Your 3CX Admin Configures - A generic SIP trunk to VINSI's SBC (VINSI provides the address and sign-in details). - An inbound rule on that trunk that delivers calls to the extension number that was dialled. - Outbound rules that allow the calls you want the AI to make, if calling out through 3CX. - Codec G.711 μ-law (PCMU) on the trunk. - No SIP helper (SIP ALG) on the firewall in front of 3CX — it rewrites calls in flight and causes missing or one-way audio. ## Troubleshooting | Problem | Check | | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | Forwarded calls don't reach the AI | The forward target is the full VINSI number (e.g. +18005551234), and the number is assigned to an agent in VINSI. | | Transfers loop back to the AI | The transfer destination is the forwarded number. Use a different number. | | The AI answers but doesn't recognise the caller | 3CX is replacing the caller's number on forwarded calls. Set the forwarding rule to pass the original caller ID. | | No audio or one-way audio (SIP trunk route) | A firewall SIP helper is rewriting calls. Turn it off. | --- # Connect Zoom Phone Let a VINSI AI agent answer calls to your Zoom Phone numbers and pass callers to your team. Created: September 18, 2026 Updated: September 18, 2026 ## Overview Zoom Phone only accepts a direct SIP connection from a carrier through Zoom's **Bring Your Own Carrier (BYOC)** option, using a Zoom-certified Session Border Controller. Most Zoom Phone accounts don't use BYOC, so the usual way to connect is for Zoom to **forward calls to a VINSI number**. It takes a few minutes and needs no new hardware. ## Two Ways to Connect | | Call forwarding | Direct SIP (BYOC) | | ------------------ | ------------------------------------------ | ------------------------------------------------------------ | | Needs | Any Zoom Phone plan | BYOC enabled on your Zoom account, plus a Zoom-certified SBC | | Setup | Your Zoom admin, a few minutes | A project with your Zoom admin, VINSI and Zoom | | Calls in to the AI | Yes | Yes | | AI transfers to | Direct numbers and call-queue numbers | Depends on the design | | AI calls out using | A VINSI number (or a number you authorise) | Depends on the design | ## Call Forwarding (Standard Zoom Phone) ### Set It Up 1. In VINSI, get a number for the agent (**Phone Numbers → Add Phone Number**) and assign it to the agent. See [Setting Up Phone Numbers](https://docs.vinsi.ai/ai-phone-agents/setting-up-phone-numbers). 2. In the Zoom web portal, a Zoom admin adds the VINSI number as an external phone number (Zoom calls this an **External Contact**). 3. Route the number, auto receptionist, or call queue you want the AI to answer to that external contact — for all calls, or only for certain times such as after hours or overflow. 4. Call the Zoom number from a mobile. The AI should answer, and the call should appear in VINSI's **Call Logs** with your caller's number. ### Transfers to Your Team Zoom extensions can only be reached from inside Zoom, so the AI transfers to a **full phone number**. Use one of these as the agent's transfer destination: - **A call queue with its own number** (recommended) — it rings whoever is free, using your existing Zoom ring rules. - **A person's direct number** — only for staff who have one; many Zoom seats only have an extension. The caller hears hold music while the phone rings, and the AI can pass the caller's details and a short summary of the conversation to the person who answers. **Never transfer to the number that forwards to the AI.** The call would come straight back to the agent. Transfers need a different number. ### Outbound Calls & Caller ID Forwarding only covers incoming calls. Calls the AI makes — callbacks, reminders, campaigns — go out through VINSI, not Zoom. Your options for the number people see: | Option | Trade-off | | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | | **A VINSI number** (recommended) | Full STIR/SHAKEN verification, least likely to be labelled “Spam Likely”. Your Zoom numbers stay as they are. | | **Port the number to VINSI** | Strongest verification, but incoming calls to it then arrive at VINSI instead of Zoom. | | **Show a Zoom number you authorise** | Keeps the number on Zoom, but calls get a lower verification level and are more likely to be flagged as spam. Arranged with VINSI. | ## Direct SIP Connection (Zoom BYOC) A direct SIP connection removes the forwarding limits, but Zoom only accepts it from a Zoom-certified SBC on an account with BYOC enabled. - **You already have BYOC with your own SBC:** your SBC admin adds a route to VINSI, and VINSI configures its side. Contact VINSI to plan it. - **You don't have BYOC:** it means enabling BYOC with Zoom and deploying a certified SBC, which adds cost and lead time. Call forwarding covers most needs without it. ## Limits to Know - Forwarding covers **incoming calls only**. - The AI can't dial **Zoom extensions** — only full phone numbers. - Calls Zoom forwards to an outside number can count as **outbound minutes on your Zoom plan**. Check your plan if it's metered. - How Zoom presents the **caller's number** on forwarded calls depends on your Zoom settings. Check it on your first test call, so the AI can recognise returning callers. ## Troubleshooting | Problem | Check | | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | | Calls don't reach the AI | The external contact has the full VINSI number; the routing rule is active for the current time; the VINSI number is assigned to an agent. | | Transfers come back to the AI | The transfer destination is the forwarded number. Use a call queue or direct number instead. | | Transfers to one person don't ring | That person has no direct number in Zoom. Transfer to a call queue with a number instead. | | The AI doesn't recognise returning callers | Zoom is showing its own number instead of the caller's on forwarded calls. Change the caller ID setting for forwarded calls in Zoom. | --- # AI Assistant — Chat Ask questions, get answers, and explore your organization's knowledge — all through a conversational AI interface powered by your own uploaded documents. ## Overview The AI Assistant Chat gives every member of your organization a direct line to your internal knowledge base. Instead of hunting through folders or asking a colleague, you type a question and the assistant responds using the documents, policies, playbooks, and files your team has uploaded. Answers are grounded in your organization's knowledge base — so the assistant isn't guessing or pulling from general internet knowledge. If the answer is in your uploaded documents, it will find it. Navigate to **AI Assistant → New Chat** to open the chat interface. ## Workspace Sidebar The left-hand panel is your **LLM Assistant Workspace**. From here you can: - **New Chat** — start a fresh conversation at any time. - **Search chats** — search across your full conversation history by keyword. - **History** — view a list of all past conversations, including a preview of the first message and response. - **Knowledge Base** — jump directly to the Knowledge Base tab to manage uploaded documents. The **History** section at the bottom of the panel shows your recent chats with a short preview of the question asked and the assistant's reply. Click any entry to reopen that conversation. ## Starting a Chat Click **New Chat** in the sidebar or navigate to the **New Chat** tab at the top of the page. The chat window opens with a prompt bar at the bottom. Type your question in the _"Ask anything about your organization knowledge base"_ input and press the send button. The assistant will respond using the documents stored in your organization's knowledge base — including internal policies, playbooks, uploaded guides, and any other files your team has added. The assistant's responses are only as good as your knowledge base. For the best results, make sure your most important documents are uploaded and up to date in the **Knowledge Base** tab. ## Chat History Every conversation is automatically saved and accessible from the **History** section in the workspace sidebar. Each entry shows a preview of the question and the assistant's opening response, along with a timestamp. Click any history entry to reopen the full conversation thread. You can continue asking follow-up questions in an existing conversation or start a new one at any time. --- # AI Assistant — Knowledge Base The organization knowledge base is the source of truth your AI assistant draws from when answering questions. Upload and manage documents here to keep your assistant accurate and up to date. ## Overview The Knowledge Base is a document library scoped to your organization. Any file you upload here becomes available to the AI assistant when team members ask questions in the Chat tab. The assistant will reference these documents to generate accurate, organization-specific answers rather than generic responses. Navigate to **AI Assistant → Knowledge Base** to manage your documents. The page shows a searchable list of all uploaded files and an **Upload file** button in the top right. ## Uploading Documents Click **Upload file** in the top right corner to add a new document to the knowledge base. Documents are validated on upload — unsupported or potentially risky file formats will be rejected automatically. Good candidates for your knowledge base include: - Internal policies and procedures - Sales playbooks and scripts - Product documentation and FAQs - Onboarding guides - Compliance documents - Training materials The more relevant and well-structured your documents are, the more accurate and useful the AI assistant's answers will be. Clear headings, concise language, and up-to-date content make a significant difference in response quality. ## Managing Documents Use the **Search documents** bar to quickly find a specific file by name. As your library grows, keeping documents named clearly and consistently will make them easier to locate and maintain. When information changes — policies are updated, playbooks are revised, new products are launched — replace the outdated file with the current version. The assistant will immediately reflect the updated content in its responses. Stale documents left in the knowledge base can cause the assistant to give outdated answers, so treat it like a living library rather than an archive. ## File Restrictions VINSI applies strict validation to all uploaded files to protect your organization's environment. The following are blocked: - **Audio files** — the knowledge base is text-based; audio cannot be indexed. - **Risky file formats** — executable files, scripts, and other formats that could pose a security risk are rejected automatically. Supported formats include standard document types such as PDF, DOCX, and plain text files. If an upload is rejected, check the file format and try converting it to a supported type before re-uploading. --- # AI Assistant — Widgets & Settings Add your AI Assistant to your own websites as a chat widget, and set the assistant's name, logo, persona, and message limits. Created: September 16, 2026 Updated: September 16, 2026 ## Overview A widget puts your organization's AI Assistant on an outside website, such as a help center, docs site, or customer portal. Visitors ask questions, and the assistant answers from the documents in your [Knowledge Base](https://docs.vinsi.ai/ai-assistant/knowledge-base), the same content your team uses in [Chat](https://docs.vinsi.ai/ai-assistant/chat). In the AI Assistant workspace sidebar, click **Widgets** to manage widgets, or **Settings** to set up the assistant. ## Your Widgets The **Widgets** page (_Embeddable AI chat widgets for your external sites._) lists each widget with these columns: | Column | What it shows | | ------------------------- | ---------------------------------------------------------------------------------------------- | | **Name** | The widget's internal name | | **Type** | _floating_ or _inline_ | | **Allowed Domains / IPs** | Up to three entries plus a _+N more_ count. If none are set, it shows _None (widget blocked)_. | | **Status** | _Active_ or _Inactive_ | Each row has three buttons: the code icon copies the embed code, the pencil opens **Edit Widget**, and the trash can deletes the widget. Once a widget is deleted, its embed code stops working. ## Creating a Widget Click **New Widget** (or **Create your first widget** if you have none), fill in the sections below, and click **Save Widget**. After the first save, the page switches to **Edit Widget** and the embed code appears. ### General - **Widget Name** — required. Only your team sees it, e.g. _Support Chat_ or _Docs Bot_. - **Type** — choose one: - **Floating** (default): a chat button fixed in the bottom-right corner of the page. - **Inline**: the chat is built into your page, inside a `
` element. ### Access Control In **Allowed Domains / IPs**, list every site where the widget may run, one per line. You can enter: | Entry | Example | Matches | | ---------- | ---------------- | ------------------------------------------------------------- | | Hostname | support.acme.com | That exact host only | | Wildcard | \*.acme.com | Any subdomain, such as help.acme.com, but not acme.com itself | | CIDR range | 192.168.1.0/24 | Sites opened by an IPv4 address in that range | If you paste a full URL, such as `https://acme.com`, only the hostname is used. Requests from unlisted sites are rejected, so the widget won't load there. A widget with no allowed domains is **blocked everywhere**. When you save one, you'll see _No allowed domains/IPs set — all requests will be blocked. Continue?_ Add `acme.com` and `*.acme.com` separately to cover both the main domain and its subdomains. ### Appearance | Field | Default | Notes | | ------------------- | ------------------- | ------------------------------------------------------------------------------------ | | **Widget Title** | AI Assistant | Shown in the chat header. | | **Primary Color** | #3e55ff | Pick a color or type a hex value. Used for the header, button, and visitor messages. | | **Welcome Message** | How can I help you? | The first message visitors see. | The **Preview** on the right updates as you type. It uses sample messages to show your title, color, and welcome message; it doesn't send real questions to the assistant. Floating widgets use the logo from [Settings](https://docs.vinsi.ai/ai-assistant/widgets#widgets-settings) for the chat button. ### Status When you edit a widget, the **Widget active** switch appears. Turn it off to pause the widget without deleting it. _Inactive widgets reject all chat requests._ Turn it back on to restore the widget, and you won't need to change the embed code. ## Embed Code After saving, copy the code from the **Embed Code** box (or use the code icon on the Widgets list) and add it to your site. **Floating**: paste before the closing `` tag. Floating widget ``` ``` **Inline**: paste where you want the chat to appear, and change the `height` as needed. Inline widget ```
``` The embed code stays the same when you edit the widget. The widget loads its title, color, welcome message, and logo each time a page opens, so saved changes show up on your site without re-pasting the code. ## What the Widget Knows Every widget answers from your organization's whole AI Assistant [Knowledge Base](https://docs.vinsi.ai/ai-assistant/knowledge-base). To change what it knows, add, update, or remove documents there. All of your widgets pick up the changes. - Answers can include a **Sources** list with the documents used. - Greetings like "hi" or "hello" get your welcome message back. - The widget stays on topic. It answers questions about your organization, its products and services, and the VINSI.AI platform. It politely declines unrelated requests, such as recipes, homework, or trivia. Anyone on an allowed site can see what the widget knows. Don't upload internal-only documents to the Knowledge Base if your organization has a public widget. ## What Visitors See - A chat header with your **Widget Title** and a _Type a message..._ box. - The notice: _AI Generated Answers May Be Inaccurate._ - If they send messages too quickly, they'll see _Too many messages. Please slow down._ By default, each visitor can send up to 10 messages a minute. - Long messages are rejected with _Message is too long_. The default limit is 1,000 characters. - Each widget has a daily message limit. After it's reached, visitors see _This assistant has reached its daily limit. Please try again tomorrow._ ## Assistant Settings Click **Settings** in the AI Assistant sidebar to customize how the assistant presents itself and behaves for your organization. These settings apply to the whole organization. Saving and uploading require write permission for AI Assistant settings. | Setting | What it does | | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Assistant name** | Shown in the sidebar and used when the assistant refers to itself in Chat. Up to 255 characters; defaults to _AI Assistant_. | | **Assistant logo** | Replaces the chat icon on **floating widgets** and appears next to the assistant name. Click **Upload logo** to add one (JPEG, PNG, GIF, WebP, or SVG, up to 10 MB) or **Remove** to clear it. Square images work best. | | **Persona / instructions** | Optional tone and behavior guidance, e.g. _Be concise, friendly, and professional. Avoid jargon._ Up to 4,000 characters. Applies to your team's Chat conversations. | | **Rate limit (messages per minute, per user)** | Caps how many messages each signed-in user can send per minute in Chat. From 1 to 600; default 40. | Click **Save settings** to apply changes. Logo uploads and removals save right away. Only the logo carries over to widgets. Each widget uses its own **Widget Title** and **Welcome Message**, and the Persona and Rate limit settings apply only to Chat. --- # Dashboard A real-time view of your QA call activity — track uploads, evaluations, scores, and agent performance at a glance. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created April 1, 2026 ## Overview The QA Dashboard gives your team an at-a-glance view of call quality across your organization. It is organized into four sections — summary cards at the top, a calls-over-time chart, an agent performance table, and a recent uploads feed at the bottom. You can use the dropdown next to **Upload Calls** to switch between campaigns. ![QA Dashboard Diagram](https://docs.vinsi.ai/images/qa/vinsi-screenshots/QA-dashboard-diagram.png) ### Recent Uploads A feed of the most recently uploaded call recordings. Click **View all →** to go to the full uploads list. - **Agent** — the agent whose call was uploaded - **Campaign** — the QA campaign the call was evaluated under - **Score** — the call's score out of the campaign maximum, with a quality label — **Excellent**, **Good**, **Fair**, or **Poor** - **Date** — when the call was uploaded ### Summary Cards Four metric tiles at the top of the dashboard give you an instant snapshot of overall QA activity. #### ![total-uploaded](https://docs.vinsi.ai/images/qa/symbols/dashboard/qa-total-uploaded.svg)Total Uploaded Total number of call recordings uploaded, across all time. #### ![evaluated](https://docs.vinsi.ai/images/qa/symbols/dashboard/qa-evaluated.svg)Evaluated Total number of calls that have been reviewed and scored. #### ![avg-score](https://docs.vinsi.ai/images/qa/symbols/dashboard/qa-avg-score.svg)Avg Score The average quality score across all evaluated calls. #### ![active-campaigns](https://docs.vinsi.ai/images/qa/symbols/dashboard/qa-active-campaigns.svg)Active Campaigns Number of QA campaigns currently running. ### Calls Over Time A line chart showing the volume of uploaded and evaluated calls over time. Use the **Day**, **Week**, and **Month** toggles to adjust the time resolution. - **Uploaded** — total calls added to the system in the selected period - **Evaluated** — calls that were scored within the selected period ### Performance Summary The Agent Performance table breaks down QA activity by agent. Click **Manage Agents →** to go directly to the Agents page. - **Agent** — the agent's name and email address - **Calls QA'd** — number of calls evaluated for that agent - **Avg Score** — the agent's average quality score across evaluated calls - **Status** — whether the agent is currently Active or Inactive - **Performance** — a visual indicator of the agent's overall performance trend --- # Campaigns Organize your QA calls into categories using campaigns. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created April 1, 2026 ## Overview Campaigns are a way to organize your QA calls into categories. Rather than representing a marketing effort, a campaign is simply a label that groups related calls together — for example by team, call type, product line, or any other classification that makes sense for your workflow. Each campaign entry in the list displays a **name** and an optional **description** shown beneath it, making it easy to identify what a campaign represents at a glance. From this page you can also see key details about each campaign at a glance: - **Status** — whether the campaign is currently Active or Inactive. - **Script** — shows whether an evaluation script has been defined for the campaign. A **Defined** status means the AI has a script to follow when scoring calls; a dash indicates no script has been set up yet. - **Max Score** — the maximum score a call can receive when evaluated against this campaign's criteria. - **Dispositions** — the call disposition tags associated with the campaign (e.g. Fake, Real, Bot, Call). These are used by the AI to classify the outcome of each evaluated call. - **Created** — the date the campaign was created. Use the **Edit** button on any row to update the campaign's name, description, script, max score, or dispositions. ### Adding a Campaign To create a new campaign, click the ![New Campaign](https://docs.vinsi.ai/images/qa/symbols/campaigns/qa-new-campaign.svg) button at the top of the page. A form will appear where you can define the campaign's name, description, evaluation script, max score, and dispositions. --- # Upload Upload call recordings to be scored and reviewed within your QA campaigns. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created April 1, 2026 ## Overview You can reach this page by selecting the **Upload** tab in the QA Calls navigation bar, or by clicking the ![upload-calls](https://docs.vinsi.ai/images/qa/symbols/dashboard/qa-upload-calls.svg) button found on the **Dashboard**, **Campaign**, or **Results** tab. The Upload page is where you add call recordings to be evaluated within a QA campaign. Supported file formats are **MP3**, **WAV**, **M4A**, and **OGG** — up to **200 MB** per file. You can upload multiple files at once. For each upload, you must assign it to a **campaign**. You can also optionally add the **agents** involved in the call. An indicator next to each campaign will let you know whether it has an evaluation script attached — this is set when the campaign is created. You can set agent information individually for each call, or use the ![apply-to-all](https://docs.vinsi.ai/images/qa/symbols/upload/qa-apply-to-all.svg) button to apply the same agents across all uploaded calls at once. Once everything is set, click ![upload-to-s3](https://docs.vinsi.ai/images/qa/symbols/upload/qa-upload-to-s3.svg) to submit your files for processing and evaluation. --- # Results Review scored call results, agent performance, and QA feedback across your campaigns. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created April 1, 2026 ## Overview The Results page is where you can review the AI evaluations of your uploaded calls. Each result shows the call's score, the agent it was assigned to, the campaign it was evaluated under, and the date it was uploaded. Use the **Score** dropdown (set to All Scores by default) to filter results by a specific score range, narrowing down to calls that performed above or below a certain threshold. The ![select-date-time](https://docs.vinsi.ai/images/qa/symbols/results/qa-select-date-time.svg) button lets you filter results down to a specific day or date range. Click ![export-csv](https://docs.vinsi.ai/images/qa/symbols/results/qa-export-csv.svg) to download the current results as a CSV file. --- # Agents Manage and track the agents being evaluated within your QA call campaigns. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created April 1, 2026 ## Overview The Agents page lets you view, add, or edit your agents. ## Add Agent ![add-agent-button](https://docs.vinsi.ai/images/qa/symbols/agents/qa-add-agent.svg) Click **Add Agent** to open the add agent form. The following fields are required: - **Full Name** — the agent's full name - **Email** — the agent's email address - **Campaign** — select the campaign to assign the agent to. Only active campaigns are shown in the dropdown. ![Add Agent Modal](https://docs.vinsi.ai/images/qa/vinsi-screenshots/QA-add-agent.png) ## Agent Card ![QA-agent-card](https://docs.vinsi.ai/images/qa/vinsi-screenshots/QA-agent-card.png) Each agent appears as a card showing their name, email, and the campaign they are assigned to. The card also displays two stats — **Calls QA'd** (total calls evaluated for that agent) and **Avg Score** (their average quality score) — along with an **Active** or **Inactive** status badge. Use the ![edit](https://docs.vinsi.ai/images/qa/symbols/agents/qa-edit-agent.svg) button to edit the agent's details, or the ![delete](https://docs.vinsi.ai/images/qa/symbols/agents/qa-delete-agent.svg) button to remove the agent. --- # Extensions Score calls by phone extension instead of by named agent, and choose which campaign evaluates each extension. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created: September 16, 2026 Updated: September 16, 2026 ## Overview Some teams don't track calls by agent name — they track them by the phone extension that handled the call (for example a front desk, a shared queue, or a department line). The **Extensions** page lets you list those extensions and link each one to the QA campaign that should score its calls. Extensions and Agents are two ways of answering the same question: _who does a scored call belong to?_ Your organization uses one or the other, never both at the same time. ### Before You Start - **Open QA Calls.** Use the product switcher in the top bar and choose **QA Calls**. It is available to organization admins and to members who have been given access to the QA Calls module. QA Calls features are unlocked by the **Elite** or **Enterprise** support plan. - **Switch the evaluation mode to Extensions.** The **Extensions** tab only appears in the QA Calls menu when an organization admin sets **Admin → Evaluation Mode** to **Extensions**. While the mode is set to **Agents** (the default), you'll see the **Agents** tab instead. See [QA Admin](https://docs.vinsi.ai/qa/admin). - **Create at least one active campaign.** Every extension must be linked to an active campaign. See [Campaigns](https://docs.vinsi.ai/qa/campaigns). - **Permissions.** The Extensions tab uses the same permission as the Agents tab. Members need write access to QA Agents to see the **Add Extension** button. ## The Extensions List Go to **QA Calls → Extensions**. The page is titled **Extensions** with the subtitle _Phone extensions evaluated by QA — manage which campaign scores each one_. Each row shows: | Column | What it shows | | ---------------- | -------------------------------------------------------------------------------------------------------- | | **Label** | The friendly name you gave the extension, with the extension number underneath (for example _Ext. 101_). | | **Campaign** | The campaign that scores this extension's calls, or _Not assigned_. | | **Status** | **Active** or **Inactive**. | | **Last Updated** | When the extension was last changed. The list is sorted newest first by default. | | **Actions** | Edit (pencil) and remove (trash) buttons. | Use the search box (_Search by label, extension or campaign..._) to filter the list. Columns can be sorted and resized, and the list pages at 10, 25, or 50 rows. If no extensions exist yet you'll see **No extensions yet** with an **Add Extension** button. ## Adding an Extension 1. Click **\+ Add Extension** in the top-right corner. 2. Fill in the **Add Extension** form (fields marked \* are required): | Field | Details | | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Label \*** | A name people will recognize, e.g. _Front Desk_. | | **Extension \*** | The extension number, e.g. _101_. Must be a positive whole number and unique within your organization. | | **Files per Run** | The maximum number of recordings analyzed per run for this extension. Must be a positive whole number. Defaults to **1** (leaving it blank also uses 1). | | **Campaign \*** | The campaign that scores this extension. Only active campaigns are listed; if you have none you'll see _No active campaigns available._ | | **Extension is active** | On by default. Inactive extensions are skipped by scheduled analysis. | 1. Click **Add Extension**. The button stays disabled until the required fields are valid. If you see **That extension already exists in this organization**, the number is already on the list — edit the existing row instead of adding a new one. ## Editing or Removing **Edit:** click anywhere on a row, or click its pencil button, to open **Edit Extension**. Change any field and click **Save Changes**. To pause scoring for an extension without deleting it, turn off **Extension is active**. **Remove:** click the trash button, then confirm with **Remove** in the **Remove Extension** dialog. This action cannot be undone. ## Files per Run & Scheduled Analysis Besides manual uploads on the [Upload](https://docs.vinsi.ai/qa/upload) page, VINSI can analyze recordings automatically in scheduled runs. Each active extension contributes up to its **Files per Run** recordings to each run, scored by the campaign you linked. Raise the number for busy extensions so their backlog clears faster. Organization admins can review every run — and manually assign recordings that couldn't be matched — under **Admin → Run History**. See [QA Admin](https://docs.vinsi.ai/qa/admin). Scored calls appear on the [Results](https://docs.vinsi.ai/qa/results) page. ## Related - [QA Admin](https://docs.vinsi.ai/qa/admin) — switch the evaluation mode and review analysis runs - [Agents](https://docs.vinsi.ai/qa/agents) — the alternative to extensions - [Campaigns](https://docs.vinsi.ai/qa/campaigns) - [Results](https://docs.vinsi.ai/qa/results) --- # Analytics Quality assurance insights and performance analysis across your agents and campaigns. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created April 1, 2026 ## Overview The Analytics page gives you a deeper view into the quality of your QA calls. It is organized into five tabs, each focused on a different aspect of agent and call performance. ### ![agent-benchmarks](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-agent-benchmarks.svg)Agent Benchmarks Displays each agent's average quality score as a percentage, normalized across all campaigns they are part of. This gives you a fair, apples-to-apples comparison of agent performance regardless of which campaign they were evaluated under. ### ![score-distribution](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-score-distribution.svg)Score Distribution Shows how your evaluated calls are spread across score ranges — for example, how many calls scored Excellent, Good, Fair, or Poor. All values are normalized to a percentage so you can spot patterns in call quality at a glance, regardless of total volume. ### ![low-performers](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-low-performers.svg)Low Performer Tracker Compares each agent's average score over the last 30 days against their score from the previous 30-day period. This makes it easy to identify agents who are trending downward and may need coaching, as well as agents who have meaningfully improved. ### ![volume-vs-score](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-volume-vs-score.svg)Call Volume vs Score Plots call volume against average quality score for each agent, making it easy to identify agents who are handling a high number of calls but delivering below-average quality. This helps prioritize where coaching or workload adjustments are needed most. ### ![qa-alerts](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-alerts.svg)QA Alerts Automatically flags calls that fall below a defined quality threshold so they can be reviewed and actioned. QA Alerts help you catch underperforming calls quickly without having to manually scan through every result. --- # QA Tools Compare agents, see how scores are spread, spot declining performers, and flag calls below a threshold. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created: September 16, 2026 Updated: September 16, 2026 ## Overview **QA Tools** — _Quality assurance insights and performance analysis_ — is opened from **QA Calls → Analytics**. It has five tabs: **Agent Benchmarks**, **Score Distribution**, **Low Performers**, **Volume vs Score**, and **QA Alerts**. Most tabs have a campaign dropdown (default **All Campaigns**) to narrow the data to one campaign. The tools work from calls that have already been scored. If you have no campaigns yet, you'll see **No campaigns yet**with a **Create a campaign** link; if nothing has been scored, upload and analyze calls first on the [Upload](https://docs.vinsi.ai/qa/upload) page. Scores on this page are always shown as a percentage of the campaign's max score so campaigns with different maximums can be compared. Ratings use fixed ranges — **Excellent** 90–100%, **Good** 75–89%, **Fair** 60–74%, **Poor** below 60% — rather than the custom score tiers set in [QA Admin](https://docs.vinsi.ai/qa/admin). ## ![agent-benchmarks](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-agent-benchmarks.svg)Agent Benchmarks _Average score % per agent — normalized across campaigns._ Only agents with at least one scored call are included. - **Bar chart** — each agent's average score percentage. With **All Campaigns** selected, bars and a legend are colored by campaign. - **Rankings** — agents ordered from highest to lowest percentage, with medals for the top three. Each row shows the number of calls QA'd, the average score out of the campaign max, and the percentage with its rating. - The header shows how many agents are listed and either _across all campaigns_ or the selected campaign's max points. ## ![score-distribution](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-score-distribution.svg)Score Distribution _How calls are distributed across score ranges (normalized to %)._ Only scored calls are counted. - **Chart** — the number of calls in each 10% range, from **0–10%** to **90–100%**. - **Summary** — **Total evaluated calls**, plus the count and share of calls rated Excellent (90–100%), Good (75–89%), Fair (60–74%), and Poor (<60%). ## ![low-performers](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-low-performers.svg)Low Performers The **Low Performer Tracker** compares each agent's average score over the **last 30 days** with the **previous 30 days**. Use the filter to show **↓ Declining** (the default), **All**, or **↑ Improving** agents. The biggest drops are listed first. | Column | What it shows | | -------------------- | --------------------------------------------------------------------------------------------- | | **Agent** | The agent's name. | | **Campaign** | The agent's campaign. | | **Last 30 Days** | Average score out of max and as a percentage, or _No data_. | | **Prev 30 Days** | Average for the previous 30 days, or _New this period_ if the agent had no scored calls then. | | **Change** | Difference in score points between the two periods, in red (down) or green (up). | | **Calls (last 30d)** | Scored calls in the last 30 days. | An agent needs at least one scored call in the last 60 days to appear. If the list is empty, try switching the filter to **All**. ## ![volume-vs-score](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-volume-vs-score.svg)Volume vs Score **Call Volume vs Score** helps you _identify agents with high call volume but low quality scores_. - **Scatter chart** — each dot is an agent, plotted by **Calls QA'd** (across) and **Avg Score %** (up). Hover a dot for details. - **At Risk Agents** — up to eight agents scoring below 60%, with the most calls first. If none qualify you'll see **No agents at risk**. ## ![qa-alerts](https://docs.vinsi.ai/images/qa/symbols/analytics/qa-alerts.svg)QA Alerts _Set score thresholds and identify underperforming agents._ Thresholds are set per campaign. 1. Under **Alert Settings**, choose a **Campaign**. 2. Drag the **Alert below** slider to a percentage between 10% and 100% (in steps of 5). It starts at 60%. 3. Click **Save Threshold**. You'll see **Active: flag below** your percentage. **Flagged Calls** then lists that campaign's calls scoring below the threshold, with the number flagged: - **Agent** — name and email. - **Score** — score out of max, percentage, and rating. - **Below Threshold** — how many percentage points below the threshold the call scored. - **Date** — when the call was added. If nothing is below the threshold you'll see **All clear**. The **Configured** list shows every campaign you've set a threshold for. QA Alerts are an on-screen review list — they don't send notifications. Thresholds are saved in your current browser only, so teammates (or you on another device) need to set their own. Flagged Calls checks the campaign's 100 most recent calls; use the **Score** filter on [Results](https://docs.vinsi.ai/qa/results) to review older calls. ## Related - [Dashboard](https://docs.vinsi.ai/qa/dashboard) - [Results](https://docs.vinsi.ai/qa/results) - [Agents](https://docs.vinsi.ai/qa/agents) - [QA Admin](https://docs.vinsi.ai/qa/admin) --- # QA Admin Choose how calls are attributed, customize score tiers and score display, and review automated analysis runs. **Elite plan required — Upgrade needed to unlock QA Calls features!** Created: September 16, 2026 Updated: September 16, 2026 ## Overview Go to **QA Calls → Admin** to open **QA Configuration** — _Configure how scores are labeled and displayed across QA Calls_. Settings are grouped into cards; click a card to open its settings panel, and use **Search settings...**to find a card quickly. | Section | Card | What it controls | | -------------- | ------------------- | ------------------------------------------------------------------------------------------ | | **Evaluation** | **Evaluation Mode** | Score calls by named agent or by phone extension. The card's badge shows the current mode. | | **Scoring** | **Score Tiers** | Labels, thresholds, and colors used to rate calls (Excellent, Good, Poor...). | | **Scoring** | **Display** | Show scores as a percentage or out of max, and toggle decimals and percentage hints. | | **Automation** | **Run History** | Automated analysis runs and recordings that need manual assignment. | Settings apply to your whole organization. ### Who Can Use It QA Admin is for **organization admins and owners** only. The **Admin** tab is hidden from everyone else, and opening the page directly shows _QA configuration is restricted to organization administrators._ QA Calls itself is opened from the product switcher in the top bar (**QA Calls**) and is unlocked by the **Elite** or **Enterprise** support plan. See [Billing & Plans](https://docs.vinsi.ai/account/billing). ## Evaluation Mode The evaluation mode decides who a scored call belongs to. Only the matching tab stays visible in the QA Calls menu. | Mode | What happens | | -------------------- | -------------------------------------------------------------------------------------------------------------- | | **Agents** (default) | Calls are scored against named agents. The [Agents](https://docs.vinsi.ai/qa/agents) tab is shown. | | **Extensions** | Calls are scored against phone extensions. The [Extensions](https://docs.vinsi.ai/qa/extensions) tab is shown. | 1. Click the **Evaluation Mode** card. 2. Click **Agents** or **Extensions**. The change saves immediately — there is no Save button — and you'll see **Evaluation mode updated**. ## Score Tiers Score tiers turn a call's score into a label and color. Each tier applies from its minimum percentage of the campaign's max score upward. Order doesn't matter — tiers are matched from the highest threshold down. Out of the box, your organization uses: | Label | Min % | Color | | ------------- | ----- | ------ | | **Excellent** | 90 | Green | | **Good** | 75 | Blue | | **Fair** | 60 | Orange | | **Poor** | 0 | Red | ### Edit Tiers 1. Click the **Score Tiers** card. 2. For each tier, edit the label, the minimum percentage (0–100), and pick a color. 3. Click **\+ Add tier** to add a tier (it starts as _New tier_ at 0%), or the trash button to remove one. You can't remove the last remaining tier. 4. Check the **Preview**, which shows sample scores of 95, 80, 65, and 40 out of 100 with your labels and colors. 5. Click **Save changes**. You'll see **QA settings saved**. Make sure one tier starts at **0%** so every scored call gets a label. Tiers with an empty label are dropped when you save. Your tiers are also used for the **Score** filter on the [Results](https://docs.vinsi.ai/qa/results) page. ## Display Click the **Display** card to choose how average and per-call scores are shown. | Setting | Options | Default | | ---------------------------------------------- | ------------------------------------------------------------------- | ---------- | | **Average score basis** | **Percentage (85%)** or **Out of max (85 / 100)** | Percentage | | **Show one decimal place** | On shows e.g. _85.5%_; off rounds to whole numbers | Off | | **Also show percentage next to the raw score** | On shows e.g. _85 / 100 (85%)_. Only available with **Out of max**. | On | The **Preview** updates as you change options. Click **Save changes** to apply. ## Run History Click the **Run History** card to open **Analysis run history**: automated batch analyses of recordings dropped in your incoming folder, newest first. The 20 most recent runs are shown; click **Refresh** to reload. If nothing has run yet you'll see **No runs yet**. Each run shows: - **Status** — **Running**, **Completed**, or **Error** (errors include a message below the run). - **Start time** and how it was triggered — **Scheduled** or **Manual**. - **Found** — recordings discovered by the run. - **Scored** — recordings evaluated successfully. - **Failed** — recordings that couldn't be evaluated (shown only when above zero). - **Unmatched** — recordings that couldn't be matched to anyone and were set aside (shown only when above zero). ### Assigning Unmatched Recordings When a run has unmatched recordings, it shows a **file(s) need manual assignment** link. To score them yourself: 1. Click the link to expand the file list. Files load 100 at a time — click **Load more** for the rest. 2. Optionally click **Listen** to play the recording and identify the caller. 3. Choose the right person from **Select QA agent**. 4. Click **Evaluate**. The call is scored using the selected agent's campaign and you'll see **Call evaluated and assigned**. The file then drops off the list and the run's counters refresh. Evaluated calls appear on the [Results](https://docs.vinsi.ai/qa/results) page. ## Related - [Extensions](https://docs.vinsi.ai/qa/extensions) - [Agents](https://docs.vinsi.ai/qa/agents) - [Results](https://docs.vinsi.ai/qa/results) - [Dashboard](https://docs.vinsi.ai/qa/dashboard) --- # Ticketing System Manage and resolve service desk requests with AI-assisted categorization and prioritization. Created March 27, 2026 ## Overview The VINSI ticketing system is designed to streamline service desk operations by giving your team a centralized place to submit, track, and resolve issues. VINSI AI analyzes each ticket as it comes in, automatically suggesting a category and urgency level based on the issue description. This helps your team prioritize effectively and ensures critical issues are never overlooked. ## Create Ticket 1. Log into the VINSI AI SaaS platform 2. Navigate to **Ticket System** 3. Click **\+ New Ticket** button: ![new-ticket-button-svg](https://docs.vinsi.ai/images/tickets/symbols/adding-tickets/new_ticket_svg.svg) 4. Add a **Subject** — provide a brief, clear summary of your issue 5. Add a **Description** — describe your issue in detail; the more context you provide, the faster your ticket can be resolved 6. Set the **Urgency** — indicate how critical the issue is. VINSI AI will review your description and suggest an urgency level to help guide your selection 7. Select a **Category** — classify your inquiry so it is routed to the appropriate team 8. Set a **Resolution Deadline** — specify when you need the issue resolved by 9. **Assign** the ticket to the relevant team member responsible for handling it --- # Ticket Dashboard A real-time view of your service desk health — track ticket volume, priority, and team workload at a glance. Created March 27, 2026 ## Overview The Ticket Dashboard gives your team an at-a-glance view of the health of your service desk at any point in time. It is organized into three sections — summary cards at the top, visual charts in the middle, and a full ticket breakdown at the bottom — giving both individual contributors and team leads the visibility they need to stay on top of the queue. ![Ticket Dashboard Diagram](https://docs.vinsi.ai/images/tickets/vinsi-screenshots/Ticket-Dashboard-Diagram.png) ## Summary Cards At the top of the dashboard, a row of summary cards displays key ticket counts so you can immediately spot bottlenecks and workload distribution without digging into individual records. - **Overdue** — tickets that have passed their resolution deadline - **Due Today** — tickets that must be resolved by end of day - **Open** — all currently active, unresolved tickets - **On Hold** — tickets paused pending additional information - **Unassigned** — tickets not yet assigned to a team member - **My Tickets** — tickets assigned directly to you ## Priority & Status Charts The middle section provides visual breakdowns to help identify where your team's attention is most needed. - **Unresolved Tickets by Priority** — a pie chart showing the split between Low, Medium, High, and Urgent tickets - **Unresolved Tickets by Status** — a pie chart breaking down Open vs. Pending tickets - **New & My Open Tickets** — a priority-level breakdown of tickets currently assigned to you, giving a quick personal workload snapshot ## Quick Summary The bottom of the dashboard provides a full-picture summary across all tickets, including closed ones. - **Quick Summary** — tracks totals for Unresolved, Overdue, Due Today, and Unassigned tickets in one consolidated view - **All Tickets by Priority** — shows the distribution of every ticket across Low, Medium, High, and Urgent priority levels, giving managers and team leads the visibility needed to identify trends and keep the queue under control --- # Tickets & Tasks View, filter, and manage all tickets and their related tasks across your organization in one place. Created March 27, 2026 ## Tickets Page Overview The Tickets page is where you can view all your tickets and their details. Each ticket entry shows key information at a glance, and you can click into any ticket to see its full history, notes, and associated activity. Use filters to narrow down the list, customize which columns are displayed, or let the AI assistant help you build more advanced views. ## Ticket Organization The ticket organization toolbar located at the top right of the ticket list allows for many powerful tools to manage tickets. ### Filtering Tickets ![icon-filter-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the ticket list using any combination of the following filters: - **Status** — filter by Open, Pending, On Hold, Resolved, or Closed - **Priority** — filter by Low, Medium, High, or Urgent - **Agent** — show tickets assigned to a specific agent - **Created** — filter by ticket creation date or date range - **Department** — filter tickets by the department they are assigned to - **Group** — filter by team or support group - **Requesters** — filter by the person who submitted the ticket - **Category** — filter by the type of issue or inquiry - **Due By** — filter tickets by their resolution deadline ### Column Display ![icon-sliders-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) You can customize which columns are shown in the ticket list to focus on the information most relevant to your workflow. By default, the following columns are displayed: **Subject**, **Requester**, **Due Date**, **State**, **Status**, **Priority**, & **Assigned To** You can optionally enable any of the following additional columns: **Type**, **Source**, **Tags**, **Department**, **Group**, **Requester Email**, **Created**, **Closed At**, **Resolved At**, & **Updated**. ### AI Assistant ![icon-chip-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The built-in AI assistant can help you work more efficiently with your ticket data. Use it to create custom filters, sort and group tickets, and calculate totals — without needing to configure everything manually. Simply describe what you want to see in plain language and the AI assistant will build the filter or grouping for you automatically. ## Ticket Management To access or edit the ticket information page, click this icon: ![icon-view-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-view.svg) ![Ticket-Info-Diagram](https://docs.vinsi.ai/images/tickets/vinsi-screenshots/Ticket-Info-Diagram.png) ### Details Panel![icon-info-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-info.svg) The Details panel displays key metadata about the ticket. It shows the **Requester** — including their name and email — along with the ticket **Type**, **Source**, **Created** date and time, and **Due By** date. If the ticket has passed its deadline, an **Overdue** badge will appear to flag it for immediate attention. ### Properties Panel![icon-sliders-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) The Properties panel is where you can update the configurable fields of a ticket. You can set the **Status** (e.g. Open, Pending, Resolved) using a dropdown, and select the **Priority** level — **Low**, **Medium**, **High**, or **Urgent**. You can also set or clear the **Due By** date and time, and use the **Assigned To** dropdown to assign the ticket to a specific team member. You may not be able to modify information in this panel if you are not a manager or administrator. ### Notes Panel![icon-notes-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-notes.svg) Here you can view notes left for this ticket by other users. ### Tasks Panel![icon-tasks-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-tasks.svg) ![Tasks Diagram](https://docs.vinsi.ai/images/tickets/vinsi-screenshots/Tasks-Diagram.png) The Tasks panel allows you to break down a ticket into smaller, actionable items and distribute work across your team. Clicking **\+ Add Task** opens a form where you can describe the task, assign it to a colleague in your organization, and set a due date. This is especially useful for larger or more complex tickets that require input from multiple team members — keeping everyone aligned and accountable without losing track of the bigger picture. ## Tasks Page Overview The Tasks page is where you can view all your tasks. Each task entry shows key information at a glance. Clicking the **information icon** ![icon-view-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-view.svg) takes you to the task's related ticket. ## Task Organization The task organization toolbar at the top right of the task list gives you tools to filter and customize your view. ### Filtering Tasks ![icon-filter-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the task list using any combination of the following filters: - **Status** — filter by Open, Pending, On Hold, Resolved, or Closed - **Priority** — filter by Low, Medium, High, or Urgent - **Agent** — show tasks assigned to a specific agent - **Due By** — filter tasks by their deadline ### Column Display ![icon-sliders-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the task list displays **Title**, **Assigned To**, **Due Date**, and **Status**. You can optionally enable **Priority**, **Ticket**, **Created**, and **Updated** to suit your workflow. ### AI Assistant ![icon-chip-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) Use the AI assistant to create custom filters, sort and group tasks, and calculate totals — just describe what you need in plain language. --- # Catalog Build and manage custom ticket forms with tailored fields for every type of request your organization handles. Created March 27, 2026 ## Overview The Catalog is a form builder for tickets. Admins and end users can create custom ticket types, each with their own set of fields to match the specific information needed for different kinds of requests. Whether it is an IT support request, an HR inquiry, or a bug report, the Catalog lets you design a tailored submission experience for each one. Custom fields ensure the right information is collected upfront, reducing back-and-forth and helping your team resolve tickets faster. Each catalog item acts as a template that requesters fill out when opening a new ticket of that type. ## Creating Categories ![icon-add](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-add.svg) Categories group related catalog items together, making it easier for requesters to find the right ticket type. Each category has a **Name**, a **Description**, and an **Icon** to help users quickly identify it in the list. 1. Open the Catalog page and select the add icon beside **Creating Categories** to start a new category. 2. Enter a short, requester-friendly **Name**, such as IT Support, HR Requests, Facilities, or Billing. 3. Add a clear **Description** that explains what types of requests belong in the category. This helps requesters choose the right path before they submit a ticket. 4. Choose an **Icon** that visually matches the category. Icons appear in the catalog list and make categories easier to scan. 5. Save the category, then create or move catalog items into it so related request forms stay grouped together. Keep categories broad enough to hold multiple request types. For example, create one IT Support category, then add catalog items such as Password Reset, Hardware Request, Software Access, and Network Issue under it. ## Creating a Catalog Item ![new-catalog-item-button](https://docs.vinsi.ai/images/tickets/symbols/catalog/new_catalog_item.svg) 1. Fill in the item's **Name**, **Description**, and the **Category** it belongs to 2. Set the **Status** — **Publish** it immediately to make it available to requesters, save it as a **Draft** to continue working on it later, or **Archive** it to remove it from the active catalog without deleting it permanently 3. Once finished, click Create & Continue: ![create-continue-svg](https://docs.vinsi.ai/images/tickets/symbols/catalog/create-continue.svg) 4. To begin adding custom fields, navigate to Custom Fields: ![custom-fields-svg](https://docs.vinsi.ai/images/tickets/symbols/catalog/custom-fields.svg) 5. Select Add Field ![add-field-svg](https://docs.vinsi.ai/images/tickets/symbols/catalog/add-field.svg) and choose from a variety of input types: **Text Input, Text Area, Dropdown, Department, Checkbox, Number, Date, Email, URL, Phone,** or **File Upload** 6. Preview what the field will look like using the Preview Tab: ![preview-tab-svg](https://docs.vinsi.ai/images/tickets/symbols/catalog/preview-tab.svg) Note: Some fields exist by default, including Email, Full Name, Subject, and Description. **Default:** ![Default-catalog-png](https://docs.vinsi.ai/images/tickets/vinsi-screenshots/Default-catalog.png) **Custom:** ![custom-catalog-png](https://docs.vinsi.ai/images/tickets/vinsi-screenshots/custom-catalog.png) --- # Workflow Automate ticket routing, escalation, and resolution with configurable workflows. Created March 27, 2026 ## Overview Workflows automate repetitive ticket handling by listening for a trigger, checking ticket details, and then running one or more actions. They help teams route new requests, escalate urgent work, update ticket fields, notify the right people, and add internal notes without manual follow-up. A workflow is built from connected nodes. Every workflow starts with a **Trigger**, can branch through **Conditions**, runs **Actions**, and finishes with an **End** node. You can create broad workflows that apply to all tickets or limit a workflow to a specific catalog item. Common examples include assigning all IT tickets to the IT support group, raising high-priority tickets to urgent status, emailing a requester when a ticket is updated, or adding an internal note when a ticket reaches a specific status. ## Creating a Workflow ![new-workflow-button](https://docs.vinsi.ai/images/tickets/symbols/workflow/new-workflow.svg) ![new-workflow-png](https://docs.vinsi.ai/images/tickets/vinsi-screenshots/new-workflow.png) In this menu you can create a workflow which will allow you to automate what happens to a ticket based on what happens with a ticket (**trigger**). Connect **nodes** in the workflow screen to create an automated action. 1. Select **New Workflow** from the Workflow page. 2. Enter a descriptive **Workflow Name** so admins can understand what the automation does at a glance. 3. Choose the **Trigger** that should start the workflow, such as Ticket Created, Ticket Updated, Status Changed, or Ticket Assigned. 4. Use **Catalog Item** when the automation should only run for one request type, or leave it set to all tickets when the rule should apply broadly. 5. Add a short **Description** that explains the purpose of the workflow. 6. Create the workflow, then connect trigger, condition, action, and ending nodes in the workflow builder. ## Nodes ### Triggers Trigger nodes define the event that starts the workflow — every workflow must begin with a trigger that detects a change or action on a ticket. #### ![ticket-created](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-ticket-created.svg)Ticket Created Fires when a new ticket is submitted to the system. #### ![ticket-updated](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-ticket-updated.svg)Ticket Updated Fires whenever any field on an existing ticket is modified. #### ![status-changed](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-status-changed.svg)Status Changed Fires when a ticket's status transitions from one state to another. #### ![ticket-assigned](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-ticket-assigned.svg)Ticket Assigned Fires when a ticket is assigned to a team member. ### Conditions Condition nodes evaluate ticket data and branch the workflow down different paths depending on whether the specified criteria are met. #### ![check-field](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-check-field.svg)Check Field Branches the workflow based on the value of a specific ticket field. #### ![check-priority](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-check-priority.svg)Check Priority Branches the workflow based on the ticket's priority level. #### ![check-status](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-check-status.svg)Check Status Branches the workflow based on the ticket's current status. #### ![check-catalog](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-check-catalog.svg)Check Catalog Item Branches the workflow based on the catalog item type associated with the ticket. #### ![check-custom-field](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-check-custom-field.svg)Check Custom Field Branches the workflow based on the value of a custom field defined in the catalog. ### Actions Action nodes perform an operation on the ticket — such as assigning it, updating its fields, or sending a notification — when the workflow reaches that step. #### ![assign-agent](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-assign-agent.svg)Assign Agent Automatically assigns the ticket to a specific agent. #### ![assign-group](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-assign-group.svg)Assign Group Automatically assigns the ticket to a team or support group. #### ![set-status](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-set-status.svg)Set Status Changes the ticket's status to a specified value. #### ![set-priority](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-set-priority.svg)Set Priority Updates the ticket's priority level automatically. #### ![set-department](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-set-department.svg)Set Department Assigns the ticket to a specific department. #### ![send-email](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-send-email.svg)Send Email Sends an automated email notification to a specified recipient. #### ![add-note](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-add-note.svg)Add Note Automatically adds a note to the ticket as part of the workflow. ### Endings Ending nodes mark the conclusion of a workflow path, signaling that all actions for that branch have been executed and the workflow is complete. #### ![end](https://docs.vinsi.ai/images/tickets/symbols/workflow/workflow-end.svg)End Terminates the workflow once all preceding actions have been completed. --- # Knowledge Base Create and manage articles to help agents and end users resolve common issues faster. Created April 1, 2026 ## Overview The Knowledge Base is a place to store helpful articles that agents and end users can refer to when working through common questions or issues. Instead of answering the same question repeatedly, you can write it up once and point people to it. Articles are organized into categories, so your team can quickly find what they need without digging through a long list. You can keep articles as drafts while you're writing them, publish them when they're ready, or archive them if they're no longer relevant. ## Create Category ![new-category-button](https://docs.vinsi.ai/images/tickets/symbols/knowledge-base/new-category.svg) Categories are folders that help keep your articles organized and easy to find. You can place categories inside other categories to group things however makes sense for your team. ## Create Article ![create-article-button](https://docs.vinsi.ai/images/tickets/symbols/knowledge-base/create-article.svg) ![](https://docs.vinsi.ai/images/tickets/vinsi-screenshots/create-article.png) Give your article a **Title** and write the content in the **Body** field — you can format the text using the rich editor toolbar. Pick a **Category** to file it under, and choose a **Status**: _Draft_ keeps it hidden while you work on it, _Published_ makes it visible, and _Archived_ removes it from view without deleting it. When you're ready, hit **Create** to save it. ### ![generate-with-ai](https://docs.vinsi.ai/images/tickets/symbols/knowledge-base/generate-with-ai.svg) Not sure what to write? Click **Generate with AI** and describe what the article should cover — the AI will write a draft for you that you can edit before saving. ## AI Assistant ![icon-chip-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The AI assistant can help you build out your knowledge base faster. It can look at what topics your tickets commonly cover and suggest articles that would be useful to have — so you're not starting from scratch wondering what to write. Once you pick a suggestion, the AI will generate a full article draft for you — just review it, make any edits, and publish when it's ready. --- # Assets Track hardware, software, and equipment, see who uses each item, and print QR labels that let anyone open a support ticket for it. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Assets is your organization's inventory. Each asset records what the item is, where it is, who uses it, who manages it, and its purchase, warranty, and network details. Open it from **Admin** in the ticket system's top navigation, then select the **Assets** card under **Asset Management**. You can also go straight to `/ticket-system/assets`. The page header reads _Manage inventory and equipment_ with the total count. When filters are on, it also shows how many assets are shown. ## The Asset List Summary cards at the top count your assets: **Total**, **In Use**, **Available**, **Under Repair**, and **Retired**. The table shows these columns: | Column | What it shows | | ----------------- | --------------------------------------------------------- | | **Asset** | Display name, with the asset tag (or _No tag_) underneath | | **Type** | The asset type | | **Serial Number** | Manufacturer serial number | | **Assigned To** | The person in the asset's **Used By** field | | **Location** | Where the asset is | | **Status** | In Use, Available, In Repair, Retired, Lost, or Disposed | | **Updated** | How long ago the asset was last changed | On smaller screens some columns are hidden, and on phones the list turns into cards. Tap a card to open its details. ### Search and Filters The search box matches display name, asset tag, serial number, MAC address, the assigned user, and location. Click **Filters** to open the filter panel. You can filter by **Asset Type**, **Status**, **Location**, **Department**, and **Assignment** (_Assigned_ or _Unassigned_). The panel shows _Showing X of Y assets_. Click **Clear All** to reset. ### Row Actions Each row has an **Actions** menu: - **View details** — shows the asset's Overview, Assignment, Identifiers, and Purchase / warranty sections. - **Edit** — opens the asset form. - **Create ticket** — opens the New Ticket form on the Tickets page. - **Scan/update identifiers** — opens the asset form with photo extraction ready, so you can fill in serial number, MAC address, and asset tag from photos. - **Print Label** — opens the label preview for this asset. - **Retire** — sets the status to _Retired_ right away. - **Delete** — permanently removes the asset after you confirm. This can't be undone. **Add New** and **Delete** only appear for users with write access to the ticket system. ## Adding and Editing Assets 1. Click **Add New** (or **Edit** on an existing asset). 2. Under **Asset Info**, enter a **Display Name** (required), **Asset Tag**, **Asset Type**, and **Status**. Then add **Manufacturer / Vendor**, **Model**, and **Serial Number**. 3. Under **Location & People**, set **Location**, **Department**, **Used By**, and **Managed By**. 4. Optionally fill in **Purchase Info** (**Purchase Date**, **Warranty Expiry**, **Purchase Cost**) and **Network Info** (**IP Address**, **MAC Address**, **Operating System**), plus **Notes**. 5. Click **Create Asset** or **Update Asset**. New assets start with the status _In Use_. The **Status** choices are _Available_, _Disposed_, _In Repair_, _In Use_, _Lost_, and _Retired_. ### Extract Data from Photos At the top of the form, the **Extract Asset Data** panel lets AI read labels, serial numbers, ports, and stickers for you. The image button next to **Serial Number** and **MAC Address** opens the same tool. 1. Click **Extract from photos**. 2. Click **Take/upload photos**. On a phone this can open the camera. You can add up to **5** images (up to 10 MB each). 3. Click **Analyze photos**. 4. Found values fill in any empty fields. **Detected fields** lists what was read, along with a confidence score. Click **Apply all fields** to overwrite fields that already have values. 5. Click **Done**, check the values, and save the asset. The tool can read display name, asset tag, asset type, manufacturer, model, serial number, MAC address, IP address, and operating system. AI can misread small or blurry text. Always check serial numbers and MAC addresses before you save. ## Asset Types and Vendors Asset types and vendors are managed on the [Administration](https://docs.vinsi.ai/tickets/admin) page under **Asset Management**: - **Asset Types** — click **New Asset Type** and enter a **Name**, **Description**, and **Icon**. - **Vendors** — click **New Vendor** and enter the name and contact details. Once you create asset types, **Asset Type** in the asset form becomes a list of your types (_\-- Select Type --_). Until then, it offers the built-in types: Computer, Laptop, Monitor, Network Device, Other, Peripheral, Phone, Printer, Server, Software, and Tablet. Once you add vendors, **Manufacturer / Vendor** becomes a list of your vendors (_\-- Select Vendor --_). Until then, it's a text box (for example, _Dell, HP_). ## Assigning Assets **Used By** and **Managed By** list your organization's members by name and email. **Used By** is the person who has the asset. It appears in the **Assigned To** column and drives the _Assigned_ / _Unassigned_ filter. **Managed By** is the person responsible for the asset. Assets also appear on people's records in [Administration](https://docs.vinsi.ai/tickets/admin): - **Agents** — open an agent and select the **Assets** tab. It lists assets where the agent is **Used By** or **Managed By**. - **Requesters** — open a requester and select the **Assets** tab. Pick an asset from the dropdown and click **Add Member** to link it. Click **Remove** to unlink it. Deleting a requester unlinks their assets. ## Assets and Tickets **Create ticket** opens the New Ticket form on the [Tickets](https://docs.vinsi.ai/tickets/tickets) page so you can log an issue while you look at an asset. Tickets created from an asset's QR label are linked to that asset automatically. See [QR Support Page](https://docs.vinsi.ai/tickets/assets#assets-qr) below. ## Printing Labels Each label shows your organization name, the asset's display name and tag, the text _Scan for support_, and a QR code. You can also add the serial number. 1. For one asset, choose **Print Label** from its Actions menu. For several, tick the checkboxes and click **Print Labels (n)** in the header or the selection bar. **Select all shown** picks every asset that matches your filters. **Clear selection** unticks them. 2. The label preview opens in a new tab. Choose a size: **2 x 1 inch** (default), **3 x 2 inch**, or **Custom** (enter width and height in millimeters). 3. Tick **Serial** to print the serial number. 4. Print one of two ways: - **Print using system dialog** — use any printer set up on your computer. - **Print Bluetooth thermal** — send labels straight to a Bluetooth label printer. First choose the protocol, **TSPL label** or **ESC/POS receipt**. For TSPL, also choose **203 dpi** or **300 dpi**. Then pick the printer in the browser prompt. Bluetooth printing needs a browser with Web Bluetooth, such as Chrome or Edge on desktop or Android. iPhone Safari can't send Bluetooth printer commands, so use the system dialog there. ### QR Support Page Scanning a label's QR code opens a public **Asset support** page. It needs no sign-in. The page shows your organization's name and logo, plus the asset's name, tag, type, manufacturer, and model. The person reporting the issue fills in: - **Name** and **Email or phone** - **Issue category** — Hardware issue, Network issue, Software issue, Access issue, or Other - **Description** - **Attachments** — up to 5 images When they click **Create support ticket**, they see _Ticket created_ and a reference number. The new ticket has: - A subject of _Category: Asset name_ - Type _Incident_, priority _Medium_, and source _Asset QR_ - A link to the asset The contact is added as a requester if they aren't one already, and your ticket-created workflows run as usual. ## Import and Export **Export** downloads your assets as a CSV file. **Import** uploads a CSV file. The first row must hold column headers, and every row needs a **Display Name** (or **Name**). Rows without one are skipped. Headers aren't case-sensitive. These columns are recognized: | Field | Accepted headers | | ---------------- | -------------------------------- | | Display name | Display Name, Name | | Asset tag | Asset Tag, Tag | | Asset type | Asset Type, Type | | Status | Status | | Location | Location, Site | | Department | Department, Dept | | Manufacturer | Manufacturer, Make, Brand | | Model | Model, Model Name | | Serial number | Serial Number, Serial, Serial No | | Purchase date | Purchase Date | | Warranty expiry | Warranty Expiry, Warranty | | Purchase cost | Purchase Cost, Cost, Price | | IP address | IP Address, IP | | MAC address | MAC Address, MAC | | Operating system | Operating System, OS | | Description | Description, Desc | | Notes | Notes, Note, Comments | After the import you'll see _Successfully imported N assets_. If some rows fail, you'll see _Imported X of Y_ instead. --- # Requester Portal Let the people who submit tickets check their ticket status. They sign in with a one-time code sent to their email, so no password is needed. Created: September 16, 2026 Updated: September 16, 2026 ## Overview The **Ticket Portal** is a simple self-service page for requesters, meaning customers, employees, or anyone else who has tickets with your team. They can see every ticket created for them, check the status, and view who is working on it, without contacting your support team. The portal is **read-only**. Requesters can view and track tickets, but they can't submit, reply to, or change tickets there. New tickets come in through your other channels, such as [Catalog](https://docs.vinsi.ai/tickets/catalog) request forms and asset [QR labels](https://docs.vinsi.ai/tickets/assets). The portal works on phones and follows the device's light or dark mode. ## Who Can Use the Portal Anyone listed under **Requesters** in [Administration](https://docs.vinsi.ai/tickets/admin) can sign in with that email address. A requester record is created automatically when: - A ticket is submitted with a requester email, for example from a Catalog request form. - Someone reports an issue from an asset's QR support page using an email address. The portal lists tickets linked to the requester. Tickets created for other people, or for someone at another organization with the same email address, don't appear. ### The Portal Link Each organization has its own portal link: ``` https://YOUR_VINSI_APP_URL/ticket-system/portal?org=YOUR_ORGANIZATION_ID ``` The `org` part of the link is required, because it tells the portal which organization to sign in to. Requesters usually get the link by email. When a ticket is submitted from a Catalog request form, the requester gets a _Ticket #…_ email with a **View My Tickets** button, and your team sees _Portal invite email sent to …_. The sign-in code email also has an **Open Ticket Portal** button. ## Signing In 1. Open the portal link. The **Ticket Portal** page says _Sign in to view your ticket status_. 2. Enter your email in **Email Address** and click **Send Login Code**. The page says _We will email you a one-time password to sign in._ 3. Check your inbox for _Your Ticket Portal Access Code_. The code is 8 characters and expires in **10 minutes**. 4. Enter or paste the code in **Enter Login Code** and click **Sign In**. On the code screen, click **Resend code** to get a new code (the old one stops working), or **Change email** to start over. For privacy, the portal shows the same message whether or not an email is registered. If a code never arrives, the email may not match a requester on file. See [Troubleshooting](https://docs.vinsi.ai/tickets/portal#portal-troubleshooting). ## Tracking Tickets After signing in, requesters see **My Tickets** with a total count, newest first. Each ticket card shows: - The ticket number and subject - A status badge: _Open_, _Pending_, _Resolved_, or _Closed_ - The priority: _Low_, _Medium_, _High_, or _Urgent_ - The ticket type, the date it was created, and _Assigned to_ the agent (or _Unassigned_) Use the status buttons (**All**, **Open**, **Pending**, **Resolved**, **Closed**) to filter the list. The list shows 10 tickets per page. Click **Refresh** to load the latest changes from your team. If there are no tickets yet, the portal shows _No tickets yet — When tickets are created for you, they will appear here._ ### Ticket Details Click a ticket to see its full **Description** and these details: | Field | Meaning | | --------------- | ---------------------------------------------------- | | **Type** | The ticket type, e.g. Incident or Service Request | | **Source** | How the ticket came in, e.g. Chat Widget or Asset QR | | **Created** | Date and time the ticket was opened | | **Due By** | The target resolution date, if one is set | | **Assigned To** | The agent handling it | | **Group** | The ticket group | | **Department** | The department | | **Resolved** | When it was resolved, if it has been | ## Signing Out Click **Sign Out** in the top bar, next to the requester's name. For security, a sign-in lasts up to 24 hours and only in the current browser tab. Closing the tab also signs the requester out, and they'll need a new code next time. ## Troubleshooting | Problem | What to check | | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | The code never arrives | Check spam. Make sure the email exactly matches a record under **Requesters** in Administration, and that the link includes the right org value. | | _Too many requests. Please try again later._ | Each email can request up to 3 codes every 15 minutes. Wait and try again. | | _Invalid or expired code. Please request a new one._ | The code is more than 10 minutes old or was replaced by a newer one. Click **Resend code**. | | A ticket is missing from the list | Make sure the ticket is linked to this person as its requester. Only those tickets appear. | | Signed out unexpectedly | Sessions end after 24 hours or when the tab closes. Request a new code. | --- # Analytics Track ticket volume, team performance, and resolution trends to keep your support operation running smoothly. Created April 1, 2026 ## Overview The Analytics section gives you a clear picture of how your ticketing system is performing. You can see how many tickets are coming in, how quickly they're being resolved, and how your team is handling the workload — all in one place. Use it to spot patterns, identify bottlenecks, and make informed decisions about how to improve your support process. ## Curated Reports Pre-built reports covering the most common areas of your support operation — just open and go, no setup needed. ### Service Desk #### ![service-desk-overview](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-service-desk-overview.svg)Service Desk Overview Provides insights about ticket inflows and SLA compliance. **Data Points:** Total Tickets, Tickets by Status, Tickets by Priority, Tickets in the Last 30 Days #### ![service-desk-trends](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-service-desk-trends.svg)Service Desk Trends Provides insights about ticket load and service desk performance. **Data Points:** Weekly Ticket Volume (Last 13 Weeks) #### ![ticket-lifecycle](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-ticket-lifecycle.svg)Ticket Lifecycle Provides a break-up of time spent by tickets in different statuses. **Data Points:** Avg. Resolution Time, Avg. First Response, Resolved Tickets, Overdue Rate, Status Distribution (Open, Resolved, Pending) #### ![agent-performance](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-agent-performance.svg)Agent Performance Compares the performance of agents based on resolution and workload. **Data Points:** Performance by Agent #### ![priority-analysis](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-priority-analysis.svg)Priority Analysis Breakdown of tickets by priority levels and response times. **Data Points:** Tickets by Priority, Tickets by Type #### ![source-analysis](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-source-analysis.svg)Source Analysis Shows where tickets originate from across channels. **Data Points:** Tickets by Source Channel ### Tasks #### ![task-overview](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-task-overview.svg)Task Overview Provides insights about task completion and workload. **Data Points:** Total Tasks, Tasks by Status (Open, Completed, Overdue) ### Assets #### ![inventory-overview](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-inventory-overview.svg)Overview of Inventory Provides insights about cost and hygiene of assets managed. **Data Points:** Assets by Status #### ![asset-type](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-asset-type.svg)Asset Type Distribution Breakdown of assets by type and status. **Data Points:** Assets by Type ### Solutions #### ![solutions-overview](https://docs.vinsi.ai/images/tickets/symbols/analytics/analytics-solutions-overview.svg)Solutions Overview Gives an overview of Solutions creation and usage. **Data Points:** Total Articles, Published Articles, Total Drafts, Article Views, Articles Marked as Helpful ## AI Assistant ![icon-chip-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The AI assistant lets you ask questions about your ticket data in plain language — no need to build a report manually. You can ask things like "how many tickets were closed last week?" or "which agent resolved the most tickets this month?" and get an answer right away. Just type what you want to know and the AI will pull the relevant data and present it clearly — you can also ask it to suggest which reports to read based on what information you want to understand. --- # Administration Configure and manage your ticket system — users, permissions, assets, and more. Created April 1, 2026 Updated: September 16, 2026 ## Overview The Administration section is where you set up and control everything behind the scenes of your ticket system. From here you can manage who has access, what they can do, and how your organization's assets are tracked. Changes made here affect the entire system, so this area is typically handled by an admin or team lead. Open it from **Admin** in the ticket system's top navigation (`/ticket-system/admin`). The page subtitle reads _Manage ticket system settings_, and an **AI Assistant** button sits at the top right. Settings are grouped under section headers. Each card shows a count of the items it contains, and cards only appear for users whose role grants the matching permission. ## User Management Manage users, groups and permissions across the service desk. #### ![ticket-agents](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-ticket-agents.svg)Agents Manage all service desk team members, permissions and access rights (formerly _Ticket Team_). Search by name or email, sort, and filter by role. Opening an agent shows the tabs **Profile**, **Tickets**, **Assets**, **Groups**, **Departments**, **Schedules**, and **Roles**. #### ![agent-groups](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-agent-groups.svg)Ticket Groups Create groups of users that can be auto-assigned to tickets. Click **New Group** and enter a **Name** and **Description**. Inside a group, use **Add Member** to add agents and set a **Default Assignee**. #### ![roles](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-roles.svg)Roles Create and modify roles to manage agent permissions. Click **New Role**, enter a **Name** and **Description**, then tick permissions from the checklist covering tickets, assets, knowledge base, analytics, and admin. #### ![departments](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-departments.svg)Departments Manage departments and their associated members. Click **New Department** to add one. #### ![requesters](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-requesters.svg)Requesters External contacts who submit tickets via widgets (formerly _Ticket Requesters_). The list shows **Name**, **Email**, **Phone**, and **Tickets**. Deleting a requester unlinks their tickets and assets. #### ![requester-groups](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-requester-groups.svg)Requester Groups Create requester groups and manage permissions for members (formerly _Ticket Requester Groups_). #### ![work-schedule](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-work-schedule.svg)Business Hours Assign work schedules to users to calculate their workload (formerly _Work Schedule_). Click **New Schedule** and enter a **Name**, **Description**, and **Type**: - 24 hours 7 days a week - 24 hours 5 days a week - Business Hours (9 AM – 5 PM) - Extended Hours (7 AM – 10 PM) - Night Shift (10 PM – 6 AM) - Custom Hours Add **Members** to a schedule, and use **Set as Default** to make it the default schedule. ## Asset Management Track and manage your organization's hardware, software, and other assets. #### ![assets](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-assets.svg)Assets Track hardware, software, licenses, and other organizational assets in one place. #### ![asset-types](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-asset-types.svg)Asset Types Define and manage categories for your assets to keep your inventory organized. Click **New Asset Type** and enter a **Name**, **Description**, and **Icon**. #### ![vendors](https://docs.vinsi.ai/images/tickets/symbols/admin/admin-vendors.svg)Vendors Manage the vendors and manufacturers associated with your assets. Click **New Vendor** and enter a **Name**, **Description**, **Website**, **Email**, **Phone**, **Address**, and **Contact Person**. ## Email Settings Available to organization admins. Configure the outgoing email server for ticket system notifications. Choose one of three modes: - **Platform default** — sends from `noreply@vinsi.ai`. No setup required. - **Manual SMTP** — enter **SMTP Host**, **Port**, **TLS/SSL**, **Username**, **Password**, **From Name**, **From Email**, and **Reply-To Email**, plus **Rate Limits** per minute, per hour, and per day. Click **Test Connection** to verify your settings, then **Save**. - **OAuth Connected Account** — click **Connect Microsoft account** or **Connect Google account**, and set a **Reply-To Email**. ## AI Assistant ![icon-chip-svg](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The AI assistant can help you manage and configure your system faster. Ask it questions about your current setup, get recommendations on how to structure roles and departments, or have it walk you through any part of the administration settings. Just describe what you're trying to set up and the AI will guide you through the steps — no need to dig through settings on your own. --- # Dashboard Get a real-time snapshot of your sales pipeline, contacts, engagements, deals, and tasks — all in one place. Created April 1, 2026 ## Overview The CRM Dashboard is the first thing you see when you open the CRM. It gives you a live view of what's happening across your sales operation — pipeline value, active engagements, contact counts, and your personal workload. Everything on the dashboard updates automatically, so you always have an up-to-date picture without having to dig through individual sections. You can freely move around cards, and you can also delete or edit tiles by clicking the three dots on the top right of each card. ## Dashboard The dashboard is made up of four widget categories: KPI Cards, Charts, Lists, and Navigation. ### KPI Cards #### ![pipeline-value](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-pipeline-value.svg)Pipeline Value Total value of all open deals currently in your pipeline. #### ![engagements](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-engagements-card.svg)Engagements Number of active engagements and the total across all stages. #### ![contacts](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-contacts-card.svg)Contacts Total number of contacts in your CRM, split between leads and customers. #### ![my-work](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-my-work.svg)My Work Your personal workload — open tickets and tasks assigned to you. ### Charts #### ![deal-pipeline](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-deal-pipeline.svg)Deal Pipeline A bar chart showing how many deals are in each stage of your pipeline, with total value at a glance. #### ![engagement-stages-companies](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-engagement-stages.svg)Engagement Stages & Companies Shows how your engagements are distributed across pipeline stages alongside a breakdown of your company contacts. ### Lists #### ![recent-activity](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-recent-activity.svg)Recent Activity A live feed of the latest actions taken across your CRM — calls, notes, status changes, and more. #### ![my-tasks](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-my-tasks.svg)My Tasks Your upcoming tasks, so you can see what needs to be done without leaving the dashboard. #### ![recent-deals](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-recent-deals.svg)Recent Deals The most recently created or updated deals in your pipeline. ### Navigation #### ![quick-links](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-stat-contacts.svg)Quick Links Navigation shortcuts to the CRM sections you use most. ## Content ![add-content-button](https://docs.vinsi.ai/images/crm/symbols/dashboard/crm-dash-add-content.svg) Use the Add Content menu to choose which widgets appear on your dashboard. Each widget can be toggled on or off individually. **Pipeline Value** — KPI card showing total open deal value. **Engagements** — KPI card showing active and total engagement counts. **Contacts** — KPI card showing your total leads and customers. **My Work** — KPI card showing your open tickets and tasks. **Deal Pipeline** — Chart showing deals broken down by pipeline stage. **Engagement Stages & Companies** — Charts showing engagement stage distribution and company breakdown. **Recent Activity** — List of the latest actions taken across your CRM. **My Tasks** — List of upcoming tasks assigned to you. **Recent Deals** — List of your most recently created or updated deals. **Quick Links** — Navigation shortcuts to the sections you use most. --- # Contacts View, manage, and organize all your contacts — leads and customers — in one place. Created April 1, 2026 ## Overview The Contacts page is your central list of every person in your CRM — leads, customers, or both. Click into any contact to view their full profile and history. Use the navigation bar at the top to quickly switch between **All Leads**, **All Contacts**, **My Leads**, or **Leads by Status**. ## Add Contact ![add-contact-button](https://docs.vinsi.ai/images/crm/symbols/contacts/crm-add-contact.svg) Click **Add Contact** to create a new contact record. [Need to add contacts in bulk?Use Import Contacts in CRM Admin to upload a CSV and assign leads to team members all at once.](https://docs.vinsi.ai/crm/admin/data-automation#crm-da-import-contacts) ## Organization ### Filtering ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the contacts list using any combination of the following filters: - **Lead Status** — filter by the contact's current lead status - **Disposition** — filter by the contact's disposition - **Type** — filter by contact type - **Source** — filter by where the contact originated - **Last Work Date** — filter by when the contact was last worked - **Assigned To** — show contacts assigned to a specific team member ### Column Display ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the following columns are displayed: **Company**, **Email**, **Phone**, **State**, **Lead Status**, **Disposition**, **Last Work Date**, & **Assigned To** You can optionally enable: **Title**, **Email 2**, **Phone 2**, **Phone 3**, **Source**, **Type**, **Created**, & **Updated** ### AI Assistant ![icon-chip](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The built-in AI assistant can help you work more efficiently with your contacts. Use it to create custom filters, sort and group records, and calculate totals — without needing to configure everything manually. Simply describe what you want to see in plain language and the AI assistant will build the filter or grouping for you automatically. --- # Companies Track and manage all the companies your team works with, including clients and prospects. Created April 1, 2026 ## Overview The Companies page lists every business or organization in your CRM. Click into any company to view its profile, associated contacts, and activity history. Use the navigation bar at the top to quickly switch between **All Companies**, **My Companies**, or **All Clients**. ## Add Company ![add-company-button](https://docs.vinsi.ai/images/crm/symbols/companies/crm-add-company.svg) Click **Add Company** to create a new company record. ## Organization ### Filtering ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the companies list using any combination of the following filters: - **Type** — filter by company type - **Created** — filter by creation date or date range - **Industry** — filter by the company's industry ### Column Display ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the following columns are displayed: **Contact**, **Phone**, **Website**, **Location**, **Type**, & **Created** You can optionally enable: **Email**, **Industry**, **Address**, **Zip**, **Country**, **Updated**, & **Owner** ### AI Assistant ![icon-chip](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The built-in AI assistant can help you work more efficiently with your company records. Use it to create custom filters, sort and group records, and calculate totals — without needing to configure everything manually. Simply describe what you want to see in plain language and the AI assistant will build the filter or grouping for you automatically. --- # Deals Track every deal in your pipeline — from first contact to closed won. Created April 1, 2026 ## Overview The Deals page shows every deal your team is working on. Click into any deal to view its full details, activity timeline, and linked contacts. Use the navigation bar at the top to quickly switch between **All Deals**, **My Deals**, or **Deals by Status**. ## Add Deal ![add-deal-button](https://docs.vinsi.ai/images/crm/symbols/deals/crm-add-deal.svg) Click **Add Deal** to create a new deal record. ## Organization ### Filtering ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the deals list using any combination of the following filters: - **Deal Stage** — filter by the current stage in the pipeline - **Priority** — filter by Low, Medium, High, or Urgent - **Deal Type** — filter by the type of deal - **Created** — filter by creation date or date range ### Column Display ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the following columns are displayed: **Stage**, **Amount**, **Total Annual**, **Close Date**, **Owner**, **Contact**, & **Priority** You can optionally enable: **Company**, **Pipeline**, **Deal Type**, **Billing Type**, **Frequency**, **Recurring Amt**, & **Created** ### AI Assistant ![icon-chip](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The built-in AI assistant can help you work more efficiently with your deals. Use it to create custom filters, sort and group records, and calculate totals — without needing to configure everything manually. Simply describe what you want to see in plain language and the AI assistant will build the filter or grouping for you automatically. --- # Activities Log and review all the interactions your team has had with contacts and companies. Created April 1, 2026 ## Overview The Activities page is a log of every interaction in your CRM — calls, emails, meetings, and more — tied to contacts, companies, or deals. Use the navigation bar at the top to quickly switch between **All Activities**, **My Activities**, or **Activities by Status**. ## New Activity ![new-activity-button](https://docs.vinsi.ai/images/crm/symbols/activities/crm-new-activity.svg) Click **New Activity** to log a new interaction. ## New Task ![new-task-button](https://docs.vinsi.ai/images/crm/symbols/activities/crm-new-tasks.svg) This page also includes a **Tasks** tab. Switch between Activities and Tasks using the tabs at the top of the page. ![activities-tasks-tabs](https://docs.vinsi.ai/images/crm/symbols/activities/crm-activities-tabs.svg) \- Click **New Task** to create a new task. ## Organization ### Filtering Activities ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the activities list using any combination of the following filters: - **Status** — filter by Open, Pending, On Hold, Resolved, or Closed - **Priority** — filter by Low, Medium, High, or Urgent - **Agent** — show records assigned to a specific agent - **Created** — filter by creation date or date range - **Department** — filter by department - **Group** — filter by team or group - **Contacts** — search by name or email - **Category** — filter by category - **Due By** — filter by deadline ### Filtering Tasks ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the tasks list using any combination of the following filters: - **Task Status** — filter by Open, Pending, On Hold, Resolved, or Closed - **Ticket Priority** — filter by Low, Medium, High, or Urgent - **Assignee** — show tasks assigned to a specific team member - **Created** — filter by creation date or date range - **Due By** — filter by deadline ### Activities Columns ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the following columns are displayed: **Subject**, **Contact**, **Due Date**, **State**, **Status**, **Priority**, **Assigned To**, & **Ticket #** You can optionally enable: **Type**, **Source**, **Tags**, **Department**, **Group**, **Requester Email**, **Created**, **Closed At**, **Resolved At**, & **Updated** ### Tasks Columns ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the following columns are displayed: **Task**, **Ticket**, **Contact**, **Due Date**, **State**, **Status**, **Priority**, & **Assigned To** You can optionally enable: **Ticket #**, **Ticket Status**, **Contact Email**, **Description**, **Created By**, **Created**, **Completed At**, & **Updated** ### AI Assistant ![icon-chip](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The built-in AI assistant can help you work more efficiently with your activity log. Use it to create custom filters, sort and group records, and calculate totals — without needing to configure everything manually. Simply describe what you want to see in plain language and the AI assistant will build the filter or grouping for you automatically. --- # Tasks Break CRM activities into to-dos, assign them to teammates with due dates, and track them in a list or on a Kanban board. Created: September 16, 2026 Updated: September 16, 2026 ## Overview A CRM task is a to-do that belongs to one [activity](https://docs.vinsi.ai/crm/activities), for example "Send the proposal" on a follow-up activity. Each task has a title, optional description, assignee, due date, and status. The task's **priority** and **contact** come from its activity. An activity can have any number of tasks, and its details show a progress bar such as **Tasks 2/5 completed**. ## Find Your Tasks 1. Open **CRM → Activities**. 2. Click **Tasks** in the **Activities | Tasks** toggle. The badge shows how many tasks you have. 3. Choose a tab: | Tab | Shows | Available to | | -------------- | ---------------------------------------------------------------- | --------------------- | | My Tasks | Tasks assigned to you, plus tasks on activities assigned to you. | Everyone | | All Open Tasks | All tasks that are Open or In Progress. | Org admins and owners | | All Tasks | Every task in the organization, including completed ones. | Org admins and owners | ## Create a Task Every task must be attached to an existing activity. You can add tasks in three places. ### New Task Button 1. In **CRM → Activities → Tasks**, click **New Task**. 2. Under **Link to Ticket**, pick the activity in the **Ticket** list (shown as _number — subject \[status\]_). 3. Under **Task Details**, enter a **Title** and an optional **Description**. 4. Under **Assignment**, choose **Assign To** (defaults to you) and an optional **Due By** date and time. 5. Click **Create Task**. You'll see **Task created successfully**. The **New Task** button requires write access to CRM Activities. If you don't see it, ask an admin for that permission. ### While Creating an Activity 1. Click **New Activity** on the Activities page. 2. In the **Tasks** section, click **Add Task** once per task. 3. For each **Task 1**, **Task 2**, … enter a title, and optionally an assignee (defaults to you) and a due date. Use the trash button to remove one. 4. Create the activity. The tasks are saved with it; tasks left without a title are skipped. ### Inside an Activity Open an activity (click a task row, or open the activity's detail page). In the **Tasks** section click **Add Task**, type a title, optionally choose an assignee and due date, and click **Add**. In the activity details window you can also click **✨ AI Draft Title & Description** to have AI suggest a task title from what you typed and the activity subject. ## Task Fields | Field | Details | | ----------- | ---------------------------------------------------------------------------------------------------------------- | | Title | Required. What needs to be done. | | Description | Optional notes (available from the **New Task** button). | | Activity | Required. The activity the task belongs to (labeled **Ticket** in the New Task form). It can't be changed later. | | Assignee | Any member of your organization, or **Unassigned**. | | Due date | Optional date and time. Drives the due state (Overdue, Due Today, and so on). | | Status | Open, In Progress, or Completed. New tasks start as Open. | | Priority | Not set on the task. The list shows the parent activity's priority (Low, Medium, High, Urgent). | ## Statuses and Due States | Status | Meaning | | ----------- | ------------------------------------------------------------------------------------------ | | Open | Not started. Default for new tasks, and the status a reopened task returns to. | | In Progress | Being worked on. Set it by dragging the card to the **In Progress** column in Kanban view. | | Completed | Done. The title is struck through and the completion time is saved in **Completed At**. | The **State** column shows how each unfinished task is tracking against its due date: | State | When | | ----------- | ---------------------------------- | | Overdue | The due date and time have passed. | | Due Today | Due later today. | | Due Soon | Due within the next 3 days. | | On Track | Due more than 3 days from now. | | No due date | No due date is set. | Completed tasks have no state. ## Complete, Reopen, or Delete - **Complete:** click the checkbox next to the task title in the list or in the activity's Tasks section. - **Reopen:** click the checkbox again. The task goes back to **Open**. - **Delete:** click the trash button in the **Actions** column. The button appears for org admins and owners and for the task's assignee. Deleting is immediate and can't be undone. ## Working with the Task List ### Search and Filters ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) **Search tasks...** matches the task title, activity subject, activity number, and assignee name. Click the filter button to narrow the list; a red badge shows how many filters are on. | Filter | Options | | --------------- | --------------------------------------------------------- | | Task Status | All, Open, In Progress, Completed | | Ticket Priority | All, Low, Medium, High, Urgent (the activity's priority) | | Assignee | All, Unassigned, Me | | Created | All time, Today, Last 7 days, Last 30 days, Last 3 months | | Due By | All, Overdue, Due Today, No Due Date | Click **Okay** to close the panel or **Reset** to clear all filters. The AI assistant button opens a chat where you can describe the view you want in plain language, for example to filter, sort, or group tasks. ### Columns ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) Click the sliders button to show or hide columns, or click **Reset** to restore the defaults. **Title** is always shown. Your choice is remembered in this browser. Default columns: **Title** (with the activity number), **Ticket** (the activity subject), **Due Date**, **State**, **Status**, **Priority**, and **Assigned To**. Optional columns include **Ticket #**, **Ticket Status** (the activity's status), **Description**, **Created By**, **Created**, **Completed At**, and **Updated**. ### Kanban View Use the list / grid toggle to switch between **Table view** and **Kanban view**; the choice is remembered in this browser. The board has **Open**, **In Progress**, and **Completed** columns with a count on each. Drag a card to another column to change its status. Cards show the title, activity, description, due state, priority, and assignee. Click a card to open its activity. ### Activity Details Click a task row, a Kanban card, or the eye (**View**) button to open the task's activity. From there you can: - Review the subject, description, type, source, created date, and due date. - Change the activity's **Status**, **Priority**, and **Assigned To**, then click **Save Changes**. - See all of the activity's tasks, check them off, delete them, or add new ones with **Add Task**. See [Activities](https://docs.vinsi.ai/crm/activities) for more about activities. ## Notifications CRM tasks don't send email notifications or reminders when they are assigned, changed, or become due. Use the **My Tasks** tab and the **State** column (or the **Due By → Overdue** filter) to keep on top of your work. Need an email reminder at a specific time? Create a VINSI calendar event linked to the activity and pick a reminder. See [Calendar](https://docs.vinsi.ai/crm/calendar). ## CRM Tasks vs. Ticket Tasks The Ticket System has its own tasks, in **Ticket System → Tasks**. They look similar but are a separate list: CRM tasks never appear in the Ticket System, and ticket tasks never appear under CRM Activities. | | CRM tasks | Ticket tasks | | ------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | | Attached to | A CRM activity | A support ticket | | Where to find them | CRM → Activities → Tasks | Ticket System → Tasks, and inside each ticket | | Email when assigned | No | Yes, to the new assignee | | Status changes | Applied immediately | Emailed to the assignee and logged as a private note on the ticket; dragging on the Kanban board asks for an optional message | See [Tickets](https://docs.vinsi.ai/tickets/tickets) for the Ticket System. ## Troubleshooting & FAQ | Problem | What to do | | ----------------------------------------------- | ----------------------------------------------------------------------------------------------- | | "Please select an activity" | Every task needs an activity. Pick one in the **Ticket** list, or create the activity first. | | "Task title is required" | Enter a title before clicking **Create Task**. | | No **New Task** button | You need write access to CRM Activities. Ask an org admin. | | I only see the **My Tasks** tab | **All Open Tasks** and **All Tasks** are for org admins and owners. | | A task I didn't assign to myself is in My Tasks | My Tasks also includes tasks on activities assigned to you. | | No delete button on a task | Only org admins/owners and the task's assignee can delete it. | | How do I set a task to In Progress? | Switch to Kanban view and drag the card into **In Progress**. | | Can I move a task to a different activity? | No. Create a new task on the other activity and delete the old one. | | My column or view choice was lost | These are saved per browser. A different browser or cleared site data starts from the defaults. | --- # Calendar See your Google or Microsoft meetings and your team's VINSI events in one calendar, and schedule meetings linked to contacts, deals, activities, and engagements. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Open **CRM → Calendar**. The calendar combines up to three sources: your connected **Google** calendars, your connected **Microsoft** calendars, and the built-in **VINSI** calendar, which works without any external account. Use it to create meetings with guests, schedule follow-ups against CRM records, collect RSVPs, and send email reminders. ## Calendar Sources | Source | What you see | Created from the Calendar as | | ------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **Google** | Events from every calendar in _your own_ connected Google account, colored by that calendar's Google color. | A Google Calendar meeting with a Google Meet link. Guests get Google's invitation email. | | **Microsoft** | Events from the calendars in _your own_ connected Microsoft account. | An Outlook meeting set up as a Microsoft Teams online meeting. Guests get Microsoft's invitation email. | | **VINSI** | Native VINSI events: your own personal events plus every organization-wide event. | A VINSI event with a type, color, visibility, reminders, attendees, and optional CRM links. VINSI sends the invitation emails. | Google and Microsoft events are always shown from **your** connection only. You don't see a teammate's Google or Microsoft calendar unless it is shared with your own account in Google or Microsoft. To share events with the whole team inside VINSI, create a VINSI event with **Organization** visibility. ### Connect Google or Microsoft When neither provider is connected, the Calendar shows a banner with **Connect Google** and **Connect Microsoft** buttons and switches to the VINSI calendar automatically. 1. Click **Connect Google** or **Connect Microsoft** (or use the Google / Microsoft cards in [CRM Admin → Team Settings](https://docs.vinsi.ai/crm/admin/team-settings)). 2. Sign in and grant the calendar permission. 3. Return to **CRM → Calendar**. Your calendars now appear in the filters and on the grid. Only an account connected _with calendar access_ counts. If you connected without granting calendar access, reconnect and approve it. ## Views and Filters Use the arrows and **Today** to move through dates, and **Month**, **Week**, or **Day** to change the view. The calendar opens in Month view on desktop and Day view on a phone. - **Month** shows up to 3 events per day (2 on a phone); click **+N more** to see the rest. - **Week** and **Day** show a time grid from **6 AM to 10 PM** with a line marking the current time. The filters above the calendar: | Filter | Options | | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Provider | **All providers**, **Google**, **Microsoft**, **VINSI**. Google and Microsoft appear only when connected. | | Calendar (Google / Microsoft) | **All calendars** or one specific calendar, e.g. _Google · Work ★_ (★ marks the primary calendar). | | Event filter (when Provider is VINSI) | **All Events**, **Activities**, **Contacts**, **Deals**, **Engagements** (events linked to that kind of record), **Organization**, or **Personal** (by visibility). | When you have more than one external calendar, a color legend lists each calendar next to the filters. ## Create a Google or Microsoft Meeting 1. Set the Provider filter to **All providers**, **Google**, or **Microsoft**. 2. Click **New Event**. The **Create meeting** sheet opens, starting at the next full hour for 1 hour. 3. Fill in the fields below and click **Create meeting**. | Field | Details | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Title | Required. | | Start / Duration / End | Required. **Duration** (15 min, 30 min, 45 min, 1 hour, 1.5 hours, 2 hours) sets the end time; you can also type an end time directly. End must be after start. | | Calendar | Required. Which connected Google or Outlook calendar to put the meeting on. | | CRM contact | Type at least 2 characters to search contacts by name, email, or phone. The selected contact is invited and the meeting is logged on their record. | | Guests | Extra guest emails, separated by commas, semicolons, or new lines. The sheet shows how many guests will receive the invite. | | Location | Optional. | | Description | Optional. | If the time overlaps another meeting you created from VINSI, you'll see **You already have a meeting at this time: …** with the option to create the meeting anyway. ## Create a VINSI Event 1. Set the Provider filter to **VINSI**. 2. Click **New Event**. The **Vinsi Calendar** sheet opens. 3. Fill in the fields below and click **Create event**. | Field | Options and defaults | | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Event Title \* | Required. | | Type | Appointment, Call, **Meeting** (default), Reminder, Task, Other. | | Start Date \* / End Date \* | Defaults to the next full hour for 1 hour. Changing the start keeps the same length. End must be after start. | | All day | Switches the dates to whole days. | | Visibility | **Personal** (default) or **Organization**. See [Who Sees What](https://docs.vinsi.ai/crm/calendar#crm-calendar-access). | | Color | One of 8 swatches (purple by default). | | Location | Optional. | | Description | Optional notes or agenda. | | Reminder | Pick any combination: 5 min, 15 min, 30 min, 1 hour, or 1 day before. None are selected by default. | | Attendees | Choose from **— Add org member —**, or type an external email in **Or type an external email...** and click **Add**. Each attendee is tagged **Org** or **External**; click × to remove. | | Link to CRM record (optional) | Expand to link a **Contact**, **Deal**, **Activity**, and/or **Engagement**. | - Picking a deal, activity, or engagement also fills in its contact. - Picking an activity that has a due date moves the event to that due date (1 hour long). The contact linked to the event, directly or through the linked deal, activity, or engagement, is added as an attendee automatically and receives the invitation email. You, as the host, are always added as an accepted attendee. ### Schedule from a CRM Record You can open the same VINSI event form with the record already linked: - **Activity detail page**: click **Schedule Event**. - **Deals** and **Engagements**: open the record and choose **Schedule Event** from the ⋮ menu. See [Deals](https://docs.vinsi.ai/crm/deals). - **New Activity** ([Activities](https://docs.vinsi.ai/crm/activities)): tick **Add to Vinsi Calendar**. This creates a personal VINSI event named after the activity that **ends at the Due By time** and starts 1 hour earlier (or starts 1 hour from now if no due date is set), with a 30-minute reminder. Use **Invite Attendees** to add members or external emails; the activity's contact is invited too. Meetings with a contact from a Google or Microsoft account can also be scheduled from the contact's profile. See [Contacts](https://docs.vinsi.ai/crm/contacts). ## View Event Details Click any event on the calendar to open its details. - **Google / Microsoft events** show the calendar name, date and time, the matching CRM contact (when a guest's email matches a contact), location, description, a **Join meeting →** link when the event has a Meet or Teams link, the organizer, and attendees. - **VINSI events** show the type and visibility, date and time (or **All day**), location, description, linked contact, linked Deal / Activity / Engagement, each guest's response (Accepted, Rejected, Pending) with the **Host** labeled, and the reminder times. ## Edit and Reschedule To reschedule, open the event, click the edit (pencil) button, change the dates, and save. | Event | How editing works | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Google / Microsoft | Opens **Edit meeting**; click **Save changes**. Guests are sent the update by Google or Microsoft. You can't move a meeting to a different calendar (_Calendar changes aren't supported yet for existing meetings._). Past events, holiday calendars, and read-only calendars can't be edited. | | VINSI | Opens the event form; click **Save changes**. Only the host or an org admin/owner can edit. Newly added attendees get an invitation. Tick **Notify attendees of changes** to email existing attendees and the linked contact that the event was updated. | ## Delete or Cancel - **Google / Microsoft:** open the event and click the trash button. Confirm _Delete this calendar event? This will cancel the meeting for all attendees._ Past, holiday, and read-only events can't be deleted. - **VINSI:** open the event, click the trash button, and confirm _Are you sure you want to delete this event?_ Tick **Notify attendees of cancellation** to email attendees and the linked contact. Only the host or an org admin/owner can delete. ## Invitations and Responses Google and Microsoft handle invitations and RSVPs for their own meetings. For VINSI events, VINSI emails every attendee (and the host) when the event is created. - The invitation email has accept and decline links. Team members are taken to **CRM → Calendar**; external guests see a confirmation page such as **Invitation Accepted**. - If you're an attendee, open the event in the Calendar and use **Accept** or **Reject** under **Your response**. You can change your answer at any time. - The host sees a summary such as _3 guests · 2 accepted · 1 awaiting_. ## Reminders VINSI event reminders are sent **by email** to the host and every attendee, including external guests, at each reminder time you selected. Reminders are processed every 5 minutes, so one may arrive a few minutes early or late. Times in reminder emails use your organization's time zone ([Team Settings → Time Zone](https://docs.vinsi.ai/crm/admin/team-settings)). Reminders for Google and Microsoft meetings are managed in Google or Microsoft. ## Who Sees What | Event | Who sees it in the Calendar | Who can edit or delete it | | -------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | | Google / Microsoft | Only the person whose account it comes from. | That person, if they have write access to the calendar and the event hasn't ended. | | VINSI – Organization | Everyone in the organization. | The host, or an org admin/owner. | | VINSI – Personal | Only the host. Invited attendees receive the email but don't see the event in their Calendar. | The host, or an org admin/owner. | When you open an event you can't manage, the panel explains that only the host or an org admin can edit or delete it. ## Default Calendar Account Org admins can choose one connected Google or Outlook account as the organization's **Default Calendar Account** in [CRM Admin → Team Settings → Calendar Settings](https://docs.vinsi.ai/crm/admin/team-settings). It controls where automated CRM calendar requests (for example, booking through the API) create, read, reschedule, and delete events. When it isn't set, those requests fall back to the internal VINSI calendar. It doesn't change which calendars you see on the Calendar page. ## Troubleshooting & FAQ | Problem | What to do | | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **New Event** is disabled ("Connect a calendar provider to create meetings") | Connect Google or Microsoft, or switch the Provider filter to **VINSI**. | | Edit and delete buttons are grayed out on a Google/Microsoft event | The event is in the past, on a holiday calendar, or on a calendar you can only read. Hover the button to see which. | | "Only the host or an org admin can edit this event" | Ask the host (shown in the panel) or an org admin to make the change. | | An early-morning or late-night event is missing | Week and Day views show 6 AM–10 PM only. Switch to **Month**. | | A teammate can't see my VINSI event | Personal events are visible only to you. Edit the event and choose **Organization**. | | I can't see a teammate's Google/Microsoft meetings | External calendars come from your own connection only. Have them share the calendar with your account in Google or Microsoft, or use Organization VINSI events. | | "You already have a meeting at this time" | Choose another time, or confirm to create the meeting anyway. | | "End time must be after start time." | Move the end later than the start, or pick a Duration. | | A contact received an invitation I didn't expect | Linking a contact, deal, activity, or engagement invites that record's contact. Remove the link before saving if you don't want to invite them. | | No reminder email | Reminders apply to VINSI events only and must be selected on the event. Check your spam folder; allow up to 5 minutes. | --- # Documents Access and manage all documents associated with your CRM contacts, companies, and deals. Created April 1, 2026 ## Overview The Documents page gives you a centralized view of all files attached to your CRM records — contacts, companies, or deals. Use the navigation bar at the top to quickly switch between **All Documents** or **My Documents**. ## Organization ### Filtering ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the documents list using any combination of the following filters: - **Source Type** — filter by where the document originated - **Category** — filter by document category - **Date Uploaded** — filter by when the document was uploaded ### Column Display ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the following columns are displayed: **Type**, **Source**, **Company**, **Contact**, **Category**, **Size**, **Date**, & **Signing** You can optionally enable: **Uploaded By** & **File Type** ### AI Assistant ![icon-chip](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The built-in AI assistant can help you find and organize documents quickly. Use it to create custom filters, sort and group files, and locate what you need — without configuring everything manually. Simply describe what you want to see in plain language and the AI assistant will build the filter or grouping for you automatically. --- # Engagements Manage and track every customer engagement — from initial outreach through to close. Created April 1, 2026 ## Overview The Engagements page shows every active and historical engagement in your pipeline, linked to contacts, companies, and activities. Use the navigation bar at the top to quickly switch between **All Engagements**, **My Engagements**, or **Engagements by Status**. ## New Engagement ![new-engagement-button](https://docs.vinsi.ai/images/crm/symbols/engagements/crm-new-engagement.svg) Click **New Engagement** to create a new engagement record. ## Organization ### Filtering ![icon-filter](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-filter.svg) Narrow down the engagements list using any combination of the following filters: - **Stage** — filter by the current engagement stage - **Pipeline** — filter by pipeline - **Type** — filter by engagement type - **Created** — filter by creation date or date range ### Column Display ![icon-sliders](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-sliders.svg) By default, the following columns are displayed: **Type**, **Stage**, **Amount**, **Total Annual**, **Owner**, **Contact**, & **Created** You can optionally enable: **Pipeline**, **Company**, **Frequency**, **Recurring Amt**, **Start Date**, **End Date**, **Description**, & **Updated** ### AI Assistant ![icon-chip](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-chip.svg) The built-in AI assistant can help you work more efficiently with your engagements. Use it to create custom filters, sort and group records, and calculate totals — without needing to configure everything manually. Simply describe what you want to see in plain language and the AI assistant will build the filter or grouping for you automatically. --- # Invoices VINSI now includes a full invoicing module built directly into the CRM, so you can create, send, and track invoices without leaving your workflow. From line items and tax rules to payment collection, everything is connected to your contacts, companies, and deals in one place. Created May 18, 2026 ## Adding Invoices A detailed guide on adding invoices to the CRM. #### ![new-invoice](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-add.svg)New Invoice Clicking **\+ Add Invoice** opens the draft invoice workspace. The form is divided into several sections: **Organization Details** Fill in your organization's name, phone, email, and address. You can also upload or replace your organization logo, which will appear on the invoice. **Invoice Details** - **Document Type** — choose between **Invoice** or **Quote** - **Invoice No** — auto-generated (e.g. INV-2026-3922), editable if needed - **Issue Date** and **Due Date** — set when the invoice is issued and when payment is due - **Payment Method** — select from: Credit Card, ACH, Check, Cash, Bank Transfer, or Wire Transfer - **Client** — link to a **Company** or **Contact** by searching by name or email - **Client Email** — the email address the invoice will be sent to **Billing & Shipping Address** Enter the client's billing address (Full Name, Company, Street, City, State, Postal Code, and Tax Number). The shipping address defaults to **Same as billing** — uncheck to enter a separate destination. **Line Items** Click **\+ Add Item** to add billable items. Each line item has a **Type** toggle (**Product** or **Service**), a dropdown to select from your catalog, **Qty**, **Rate / hour**, [**Tax %**](https://docs.vinsi.ai/crm/invoices#crm-invoices-taxes), and a calculated **Amount**. A details field below each item lets you add a description. **Payment Details & Totals** At the bottom, set the **Payment Method**, **Shipping Charge**, and **Discount**. The **Notes** field holds payment terms that will appear on the invoice (e.g. due within 14 days, accepted payment methods). The **Totals** panel on the right updates in real time, showing **Sub Total**, **Tax**, **Total**, and **Total Due**. When ready, use **Save Draft** to save without sending, **Save Invoice** to finalize, **Download Invoice** to export as a PDF, or **Print** to print directly. #### ![import-invoice](https://docs.vinsi.ai/images/tickets/symbols/ticket-task-management/icon-add.svg)Import Invoice Click **Import Invoice** to upload an existing invoice as a PDF. Supported formats include **QuickBooks**, **Stripe**, **Xero**, **Zoho**, and generic PDFs. After uploading, you can review and edit the extracted data before the invoice is created. PDF import is a secondary workflow — manual invoice creation is still the primary path. ## Invoices Management Below is a detailed guide on how to use the core tools for creating, viewing, and managing invoices across your CRM. These stats appear on the invoice list page of the invoice management page. #### Overview The Invoices overview is your billing dashboard. At the top, four stat cards summarize your financial position at a glance: - **Invoices Sent** — total value of all invoices sent in the current view - **Paid Invoices** — total value of payments received - **Outstanding** — total balance still owed across open invoices - **Cancelled** — total value of voided or cancelled invoices Below the stat cards, two widgets sit side by side: - **Payment Activity** — A monthly chart comparing income versus expenses over time. - Click **Reports** to go to the _revenue reports_ section. - **Catalog Mix** — Shows how many active **Products** and **Services** are available as billable items. - Click **Catalog** to go to the _product list_ page. **AI Analysis:** This panel provides beta insights powered by VINSI AI. It surfaces outstanding balances, overdue invoice counts, failed payments, and active tax rules — along with clients flagged for follow-up. Click **Run Analysis** to refresh the insights. **Recent Invoices:** This panel lists your latest invoices with client, date, status, and total. **Recent Transactions** shows the most recent financial activity. Use **View all** or **Open** to navigate to the full lists. #### Invoice List A full list of all invoices in your CRM. Use the search bar to find invoices by invoice number, client, email, or status. Filter the list using the status tabs: **All**, **Quotes**, **Paid**, **Outstanding**, **Overdue**, **Draft**, and **Cancelled**. Use **\+ Add Invoice** to create a new invoice, or **Import Invoice** (Beta) to bulk-import invoice records. #### New Invoice See [Adding Invoices — New Invoice](https://docs.vinsi.ai/crm/invoices#crm-invoices-new) section above. #### Invoice Details Open any invoice to view its full details — line items, totals, payment history, and linked CRM records. From the detail view you can edit the invoice, record a payment, send a reminder, or download the invoice as a PDF. ## Money Movement Track and reconcile all financial activity tied to your invoices. #### Payments View all payments recorded against invoices. Each payment entry shows the amount, date, method, and which invoice it was applied to. Payments can be logged manually or imported from a connected payment processor. **Adding a Payment** Click **Add Payment** to open the payment form. Fill in the following fields: - **Invoice** — select the invoice this payment applies to - **Member** — the team member recording the payment - **Date** — the date the payment was received - **Payment Type** — Credit Card, ACH, Check, Cash, Bank Transfer, or Wire Transfer - **Payment Details** — a reference number, authorization code, or note - **Amount** — the payment amount - **Status** — set to **Pending**, or update once confirmed #### Transactions A ledger-style log of every financial transaction in the system — including invoice charges, payments received, refunds, and adjustments. Use this view to audit activity and reconcile with your accounting records. **New Transaction** Click **New Transaction** to manually record a transaction or upload a receipt. Fill in the following fields: - **Description** — a note describing the transaction - **Credit / Debit** — select the transaction type: - **Credit – Payment** — money received against an invoice - **Credit – Invoice** — revenue recorded from an issued invoice - **Debit – Refund** — money returned to a client - **Debit – Expense** — an outgoing expense - **Amount** — the transaction value - **Source** — where the transaction originated (e.g. Manual, Wire, POS, Venmo, etc.) - **Date** — the date of the transaction - **Status** — Paid, Pending, Failed, or Refunded - **Attachment** — optionally upload a receipt or supporting document The **Pay Now** button on this form is used to save and record the transaction — it does not initiate a live payment. #### Taxes Configure tax rate templates that can be applied to invoice line items. Saved taxes appear in the **Tax %** dropdown when adding line items to an invoice. **Add Tax** Click **Add Tax** to create a new tax rate. Fill in the following fields: - **Tax Name** — a label for the tax (e.g. Sales Tax, VAT) - **Country** — the country this tax applies to - **Region** — the state or region, or leave as _(any)_ to apply broadly - **Tax Rate (%)** — the percentage rate to apply - **Applies To** — which items this tax applies to (e.g. All, Products, Services) - **Enabled** — toggle to activate or deactivate the tax rule ## Catalog Manage the products and services available to add as line items on invoices. #### Product List Browse all products and services in your catalog. Each item shows its name, description, unit price, and tax classification. The product list is what populates the line item picker when creating or editing an invoice. #### Add Product Click **Add Product** to add a new item to your catalog. Set the product name, description, unit price, and default tax rate. Once saved, it becomes immediately available as a line item on any invoice. ## Reports Analyze invoicing performance and revenue trends over time. #### Revenue Reports The Revenue Reports page gives you a financial summary of your invoicing activity. At the top, four stat cards provide a quick snapshot: - **Total Revenue** — total value of all invoices booked - **Collected** — payment summary of what has been received - **Outstanding** — total balance still owed across open invoices - **Catalog Items** — count of active products and services in your catalog Below the stat cards, two panels sit side by side: - **Sales Report** — a chart comparing invoice amounts against collected payments over time, giving you a clear view of your revenue vs. collection gap - **Payment Summary** — breaks down revenue by item classification, showing separate totals for **Products** and **Services** At the bottom, the **Expenses Report** lists recent activity affecting invoicing, with columns for **Recent**, **Date**, **Type**, **Status**, and **Amount**. --- # Administration Configure and manage your CRM — integrations, pipelines, contact settings, automation, and phone. Created April 1, 2026 Updated: September 16, 2026 ## Overview The CRM Administration section gives you full control over how your CRM is configured and how your team uses it. Changes made here affect the entire organization and are typically managed by an admin or team lead. Open it from **CRM → Admin**. The page has a heading and a search box to filter cards, and the cards are grouped into the sections below. Clicking a card opens its settings in a slide-up panel. This page is a map of every card. For step-by-step instructions — what each field does, what happens when you rename or delete something, and the gotchas — open the section pages: [Team Settings](https://docs.vinsi.ai/crm/admin/team-settings), [CRM Configuration](https://docs.vinsi.ai/crm/admin/crm-configuration), [Invoice Settings](https://docs.vinsi.ai/crm/admin/invoice-settings), [Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation), and [Phone](https://docs.vinsi.ai/crm/admin/phone). ## [Team Settings ](https://docs.vinsi.ai/crm/admin/team-settings) Integrations, timezone, and team member access ### Google — Connect Gmail and Google Calendar. ### Microsoft — Connect Microsoft mail and calendar. ### Time Zone — Set the default time zone for ticket due date notifications and scheduling. ### Calendar Settings — Choose which connected Google or Outlook account the CRM uses to create, read, reschedule, and delete calendar events. ### Email Settings — Configure the outgoing email server. ### CRM Team — Manage who has CRM module access. ### Video Meetings — Create and join video meetings with your team and contacts. ## [CRM Configuration ](https://docs.vinsi.ai/crm/admin/crm-configuration) Manage pipelines, contact options, and email templates ### Pipeline Configuration — Manage deal and engagement pipelines and their stages. ### Lead Statuses — Customize contact lead status options. ### Dispositions — Manage call disposition options shown on contact profiles. ### Contact Sources — Track where contacts and leads originate. ### Industries — Manage industry options for company profiles. ### Email Templates — Create and manage quick-fill email templates for the compose modal. ### SMS Templates — Create and manage plain-text SMS templates for the Send SMS workflow action. ### Custom Tabs — Create custom tabs with text fields and dropdowns on contact, company, deal, and engagement modals. ### Custom Fields — Create standalone custom fields on contacts, companies, deals, and engagements — optionally attach them to a custom tab. ### Dashboard Widgets — Build custom widgets for the CRM dashboard. ### Custom Objects — Extend the CRM with custom entities (limited availability). ### Custom Labels — Rename Contact and Company for your organization (e.g. "Company" → "Clinic"). ## [Invoice Settings ](https://docs.vinsi.ai/crm/admin/invoice-settings) Manage invoice company profile and payment collection ### Invoice Settings — Save company information and connect Stripe for CRM invoice payments. ### Stripe Connect — Accept payments via Stripe. ## [Data & Automation ](https://docs.vinsi.ai/crm/admin/data-automation) Import, manage CRM data and automate workflows ### Workflows — Build drag-and-drop automations triggered by contact, deal, and order events. ### Email Campaigns — Send bulk emails using CSV or CRM contacts with email verification and send rate controls. ### Reports — View 20+ built-in CRM reports. ### Email Reports — Monitor team email delivery health. ### Import Contacts — Bulk import leads from a CSV file and assign them to team members. ### Bulk Assign — Reassign multiple contacts at once. ### Bulk Delete — Permanently remove multiple contacts at once. ### Business Card — Scan a business card image to create a contact and company. ### Unsubscribe Management — View unsubscribed contacts, get the unsubscribe link, and re-subscribe contacts. ### Website Visitors — Track anonymous visitors on your marketing site — city, ISP, pages viewed. ### Do Not Call Registry — Numbers blocked from all outbound batch and manual dialing. ## [Phone ](https://docs.vinsi.ai/crm/admin/phone) Manage phone numbers and review call history ### Phone Settings — Members, desk phones, browser softphones, and AI phone agents — all in one place. ### Call Logs & Recordings — View call history, listen to recordings and review transcripts. ### Phone Numbers — Buy and manage phone numbers. ### AI Coach Settings — Configure coaching profiles and assign them to team members. --- # Team Settings Manage integrations, time zone and calendar settings, video meetings, and team member access to the CRM. Created April 1, 2026 Updated: September 18, 2026 ## Overview Open [CRM → Admin](https://docs.vinsi.ai/crm/admin). **Team Settings** is the first section of cards on the page. Click a card to open its panel in a slide-over sheet; close it with the round **×** button in the sheet header. Buttons such as **Save**, **Connect** and **Disconnect** sit in the sticky footer row at the bottom of the sheet, not inside the scrolling panel body. Seven cards live in this section: | Card | Opens the panel | Scope of the change | | --------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------- | | **Google** | Google | Your own account, in the organization you are currently signed in to | | **Microsoft** | Microsoft | Your own account, in the organization you are currently signed in to | | **Time Zone** | Organization Time Zone | Organization-wide | | **Calendar Settings** | Default Calendar Account | Organization-wide | | **Email Settings** | Email Settings | Organization-wide | | **CRM Team** | CRM Team Access | Organization-wide: permission groups and who is in them; per-member edits open the permissions editor | | **Video Meetings** | VINSI Video Meetings | Meetings you create, plus organization-wide backgrounds | The Google and Microsoft cards show a small badge when your account is connected; the CRM Team card shows the number of members. #### Who can use these cards Organization **owners** and **admins** always see and can change everything in this section. Everyone else is governed by the per-member permission switches under **CRM Admin → Team Settings** in the permissions editor (open it from the[ Manage Organization](https://docs.vinsi.ai/organization/manageOrganization) page, or by clicking a member's role on the CRM Team card): | Permission | Read | Write | Controls | | ----------------- | ---- | ----- | ------------------------------------------------------------------------------------ | | Team Settings | Yes | No | Whether the whole section is visible | | Google | Yes | No | The Google card | | Microsoft | Yes | No | The Microsoft card | | Timezone | No | No | The Time Zone card; write also unlocks the time-zone dropdown and the caller-ID name | | Calendar Settings | No | No | The Calendar Settings card | | Email Settings | No | No | The Email Settings card | | CRM Team | No | No | The CRM Team card | The Read / Write columns show how a brand-new member starts out. A permission that has never been granted is treated as denied, so if a member cannot see a card, turn its Read switch on and save. The **Video Meetings** card has no permission switch — it is visible to every member who can open CRM Admin. Permission switches only decide what the page shows you. **Email Settings** and **Calendar Settings** are additionally checked on the server: saving either one as a non-admin fails with _Admin access required_, even if the panel is visible. Ask an owner or admin to make the change. ### Google Connects **your** Google account (Gmail and Google Calendar) to the CRM. Once connected you can send email to a contact from their CRM profile, read the email thread history with that contact, create Google Calendar events from a contact record, and see their upcoming meetings. A connected Google account also becomes selectable as the organization's [default calendar account](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-calendar-settings) and as an[ outgoing email sender](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-email-settings). **Who can use it:** any member who can see the card (owners, admins, and members with read access to _Google_). Connecting is per-user — every team member who wants to email or schedule from contact profiles connects their own account. No admin role is required to connect your own. #### Connect your Google account 1. Open [CRM → Admin](https://docs.vinsi.ai/crm/admin) and click the **Google** card. 2. The panel lists **What you'll unlock**. Click **Connect Google Account** in the footer row. 3. Sign in to Google and approve the access request. The panel warns beforehand: _You'll be asked to grant access to Gmail and Google Calendar. Your credentials are stored securely and never shared._ 4. Google returns you to CRM Admin with **Google account connected successfully!** and reopens the Google panel. 5. Check the green banner: it reads **Connected** _as you@yourcompany.com_, with a dot for **Gmail** and one for **Calendar**, each marked **Enabled** or **Not granted**. #### What Google asks for Google shows one consent screen listing all of the following. Approve them together — unticking one leaves the matching feature switched off and the panel marks it **scope not granted**. | Access requested | Used for | Shown in the panel as | | ------------------------------- | ---------------------------------------------------- | --------------------- | | Send email on your behalf | Sending email to a contact from their CRM profile | Gmail | | Read your email | Showing the email thread history on a contact record | Gmail | | Create and edit calendar events | Creating and updating meetings from a contact record | Calendar | | See the list of your calendars | The **Shared Calendar** picker below | Calendar | | See your email address | Labelling which account is connected | Connected as … | VINSI asks for offline access so it can keep working after you close the browser, and forces a fresh consent screen every time you connect, so you always see exactly what is being granted. #### Pick an organization-wide shared calendar This block only appears when Calendar access was granted. It sets one Google Calendar that _all_ CRM appointments are written to, instead of each person's own calendar. 1. Click **Load Calendars**. The button is replaced by a dropdown once the list arrives. 2. Choose a calendar. **(Primary)** marks your main calendar and **(Read-only)** marks one you cannot write to. 3. Click **Save**. A **Shared calendar saved** message appears and the panel shows **Currently using:** with the calendar name. 4. To go back to per-user calendars, choose **Use each user's primary calendar (default)** and save, or click **Clear** next to the current selection. To use a calendar that is shared with you from another domain and does not appear in the list, paste its ID into **Import Shared Calendar**(format `calendar-id@group.calendar.google.com`) and click **Import**, then click **Load Calendars** again to select it. **Refresh** clears the loaded list so you can pull it again. #### Buttons and fields | Control | What it does | Default / limits | | ------------------------------ | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | Connect Google Account | Starts the Google sign-in and consent flow. Shown only when you are not connected. | — | | Reconnect / Update Permissions | Runs the same flow again for an already-connected account. Use it to grant access you skipped the first time. | — | | Disconnect | Removes your Google connection for this organization. | Takes effect immediately — there is no confirmation prompt | | Load Calendars / Refresh | Fetches the list of calendars your account can see. | Needs Calendar access | | Shared calendar dropdown | The one calendar the whole organization writes CRM events to. | Default: _Use each user's primary calendar (default)_ | | Clear | Removes the shared calendar and returns to per-user calendars. | Only shown when one is set | | Import Shared Calendar | Subscribes your account to a calendar by ID so it shows up in the picker. | **Import** stays disabled until you type an ID | #### When the connection expires VINSI renews the Google session in the background, so day-to-day you never have to do anything. If Google refuses the renewal — you changed your password, turned on new security settings, or removed VINSI from your Google account's connected apps — the connection is marked inactive and the card flips back to the disconnected state. Click **Connect Google Account** to restore it; nothing else is lost. #### Troubleshooting | What you see | What to do | | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | **Google connection failed: …** after signing in | The consent flow was cancelled or Google rejected it. Click **Connect Google Account** and try again, making sure you approve every item. | | Gmail or Calendar shows **Not granted**, and features are tagged _scope not granted_ | You unticked something on the consent screen. Click **Reconnect / Update Permissions** and approve it. | | **Please reconnect Google to grant calendar list permissions** when clicking Load Calendars | The connection predates the calendar-list permission. Click **Reconnect / Update Permissions**. | | **Failed to load calendars** | A temporary Google error. Try again; if it keeps failing, reconnect. | | **Calendar already in your list — use Load Calendars to select it** | The imported calendar was already subscribed. Click **Load Calendars** and pick it. | | The card still says disconnected right after connecting | Reload [CRM Admin](https://docs.vinsi.ai/crm/admin). The panel re-checks the connection on every load. | **Gotchas** - **Disconnect is instant and unconfirmed.** There is no "are you sure" dialog — one click drops the connection. - The connection belongs to **you in this organization**. If you belong to more than one organization, connect again after switching. - Disconnecting an account that is in use as the [default calendar account](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-calendar-settings) or the [organization email sender](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-email-settings) breaks those settings for everyone. Pick a replacement first. - The **Shared Calendar** block sits inside a per-user panel but its setting is organization-wide — changing it changes where _everybody's_ CRM appointments land. - A calendar marked **(Read-only)** can be viewed but not written to, so events created from a contact record will fail against it. Once connected, see [CRM Calendar](https://docs.vinsi.ai/crm/calendar) for working with the meetings themselves. ### Microsoft The Microsoft card is the Outlook equivalent of the Google card: connect **your** Microsoft account to send email to contacts from their CRM profile, read the email history, create Microsoft Calendar events from a contact record, and see upcoming meetings. It also makes the account available as the organization's [default calendar account](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-calendar-settings) and as an[ outgoing email sender](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-email-settings). **Who can use it:** any member who can see the card (owners, admins, and members with read access to _Microsoft_). The connection is per-user, exactly like Google. Work, school and personal Microsoft accounts are all accepted. #### Connect your Microsoft account 1. Open [CRM → Admin](https://docs.vinsi.ai/crm/admin) and click the **Microsoft** card. 2. Click **Connect Microsoft Account** in the footer row. 3. Microsoft shows an account picker. Choose the mailbox you want the CRM to use, then approve the access request. The panel warns beforehand: _You'll be asked to grant access to Microsoft and Microsoft Calendar. Your credentials are stored securely and never shared._ 4. You return to CRM Admin with **Microsoft account connected successfully!** and a green **Connected** banner showing **Outlook** and **Calendar** as **Enabled** or **Not granted**. #### What Microsoft asks for | Access requested | Used for | Shown in the panel as | | --------------------------------------------------- | ---------------------------------------------------------------- | --------------------- | | Read your profile | Labelling which account is connected | Connected as … | | Send mail as you | Sending email to a contact from their CRM profile | Outlook | | Read your mail | Showing the email thread history on a contact record | Outlook | | Read and write your calendars | Creating and updating meetings from a contact record | Calendar | | Maintain access to data you have given it access to | Keeping the connection alive without asking you to sign in again | — | #### Admin consent in a managed tenant Many Microsoft 365 tenants block users from approving third-party apps themselves. In that case the sign-in ends with a message saying approval is needed from an administrator, and nothing is connected. A Microsoft tenant administrator has to grant admin consent for the VINSI application once; every member can then connect normally. VINSI deliberately does not force its own consent prompt, so once your tenant admin has approved the app, members just pick their account and are returned straight to the CRM. #### Buttons | Control | What it does | Default / limits | | ------------------------------ | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | Connect Microsoft Account | Starts the Microsoft account picker and consent flow. Shown only when you are not connected. | — | | Reconnect / Update Permissions | Runs the flow again for an already-connected account, to add access you skipped or to switch mailbox. | — | | Disconnect | Removes your Microsoft connection for this organization. | Takes effect immediately — there is no confirmation prompt | #### When the connection expires As with Google, the session renews itself in the background. If Microsoft refuses — password change, new conditional-access policy, or the app revoked in your Microsoft account — the card returns to the disconnected state and you simply click **Connect Microsoft Account** again. #### Troubleshooting | What you see | What to do | | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **Microsoft connection failed: …** | The consent flow was cancelled or refused. Try again; if the error mentions administrator approval, see _Admin consent_ above. | | Outlook or Calendar shows **Not granted** | Click **Reconnect / Update Permissions** and approve the missing item. | | You connected the wrong mailbox | Click **Reconnect / Update Permissions** and choose a different account in the picker. | **Gotchas** - **Disconnect is instant and unconfirmed**, the same as the Google card. - There is no shared-calendar picker on the Microsoft card. Organization-wide calendar routing for Microsoft accounts is set on the [Calendar Settings](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-calendar-settings) card. - Sending email from an Outlook account through [Email Settings](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-email-settings) uses the connected account, not an SMTP password — you do not need to enable SMTP AUTH for that mode. ### Time Zone Opens the **Organization Time Zone** panel. This is the default time zone for your organization, used for ticket due-date reminders and for scheduling. Individual team members can override it in their own profile settings, so this is the fallback for anyone who has not. **Who can use it:** owners and admins, plus members granted write access to _Timezone_. Members with read access only can open the panel and see the current value, but the dropdown is greyed out. #### Change the organization time zone 1. Open [CRM → Admin](https://docs.vinsi.ai/crm/admin) and click the **Time Zone** card. 2. Open the **Time Zone** dropdown. It has two groups: **Common Time Zones** at the top and **All Time Zones** below. 3. Pick a zone. It saves the moment you select it — there is no Save button. A brief spinner appears and a **Timezone updated** message confirms it. 4. Confirm the line at the bottom of the card now reads **Currently set to:** your new zone. #### Field | Field | Options | Default | | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | | Time Zone | **Common Time Zones**: America/Los Angeles, America/Denver, America/Chicago, America/New York, America/Phoenix, America/Anchorage, Pacific/Honolulu, Europe/London, Europe/Paris, Europe/Berlin, Asia/Tokyo, Asia/Shanghai, Asia/Kolkata, Asia/Dubai, Australia/Sydney, Australia/Melbourne. **All Time Zones** lists every remaining standard zone. | America/Los Angeles | Looking for the outbound caller-ID display name? It is not set here. Set it per user under **Phone Settings → Softphone Settings**and per device under **Desk Phones** — see [Softphone](https://docs.vinsi.ai/telephony/softphone) and[ Desk Phones](https://docs.vinsi.ai/telephony/deskPhones). **Gotchas** - **There is no undo and no Save step.** Selecting a zone writes it straight away, so take care when scrolling the list with the keyboard. - Changing the organization zone does not move anyone whose profile already has a personal time zone set. - The same organization time zone is also editable from [Manage Organization](https://docs.vinsi.ai/organization/manageOrganization); both places write the same value. ### Calendar Settings Opens the **Default Calendar Account** panel. It nominates one already-connected Google or Outlook account as the calendar the CRM uses to create, read, reschedule and delete calendar events for the whole organization — no matter which team member's API key or automation triggered the request. Use it so that automated bookings and integrations always land on one predictable calendar instead of on whichever person happened to trigger them. **Who can use it:** organization owners and admins. Saving is admin-gated on the server, so a member who can see the panel still gets _Admin access required_ if they try to save. #### Set the default calendar account 1. Make sure somebody in the organization has connected an account with calendar access using the [Google](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-google) or [Microsoft](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-microsoft) card. 2. Open [CRM → Admin](https://docs.vinsi.ai/crm/admin) and click **Calendar Settings**. 3. The box at the top shows **Currently configured:** — either an account, or _Not configured — falling back to the internal Vinsi Calendar_. 4. Pick an entry from the **Connected account** dropdown. Each option reads _email (Google or Microsoft) - member name_. 5. Click **Save**. A **Default calendar account updated** message confirms it and the _Currently configured_ box refreshes. To go back to the built-in calendar, choose **Select an account…** (the blank first option) and click **Save**. #### Fields | Field | What it does | Default / limits | | ----------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- | | Connected account | The one Google or Outlook account the CRM reads and writes organization calendar events through. | Blank. Lists every Google and Outlook account connected by any member of the organization | | Save | Applies the selection organization-wide. | Stays disabled until you actually change the selection, and while loading or saving | **Gotchas** - If nothing is connected yet the panel says _No Google or Outlook accounts are connected yet. Connect one from the Google or Microsoft integration cards first._ and there is nothing to choose. - The **Save** button looks broken when it is simply disabled because the selection has not changed. Change the dropdown first. - Picking a colleague's account makes the whole organization's CRM events live in that person's calendar. If they later disconnect or leave, calendar actions fail until you choose another account. - This is a different setting from the Google card's **Shared Calendar**: this one chooses _whose account_ is used, the Google one chooses _which calendar_ inside a Google account. ### Email Settings Sets the outgoing mail server for everything the CRM sends on your organization's behalf — ticket assignment notices, workflow emails, reminders, meeting invitations and email campaigns. **Who can use it:** organization owners and admins, plus members granted read access to _Email Settings_ to view it. Saving is admin-only on the server; a non-admin save fails with _Admin access required_. #### The three ways to send The panel starts with two radio buttons, and choosing **Custom SMTP Server** reveals a second pair under **SMTP Setup Method:**. | Mode | How it sends | Best for | | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | | **Default (noreply@vinsi.ai)** | VINSI's own shared mail server. Nothing to set up. | Getting started and internal notifications. Recipients see _noreply@vinsi.ai_ as the sender, so it is a poor choice for campaigns. | | **Custom SMTP Server → SMTP Configuration** | Your own mail server or sending service, using a host, port, username and password you enter. | Company mail servers and bulk-sending services such as a dedicated sending domain. | | **Custom SMTP Server → Use Connected Organization Account** | A Google or Microsoft account that a member already connected on the [Google](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-google) or [Microsoft](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-microsoft) card. No password is stored. | Small teams that already send from a shared Gmail or Outlook mailbox. | #### Use the platform default 1. Open [CRM → Admin](https://docs.vinsi.ai/crm/admin) and click **Email Settings**. 2. Select **Default (noreply@vinsi.ai)**. All other fields disappear. 3. Click **Save Email Settings** in the footer row. You get **Email settings saved — using default**. #### Set up your own SMTP server 1. Select **Custom SMTP Server**, then **SMTP Configuration**. 2. Fill in **SMTP Host**, **Port**, **Username** and **Password**. Tick **Use TLS/SSL (port 465)** if your provider requires an SSL connection. 3. Fill in **From Name**, **From Email**, and optionally **Reply-To Email**. 4. Review the **Rate Limits** block. Typing a well-known host fills these in for you (see the table below). 5. Click **Test Connection**. Success shows a green **✓ Connection successful!**; failure shows the reason in red. 6. Click **Save Email Settings**. You get **SMTP settings saved**. #### Send through a connected Google or Microsoft account 1. Select **Custom SMTP Server**, then **Use Connected Organization Account**. 2. If the panel says _No connected email accounts in the organization._, click **Connect an account** (Microsoft) or **Connect Google** and complete the sign-in, then come back. 3. Pick an entry in **Connected Account**. Options read _email (Google or Microsoft) - member name_. 4. Set **From Name**. **From Email** fills itself in from the account and cannot be edited. 5. Adjust **Rate Limits**, then click **Test Connection** to verify the account is still active and still has mail access. 6. Click **Save Email Settings**. You get **Email settings saved**. #### Fields | Field | Mode | What to enter | Default / limits | | ---------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | SMTP Host | SMTP Configuration | Your provider's outgoing mail server. Required. | Empty, placeholder smtp.resend.com | | Port | SMTP Configuration | Usually 587 for TLS or 465 for SSL. | **587** | | Use TLS/SSL (port 465) | SMTP Configuration | Tick only if your provider needs an SSL connection on port 465. | Off | | Username | SMTP Configuration | Usually the full mailbox address. Required. | Empty, placeholder noreply@company.com | | Password | SMTP Configuration | The mailbox or API password. For Gmail with 2-Step Verification use a Google App Password; for Microsoft 365 the mailbox may need SMTP AUTH enabled. | Shows •••••••• once saved — leave it to keep the stored password | | Connected Account | Connected account | Which already-connected Google or Outlook mailbox to send through. | Blank (_Select an account_) | | From Name | Both custom modes | The display name recipients see. | Empty, placeholder Acme Corp | | From Email | Both custom modes | The sender address. | SMTP mode: free text, placeholder campaigns@mail.yourdomain.com. Connected mode: read-only, forced to the connected account's address | | Reply-To Email | SMTP Configuration | Where replies should land, if that differs from the From address. Useful when you send from a sending subdomain that has no mailbox. | Optional. Empty, placeholder sales@yourdomain.com | | Per Minute | Both custom modes | Maximum emails sent per minute. | **15**, allowed 1–1000 | | Per Hour | Both custom modes | Maximum emails sent per hour. | **400**, allowed 1–50,000 | | Per Day | Both custom modes | Maximum emails sent per day. | **1800**, allowed 1–500,000 | #### Rate limits Rate limits stop your mail account being suspended for sending too fast. Anything over the limit is queued and sent automatically as soon as the window opens, so nothing is dropped — it just goes out later. When you type one of the hosts below into **SMTP Host**, the three boxes fill in with that provider's recommended numbers and a green _Detected …_ line appears; you can still adjust them. | SMTP Host | Detected as | Per minute | Per hour | Per day | | ---------------------------------- | ------------------- | ---------- | -------- | ------- | | smtp.resend.com | Resend Pro | 300 | 10,000 | 40,000 | | smtp-relay.gmail.com | Google Workspace | 15 | 400 | 1,800 | | smtp.gmail.com | Gmail Free | 5 | 80 | 450 | | smtp.office365.com | Office 365 | 30 | 1,000 | 10,000 | | smtp.sendgrid.net | SendGrid | 300 | 10,000 | 100,000 | | smtp.mailgun.org | Mailgun | 300 | 10,000 | 100,000 | | smtp.postmarkapp.com | Postmark | 100 | 5,000 | 50,000 | | email-smtp.us-east-1.amazonaws.com | AWS SES (us-east-1) | 300 | 10,000 | 50,000 | | email-smtp.us-west-2.amazonaws.com | AWS SES (us-west-2) | 300 | 10,000 | 50,000 | For anything not in the list, the panel suggests **15/min, 400/hr, 1800/day** for Google Workspace and **5/min, 80/hr, 450/day**for a free Gmail account as a starting point. #### Troubleshooting | What you see | What it means | | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | **Host and username are required** | SMTP Configuration mode needs both before it will save. | | **Authentication failed. Check the username and password.** | The mailbox rejected the login. For Gmail use an App Password; for Microsoft 365 check that SMTP AUTH is enabled for the mailbox. | | **When using the saved password, host/port/username must match the stored config. Enter the password to test a different server.** | You changed the server details but left the masked password in place. Retype the password to test the new server. | | **No saved SMTP password to use. Please enter the password.** | There is nothing stored to fall back on. Type the password. | | **The connected email account could not be found. Please reconnect or select a different account.** | The member who owned the account disconnected it. Reconnect it or pick another account. | | **The connected email account is inactive or does not have email capabilities.** | The connection lapsed or mail access was never granted. Reconnect it from the Google or Microsoft card. | | **Account does not have mail permissions. Please reconnect with mail access.** | Same cause, reported by **Test Connection**. | | **From Email must match the selected connected email account.** | Connected-account mode can only send as that account's own address. | | **Admin access required** | You can view the panel but not save. Ask an organization owner or admin. | | **Couldn't verify the connected email account just now — your settings are still saved. Reload to retry.** | A temporary lookup failure. Your configuration is intact; reload the page. | **Gotchas** - **Switching back to Default wipes the custom configuration.** Saving in Default mode clears the host, port, username, password, From Name and From Email — write them down first if you might switch back. - **Reply-To Email only appears in SMTP Configuration mode.** Connected-account mode always replies to the connected mailbox. - **Test Connection stays disabled** until you have a host and username (SMTP mode) or a selected account (connected mode). - Test Connection checks that the server accepts the login — it does not prove that a message will be delivered. Send a real test from an [email template](https://docs.vinsi.ai/crm/email-templates) with **Send Test** to confirm end to end. - Changes take effect for everything the CRM sends, including campaigns already scheduled. - If your From Email is on a sending subdomain, make sure that domain's sending records are set up with your provider, or mail will be filtered as spam regardless of these settings. ### CRM Team Opens the **CRM Team Access** panel: the list of team members who can reach the CRM module, with each person's role. The card badge shows how many there are. Use it to check who has access and to jump straight into editing a person's role and permissions. **Who can use it:** owners and admins, plus members granted read access to _CRM Team_. Editing a role opens the same permissions editor used on the [Manage Organization](https://docs.vinsi.ai/organization/manageOrganization) page, which is restricted to owners and admins. #### Find a member 1. Open [CRM → Admin](https://docs.vinsi.ai/crm/admin) and click **CRM Team**. 2. Type into **Search by name, email, or role…**. Matching is case-insensitive and covers name, email address, role and permission group, so searching _admin_ lists every admin and _supervisor_ lists everyone in the SUPERVISOR group. 3. The counter next to the box reads _N members_, or _N of M members_ while a search is active. Click the **×** in the box to clear it. 4. Page through with **« First**, **‹ Prev**, **Next ›** and **Last »**. #### Permission groups The panel has two tabs, **Members** and **Permission Groups**. On the groups tab, owners and admins create roles such as _Supervisor_ or _Call Center Agent_, set their permissions once, and assign them — to one member with the picker on their row, or to many at once with the selection boxes and **Apply**. Each member's role label shows their group, for example **Member · SUPERVISOR**. See [Permission Groups](https://docs.vinsi.ai/organization/permissionGroups) for the full walkthrough. #### Edit a member's role and permissions 1. Click anywhere on the member's row, or click the role label on the right. 2. The permissions editor opens for that person. Change the role and the individual read/write switches, including the **CRM Admin → Team Settings** group described in the [Overview](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-overview). 3. Save in the editor. The member sees the change the next time they load the page. #### What the panel shows | Element | Details | | ------------ | ------------------------------------------------------------------------------------------------------------------- | | Row | Profile picture (or a coloured initial), full name, and email underneath. Members with no name are listed by email. | | Role button | The member's role, or **Member** when none is set. Click to edit. | | Ordering | Always A–Z by first name, falling back to last name then email. | | Page size | 20 members per page. Pagination only appears when there is more than one page. | | Empty states | _No team members found._ with no search, or _No team members match "…"._ with one. | **Gotchas** - **You cannot add or remove people here.** Invite new members and remove old ones on [Manage Organization](https://docs.vinsi.ai/organization/manageOrganization); how many seats you have is governed by your [plan](https://docs.vinsi.ai/account/billing). - Right after the panel opens, roles can briefly show in italics with a _Loading…_ tooltip and clicking does nothing. Wait a moment and try again. - A role that stays italic with _Permissions unavailable_ means that member has no editable permission record yet — open them from [Manage Organization](https://docs.vinsi.ai/organization/manageOrganization) instead. - Search and page position reset every time you close and reopen the panel. ### Video Meetings Opens the **VINSI Video Meetings** panel, where you schedule meetings, email join links to contacts and teammates, and manage the organization's custom meeting backgrounds. Everything about actually being in a meeting — joining, controls, recordings, summaries and remote control — is covered in [VINSI Meet](https://docs.vinsi.ai/meet/overview). **Who can use it:** every member who can open [CRM Admin](https://docs.vinsi.ai/crm/admin). This card has no separate permission switch. #### Create a meeting and invite people 1. Open [CRM → Admin](https://docs.vinsi.ai/crm/admin) and click **Video Meetings**. 2. Type a **Meeting Title**. 3. Optionally set **Date & Time (optional)** — a date plus a start and end time. Leave it blank for a meeting you start right away. 4. Under **Invite by email (optional)**, start typing a name or email: pick a contact or teammate from the suggestions (click or press Tab), or type any address. 5. Click **Create & Send Invites**. Each invitee gets an email with a join link. #### Manage existing meetings The table below the form lists **Title**, **Host**, **When** and **Created**; click Title, When or Created to sort. Each row has these actions: | Action | What it does | | ------------- | ----------------------------------------------------------------------------------------- | | **Join** | Opens the meeting room. | | **Summary** | Shows the AI summary of the meeting, once one has been generated. | | **Recording** | Lists the recordings for that meeting, newest first, each stamped with its date and time. | | **Edit** | Changes the title and time, shows who is already invited, and lets you add more people. | | **Delete** | Removes the meeting. A confirmation appears first. | #### Custom backgrounds 1. Scroll to **Custom Backgrounds**. 2. Click **Upload Background** and choose an image. Everyone in your organization can then pick it during a meeting. 3. To remove one, click the small red **×** on its thumbnail and confirm _Delete this background?_. | Field | What to enter | Default / limits | | ----------------- | ------------------------------------------------------------------------- | --------------------------------------------------------- | | Meeting Title | Required — **Create & Send Invites** stays disabled until it has a value. | Empty, placeholder e.g. Q3 Planning. Up to 255 characters | | Date & Time | Date, start time and end time. | Optional. Dates in the past cannot be picked | | Invite by email | Contacts, teammates or any typed address. | Optional | | Upload Background | A PNG, JPG or WebP image. | Maximum 2 MB. Shared with the whole organization | If invitation emails do not arrive you will see _Some invites couldn't be emailed — check that the org has an email account configured under Email Settings._ Fix it on the [Email Settings](https://docs.vinsi.ai/crm/admin/team-settings#crm-ts-email-settings) card, then edit the meeting and add the people again. Full walkthroughs: [Meet overview](https://docs.vinsi.ai/meet/overview), [joining a meeting](https://docs.vinsi.ai/meet/joining),[ recordings and summaries](https://docs.vinsi.ai/meet/recording), and [remote control](https://docs.vinsi.ai/meet/remote-control). --- # CRM Configuration Manage pipelines, contact options, and email templates for your CRM. Created April 1, 2026 Updated: September 17, 2026 ## Overview CRM Configuration lets you tailor the CRM to your team's workflow — from deal pipelines and lead statuses to custom tabs and dashboard widgets. Changes here apply across the entire organization. Open [CRM Admin](https://docs.vinsi.ai/crm/admin) and scroll to the **CRM Configuration** section, or type into the **Search settings…** box at the top of the page to filter the cards by name. Clicking a card slides up a panel over the card grid; close it with the **X** in the panel header, or with **Back to CRM Admin** where that link is shown. Opening a panel also adds `?panel=…` to the address bar, so you can bookmark a panel or refresh without losing your place. Browser back and forward move between panels. ### Who can use these cards Anyone with the organization role **org:admin** or **org:owner** has full read and write access to every card below. For everyone else, access is controlled per card by the permission entries listed in the table — an admin sets these per member on the Members permissions screen. Read access shows the card; write access enables the add, edit, reorder, and delete controls inside it. A member who has never had permissions assigned keeps access by default. | Card | Permission entry | Panel address | | ---------------------- | ---------------------------------------- | ------------------------ | | Pipeline Configuration | CRM Configuration → Pipeline | ?panel=pipelines | | Lead Statuses | CRM Configuration → Lead Statuses | ?panel=lead-statuses | | Dispositions | CRM Configuration → Dispositions | ?panel=dispositions | | Contact Sources | CRM Configuration → Contact Sources | ?panel=sources | | Industries | CRM Configuration → Industries | ?panel=industries | | Email Templates | CRM Configuration → Email Templates | ?panel=email-templates | | SMS Templates | CRM Configuration → SMS Templates | ?panel=sms-templates | | Custom Tabs | CRM Configuration → Custom Tabs | ?panel=custom-tabs | | Custom Fields | CRM Configuration → Custom Tabs (shared) | ?panel=custom-fields | | Dashboard Widgets | CRM Configuration → Dashboard Widgets | ?panel=dashboard-widgets | | Custom Objects | CRM Configuration → Custom Objects | ?panel=custom-objects | | Custom Labels | CRM Configuration → Custom Labels | ?panel=custom-labels | Custom Fields shares the **Custom Tabs** permission — you cannot grant one without the other. A permission that has never been granted is treated as denied, both on the page and on the server, so a member who cannot see a card needs its Read switch turned on and saved. ### Pipeline Configuration Pipelines define the stages a record moves through. **Deal pipelines** drive the board and stage dropdown on[ Deals](https://docs.vinsi.ai/crm/deals); **engagement pipelines** drive the same things on[ Engagements](https://docs.vinsi.ai/crm/engagements). Each stage has a name, a color, and a flag that decides whether records sitting in it are counted in the pipeline totals. **Who can use it:** org admins and owners, plus anyone granted the **Pipeline** permission. Read access shows the pipelines and stages; write access is required for **New Pipeline**, **Add Stage**, the reorder arrows, the **$** toggle, and the edit and delete icons. #### Add a pipeline 1. Open **Pipeline Configuration**. 2. Choose the **Deal Pipelines** or **Engagement Pipelines** tab. The new pipeline is created in whichever tab is selected. 3. Click **New Pipeline** at the bottom of the panel. 4. Enter a **Pipeline Name \*** (for example _Enterprise Sales_) and click **Create**. Pressing Enter also saves. 5. The pipeline appears as a pill at the top of the panel and starts with no stages. #### Add, edit, and reorder stages 1. Click the pipeline's pill to select it. The card below shows **Stages — "Pipeline name"**. 2. Click **Add Stage**. Enter a **Stage Name \*** (for example _Proposal Sent_), pick a **Stage Color** from the eleven swatches or set your own with the **Custom color** picker, then click **Add Stage**. 3. To change a stage, click its pencil icon, edit the name or color, and click **Save**. 4. Use the up and down arrows on a stage row to move it. The new order saves immediately and is the order shown on the deal or engagement board. 5. Click the **$** button on a stage to include or exclude it from the pipeline total. Included deal stages show a green **$** next to the name; included engagement stages show a green **MRR**. #### Delete a stage or pipeline 1. To remove a stage, click its red trash icon. It is removed straight away — there is no confirmation prompt. 2. To remove a pipeline, click the small red **x** next to its pill. The **x** only appears when the tab has more than one pipeline; trying to remove the last one shows _At least one pipeline is required_. #### Fields and limits | Field | Default | Limits | | ------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | Pipeline Name | None — required | Up to 100 characters. Must be unique in your organization; a duplicate shows _A pipeline with that name already exists_. | | Pipeline type | Set by the tab you are on (Deal or Engagement) | Cannot be changed afterwards. | | Stage Name | None — required | Up to 100 characters. Must be unique within its pipeline; a duplicate shows _That stage name already exists_. | | Stage Color | Blue #0d6efd | Eleven preset swatches, or any color from the picker. | | Counted in totals (**$**) | Off for stages you create | Toggle per stage. Saves immediately. | | Stage order | New stages are added last | Changed with the arrow buttons only. | #### What you start with | Type | Pipeline | Stages | | ---------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Deal | Sales Pipeline | Appointment Scheduled, Qualified To Buy, Presentation Scheduled, Decision Maker Bought-In, Contract Sent, Closed Won, Closed Lost. Everything except Closed Lost counts toward the total. | | Engagement | Service Pipeline | Proposal, Onboarding, Active, On Hold, Completed, Cancelled. Onboarding, Active, and Completed count toward MRR. | | Engagement | Order Pipeline | Open, Processing, Shipped, Delivered, Completed, Cancelled, Refunded. Only Completed counts toward MRR. | | Engagement | Customer Pipeline | New, Onboarding, Active, On Hold, Completed, Cancelled. Onboarding, Active, and Completed count toward MRR. | #### What happens to existing records - Deals and engagements store the pipeline and stage _by name_. Renaming a stage does **not** rewrite the records already in it — they keep the old text and stop matching any column on the board until you move them. - Deleting a stage or pipeline hides it from the dropdowns and the board. Records that referenced it keep their saved value and are not deleted, but they will no longer line up with a visible stage. - If you plan to rename a stage that is in use, move the records to the new stage first, or expect to re-stage them afterwards. The **$** flag is matched by stage _name_ across all pipelines of the same type. Two pipelines that both have a stage called _Active_ are treated as one set — flagging it in either pipeline makes every _Active_ record count. If no stage is flagged at all, deals fall back to counting every stage except _Closed Lost_, and engagements fall back to _Onboarding_, _Active_, and _Completed_. ### Lead Statuses Lead statuses describe where a person is in your funnel. They appear as the **Lead Status** dropdown on a contact, as a column and filter on the [Contacts](https://docs.vinsi.ai/crm/contacts) grid, as an audience filter in Email Campaigns and the bulk tools, and as a condition or action in workflows on [Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation). **Who can use it:** org admins and owners, plus anyone granted the **Lead Statuses** permission. Write access is required for **Add Status**, the reorder arrows, and the edit and delete icons. #### Add, edit, reorder, delete 1. Open **Lead Statuses** and click **Add Status** at the bottom of the panel. 2. In the **Add Lead Status** window, type the name in **Lead Status \***, pick a **Color**, and click **Add**. Pressing Enter also saves. 3. To change one, click its pencil icon, edit the name or color in **Edit Lead Status**, and click **Save**. 4. Use the up and down arrows to set the order. This is the order of the dropdown everywhere it appears, and it saves immediately. 5. Click the red trash icon to remove a status. There is no confirmation prompt. #### Fields and limits | Field | Default | Limits | | ----------- | --------------------------- | -------------------------------------------------------------------------------------------------------- | | Lead Status | None — required | Up to 100 characters. Must be unique in your organization; a duplicate shows _That name already exists_. | | Color | Blue #0d6efd | Eleven preset swatches, or any color from the picker. Shown as the dot next to the name. | | Order | New statuses are added last | Changed with the arrow buttons only. | Your organization starts with: New, Open, In Progress, Open Deal, Unqualified, Attempted to Contact, Connected, Bad Timing, and Unassigned. #### What happens to existing records - Contacts store the lead status as text. Renaming a status leaves every contact on the old wording, so the contact no longer matches the renamed option. - Deleting a status removes it from the dropdowns and filters. Contacts already set to it keep the value — it simply cannot be picked again. New contacts default to the lead status **New**. If you delete or rename _New_, newly created contacts still land on the text "New" and will show a status that is no longer in your list. ### Dispositions As the panel itself explains: dispositions track the outcome of each contact interaction. They appear as a dropdown on the contact profile and in the **Last Disposition** column on the contacts grid. Dispositions also drive the **Disposition Changed** workflow trigger and the **Check Disposition** and **Set Disposition**workflow nodes on [Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation). **Who can use it:** org admins and owners, plus anyone granted the **Dispositions** permission. Write access is required for **Add Disposition**, the reorder arrows, and the edit and delete icons. #### Add, edit, reorder, delete 1. Open **Dispositions** and click **Add Disposition** at the bottom of the panel. 2. In **Add Disposition**, type the name in **Disposition \***, choose a **Color**, and click **Add**. 3. Click a row's pencil icon to open **Edit Disposition**, change the name or color, and click **Save**. 4. Use the arrows to reorder; the order is saved immediately and controls the dropdown order. 5. Click the red trash icon to remove one. There is no confirmation prompt. #### Fields and limits | Field | Default | Limits | | ----------- | ------------------------------- | ---------------------------------------------------------- | | Disposition | None — required | Up to 100 characters. Must be unique in your organization. | | Color | Grey #6c757d | Eleven preset swatches, or any color from the picker. | | Order | New dispositions are added last | Changed with the arrow buttons only. | Your organization starts with: Voicemail-1, Voicemail-2, No Answer After Voicemail, No Answer-1, No Answer-2, No Answer-3, Emailed Information, Slight Interest, Scheduled, Bad Timing, Not Interested, and Bad Number. #### What happens to existing records The disposition is stored on the contact as text, so renaming one leaves past interactions labelled with the old wording, and deleting one only removes it from the dropdown — the value already saved on a contact stays visible. Workflows that check or set a disposition match on the name. If you rename a disposition, open[ Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation) and re-select it in every workflow node that used it, otherwise those branches silently stop matching. ### Contact Sources Sources record where a contact came from. They fill the **Source** field on a contact, the Source column and filter on [Contacts](https://docs.vinsi.ai/crm/contacts), the **Default Source** step of Import Contacts, the audience filters in Email Campaigns, and the **Check Source** workflow node. **Who can use it:** org admins and owners, plus anyone granted the **Contact Sources** permission. #### Add, edit, reorder, delete 1. Open **Contact Sources** and click **Add Source** at the bottom of the panel. 2. Type the name in **Source \*** and click **Add**. 3. Click a row's pencil icon to rename it, then click **Save**. 4. Use the arrows to reorder. This sets the order of the Source dropdown. 5. Click the red trash icon to remove one. There is no confirmation prompt. #### Fields and limits | Field | Default | Limits | | ------ | -------------------------- | ---------------------------------------------------------- | | Source | None — required | Up to 100 characters. Must be unique in your organization. | | Order | New sources are added last | Changed with the arrow buttons only. | Your organization starts with: Website, Google, Referral, LinkedIn, Cold Call, Email Campaign, Event, and Other. Sources have no color — the list shows the name only. #### What happens to existing records Contacts keep the source as text. Renaming a source does not update the contacts already tagged with it, and deleting a source only removes it from the dropdown and the filter lists. New contacts default to the source **Website**, and imported contacts use whatever you choose as the **Default Source** during the import. Keep an option that matches those defaults so imported records stay filterable. ### Industries Industries fill the **Industry** field on a company profile and the Industry column and filter on the Companies grid. They are also offered as a filter value when you build dashboard widgets. **Who can use it:** org admins and owners, plus anyone granted the **Industries** permission. #### Add, edit, reorder, delete 1. Open **Industries** and click **Add Industry** at the bottom of the panel. 2. Type the name in **Industry \*** and click **Add**. 3. Click a row's pencil icon to rename it, then click **Save**. 4. Use the arrows to reorder the dropdown. 5. Click the red trash icon to remove one. There is no confirmation prompt. #### Fields and limits | Field | Default | Limits | | -------- | ----------------------------- | ---------------------------------------------------------- | | Industry | None — required | Up to 100 characters. Must be unique in your organization. | | Order | New industries are added last | Changed with the arrow buttons only. | Your organization starts with: Technology, Healthcare, Finance, Education, Retail, Manufacturing, Real Estate, Legal, Marketing, Consulting, and Other. #### What happens to existing records Companies store the industry as text, so a rename leaves existing companies on the old wording and a delete only removes the option from the dropdown. Nothing on the company record is cleared. ### Email Templates Email templates appear as quick-fill buttons in the compose email window on contact profiles, and can be loaded into an email campaign. The full guide to writing a template — the rich editor, HTML mode, preview, merge tags, and attachments — lives on the[ Email Templates](https://docs.vinsi.ai/crm/email-templates) page. This card is where you manage the org-wide list. **Who can use it:** org admins and owners, plus anyone granted the **Email Templates** permission. #### Manage the list 1. Click **New Template** at the bottom of the panel to open **New Email Template**, or click a row's pencil icon to open **Edit Template**. 2. Fill in **Template Name \***, **Subject Line \***, and **Body \***, pick an icon, and save. All three are required. 3. Use the up and down arrows to change the order the quick-fill buttons appear in. 4. If the list is completely empty, a **Load Defaults** button appears in the panel header and adds three starter templates: _Thank You for Call_, _Tried Calling You_, and _Follow Up_. 5. Click the red trash icon to delete. A confirmation window titled **Delete Email Template** names the template and warns: _This action can't be undone. The template will be removed from the compose-email quick-fill dropdown for everyone in your organization._ Confirm with **Delete Template**. #### Fields and limits | Field | Default | Limits | | ------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------ | | Template Name | None — required | Up to 100 characters. | | Icon | Phone | Eleven icons: Phone, Missed Call, Follow Up, Email, Send, Message, Calendar, Star, Heart, Bell, Clock. | | Subject Line | None — required | Up to 255 characters. Supports merge tags. | | Body | None — required | No length limit. Rich editor or HTML mode. | | Attachments | None | Maximum 4 MB per file. | | Order | New templates are added last | Changed with the arrow buttons only. | #### What happens to existing records Templates are only used at the moment someone composes a message — emails already sent are untouched by a rename or a delete. Deleting a template removes its quick-fill button for everyone in the organization and cannot be undone. ### SMS Templates As the panel explains: SMS templates are plain text and can be selected in the **Send SMS** workflow action. They are not used anywhere else — there is no quick-fill for manual texting — so an SMS template only does something once a workflow on[ Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation) points at it. **Who can use it:** org admins and owners, and any member who can open CRM Configuration. There is no separate SMS Templates permission entry, so access cannot be granted or revoked for this card on its own. #### Add, edit, reorder, delete 1. Open **SMS Templates** and click **New SMS Template** at the bottom of the panel. 2. Enter a **Template Name \*** (for example _Appointment Reminder_) and pick an **Icon**. 3. Write the **Message \***. A live counter above the box shows the character count and how many SMS segments it will use. 4. Click **Create**. The button stays disabled until both the name and the message have content. Use the pencil icon and **Save** to change a template later. 5. Use the up and down arrows to reorder the list. 6. Click the red trash icon to delete. A window titled **Delete SMS Template** names the template and warns: _This action can't be undone. Workflows using this template will fall back to their inline message._ Confirm with **Delete Template**. #### Fields and limits | Field | Default | Limits | | ------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------- | | Template Name | None — required | Up to 100 characters. | | Icon | Message | Same eleven icons as email templates. | | Message | None — required | Plain text only, no formatting and no attachments. No hard length limit; 160 characters is one SMS segment. | | Order | New templates are added last | Changed with the arrow buttons only. | #### Merge tags The hint under the Message box lists the four most common tags, but the workflow engine fills in all of these when it sends: | Tag | Fills in | | ---------------------------------- | ------------------------------------------------------------------------ | | {{name}} | The contact's first name, or their full name when there is no first name | | {{first\_name}} / {{last\_name}} | First and last name | | {{full\_name}} / {{contact\_name}} | First and last name together | | {{email}} | The contact's email address | | {{phone}} | The number the message is being sent to | | {{company}} | The company on the contact | | {{lead\_status}} / {{disposition}} | The contact's current lead status and disposition | | {{deal\_name}} / {{deal\_stage}} | The deal that triggered the workflow, when there is one | A tag with no value is replaced with nothing, so the sentence around it still has to read correctly when the field is empty. #### Using a template in a workflow 1. Open [Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation) → **Workflows** and add a **Send SMS** action. 2. Pick your template from the **SMS Template** dropdown. Choosing one copies its text into the **Message** box below; choosing **Custom (no template)** leaves whatever text is there as a one-off message. 3. Choose the **From Phone Number** the text is sent from. 4. Choose **To** — _Phone (Primary)_, _Phone 2_, or _Phone 3_. If the contact has no number in that slot, the action fails for that contact. #### What happens to existing records - Editing a template updates every future workflow run that points at it, even though the workflow node still shows the copy that was made when you picked it. The live template text always wins at send time. - Deleting a template makes each workflow fall back to the text sitting in its own **Message** box. If that box is empty, the Send SMS step fails with _No SMS message configured_. The segment counter measures the text as you typed it. Merge tags expand when the message is sent, so a message that reads as one segment in the editor can become two once a long name or company is filled in. Leave yourself some room. ### Custom Tabs A custom tab adds an extra tab to the contact, company, deal, or engagement window, with your own fields inside it. Use it to group information that does not fit the standard record — qualification questions, shipping details, preferences. The list shows every tab you have created across all four record types. **Who can use it:** org admins and owners, plus anyone granted the **Custom Tabs** permission. Write access is required to open a tab for editing and to delete one. #### Create a tab 1. Open **Custom Tabs** and click **New Tab** at the bottom of the panel. 2. Under **Apply To \***, choose **Contact**, **Company**, **Deal**, or **Engagement**. This cannot sensibly be changed later without stranding the values already saved. 3. Enter a **Tab Name \*** (for example _Qualifications_, _Preferences_, _Shipping_) and pick an **Icon**. 4. Click **Add Field** for each field you want on the tab and fill it in — see the field table below. 5. Click **Create Tab**. The tab now appears on every record of that type. #### Edit, reorder fields, delete 1. Click a tab's row to open **Edit Tab**, make your changes, and click **Save Changes**. 2. Inside the editor, use the chevron up and chevron down buttons on a field card to move it, and the trash button to remove it. The fields render on the record in this order. 3. To remove a whole tab, click the red trash icon on its row. A window titled **Delete Custom Tab** asks _Delete this custom tab?_ and warns _This will permanently remove the tab and all saved field values for every record._ Confirm with **Delete Tab**. #### Tab settings | Setting | Default | Limits | | --------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Apply To | Contact | One of Contact, Company, Deal, Engagement. | | Tab Name | None — required | Up to 100 characters. Duplicate names are allowed, so keep them distinct yourself. | | Icon | Layout | 20 choices: Award, Bookmark, Box, Clipboard, Database, File, Flag, Folder, Heart, Home, Info, Layout, Location, Settings, Shield, Sliders, Star, Tag, Tool, Truck. | | Tab order | Newest tab last | There is no control for reordering tabs. | #### Field settings inside a tab | Setting | Default | Notes | | ---------------- | --------------- | ------------------------------------------------------------------------------------------------------ | | Field Name | None — required | Every field must have a name or the tab will not save (_All fields need a name_). | | Type | Text Input | Text Input, Text Area, Dropdown, Section Title, Calculated. | | Placeholder | Empty | Text Input and Text Area only. | | Dropdown Options | None | Dropdown only. Each option is a label plus an optional notification email. | | Formula | Empty | Calculated only. Reference other fields as {Field Name}; supports \+ - \* /, parentheses, and numbers. | | Role Access | Admin | Owner, Admin, or Member. | | Section Title | — | Renders as a heading on the tab. No value is stored. | The option email is explained in the editor: enter an email next to an option to notify that address whenever this option is selected on a record. It uses your organization's SMTP settings from[ Team Settings](https://docs.vinsi.ai/crm/admin/team-settings) → Email Settings, and only fires when the value actually changes to that option. #### What happens to existing records - **Renaming the tab** is safe — the values already entered stay attached and keep showing. - **Renaming a field inside a tab** is not. The values users have already typed are stored against the old field name, so they stop appearing under the new one. Add a new field instead of renaming a field that is already in use. - **Deleting the tab** is permanent. It removes the tab, every field on it, and every value that has been saved on every record — including any Custom Field you attached to that tab. This cannot be undone. Deleting a tab is the one destructive action in CRM Configuration that really does delete data. Everything else on this page hides an option and keeps the saved values. Read the confirmation text before you click **Delete Tab**. ### Custom Fields Custom Fields creates a single field on contacts, companies, deals, or engagements. A field can sit directly in the record's main section, or you can attach it to one of your [Custom Tabs](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-custom-tabs) — it does not need a tab at all. This is the screen to use when you want one extra box on a record rather than a whole new tab. **Who can use it:** org admins and owners, plus anyone granted the **Custom Tabs** permission — Custom Fields shares that entry and has none of its own. #### Create a field 1. Open **Custom Fields** and choose the record type with the pills at the top: **Contact**, **Company**, **Deal**, or **Engagement**. The list below only shows fields for the selected type. 2. Click **New Field** at the bottom of the panel. 3. Enter a **Field Name \*** (for example _Budget_, _Region_, _Preferred Contact Method_) and pick a **Type**. 4. Set **Required** and **Unique** if you need them, choose a **Width** or tick **Full row**, and fill in whatever extra boxes the type reveals. 5. Choose where it renders under **Tab** — **Main section (no tab)** or one of the custom tabs for that record type. 6. Click **Create Field**. Use a row's pencil icon and **Save Changes** to edit it later. Fields render in the order they were created. There is no reorder control on this screen; to control position, put the fields on a custom tab, where they can be reordered with the chevron buttons. #### Delete a field 1. Click the red trash icon on the field's row. 2. The **Delete Custom Field** window asks _Remove this custom field?_ and explains: _It stops showing on forms/grids but saved values are kept — you can restore it later from the database if needed._ Confirm with **Remove Field**. #### Field settings | Setting | Default | Limits and notes | | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Field Name | None — required | Up to 255 characters. Must be unique for that record type — a duplicate is refused with _A field named "…" already exists for …_. | | Type | Text Input | See the type table below. | | Required | Off | The record cannot be saved while the field is blank; the user sees _"Field" is required_. Hidden for Section Title. | | Unique | Off | No two records of that type may hold the same value; a clash is refused with _"Field" must be unique — "value" is already in use_. Blank values are exempt. Unique fields cannot be bulk-edited. Hidden for Section Title. | | Width | Half | Quarter, Third, Half, or Full. Greyed out while **Full row** is ticked. | | Full row | Off | Overrides Width and makes the field span the whole form row. | | Placeholder | Empty | Up to 255 characters. Offered for Text Input and Text Area only. | | Tab | Main section (no tab) | Main section renders the field directly on the record; a tab renders it inside that tab. Only tabs belonging to the selected record type are listed. | #### Field types | Type | What the user sees | Extra setup | | ------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | Text Input | A single-line box | Optional placeholder | | Text Area | A multi-line box | Optional placeholder | | Dropdown | A list of options you define | **Dropdown Options** — type a label and press Enter or click **Add**. Each option can carry a notification email. | | Section Title | A heading on the form | None. No value is stored, and Required and Unique do not apply. | | Calculated | A read-only number worked out from other fields | **Formula**, for example {Seat Count} \* {Hourly Rate} \* 173 | | Relation | A box that holds a link to another record | **Related To** — Contact, Company, Deal, or Engagement | #### Calculated fields Reference another field on the same record by wrapping its name in braces, as in `{Seat Count} * {Hourly Rate}`. A formula may contain field references, numbers, a decimal point, `+`, `-`, `*`, `/`, and parentheses — nothing else. Percentages, exponents, functions, and text are not supported. - If any referenced field is empty or not a number, the calculated field shows `--`. - The result is formatted as currency when the field name contains _revenue_, _amount_, _price_, _cost_, _total_, _rate_, _fee_, _salary_, or _budget_. Otherwise it is shown as a plain number with up to two decimals. - The formula is not checked when you save it. A typo or a misspelled field name simply shows `--` on every record, so test it on a real record after creating it. #### Relation fields A relation field stores the id of the related record. The form itself says so: _Stores the related record's id. No search picker yet — enter the id directly when filling out the field._ On the record the box is labelled with your field name followed by the record type in brackets, with the placeholder _Record id_. Until a search picker is added, whoever fills the field has to know the numeric id of the record they are linking to. #### What happens to existing records - **Renaming** a custom field changes the label people see and keeps every value already entered. - **Moving** a field between the main section and a tab, or between tabs, keeps its values. - **Removing** a field hides it from forms and grids but keeps the saved values in the database. There is no way to bring it back from the admin screen. - **Deleting the tab** a field is attached to is different — that permanently removes the field and all of its values. Move the field to the main section first if you want to keep it. Turning on **Unique** after records already exist does not clean up duplicates that were saved earlier. It only blocks new clashes from the moment you switch it on. ### Dashboard Widgets As the panel explains: create dashboard widgets that all team members can add to their CRM dashboard. Widgets can show text notes, KPI metrics, data lists, or visual charts from contacts, companies, deals, tickets, and engagements. Everything you create here is organization-wide. **Who can use it:** org admins and owners, plus anyone granted the **Dashboard Widgets** permission. Write access is required for the **New Widget** button. #### Create a widget 1. Open **Dashboard Widgets** and click **New Widget** at the bottom of the panel. 2. Enter a **Widget Title \*** (for example _Open Deals This Month_) and pick an **Icon**. 3. Choose a **Widget Type \***: **Text Note**, **KPI Metric**, **Data List**, or **Chart**. 4. Fill in the settings that type reveals — see the tables below. 5. Optionally click **Add Filter** to narrow the records. Each filter is a field, an operator (_Equals_, _Not Equals_, _Contains_, _Greater Than_, _Less Than_), and a value. With no filters the widget looks at all records. 6. Click **Create**. Use a row's pencil icon and **Save** to change a widget later. #### Create a widget with the AI assistant 1. In the **AI Widget Creator** box at the top of the panel, describe the widget in plain English, or click one of the suggested chips such as _Pie chart of deals by stage_ to fill the box. 2. Click **Create** (or press Enter). 3. The widget is built and saved straight away — there is no preview step. Open it with the pencil icon afterwards to check the data source, filters, and title. #### Settings by widget type | Type | Settings | Defaults | | ---------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | | Text Note | **Content \*** | Empty. Static text, no data source. | | KPI Metric | **Data Source \***, **Time Range**, **Aggregation \***, and **Numeric Field \*** when the aggregation is Sum or Average | Contacts · All Time · Count | | Data List | **Data Source \***, **Time Range**, **Display Fields \***, **Show**, **Sort By**, **Direction** | Contacts · All Time · first three fields · 5 items · Created Date · Newest / Highest First | | Chart | **Data Source \***, **Time Range**, **Chart Type \***, **Group By \***, **Value**, and **Numeric Field \*** for Sum or Average | Contacts · All Time · Bar Chart · Count of Records | #### Options and limits | Setting | Options | Notes | | ------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Widget Title | Free text — required | No length limit. The Create button stays disabled while it is empty. | | Icon | Document, Chart, Trending, Target, Award, Bookmark, Clipboard, Flag, Info, Link, Message, Zap | Defaults to Document. | | Data Source | Contacts, Companies, Deals, Tickets, Engagements, plus each of your custom tabs | Changing the source clears the filters and resets the field choices. | | Time Range | All Time, Today, This Week, This Month, This Quarter, This Year | Defaults to All Time. | | Aggregation / Value | Count, Sum, Average | Sum and Average need a numeric field. Only Deals (Amount) and Engagements (Total Price, Recurring Amt) have one — for Contacts, Companies, and Tickets the form says _No numeric fields available for this data source. Use Count instead._ | | Chart Type | Bar Chart, Pie Chart, Line Chart, Doughnut, Horizontal Bar | Charts show at most the top 15 groups. | | Group By | Text fields of the chosen source | Numeric and date fields cannot be grouped on. | | Show | 3, 5, 10, or 15 items | Data List only. | | Filters | Any number | Values come from a dropdown where the field has known options, otherwise free text. | | Size and color | Not configurable | Lists and charts render at half width, KPI and text notes narrower. | #### How team members get the widget - A new widget appears on everyone's CRM dashboard automatically — nobody has to add it. - On the dashboard, **Add Content** lists your widgets under **Organization Widgets**, each marked _Admin Widget_, with a toggle to show or hide it for that person only. - Each person can drag their cards into whatever order they like, and use a card's menu to **Rename** it or **Remove from Dashboard**. Both choices are personal and do not affect anyone else. - Members only see their own records in data widgets — contacts, deals, tickets, and engagements are limited to the ones they own. Companies are not limited this way. #### Rename and delete - Renaming a widget updates the title for everyone — except for anyone who renamed that card on their own dashboard. Their personal name wins from then on. - Changing a widget's type, data source, or filters takes effect for everyone immediately. - Deleting asks _Delete this dashboard widget? Users who have it on their dashboard will no longer see it._ Confirm and the card disappears from every dashboard. There is no reorder control here — widgets are listed in the order they were created. The AI assistant saves what it builds without showing it to you first, and it does not know your organization's own lead statuses, sources, or stage names. Always open an AI-generated widget and check the filter values against your[ pipeline stages](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-pipeline) and [lead statuses](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-lead-statuses). ### Custom Objects Custom objects are whole new record types with their own fields, list page, and reports — for anything the standard contact, company, deal, and engagement records do not cover, such as Properties, Assets, or Claims. The panel describes them as custom objects and entities that handle different logic and store any type of data. **Limited availability.** The Custom Objects card is not switched on for every organization. If you do not see it in the CRM Configuration section, contact your VINSI representative. **Who can use it:** org admins and owners, plus anyone granted the **Custom Objects** permission, in an organization where the feature is enabled. #### Create an object 1. Open **Custom Objects** and click **Add Custom Object**. 2. Fill in **Name**, **Singular Label**, and **Plural Label**. Typing the name fills the two labels in for you — check the plural, because it is simply the name with an _s_ added. 3. Click **Save**. The object editor opens with seven tabs: **General**, **Object Fields**, **Tabs Configuration**, **Table Columns**, **Search Bar**, **Populate Data**, and **Report Configuration**. #### Add fields and lay out the form 1. On **Object Fields**, click **New Field**. 2. Pick a **Field Type**, then on the **Information** step fill in **Name of the field**, an optional **Custom label** and **Placeholder**, and tick **Is Required** or **Is Unique** if needed. The right-hand **Preview** shows how the field will look. 3. Number, Dropdown List, Radio Button, Relation, Text Area, and Auto Number fields each reveal their own extra settings — minimum and maximum, the list of options, the entity to relate to, the number of rows, or the prefix, suffix, padding, and date format of the generated number. 4. Use the **Form Builder** on the right to drag fields into position, and tick **Use the entire row** on a field that needs the full width. Click **Save form**. 5. On **General**, set the **Display Format** that controls how a single record is labelled in lists — wrap each field in braces, as in `{First Name} {Last Name}`. Add at least one field before setting this. #### Finish the setup 1. **Tabs Configuration** — optionally pick one Dropdown List or Radio Button field whose options become tabs above the record table. Choose **None (no tabs)** to turn this off. 2. **Table Columns** — choose which fields appear as columns and in what order. Left alone, the first seven fields are used. 3. **Search Bar** — choose the fields the page search box should match on. Dropdown, radio, and relation fields are handled by the column filters instead and are not listed. 4. **Populate Data** — add records one at a time with **New Record**, or bulk-load them under **Import from CSV**. Column names must match the object's field names; use **Download Template** to get the right header row. Relation fields are not supported in CSV imports. 5. **Report Configuration** — build reports over the object as Table, Bar, Line, Pie, or KPI. #### Settings and limits | Setting | Default | Notes | | ----------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Name | None — required | Also determines the page address and how per-member access to the object is identified. | | Singular Label / Plural Label | Copied from the name | Used in buttons and headings such as _New …_ and _List of …_. | | Visible in header menu | On | Controls whether the object appears in the navigation menu. | | Display Format | Empty | Wrap field names in braces; combine several to build a label. | | Object order | Added last | Changed with the up and down arrows on the object list. | | Field types | — | Input Text, Input Number, Checkbox, Radio Button, Date Picker, DateTime Picker, Time Picker, Dropdown List, Relation, Text Area, Input Email, Input Password, Switch, Input Autocomplete, Auto Number. | | Field limits | — | No cap on the number of objects, fields, or options. | #### What happens to existing records - **Renaming a field** is safe — the values on existing records stay attached. - **Removing a field** hides it and its values without deleting them. - **Deleting an object** hides it and its records rather than erasing them, but there is no confirmation prompt and no way to restore it from the admin screen — one click on the trash icon is enough. - **Renaming an object** changes its page address and the identifier its per-member access is granted against. Existing links stop working, and members who had been given access to the object may lose it until an admin grants it again under the new name. Do not delete an object and then create a new one with the same name. Reusing the name reactivates the old object and clears its field definitions, which leaves the records that were captured earlier stranded and unreadable. Choose a different name instead. ### Custom Labels As the panel explains: rename the Contact and Company objects for your organization. This only changes what your team sees — it does not affect other organizations. A medical practice can call companies _Clinics_, a property manager can call them _Buildings_, and the menu, page titles, buttons, and form labels follow. **Who can use it:** only org admins and owners can save a change here. Anyone granted the **Custom Labels**permission can open the card and read the current labels, but saving is refused for anyone below admin. #### Rename Contact or Company 1. Open **Custom Labels**. There is one card for **Contact** and one for **Company**. 2. Type the new wording into **Singular label** and **Plural label**. The boxes show the current defaults as grey placeholder text. 3. Click **Save** on that card. Each card saves on its own. 4. To go back, click **Reset to default** — this fills the boxes with the original wording but does **not** save on its own. Click **Save** afterwards. #### Fields and limits | Field | Default | Limits | | ------------------------ | --------- | --------------------- | | Contact — Singular label | Contact | Up to 250 characters. | | Contact — Plural label | Contacts | Up to 250 characters. | | Company — Singular label | Company | Up to 250 characters. | | Company — Plural label | Companies | Up to 250 characters. | Only Contact and Company can be renamed. Deal and Engagement always keep their own names. #### Where the new wording shows up - The navigation menu entries for [Contacts](https://docs.vinsi.ai/crm/contacts) and Companies. - The Contacts and Companies page headings, and the contact and company windows. - The company picker and _Add company_ window used from a contact. - The [Deals](https://docs.vinsi.ai/crm/deals) page and the new-deal form. - Workflow lists and the workflow builder on [Data & Automation](https://docs.vinsi.ai/crm/admin/data-automation). - The record-type pills on [Custom Tabs](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-custom-tabs) and [Custom Fields](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-custom-fields), and the relation-field picker on [Custom Objects](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-custom-objects). #### What happens to existing records Nothing — a label is only wording. No contact or company data is changed, no field is renamed, and reports and exports are unaffected. After saving, reload the page. The navigation menu keeps showing the previous wording until the browser reloads, and teammates who already have the CRM open will keep seeing the old label until they refresh too. --- # Email Templates Create reusable email templates with personalized merge tags to send consistent, on-brand messages to your contacts. Created April 13, 2026 ## Overview Email Templates can be found under the [CRM Admin → CRM Configuration](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-email-templates) page. Email Templates let you build and save reusable emails that agents can send directly to contacts from the CRM. Each template has a name, icon, subject line, and rich-text body — all of which can include personalized merge tags that are automatically replaced with real contact data when the email is sent. Templates save time on repetitive outreach and ensure consistent messaging across your team. You can also switch to raw HTML mode for full control over the email layout and styling. Each template in the list has the following action buttons: - ![move up](https://docs.vinsi.ai/images/crm/symbols/email-templates/icon-arrow-up.svg)![move down](https://docs.vinsi.ai/images/crm/symbols/email-templates/icon-arrow-down.svg)**Reorder** — the up and down arrows let you change the order templates appear in the list, so you can keep your most-used templates at the top. - ![edit](https://docs.vinsi.ai/images/crm/symbols/email-templates/icon-edit.svg)**Edit** — opens the template builder so you can update the name, subject, body, or any other field. - ![delete](https://docs.vinsi.ai/images/crm/symbols/email-templates/icon-delete.svg)**Delete** — permanently removes the template. This action cannot be undone. ## Creating a Template Click ![New Email Template](https://docs.vinsi.ai/images/crm/symbols/email-templates/crm-new-email-template.svg) to open the template builder. Fill in the following fields: - **Template Name** — a label used to identify the template in your list (e.g. _Thank You for Call_). - **Icon** — choose an icon from the grid to visually represent the template type (phone, email, calendar, etc.). - **Subject Line** — the email subject shown to the recipient (e.g. _Great Speaking With You!_). Merge tags can be used here too. - **Body** — compose your email using the rich-text editor. Use the toolbar to format text, add lists, insert links or images, and more. Click **<> HTML** to switch to raw HTML mode for custom layouts. - **Attachments** — optionally attach files up to **4MB each** using the Add File button. When you're done, click **Create** to save the template. ### Merge Tags Merge tags are placeholders in your template body (and subject line) that get replaced with real contact data when the email is sent. This lets you write one template that feels personal to every recipient. The following merge tags are supported: - `{{name}}` — the contact's first name - `{{last_name}}` — the contact's last name - `{{full_name}}` — the contact's full name - `{{email}}` — the contact's email address - `{{company}}` — the contact's company name **Example** A body that reads _"Hi {{name}}, it was great speaking with you at {{company}}!"_ will be sent as _"Hi Sarah, it was great speaking with you at Acme Corp!"_ when sent to a contact named Sarah at Acme Corp. ## Using HTML When creating a template, you can click the **<> HTML** button to switch from the visual editor to a raw HTML editor. This lets you write the email's content and layout directly in code rather than using the formatting toolbar. HTML (HyperText Markup Language) is the standard language used to structure content on the web — and in emails. Instead of clicking Bold or choosing a font size, you write text wrapped in tags that tell the email client how things should look. For example, `Hello` makes the word "Hello" appear bold, and `

Your message

` wraps text in a paragraph. Email clients like Gmail and Outlook read these tags and render them visually when the recipient opens the email. Using HTML gives you full control over the email's layout — you can create multi-column designs, add custom colors, control spacing precisely, embed styled buttons, and build branded templates that go well beyond what the visual editor supports. Merge tags like `{{name}}` work exactly the same way inside HTML mode. **Heads up:** HTML mode is intended for users with coding experience. If you're not familiar with HTML, stick with the visual editor — a small mistake in HTML (like a missing closing tag) can cause your email to display incorrectly for recipients. If you're unsure, ask someone on your team with a technical background to help build or review the template. If you'd like to learn HTML or brush up on email-safe HTML, these free resources are a good starting point: - [MDN Web Docs — HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) — the most comprehensive free HTML reference, maintained by Mozilla. Covers every tag and attribute with clear examples. - [W3Schools HTML Tutorial](https://www.w3schools.com/html/) — beginner-friendly guides and an interactive editor where you can try HTML code live in your browser. - [Can I Email?](https://www.caniemail.com) — a reference for checking which HTML and CSS features are supported across different email clients (Gmail, Outlook, Apple Mail, etc.), since not all web HTML works in email. --- # Invoice Settings Manage invoice company profile and payment collection. Created April 1, 2026 Updated: September 17, 2026 ## Overview The **Invoice Settings** section of [CRM Admin](https://docs.vinsi.ai/crm/admin) holds two cards. Together they answer two questions for every invoice you send: _who is this invoice from_, and _how does the customer pay it_. - **Invoice Settings** — _Save company information and connect Stripe for CRM invoice payments._ Your company name, contact details, and billing addresses. - **Stripe Connect** — _Connect your Stripe account to process payments._ The Stripe keys VINSI uses to take card payments on your behalf. Both cards open in a slide-up panel over the admin grid; close either with the round **X**. Each card shows a small badge counting what you have set up — one point for company information, one for a working Stripe connection. You can jump straight to the first card with `/crm/admin?panel=invoice-settings`. Set these up **before** you raise your first invoice. Company details are copied onto an invoice when it is created, so filling them in later will not fix invoices you have already made. ## Who Can Use These Cards Organization admins and owners always have access. Everyone else needs the **Invoice Settings** permission, granted per member in [Team Settings → CRM Team](https://docs.vinsi.ai/crm/admin/team-settings). One permission covers both cards. | Permission | What it allows | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Invoice Settings — Read | See the section and open both panels. Values are visible but nothing can be changed. | | Invoice Settings — Write | Use **Save** on the company profile, **Add Address** and the per-address edit, delete and set-primary buttons, and both **Save Credentials** and **Test Connection** on Stripe Connect. | **Gotcha.** A rep without at least read access can still create invoices — their invoices simply open with the company block blank, and they have to type your company details by hand. If your team keeps producing invoices with a missing sender address, check this permission first. ### Invoice Settings This card holds one company profile for your whole organization. As the panel puts it, _this profile is used as the sender information on CRM invoices_ — it fills in the "from" block on new invoices and the footer of every invoice email you send. It is split into **Company Information** and **Addresses**. ### Company Information 1. Open **CRM → Admin → Invoice Settings**. 2. Fill in the five fields under **Company Information**. 3. Click **Save** at the bottom of the panel. You'll see **Invoice settings saved**. | Field | Example | Details | | ------------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | Company Name | Acme Corp | Your trading name. This is what appears on the invoice and in the invoice email footer. | | Legal Name | Acme Corporation LLC | Recorded for your own reference. It is not printed on the invoice. | | Website | https://company.com | Shown as a link in the invoice email footer. | | Phone | +1 (555) 123-4567 | Formats itself as a US number while you type. Must be at least 10 digits or you'll see **Invalid phone number**. Copied onto new invoices. | | Email | billing@company.com | Your billing address for replies. Invalid entries show **Invalid email address**. Copied onto new invoices. | None of the fields are compulsory — you can save a partial profile and come back. Both validation messages appear when you click out of the field, and the **Save** button stays disabled while the phone number is invalid. **What this card does not do.** There is no logo upload, invoice numbering or prefix, default payment terms, tax rate, or footer text here. The logo is set per invoice in the invoice builder, and numbering, terms, tax and notes are all set on the invoice itself — see [CRM Invoices](https://docs.vinsi.ai/crm/invoices). ### Addresses _Used on invoices sent from this profile._ Store up to three addresses and mark one as primary — the primary address is the one that goes on invoices. 1. Click **\+ Add Address**. The button is hidden once you have three addresses, or while another address is open for editing. 2. Pick an **Address Type** and, if this should be the one used on invoices, tick **Set as Primary**. The first address you add is marked primary automatically. 3. Start typing in **Address Line 1**. When address lookup is available the label shows a _Start typing to search_ hint — choose a suggestion and the city, state, postal code and country fill themselves in. 4. Complete anything the lookup missed, then click **Save Address**. You'll see **Address added** or **Address updated**. | Field | Options and defaults | | -------------------------- | ----------------------------------------------------------------------------------------------------------- | | Address Type | **Office** (default), PO Box, Billing, Headquarters, Other. Headquarters shows as **HQ** on the saved card. | | Set as Primary | Ticked automatically for your first address. Only one address can be primary at a time. | | Address Line 1 | Free text, e.g. _123 Main Street_. Supports address lookup. | | Address Line 2 | Free text, e.g. _Suite 200_. | | City / State / Postal Code | Free text, e.g. _Miami_ / _FL_ / _33101_. | | Country | Two-letter country code, forced to upper case. Defaults to **US**. | | Maximum addresses | 3. | Each saved address shows its type badge, a green **Primary** badge where it applies, and three buttons: | Button | What it does | | ------ | ------------------------------------------------------------------------------------------------ | | Star | _Set as primary._ Shown only on non-primary addresses. Applies immediately with no confirmation. | | Pencil | Opens the address for editing in place. | | Trash | Deletes the address. Reports **Address removed**. | **Gotchas.** Deleting an address happens straight away — there is no confirmation dialog, and no undo. Deleting your primary address silently promotes the next one, so check which address is marked Primary afterwards. While an address form is open the main **Save** button disappears; finish or cancel the address first. Country must be a two-letter code — anything else is replaced with **US** when saved. ### Stripe Connect Connect the Stripe account that should receive payments for your CRM invoices. Once connected, invoice emails carry a **View and pay** button that takes your customer to a Stripe checkout page, and the payment is recorded back against the invoice automatically. Without it, invoices still send — they just have no pay button. You connect by pasting keys from your own Stripe dashboard. As the panel explains: _Store Stripe credentials per organization. Secret and webhook signing secrets are encrypted at rest and never returned raw to the browser._ **Keys are credentials — treat them like passwords.** Create them yourself inside your Stripe dashboard and paste them in here. Never email them, never paste them into a chat, and never give them to anyone who asks for them outside of this screen. ### Connect Your Stripe Account 1. Open **CRM → Admin → Stripe Connect**. 2. Choose **Test mode** or **Live mode** at the top. The panel opens on **Test mode**. 3. Copy the **Webhook Endpoint** shown in the panel — it is read-only — and add it as a webhook destination in your Stripe dashboard. 4. Back in VINSI, paste the **Publishable Key**, the **Secret / Restricted Key**, and the **Webhook Signing Secret** that Stripe gave you for that webhook. 5. Click **Save Credentials**. You'll see **Stripe credentials saved**. 6. Click **Test Connection**. A working connection reports **Stripe connection is valid** and fills in the **Stripe Account** and **Last Tested** lines. Check the status pill reads **Valid** before you rely on it. 7. Repeat for the other mode when you are ready to go live. | Field | Looks like | Details | | ----------------------- | ------------------------- | --------------------------------------------------------------------------------------------------- | | Publishable Key | pk\_test\_… / pk\_live\_… | Stripe's public key. Safe to display. | | Secret / Restricted Key | rk\_test\_… / sk\_live\_… | Hidden as you type and never shown back to you. Prefer a **restricted** key over a full secret key. | | Webhook Signing Secret | whsec\_… | Hidden as you type. Lets VINSI verify that payment notifications really came from Stripe. | | Webhook Endpoint | Your VINSI webhook URL | Read-only. Copy this into Stripe — you cannot change it here. | **Leave a field blank to keep the value you already saved.** That is the intended way to update just one key — for example rotating only the secret key. Clearing a box does not erase the stored value. ### Connection Status The **Connection Status** box reports the state of the mode you are currently viewing. | Status | Meaning | What to do | | -------------- | -------------------------------------------------------------------- | ------------------------------------------- | | Not configured | No keys have been saved for this mode. | Paste your keys and save. | | Pending test | Keys are saved but have never been checked against Stripe. | Click **Test Connection**. | | Valid | VINSI reached your Stripe account successfully. | Nothing — you are connected. | | Invalid | The last test failed. The reason appears on the **Last Error** line. | Re-copy the key from Stripe and test again. | The box also lists: | Line | Shows | | ---------------------------------------------------------- | ----------------------------------------------------------------------- | | Mode | Which mode you are looking at. | | Publishable Key / Secret / Restricted Key / Webhook Secret | A masked version of what is stored, or **Not saved**. | | Key Type | Whether the saved key is a restricted or a full secret key. | | Stripe Account | The Stripe account VINSI reached. Appears only after a successful test. | | Last Tested | Date and time of the most recent test. | | Last Error | In red, the reason the last test failed. | ### Test Mode vs Live Mode Each mode stores its own set of keys and its own status. **Test mode** uses Stripe's test keys and moves no real money — use it to check the customer's experience end to end. **Live mode** takes real card payments. **Gotchas.** Switching between Test and Live clears whatever you have typed into the three key boxes — save before you switch. When both modes hold keys, VINSI uses **Live** for invoice payment links, so leaving stale live keys in place will send real customers to the wrong account. There is no **Disconnect** button in this panel: to stop taking payments, revoke or roll the key inside your Stripe dashboard, which makes the connection test fail and removes the pay button from future invoice emails. ## How This Shows Up on Invoices Everything on this page feeds [CRM → Invoices](https://docs.vinsi.ai/crm/invoices). Here is exactly where each piece lands. | Setting | Where it appears | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | Company Name | Pre-fills **Organization Name** on a new invoice, and is the company name in the invoice email footer and subject line. | | Phone | Pre-fills **Org Phone** on a new invoice, and appears in the email footer. | | Email | Pre-fills **Org Email** on a new invoice, and appears as a contact link in the email footer. | | Primary address | Pre-fills **Org Street**, **Org City**, **Org State** and **Org Postal Code** on a new invoice, and is the address in the email footer. | | Website | Appears as a link in the invoice email footer only — it is not printed on the invoice document. | | Legal Name | Stored for reference. It is not used on the invoice or in the email. | | Stripe connection | Adds a **View and pay** button and a row of accepted payment methods to the invoice email. | | Organization logo | Comes from your organization profile and the invoice builder, not from this page. | **Sending an invoice for payment** 1. Create the invoice in [CRM → Invoices](https://docs.vinsi.ai/crm/invoices). The company block is pre-filled from this page; you can still override it per invoice. 2. Open the invoice and choose **Send Email**, optionally attaching the PDF. 3. If Stripe is connected and the invoice still has a balance, the email includes a **View and pay** button that opens a Stripe checkout page, plus a row showing the accepted methods (Apple Pay, VISA, Mastercard, Discover, AMEX, Bank). 4. When the customer pays, the invoice is updated automatically — it becomes **Paid**, or **Partial** if a balance remains. **Gotchas.** Company details are copied onto the invoice the moment it is created, so changing them here never updates an existing invoice — edit that invoice directly. Duplicated invoices reuse the original's company block rather than re-reading this page. If Stripe is not connected, or the keys are wrong, the invoice email still sends but silently arrives with no pay button at all — so confirm the status pill reads **Valid** before your first real send. Quotes and already-paid invoices never get a pay button by design. --- # Data & Automation Import and manage CRM data, and automate workflows across your team. Created April 1, 2026 Updated: September 17, 2026 ## Overview Data & Automation gives you the tools to move data in and out of the CRM at scale, build automated workflows, run email campaigns, and monitor email health across your team. Open it from [CRM → Admin](https://docs.vinsi.ai/crm/admin) and scroll to the **Data & Automation** section (subtitle: _Import, manage CRM data and automate workflows_). Each card opens in a slide-up panel over the admin grid — close it with the round **X** in the corner. The **Search settings...** box above the grid filters cards by title and description. **Tip:** every panel has a direct link. Add `?panel=` and the panel name to the admin URL — for example `/crm/admin?panel=import-contacts`. Valid names are `workflows`, `email-campaigns`, `reports`, `email-reports`, `import-contacts`, `bulk-assign`, `bulk-delete`, `unsubscribe`, `website-visitors`, and `dnc-registry`. ## Who Can Use These Cards Organization admins and owners can use every card. Everyone else needs the matching permission, granted per member in [Team Settings → CRM Team](https://docs.vinsi.ai/crm/admin/team-settings). **Read** lets a member open the card; **Write** lets them change something. | Card | Permission name | Write permission controls | | ---------------------- | ------------------------------------------------- | ------------------------------------------- | | Workflows | Workflows | The **New Workflow** button | | Email Campaigns | Email Campaigns | The **New Campaign** button | | Reports | Reports | — | | Email Reports | Email Reports | — | | Import Contacts | Import Contacts | The **Choose CSV File** button | | Bulk Assign | Bulk Assign | The whole panel, including the contact list | | Bulk Delete | Bulk Delete | The whole panel, including the contact list | | Business Card | Business Card | — | | Unsubscribe Management | Unsubscribe Management | The **Add Unsubscribe** button | | Website Visitors | None — visible to anyone who can open the section | — | | Do Not Call Registry | None — visible to anyone who can open the section | — | The whole section is also behind a parent **Data Automation** permission. If a member can't see the section at all, that's the one to grant first. ### Workflows _Build drag-and-drop automations triggered by contact, deal, and order events._ A workflow watches for one event in the CRM, optionally checks a few conditions, and then does things for you — change a lead status, assign an owner, send an email or SMS, open a ticket, create an activity, and so on. Use it to stop asking people to remember manual follow-up steps. Workflows is the only card that takes over the full admin screen instead of opening a slide-up panel. The list screen is titled **CRM Workflow Automator** (_Create automations that trigger when contacts, deals, or orders change_) and has a **Back to CRM Admin** link at the top left. ### Create a Workflow 1. Open **CRM → Admin → Data & Automation → Workflows**. 2. Click **New Workflow**. If you don't see the button, ask an admin for write access to Workflows. On an empty list you'll see: _No workflows yet. Create one to automate CRM actions like assigning owners, changing statuses, and sending emails._ 3. In the **New CRM Workflow** window, type a **Workflow Name** (required) — the placeholder suggests _e.g. Auto-assign new leads_. 4. Pick a **Trigger Source**: **Native CRM** or **Custom Objects**. Custom Objects is greyed out until your organization has at least one custom object (see [CRM Configuration](https://docs.vinsi.ai/crm/admin/crm-configuration)). 5. Choose the **Entity** (Contact, Company, Deal, Order, or AI Phone Agent — or one of your custom objects) and then the **Event**. The events offered depend on the entity; see the [Triggers](https://docs.vinsi.ai/crm/admin/data-automation#crm-da-wf-triggers) table. 6. Optionally add a **Description** (_What does this workflow do?_) so other admins know what it's for. 7. Click **Create Workflow**. You'll see **Workflow created** and drop straight into the builder. Leaving out the name or trigger shows **Name and trigger are required**. **New workflows are live immediately.** There is no draft state — a workflow is created as **Active**. Until you wire it up it has nothing to do, but the moment you save a trigger connected to an action it starts running against real records. If you want to build it quietly, click **Deactivate** first and turn it back on when you're finished. ### Build the Flow The builder has three parts: the **Nodes** palette on the left (collapsible with the chevron), the canvas in the middle, and a **Configure Node** panel that slides in on the right when you select a node. 1. Drag the trigger from the **Triggers** group onto the canvas. Only the trigger you chose at creation is listed, and once it's placed it gets a tick and can't be dragged again. Dropping a second trigger shows **Only one trigger node allowed per workflow**. 2. Drag in the **Conditions** and **Actions** you need, plus an **End** node if you want the branch to stop explicitly. 3. Connect nodes by dragging from a node's right-hand handle to the next node's left-hand handle. Condition nodes have two outputs — **YES** (green, upper) and **NO** (red, lower). Each output can feed only one connection; a second attempt shows **This output is already connected**. Hover a connection and click the red ✕ to remove it. 4. Click a node to open **Configure Node**. Every node has a **Title** and an optional **Description** (_Optional note_), followed by settings specific to that node type. **Delete Node** at the bottom removes it and its connections. 5. Use **Fit View** in the header (_Fit all nodes in view_) to re-centre a large diagram. 6. Click **Save**. You'll see **Workflow saved**; a failure shows **Failed to save**. Renaming a node's **Title** is safe — it only changes the label on the canvas, not which action runs. Use it to say what this step is for, and put longer notes in the **Description** field. ### Triggers Every workflow has exactly one trigger, chosen when you create it and fixed afterwards. To change a trigger you create a new workflow. | Entity | Event | Fires when | | -------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | Contact | Record is created | A new contact is created. | | Contact | Record is updated | A contact is edited — but only when no more specific event applies. A lead-status or disposition change fires that event instead, not this one. | | Contact | Lead status changes | The contact's lead status moves to a different value. | | Contact | Disposition changes | The contact's call disposition changes. | | Contact | Custom field changes | A custom field on the contact gets a new value. | | Company | Custom field changes | A custom field on the company gets a new value. This is the only company event available. | | Deal | Record is created | A new deal is created. | | Deal | Stage changes | A deal moves to a different pipeline stage. | | Order | Record is created | A new order (engagement) is created. | | AI Phone Agent | After call | An AI phone agent call has ended and its results are available. | | Custom object | Record is created / Record is updated | A record of that custom object is created or updated. | The trigger node itself has no settings beyond Title and Description — there is nothing to configure on it. ### Conditions A condition checks one field and splits the flow into a **YES** branch and a **NO** branch. The palette only offers the conditions that make sense for your trigger, so the list you see is shorter than the full set below. | Condition node | Checks | Shown for | | ---------------------- | -------------------------------------------- | -------------------------------------------- | | Check Lead Status | Lead status | Contact, deal, order and call triggers | | Check Contact Type | Contact type | Contact, deal, order and call triggers | | Check Source | Contact source | Contact, deal, order and call triggers | | Check Disposition | Contact disposition | Contact, deal, order and call triggers | | Check Company | Company name | Contact, deal, order and call triggers | | Check Field | Any one contact field you pick | Contact, deal, order and call triggers | | Check Deal Stage | Deal stage | Contact, deal and order triggers | | Check Deal Amount | Deal value | Contact, deal and order triggers | | Check Pipeline | Pipeline | Contact, deal and order triggers | | Check Call Disposition | The disposition the AI agent set on the call | AI Phone Agent trigger only | | Check Call Summary | Text of the call summary | AI Phone Agent trigger only | | Check Transferred To | Where the call was transferred | AI Phone Agent trigger only | | Check Custom Field | A custom field on the contact or company | The two _custom field changes_ triggers only | | Check Object Field | A field on the custom object record | Custom object triggers only | Each condition has three settings: | Setting | Details | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Field | Locked to the node type and shown greyed out, except on **Check Field**, where you choose from Lead Status, Contact Type, Source, Disposition, Deal Stage, Deal Amount, Pipeline, Company, Email, Phone, or Industry. **Check Custom Field** and **Check Object Field** add their own field picker instead (_Select custom field..._ / _Select field..._). | | Operator | Defaults to **equals**. Options: equals, does not equal, contains, does not contain, is empty, is not empty. **greater than** and **less than** appear only when the field is Deal Amount. Text comparisons ignore upper/lower case. | | Value | Hidden for _is empty_ and _is not empty_. Becomes a dropdown of your configured options for Lead Status, Source, Disposition, Pipeline and Industry; a Pipeline → Stage list for Deal Stage; lead / customer / partner / vendor / other for Contact Type; and a free-text or number box otherwise. Call Disposition lists the dispositions defined on your AI agents, or shows _No dispositions found_. | **There is no AND / OR builder.** One condition node tests one field. To require two things, chain condition nodes — feed the first node's **YES** output into the second node. A condition that is missing its field or operator is treated as passing, so always fill both in. ### Actions Actions are the work the workflow does. Drag them from the **Actions** group. | Action | Settings | | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Set Lead Status | **Lead Status** — one of your configured lead statuses. | | Set Disposition | **Disposition** — one of your configured dispositions. | | Set Contact Type | **Contact Type** — lead, customer, partner, vendor, or other. | | Assign Owner | **Team Member** — pick from _Select member..._ and the member list. | | Set Deal Stage | **Deal Stage** — listed as _Pipeline → Stage_. | | Create Deal | **Deal Name** (placeholder _Use {{contact\_name}} for dynamic_), **Pipeline**, and **Amount** (number, placeholder _0.00_). | | Send Email | **Email Template** (or **Custom (no template)**), **To** (only without a template — accepts _contact_, _owner_, or an address), **Subject**, and **Body** in a rich editor. Choosing a template sends to the contact and keeps using the template's latest content. | | Send SMS | **SMS Template** (or Custom), **From Phone Number**, **To** — Phone (Primary), Phone 2, or Phone 3 — and **Message**. Supports {{name}}, {{email}}, and {{phone}}. | | Make Phone Call | **AI Agent** (required) — one of your phone agents — **Call To** (_contact_, the default, dials the contact's primary number; anything else is dialled as typed), and **Call Purpose**, which is passed to the agent as context. The call is placed as soon as the workflow reaches this node. | | Wait | **Delay** (a number) and **Unit** (minutes, hours, or days). Everything after this node is put on hold and picked up once the delay is over — see the note below. | | Add Note | **Note Content** — free text added to the contact. | | Create Ticket | **Subject** (required), **Description**, **Priority** (Low, Medium — default, High, Urgent), **Type** (Incident — default, Request, Question, Problem), **Assign To** (default Unassigned, which means whoever triggered the workflow), and **Due In (days)** (No due date — default, 1, 2, 3, 5, 7, 14, 30, 60, 90). | | Create Activity | Same fields as Create Ticket, plus two dynamic assignees: **Lead Owner (whoever the contact is assigned to)** and **Workflow Trigger User (whoever triggered it)**. Left unassigned, the activity stays unassigned. | | Set Object Field | Custom-object triggers only. Pick the **Object Field** and its **New Value**. On other triggers it shows _This workflow trigger is not linked to a custom object._ | | End | No settings. Marks the end of a branch. | Placeholders accepted in ticket and activity subjects and descriptions: `{{contact_name}}`, `{{first_name}}`, `{{last_name}}`, `{{email}}`, `{{company}}`, `{{lead_status}}`, `{{deal_name}}`, and `{{deal_stage}}`. SMS templates are managed in [CRM Configuration → SMS Templates](https://docs.vinsi.ai/crm/admin/crm-configuration), email templates in [Email Templates](https://docs.vinsi.ai/crm/email-templates). ### Activate, Rename, Delete | Task | How | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Turn a workflow on or off | Flip the switch on the workflow's row in the list, or click **Activate** / **Deactivate** in the builder header. The pill next to the name reads **Active** or **Inactive**. You'll see **Workflow activated** or **Workflow deactivated**. | | Rename | Open the workflow and click the pencil next to its name (_Rename workflow_). Press Enter to save, Escape to cancel. Confirms with **Workflow renamed**. | | Delete | Click the trash icon on the row, or **Delete** in the builder header. The **Delete Workflow** window asks **Delete this workflow?** and warns _This cannot be undone. Any automations will stop running._ Confirm with **Delete**. | | See how often it runs | The list row shows the trigger, the node and connection counts, a **run** count once it has fired at least once, and the created date. Deactivated workflows lose the coloured bar on the left of the row. | ### Workflow Gotchas - **No test mode.** There is no simulate or dry-run button. To check a workflow, activate it and perform the real action on a throwaway record. - **No run log.** Only the run counter on the list row tells you anything, and it only counts runs that actually performed at least one action. A workflow whose conditions never match shows nothing. - **Nothing warns you about a half-built flow.** A trigger with no connected actions saves and activates happily. - **One trigger, one edge per output.** Branch by using a condition's YES and NO outputs, not by dragging two connections off the same handle. - **Each node runs at most once per trigger.** If two branches converge on the same node, that node fires on whichever branch reaches it first. - **Contact updates are specific.** If you want to catch a lead-status change, use the _Lead status changes_ trigger — _Record is updated_ will not fire for it. - **Rich HTML templates are preview-only.** If an email template contains tables or inline styles, the Body field in the builder shows a read-only **(Template Preview)** instead of an editor. Edit the template itself in [Email Templates](https://docs.vinsi.ai/crm/email-templates). - **A Wait pauses only its own branch.** Everything after the Wait node is stored and resumed once the delay is over; other branches keep running immediately. If the workflow is switched off before the delay elapses, the paused steps are dropped. - **Send Email and Send SMS need delivery set up.** Email uses your SMTP settings in [Team Settings → Email Settings](https://docs.vinsi.ai/crm/admin/team-settings); SMS needs a phone number your organization owns. ### Email Campaigns _Send bulk emails using CSV or CRM contacts with email verification and send rate controls._ Use this for one-off blasts and nurture sends to a list, as opposed to the one-to-one email you send from a contact record. **Building a campaign?** The five-step wizard — recipients, compose, send settings, review, sending — is covered end to end in the [Email Campaign step-by-step guide](https://docs.vinsi.ai/step-guides/email-campaign). This section covers the admin card itself. 1. Open **Data & Automation → Email Campaigns**. The card opens on **Campaign History**, not the wizard. 2. Click **New Campaign** at the bottom of the panel to start the wizard. The button is hidden while you are inside the wizard, and hidden entirely without write access. 3. Use **Campaign History** to come back to the list from any step of the wizard. 4. Click **Refresh** to re-poll a campaign that is still sending. Every campaign in the history list carries a status and a set of actions: | Status | Meaning | | --------- | -------------------------------------------------------------------------------------------------------- | | Scheduled | Queued for a future date and time. | | Verifying | Addresses are being checked before the first email goes out. | | Pending | Accepted and waiting for the sender to pick it up. | | Sending | Emails are going out at your configured rate. | | Paused | Stopped by you. Two variants appear on their own: **Paused — high bounce** and **Paused — worker down**. | | Completed | Every recipient has been processed. | | Cancelled | Stopped before finishing and not resumable. | | Error | The campaign failed. Check your SMTP settings first. | | Action | What it does | | --------------- | -------------------------------------------------------------------------------------------------------------- | | Live View | Opens the progress view for a campaign that is sending. | | Pause / Resume | Stops and restarts sending. Confirms with **Campaign paused** / **Campaign resumed**. | | Reactivate | Asks _Restart sending for this campaign?_ then reports **Campaign reactivated — sending will resume shortly**. | | Cancel Campaign | Asks _Are you sure you want to cancel this campaign?_ Cancelling cannot be undone. | | Edit | Reopens the campaign in the wizard. | | Duplicate | Offers **Duplicate with same recipients** or **Duplicate — choose new recipients**. | | Delete | Titled **Delete Campaign** with the warning _This cannot be undone._ | Each row also reports **Recipients**, **Sent**, **Failed**, **Skipped**, **Opened**, **Clicked**, **Bounced**, and **Unopened**. Click into the numbers to see which addresses were affected and why a recipient was skipped — reasons include _Unsubscribed_, _Already sent in last 24h_, _Duplicate in list_, _No mail server (bad/typo domain)_, and _Bounced in a recent campaign_. **Gotchas.** Campaigns need SMTP configured — without it you'll see _No custom SMTP settings configured. Go to Email Settings to set up your SMTP server._ Unsubscribed contacts and addresses that bounced in the last six months are skipped automatically, so your **Sent** count will be lower than your **Recipients** count. Sending continues in the background — you can safely close the panel. ### Reports _View 20+ CRM reports with charts across contacts, deals, orders, calls and more._ This is the read-only analytics view over your whole CRM — use it for pipeline reviews, activity checks, and per-rep performance. The full catalogue of charts is listed on the [Admin Reports](https://docs.vinsi.ai/crm/reports) page. 1. Open **Data & Automation → Reports**. The screen is titled **CRM Reports** and has a **← Back to CRM Admin** link. 2. Narrow to one person with the team-member list, which defaults to **All Team Members**. 3. Pick a date range, then click **Refresh** if you want to re-pull the numbers. 4. Click any summary tile or chart segment to drill into the underlying records. 5. In a drill-down, click **Export CSV** to download those rows. | Control | Options and defaults | | ------------- | ------------------------------------------------------------------------------------------------------------------------------- | | Team member | **All Team Members** (default), or one member. | | Date range | Today, Last 7 Days, Last 30 Days, Last 90 Days, This Year, All Time, Custom. | | Custom range | Choose **Date Range** (from and to) or **Specific Date**. The end date can't be earlier than the start date. | | Summary tiles | Total Contacts, Total Companies, Total Deals, Deal Value, Total Engagements, Revenue, Appointments, Total Calls. All clickable. | | Sections | Team Member Performance, Calls, Contacts, Companies, Deals, Engagements. | | Export | **Export CSV**, available inside a drill-down only. | **Gotcha.** A chart with nothing to show renders an empty-state placeholder rather than disappearing, so a blank panel usually means your date range or team-member filter is too narrow — not that the data is missing. ### Email Reports _View email sending analytics, volume trends, and delivery insights._ Email Reports is the health check on your sending reputation: it shows how much mail your team sends, how much of it lands, and who is getting hit repeatedly. Watch it if you care about not being blocked by the big mailbox providers. 1. Open **Data & Automation → Email Reports**. The panel is titled **Email Reports** (_Email sending analytics and delivery insights_). 2. Choose a period from the date-range list. It opens on **Last 30 days**. 3. Read the KPI cards across the top, then the charts and lists below them. 4. Click **View details →** on any KPI card, or a bar or slice on a chart, to see the individual emails behind that number. 5. In a drill-down, use **Back to Reports** to return. | Control or metric | Details | | ------------------ | --------------------------------------------------------------------------------------------- | | Date range | Today, Last 7 days, **Last 30 days** (default), Last 90 days, Last year. | | Total Sent | All emails sent in the period, with a daily average underneath. | | This Week | Current week against the previous week, as a percentage. | | Open Rate | Percentage opened, with the raw _x of y opened_ count. | | Click Rate | Percentage clicked, with the raw _x of y clicked_ count. | | Bounce Rate | Percentage that failed to deliver, plus the bounced count. The number to watch. | | Unique Recipients | Distinct contacts mailed, shown against your total contact count. | | Unsubscribed | Opt-outs in the period plus an all-time figure. | | Charts | Daily Email Volume, Emails by Source, Sending Activity by Hour. | | Lists | Top Recipients, Top Senders (Team), and Recent Emails with a **View All Emails** link. | | Drill-down columns | Subject, To, Source, Sent By, Status, Date. Status badges are Delivered, Opened, and Bounced. | **Gotchas.** Email Reports has no export — to download rows, use the **Export CSV** button in [Reports](https://docs.vinsi.ai/crm/admin/data-automation#crm-da-reports) instead. A rising bounce rate paired with a growing unsubscribe count is the earliest signal that your domain is heading for trouble; clean the list from [Unsubscribe Management](https://docs.vinsi.ai/crm/admin/data-automation#crm-da-unsubscribe) before you send again. ### Import Contacts _Bulk import leads from a CSV file and assign them to team members._ The wizard runs in six stages: **Upload → Map Columns → Enrich → Assign → Importing → Done**. 1. Open **Data & Automation → Import Contacts** and click **Choose CSV File**, or click **Download sample template** first to get a correctly-headed file. The file must have a header row and at least one data row, otherwise you'll see _CSV must have at least a header row and one data row_. 2. On **Map Columns**, check the automatic mapping. Each CRM field has a dropdown over your CSV headers; set anything you don't want to bring across to **— Skip this field —**. Use **Preview (first 3 rows)** to confirm the columns line up, and **Start Over** if the file was wrong. 3. Tick **Skip Enrichment** if you want your CSV used exactly as written (_no lookups, no fallback fill_). Then click **Next: Enrich** — or **Next: Assign** if you skipped enrichment. 4. On **Enrich**, VINSI looks your company names up on Google (_Looking up companies on Google..._) and reports _Found N of M companies on Google. Toggle which ones to enrich._ Turn off any match you don't trust, then click **Next: Assign**. 5. On **Assign & Defaults**, set the owner, the default lead status and source, and the **Duplicate check**. Read the warning box — its text changes with the duplicate rule you pick. Confirm the count in the **Ready to import** tile. 6. Click **Start Import** and leave the panel open. Progress shows as _N of M processed_. 7. On **Import Complete**, review **Contacts Imported**, **Companies Created**, **Skipped** and **Errors**. Click the imported count to list the new contacts. Finish with **Import Another File** or **Back to CRM Admin**. | Field or option | Details | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | CSV columns | First Name, Last Name, Title, Email, Phone, Phone Ext, Phone 2, Phone 2 Ext, Phone 3, Phone 3 Ext, Company, Source, Lead Status, Notes, Street, City, State, Zip, Review Rating, Review Count, Website, Industry. Only **Email** is expected; every column is mapped by hand in step 2. | | File type | .csv only. | | Skip Enrichment | Off by default. When on, the Enrich stage is skipped entirely. | | Assign to Team Member | Defaults to **— Unassigned —**. Applies to every row in the batch. | | Default Lead Status | Your configured lead statuses. Used only where the CSV row has no status of its own. | | Default Source | Your configured sources. Used only where the CSV row has no source of its own. | | Duplicate check | **By Email (default)** · By Name (first + last) · By Company name · By Phone · Skip duplicate check. Matching rows are skipped, not merged. | | Imported record type | Every imported contact is created as a **lead**. | Do not map a combined "Full Name" column to First Name. If your CSV has a single column containing both first and last name together, do **not** map it to the First Name field — the whole name will be stored as the first name. You have two options: - Use the **VINSI CSV Formatter Tool** to split the column into First Name and Last Name before importing. - Contact **VINSI Sales** for help preparing the file. **Gotchas.** The file is parsed in your browser, so keep batches to a few thousand rows and split anything larger — very big files make the tab slow. Save your export as plain comma-separated CSV: values containing line breaks, escaped quotes, or semicolon separators will not parse correctly. Rows with no email are still imported, using a placeholder address. A row with a company but no person's name becomes a contact named after the company. Check that your **Default Lead Status** and **Default Source** dropdowns are actually showing a selected value before you start — if your organization has renamed those options in [CRM Configuration](https://docs.vinsi.ai/crm/admin/crm-configuration), pick them explicitly. Imported contacts land in [CRM → Contacts](https://docs.vinsi.ai/crm/contacts). ### Bulk Assign _Reassign multiple contacts to a different team member at once._ Use it when someone leaves, when you rebalance territories, or to hand a freshly imported batch to a rep. The panel is titled **Bulk Assign Contacts**. 1. Open **Data & Automation → Bulk Assign**. Contacts load automatically — you'll see _Loading N of M contacts…_ while that happens. 2. Narrow the list with the filter bar. Changing any filter clears your current selection, so filter first and select second. 3. Select contacts: click rows, use the header checkbox, or pick a preset from **Select Amount**. 4. At the bottom, open the **— Select team member —** list and choose the new owner. 5. Click **Assign**. The button shows the count, for example **Assign (37)**. 6. Watch the progress bar. When it finishes you'll see a _N contacts reassigned_ confirmation, the selection clears, and the list reloads. | Control | Options and defaults | | ----------------------- | -------------------------------------------------------------------------------------------------------------- | | Search | Placeholder _Name, email, company..._ — matches name, email address, or company. | | Lead Status | **All** (default), plus your configured lead statuses. | | Type | **All** (default), Lead, Customer, Archived. | | Disposition | **All** (default), plus your configured dispositions. | | Assigned To | **All members** (default), Unassigned, or a specific member. | | Select Amount | **None** (default), 10, 50, 100, 200, 400, 1000, **All (count)**, or **Custom** with a number box (minimum 1). | | Rows per page | 50, fixed. | | Maximum contacts loaded | 50,000 per organization. | **Gotchas.** There is no confirmation step — **Assign** applies immediately. Selection and the header checkbox cover the whole filtered set, not just the 50 rows you can see, so always check the _N of M selected_ counter before you click. On organizations with more than 50,000 contacts the list stops loading at that ceiling without warning; filter harder and work in batches. ### Bulk Delete _Select and permanently remove multiple contacts at once._ The panel is titled **Bulk Delete Contacts** and warns in red: **This action cannot be undone.** Use it to clear out a bad import or a stale list — not as a general tidy-up tool. 1. Open **Data & Automation → Bulk Delete**. Contacts load automatically. 2. Filter and select exactly as in [Bulk Assign](https://docs.vinsi.ai/crm/admin/data-automation#crm-da-bulk-assign) — the filter bar, **Select Amount** list, and 50-row pages are identical. 3. Click the red **Delete** button at the bottom; it shows the count, for example **Delete (37)**. 4. A confirmation banner appears in the panel asking **Permanently delete N contacts?**. Click **Yes, delete** to go ahead, or **Cancel** to back out. Nothing needs to be typed — it is two clicks in total. 5. Read the result. It reports what happened in one line, for example _120 contacts deleted · 4 skipped (3 with deals, 1 from client companies)_. If nothing could be deleted you get a warning instead of a success message. | Point | Details | | ---------------------------- | ------------------------------------------------------------------------------ | | Reversible? | No. Deleted contacts are gone, along with their activities, emails, and tags. | | Contacts with a deal | Skipped, and counted as _with deals_ in the result. | | Contacts on a client company | Skipped, and counted as _from client companies_ in the result. | | Confirmation | An in-panel banner with **Yes, delete** and **Cancel**. No typed confirmation. | | Maximum contacts loaded | 50,000 per organization, same as Bulk Assign. | **Gotchas.** If your selection is entirely deals-linked or client-company contacts, the delete completes but removes nothing — the message will show a skip count and no deletions. To remove one of those contacts, detach the deal or change the company type first. As with Bulk Assign, the selection covers the whole filtered set, not the visible page. ### Business Card _Scan a business card image to create a contact and company._ Photograph a card at an event, upload it, and VINSI reads the details for you to check before saving. Unlike the other cards this one opens a window titled **Create from Business Card** rather than a panel. 1. Open **Data & Automation → Business Card**. 2. Under **Upload a photo of the business card** (_We'll read the contact and company details for you to review._), choose an image. A preview appears once it is loaded. 3. Click **Scan Card**. The button changes to **Reading…** while the card is processed. 4. Check the **Contact** and **Company** sections and correct anything that was misread. If VINSI finds matching businesses it offers them under _Found on Google — pick one to fill verified details:_; clicking one overwrites the company fields with the verified data. 5. Click **Create**. On success you'll see **Contact and company created**, or a contact-only confirmation if the company already existed. | Field or limit | Details | | -------------------- | -------------------------------------------------------------------------------------------------- | | Contact fields | First Name (required), Last Name, Job Title, Email, Phone, Ext. | | Company fields | Company Name, Website, Industry, Company Email, Company Phone, Address, City, State, Zip, Country. | | Accepted image types | PNG, JPG, WEBP, HEIC. One file at a time. | | Maximum file size | 10 MB. Large photos are automatically shrunk to 1600 px on the long edge before upload. | | New contact defaults | Lead status **New**, type **lead**, source **Business Card**, owned by you. | | New company defaults | Type **prospect**, owned by you. The new contact becomes its primary contact. | **Gotchas.** Existing companies are matched on exact name first, then on the website domain — if neither matches, a second company record is created, so tidy the company name before saving. A contact whose email address already exists in your CRM is rejected; open the existing contact in [CRM → Contacts](https://docs.vinsi.ai/crm/contacts) and update it instead. Always re-read the scanned phone number and email before clicking Create: a misread digit is much harder to spot later. ### Unsubscribe Management _View unsubscribed contacts and re-subscribe contacts._ This is the suppression list your campaigns and workflow emails check before every send. It holds both people who opted out and addresses that bounced recently, so it is the first place to look when someone says "I never got your email". The list header reads **Suppressed recipients (count)** and explains what qualifies: addresses skipped on send — unsubscribed contacts, and anything that bounced in the last six months, including CSV-only recipients that aren't CRM contacts. **Find someone** 1. Open **Data & Automation → Unsubscribe Management**. Page 1 loads automatically. 2. Type into the box (placeholder _Search name, email, company..._) and press Enter or click **Search**. 3. Page through with **« First**, **‹ Prev**, **Next ›**, and **Last »**. **Put someone back on the list** 1. Find the person and click the green **Re-subscribe** button on their row. 2. The **Re-subscribe Contact** window asks _Re-subscribe \[name\]? They will start receiving emails again._ Confirm with **Re-subscribe**. 3. You'll see **Contact re-subscribed** and the row disappears from the list. This clears both the opt-out and any bounce record. **Suppress an address by hand** 1. Click **Add Unsubscribe** at the bottom of the panel. 2. Type the address into **Contact email address** (placeholder _name@example.com_) and press Enter or click **Add Unsubscribe**. 3. If the address belongs to an existing contact it is flagged. If it is unknown, a stub record is created so campaigns still honour it. Already-suppressed addresses report _This contact is already unsubscribed_. **Clear a bounce without changing the opt-out** 1. Click **Re-enable a bounced email** in the panel header. 2. Enter the address under **Email address** and click **Re-enable**. 3. The result reports how many bounces were cleared, or tells you there was no recent bounce or unsubscribe on record for that address. | Row element | Details | | --------------------- | ----------------------------------------------------------------------------------------- | | Name | The contact's full name, or a dash when it isn't known — common for CSV-only recipients. | | Email · Company | Address and company on the second line. | | Unsubscribed \[date\] | Red badge. The person clicked the unsubscribe link, or an admin added them. | | Bounced \[date\] | Warning badge marked **Hard** (red) or **Soft** (amber), with the bounce reason on hover. | | Rows per page | 25, fixed. Pagination appears once there are more than 25 entries. | | Empty states | _No contacts have unsubscribed._ or _No unsubscribed contacts match "\[search\]"._ | **Gotchas.** Re-subscribing someone who genuinely opted out is a compliance risk — only do it when they have asked you to. Bounce suppression is separate from unsubscribe: an address can be skipped purely because it bounced, which is what **Re-enable a bounced email** is for. The unsubscribe link itself is generated automatically in each outgoing email footer; there is nothing to copy from this panel. ### Website Visitors _Track anonymous visitors on your marketing site — city, ISP, pages viewed. See who's browsing and reach out._ A small script on your site reports each session back to VINSI, so you can spot companies researching you before they ever fill in a form. Anyone who can open Data & Automation can use this card. **Set up tracking** 1. Open **Data & Automation → Website Visitors** and expand **Tracking snippet**. 2. Fill in **Allowed domains** — comma or space separated, for example `vinsi.ai, www.vinsi.ai`. Leave it blank to accept any origin. 3. Click **Save & generate key**. You'll see **Tracking key generated** and a green **Active** chip. 4. Click **Copy snippet** and paste it just before the closing `` tag on every page of your marketing site. 5. Visit your own site once, then come back and click the refresh button — the session should appear. **Work the list** 1. Pick a period and search for a city, ISP, IP address, page URL, referrer, or UTM value. 2. Click **Details** on a row to see the page history and user agent; click **Hide** to collapse it. 3. Click **Edit** to open **Identify this visitor** and record what you know — business name, contact name, city, state, and notes. Click **Save**. Your entry applies to every session from that IP address and always overrides the automatic guess. 4. Click **Add to CRM** to create a company record from the row. Once linked the button becomes a green **In CRM** link that opens the company. 5. Use the trash button to remove a row. It asks **Delete this visitor record?** and cannot be undone. | Control or field | Options and defaults | | ------------------- | ---------------------------------------------------------------------------------------------------------------------- | | Allowed domains | Comma or space separated. Blank accepts any origin. | | Tracking key button | **Save & generate key** the first time, **Save & rotate key** afterwards. | | Date filter | Last 24 hours, Last 7 days, **Last 30 days** (default), Last 90 days, All time. | | Rows per page | **10** (default), 25, 50, 100. | | Visitor name | Your manual entry first, then the Google match, then the ISP or organization, then the raw IP, then _Unknown visitor_. | | Row chips | Page count, **Manual** when you identified it by hand, and the industry when known. | | Details panel | Entry page, referrer, UTM values, page history (last 20 pages with times), and user agent. | | Identify fields | Business name, Contact name, City, State, Notes — all free text. | **Gotchas.** **Save & rotate key** invalidates the old key — the snippet already on your site stops reporting until you paste the new one, so always re-copy the snippet after rotating. Traffic from cloud and datacenter networks is almost always crawlers, so those rows are hidden from the list and reported as _Hiding N bot/cloud rows on this page_; they still count toward the total, which is why a page can look shorter than the count suggests. Identifying a row by hand brings it back into view. This card tracks anonymous sessions only — it is not a form-capture tool. ### Do Not Call Registry _Numbers blocked from all outbound batch and manual dialing. "Do Not Call" dispositions and the AI's mid-call add feed this list automatically._ Anyone who can open Data & Automation can use this card. **Add a number** 1. Open **Data & Automation → Do Not Call Registry**. 2. Under **Add a number**, type the **Phone number** (placeholder _(555) 555-1234_) and optional **Notes**. 3. Click **Add**. You'll see **Added to DNC list**, or **Already on the DNC list** if it was already blocked. Fewer than ten digits gives **Enter at least 10 digits**. **Import a list** 1. Expand **Bulk import from CSV**. 2. Paste one phone number per line, or CSV rows whose first column is the phone number — extra columns are ignored. 3. Click **Import**. The result is reported as a summary, for example _240 added · 12 already listed · 3 invalid_. **Unblock a number** 1. Find it with the search box (_Search by number or notes…_). 2. Click the red trash button (_Remove from DNC list_). 3. Confirm the prompt: _Remove \[number\] from the DNC list? This number will be dialable again on future batches._ There is no undo. | Field, column or limit | Details | | ---------------------- | --------------------------------------------------------------------------------------------------------- | | Phone number | Required. Minimum 10 digits. Formatting is ignored — spaces, dashes, brackets and a leading +1 all match. | | Notes | Optional, up to 500 characters. | | CSV import | Paste-only — there is no file picker. Duplicates and numbers under 10 digits are skipped. | | Phone column | Shown as _+1 (555) 555-1234_ or _(555) 555-1234_. | | Source column | **Manual** (added here), **CSV Import**, **Disposition**, **AI Agent**, or **API**. | | Notes column | Your note, the originating call reference, or a dash. | | Added column | Local date and time. | | Rows per page | 25, **50** (default), 100, 250. | Numbers arrive on this list from four places: - **Manual** — added in this panel. - **CSV Import** — pasted into the bulk import box. - **Disposition** — saving a call with a disposition of _do not call_, _dnc_, _remove me_, or _do not contact_ adds the number automatically. - **AI Agent** — an AI phone agent adds the number mid-call when the person asks not to be contacted again. Outbound calls check this list before dialing. In [Batch Calls](https://docs.vinsi.ai/telephony/batchCall), blocked rows are reported with their own **DNC skipped** status rather than as errors, and a DNC badge appears next to the number in the batch contact list. **Gotchas.** Internal extension dialing deliberately bypasses the registry, so a coworker's extension is never blocked. Very large pastes are processed one line at a time and can time out — split anything over a few thousand numbers. Removing a number takes effect on future batches, not on a batch that is already running. --- # Admin Reports View 20+ built-in CRM reports with charts across contacts, deals, engagements, calls, and more. Created April 1, 2026 ## Overview Admin Reports give you a bird's-eye view of how your CRM is performing across every area — team activity, calls, pipeline health, company data, and more. All reports can be filtered by team member and time range, so you can drill down into exactly the data you need. **To get here: navigate to CRM from the tool selection dropdown, then click _Admin_ in the navigation bar. From the Admin page, find the _Data & Automation_ section and click _Reports_.** ## Team Member Performance Calls, leads assigned, and lead dispositions broken down by team member. #### ![calls-by-member](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-calls-by-member.svg)Calls by Team Member See how many calls each team member has made or received within the selected time period. #### ![leads-by-member](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-leads-by-member.svg)Active Leads Assigned by Team Member Shows how many active leads are currently assigned to each team member. #### ![appts-by-member](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-appts-by-member.svg)Appointments by Team Member Breaks down scheduled and completed appointments by each team member. ## Calls Call activity, dispositions, and duration trends across your team. #### ![calls-by-direction](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-calls-by-direction.svg)Calls by Direction Breaks down call volume between inbound and outbound calls. #### ![call-volume](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-call-volume.svg)Call Volume Over Time Shows how total call volume has changed over the selected time period. #### ![call-duration](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-call-duration.svg)Avg. Call Duration Over Time Tracks how the average length of calls has trended over time. #### ![calls-by-hour](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-calls-by-hour.svg)Calls by Hour of Day Shows which hours of the day have the highest call activity. ## Companies Company composition broken down by industry and type. #### ![companies-by-industry](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-companies-industry.svg)Companies by Industry Shows how your company contacts are distributed across different industries. #### ![companies-by-type](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-companies-type.svg)Companies by Type Breaks down your company contacts by the type assigned to each one. ## Deals Track deal pipeline health, value, and team performance. #### ![deals-by-stage](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-deals-by-stage.svg)Deals by Stage Shows how many deals are sitting in each stage of your pipeline. #### ![deal-value-by-stage](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-deal-value-by-stage.svg)Deal Value by Stage Shows the total value of deals grouped by their current pipeline stage. #### ![deals-by-pipeline](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-deals-by-pipeline.svg)Deals by Pipeline Compares deal counts and values across your different pipelines. #### ![deals-by-owner](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-deals-by-owner.svg)Deals by Owner Breaks down deal counts and values by the team member who owns each deal. #### ![deals-over-time](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-deals-over-time.svg)Deals Created Over Time Tracks how many new deals have been created over the selected time period. #### ![deal-value-over-time](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-deal-value-over-time.svg)Deal Value Over Time Shows how the total value of your deals has changed over time. ## Engagements Engagement volume and revenue breakdown across your pipeline. #### ![engagements-by-stage](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-engagements-by-stage.svg)Engagements by Stage Shows how engagements are distributed across the stages of your pipeline. #### ![revenue-by-stage](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-revenue-by-stage.svg)Revenue by Stage Breaks down revenue totals by engagement stage to show where value is concentrated. #### ![engagements-over-time](https://docs.vinsi.ai/images/crm/symbols/reports/crm-rep-engagements-over-time.svg)Engagements Over Time Tracks how engagement volume has trended over the selected time period. --- # Phone Manage phone numbers and review call history for your team. Created April 1, 2026 Updated: September 18, 2026 ## Overview The Phone section of CRM Admin brings together your team's phone configuration: **Phone Settings**, **Call Logs & Recordings**, **Phone Numbers**, **Call Center**, and **AI Coach Settings**. The same four cards also appear under **Phone → Admin** (`/phone/admin`). ### Phone Settings Members, desk phones, browser softphones, and AI phone agents — all in one place. Phone Settings is organized into these tabs: - **Member Phones** - **Queues** - **Hunt Groups** - **Skills** - **Voicemails** - **Settings** - **Screen** See the [Phone Settings](https://docs.vinsi.ai/crm/softphone) page for a walkthrough of each tab, and [Softphone](https://docs.vinsi.ai/telephony/softphone) for using the browser softphone. ### Call Logs & Recordings View call history, listen to recordings and review transcripts. This is the same table as **AI Phone Agents → Call Logs** — see the [Call Logs](https://docs.vinsi.ai/telephony/callLogs) page for details. ### Phone Numbers Buy, manage, and configure phone numbers for your AI agents and softphone. See the [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers) page for more details. ### Call Center Opens the Call Center workspace: the live wallboard, agent and queue reports, and call-center settings. It opens as a full page rather than a panel — use **Back to CRM Admin** at the top to return. Agents reach their own stats from the **My stats** link in the softphone. See [Call Center](https://docs.vinsi.ai/telephony/callCenter) for details. ### AI Coach Settings Configure coaching profiles and assign them to team members. - **AI Coach (Organization-wide)** — a switch showing **ENABLED** or **DISABLED**. Turning it off hides the AI Coach window in everyone's softphone. - **Add Coach** — enter a **Coach Name** to create a new coach. One coach is marked **DEFAULT**. - **Opening Pitch** and **Coaching Instructions** — set per coach. Leave either blank to use the built-in default, or click **Copy Defaults** to start from the built-in text. - **Team Coach Assignments** — choose a coach for each member. Unassigned members use the default coach. Coaching can also be turned on or off per member. - **Reset to Defaults** and **Save Changes** — saving requires write permission. Deleting a coach moves its assigned members to the default coach. --- # Phone Settings Your team's business phone system — softphones, desk phones, hunt groups, queues, and voicemail — managed from CRM Admin. Created: April 1, 2026 Updated: September 16, 2026 ## Overview Open **CRM → Admin → Phone Settings** (or **Phone → Admin**). Phone numbers are managed separately on the **Phone Numbers** card. Organization admins can make changes; other members see settings read-only. ## Phone Settings Tabs | Tab | What it's for | Guide | | ----------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | **Member Phones** | Numbers, extensions, inbound, hunt, voicemail, ring devices, desk phones | [Softphone](https://docs.vinsi.ai/telephony/softphone), [Desk Phones](https://docs.vinsi.ai/telephony/deskPhones) | | **Queues** | Call queues, live wallboard, codes & supervisors | [Call Queues](https://docs.vinsi.ai/telephony/queues), [Call Center](https://docs.vinsi.ai/telephony/callCenter) | | **Hunt Groups** | Numbers that ring a team | [Hunt Groups](https://docs.vinsi.ai/telephony/huntGroups) | | **Skills** | Skills used for routing | [Skills-Based Routing](https://docs.vinsi.ai/telephony/skillsRouting) | | **Voicemails** | Every voicemail in the organization | [Voicemail](https://docs.vinsi.ai/telephony/voicemail) | | **Settings** | Default number, outbound caller ID, business hours, voicemail emails | [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers), [Business Hours](https://docs.vinsi.ai/telephony/businessHours) | | **Screen** | Spam screening and blocked callers | [Call Screening](https://docs.vinsi.ai/telephony/callScreening) | ## Getting Started 1. [Get phone numbers](https://docs.vinsi.ai/telephony/phoneNumbers#phoneNumbers-buy) for your team and main line. 2. In **Settings**, choose your [Default Phone Number](https://docs.vinsi.ai/telephony/phoneNumbers#phoneNumbers-default) and [business hours](https://docs.vinsi.ai/telephony/businessHours). 3. In **Member Phones**, click **\+ Add Phone** for each member — see [Add a Phone](https://docs.vinsi.ai/telephony/softphone#softphone-add-phone). 4. Turn on [voicemail](https://docs.vinsi.ai/telephony/voicemail#voicemail-member) and record greetings. 5. Optionally set up [hunt groups](https://docs.vinsi.ai/telephony/huntGroups) or [call queues](https://docs.vinsi.ai/telephony/queues) for team numbers. ## All Phone Guides [**Phone Numbers & Caller ID**](https://docs.vinsi.ai/telephony/phoneNumbers) Buy numbers, set the default line, outbound caller ID, and CNAM. [**Softphone**](https://docs.vinsi.ai/telephony/softphone) Add phones for members and make, transfer, and conference calls in the browser. [**Desk Phones**](https://docs.vinsi.ai/telephony/deskPhones) Provision Fanvil phones, shared lines, busy-lamp keys, and feature codes. [**Voicemail**](https://docs.vinsi.ai/telephony/voicemail) Greetings, email notifications with transcripts, and \*97. [**Business Hours**](https://docs.vinsi.ai/telephony/businessHours) Open hours and after-hours routing for the main line, hunt groups, and queues. [**Hunt Groups**](https://docs.vinsi.ai/telephony/huntGroups) Ring a team with ring all, linear, round robin, longest idle, or skills. [**Call Queues**](https://docs.vinsi.ai/telephony/queues) Hold callers in line with agent status, wrap-up, and callbacks. [**Skills-Based Routing**](https://docs.vinsi.ai/telephony/skillsRouting) Rate members by skill so the best person rings first. [**Call Center**](https://docs.vinsi.ai/telephony/callCenter) Supervisor wallboard, listen/whisper/barge, alerts, and reports. [**Call Screening**](https://docs.vinsi.ai/telephony/callScreening) Spam screening and blocked callers. [**Call Logs & Recordings**](https://docs.vinsi.ai/telephony/callLogs) Search calls, recordings, transcripts, and export. [**Fax**](https://docs.vinsi.ai/telephony/fax) Fax numbers, sending PDFs, and fax emails. --- # Overview Connecting with custom telephony providers using SIP Created: April 25, 2025 Updated: September 16, 2026 ## Introduction to VINSI Custom Telephony In this article, we will demonstrate how to integrate VINSI agents with your telephony providers and use your numbers. The process is independent of the agent you are utilizing. Ways to integrate with your provider. - Elastic SIP Trunking - Dial to SIP Endpoint VINSI SIP Endpoint ``` sip:lk.vinsi.ai ``` ## Business Phone System VINSI also runs your team's phones — browser softphones, desk phones, hunt groups, call queues, and voicemail. Start with these guides: | Guide | Covers | | ------------------------------------------------------------------------- | ------------------------------------------------------ | | [Phone Numbers & Caller ID](https://docs.vinsi.ai/telephony/phoneNumbers) | Buying numbers, the main line, caller ID, CNAM | | [Softphone](https://docs.vinsi.ai/telephony/softphone) | Adding phones for members and calling from the browser | | [Desk Phones](https://docs.vinsi.ai/telephony/deskPhones) | Fanvil provisioning, busy-lamp keys, feature codes | | [Voicemail](https://docs.vinsi.ai/telephony/voicemail) | Greetings, email notifications, \*97 | | [Business Hours](https://docs.vinsi.ai/telephony/businessHours) | Open hours and after-hours routing | | [Hunt Groups](https://docs.vinsi.ai/telephony/huntGroups) | Ringing a team from one number | | [Call Queues](https://docs.vinsi.ai/telephony/queues) | Holding callers until an agent is free | | [Skills-Based Routing](https://docs.vinsi.ai/telephony/skillsRouting) | Ringing the best-suited people first | | [Call Center](https://docs.vinsi.ai/telephony/callCenter) | Supervisor wallboard, coaching, alerts, reports | | [Call Screening](https://docs.vinsi.ai/telephony/callScreening) | Spam screening and blocked callers | ## Elastic SIP Trunking (Recommended) We recommend this approach when integrating with providers that support elastic SIP trunking. You’ll need the following: - Set up a SIP trunk. - Configure your number to point to it. - Import that number to VINSI. Elastic SIP Trunking is a cloud-based solution that connects your IP-based communication systems (like VoIP or PBX) to the Public Switched Telephone Network (PSTN). It allows businesses to make and receive phone calls over the internet without needing traditional phone lines. Suitable for organizations needing global coverage, redundancy, and integration with PSTN for inbound and outbound calls. The "elastic" part refers to its ability to scale up or down automatically based on your call traffic needs, offering flexibility and cost efficiency. Providers like Twilio offer this service with features such as global coverage, pay-as-you-go pricing, and enhanced security. Telephony provider guides: [Twilio ](https://www.twilio.com/docs/sip-trunking) [Telnyx ](https://support.telnyx.com/en/articles/8096455-how-to-configure-a-sip-trunk) [Vonage ](https://www.vonage.com/communications-apis/sip-trunking/) ## Dial to SIP Endpoint When to use: - SIP trunking is not supported by your provider - Your telephony setup is complex - You are unable to utilize elastic SIP trunking. - Calls can be routed to a specific SIP endpoint. The key difference between Dial to SIP Endpoint and Elastic SIP Trunking lies in their use cases and functionality: Dial to SIP Endpoint involves directly dialing a specific SIP address or URI (e.g., sip:username@domain.com) to connect calls to a SIP-enabled device or application. It is typically used for point-to-point communication, bypassing traditional phone networks. Ideal for setups where calls need to be routed to specific SIP endpoints without requiring PSTN connectivity. --- # Outbound Calls Step-by-step instructions on how to set up and test an outbound calling agent. Created: June 5, 2025 Updated: September 16, 2026 ## Overview 1. Go to **AI Phone Agents**. 2. Click the **Add New AI Agent** button. 3. From the **Create New Agent** sheet, choose a template (or **Start from blank**). Create New Agent Modal ![/images/create-new-agent-modal.png](https://docs.vinsi.ai/images/create-new-agent-modal.png) 4. Open the **Outbound Agent** tab and configure the **Welcome Message** and **Instructions**. New Outbound Agent Form ![/images/new-agent-form.png](https://docs.vinsi.ai/images/new-agent-form.png) 5. Click **Save**. 6. In the Settings panel, a new **☎️ Telephony** section appears after the first save. Agent Form - Settings ![/images/agent-form-settings.png](https://docs.vinsi.ai/images/agent-form-settings.png) 7. Click **Manage** to open **Assign a Phone Number**. 8. Assign a number, set it as the default caller ID, and optionally set **Max Call Time** (see below). ## Assign a Number & Caller ID On the outbound tab of **Assign a Phone Number**, the list shows numbers that can place outbound calls: numbers with a SIP termination (manual SIP trunks), Telnyx numbers, and bring-your-own numbers. If you don't have one yet, see [Phone Numbers](https://docs.vinsi.ai/telephony/phoneNumbers) or [Elastic SIP Trunking](https://docs.vinsi.ai/ai-phone-agents/elastic-sip-trunking). - **Set as default** — each assigned number has a radio labeled "Use this number as the outbound caller ID". Selecting it shows a toast like "{number} set as the test-call caller ID". - With two or more numbers, the section hints: "Choose which number to use as the outbound caller ID for Call Me tests and batch dials". - A single assigned number is used as the default automatically. With none, the section shows "No assigned numbers". - **Max Call Time (Minutes)** — defaults to `0`, meaning no limit. Inbound and outbound have separate values. ## Test with Call Me On the **Outbound Agent** tab, the header shows a **Call Me** button. It is disabled, with the reason shown, when: - The agent has unsaved changes or was never saved ("Save the agent before calling") - The agent has no instructions - Your wallet has no credits - No outbound-capable number is assigned ("Assign a phone number with an outbound SIP trunk configured") 1. Click **Call Me**. 2. Enter a **Phone Number** in E.164 format (e.g. `+18001234567`). A 2–6 digit PBX extension also works. 3. Optionally click **Add variables** to pass Key/Value pairs (or switch to the JSON view). 4. Click **Call Me**. You'll see "Call started successfully..." and your phone will ring. ## How Outbound Calls Start An outbound agent places calls when triggered by: - [Batch Calls](https://docs.vinsi.ai/telephony/batchCall) - **Call Me** in the agent editor - The **Website Widget** "Call me" channel - The public API (`/api/calls/outbound`) Review completed outbound calls in [Call Logs](https://docs.vinsi.ai/telephony/callLogs). --- # Phone Numbers & Caller ID Buy numbers, assign them to people, AI agents, hunt groups, and queues, and control what callers see when you call out. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Phone numbers are managed in **CRM → Admin → Phone Numbers** (also **Phone → Admin → Phone Numbers**). Each number does one job: | Use | Where to set it | | ------------------------------- | --------------------------------------------------------- | | A member's direct line | Phone Settings → Member Phones | | Your main line (rings the hunt) | Phone Settings → Settings → Default Phone Number | | A hunt group | [Hunt Groups](https://docs.vinsi.ai/telephony/huntGroups) | | A call queue | [Call Queues](https://docs.vinsi.ai/telephony/queues) | | An AI phone agent | Phone Numbers → Agent column | | Fax | Phone → Fax | ## Get a Phone Number Numbers are **$3/month** each, billed as separate subscriptions you can cancel anytime. 1. Click **Get Phone Number**. 2. Enter a 3-digit **Area Code** and click **Search Available Numbers**. 3. Narrow results with **Filter by city or state…**. Badges show capabilities: **V** voice, **S** SMS, **M** MMS, **F** fax. 4. Click a number, then **Subscribe & Buy ($3/mo)** and complete checkout. The number appears in your list after checkout, with call recording turned on. ## Managing Numbers The list shows **Phone Number**, **Trunk**, **Agent**, and **Date Added**. Search by number, agent, or name. The trunk badge tells you what the number is for: | Badge | Meaning | | ------------------- | ---------------------------------------------------------------- | | VINSI.AI PHONE | Used by people — members, hunt groups, queues, or the main line. | | VINSI.AI AGENT | Answered by an AI phone agent. | | VINSI.AI FAX | Your organization's fax line. | | Your trunk name (★) | A number you brought on your own SIP trunk. | Pick an AI agent in the **Agent** column to have it answer the number. If the number is already a member's line, the main line, a hunt group number, or the fax line, you're warned first — **Assign agent anyway** takes it over. If calls to an agent's number misbehave, use the refresh icon (**Repair routing**) and click **Run Repair**. ### Bring Your Own SIP Trunk Click **Add SIP Trunk** and enter a **Trunk Name**, **Phone Number** (e.g. `+18001234567`), **SIP Termination URI** (e.g. `sip:example.com:5060`), and optional username and password, then click **Configure Trunk**. See [Elastic SIP Trunking](https://docs.vinsi.ai/ai-phone-agents/elastic-sip-trunking). ### Release a Number Click the trash icon and **Release Number**. This removes the number, cancels its $3/month subscription, and can't be undone. Unassign any AI agent first. Batch call campaigns using the number are removed too. ## Assigning Numbers In **Phone Settings → Member Phones**, pick a number in the member's **Phone Numbers** column. Numbers already in use are greyed out with _used by …_. Only the default number (tagged _default_) can be shared by several members. Fax lines don't appear in these pickers. Give each member their own number if they need a direct line. Members on the shared default number only get calls through the hunt. ## Default (Main) Number 1. Go to **Phone Settings → Settings → Default Phone Number**. 2. Choose a number from the **Phone** dropdown. Changes save automatically. Inbound calls to the default number ring every member with **Hunt** turned on in Member Phones. Business hours and after-hours handling for this number are set just below — see [Business Hours](https://docs.vinsi.ai/telephony/businessHours). Click **Unassign** to clear it (members using it are removed from it too). ## Outbound Caller ID By default, members' outbound calls show their own number. To show your main line on every call, tick **Always use this number as the outbound caller ID** under Default Phone Number. Direct numbers still ring members on incoming calls, but callbacks go to the main line. The caller ID **name** is the first of these that is set: 1. The phone's **Display Name** (Edit Phone → Basics) 2. The member's display name 3. Your organization's default caller ID name 4. The member's first and last name 5. Your organization's name ### Caller ID Name (CNAM) Many carriers show a name from the national CNAM database rather than the name your phone sends. To register one, click the tag icon (**Set Caller-ID Name (CNAM)**) next to the number: - **Display Name** — up to 15 letters, numbers, and spaces (e.g. `ACME CORP`). Leave blank to turn CNAM off. - **Enable CNAM Caller ID lookup** — show caller names on incoming calls (US and Canada). Click **Register CNAM**. Carriers pick it up in about 7–14 days. ## Troubleshooting | Problem | What to check | | ------------------------------------------ | ----------------------------------------------------------------------------- | | Number doesn't appear in the member picker | It may be assigned elsewhere, attached to an AI agent, or be the fax line. | | Can't release a number | Unassign its AI agent first. | | Callers see the wrong name | Check the Display Name and register CNAM; carrier updates take up to 2 weeks. | | Calls to an AI agent's number fail | Use **Repair routing** on that number. | | "SIP trunk pending" on the default number | Wait a moment and click **Retry**. | --- # Softphone Make and receive business calls from your browser — dial contacts, transfer, conference, and check voicemail without a desk phone. Created: September 16, 2026 Updated: September 16, 2026 ## Overview The VINSI softphone runs in your web browser using your computer's microphone and speakers (a headset is recommended). Each member's softphone uses their assigned phone number for inbound and outbound calls, and their extension for calling coworkers. It can ring alongside a [desk phone](https://docs.vinsi.ai/telephony/deskPhones) on the same number. - **Administrators** assign numbers, extensions, and devices in Phone Settings. - **Members** use the softphone from the CRM or the Phone menu. ## Admin Setup Go to **CRM → Admin → Phone Settings → Member Phones** (also reachable from **Phone → Admin**). Only organization administrators can make changes; other members see the grid read-only. ### Add a Phone 1. Click **\+ Add Phone** at the bottom of the Member Phones tab (or **\+ Add** in a member's row). 2. Choose the **Member**. 3. Under **Member Phone Settings**, pick a **Phone Number** and enter an **Extension** (2–6 digits, e.g. `101`). Need a number? Get one in **Phone Numbers** first. 4. Optionally choose a desk phone **Model** (or leave _I don't know / auto-detect_). 5. Review **This will provision** — the softphone and desk phone are created together (devices the member already has are skipped) — and click **Add**. A member who already has a phone number gets their softphone set up automatically the first time they open it. If a desk phone was created, save the credentials shown — see [Desk Phones](https://docs.vinsi.ai/telephony/deskPhones). ### Member Phone Settings | Column | What it controls | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Phone Numbers** | The member's number. The org's default number (tagged _default_) can be shared; others belong to one member. Click **Test** to check it routes to a device. | | **Ext** | Extension coworkers dial. Set in Add Phone or Edit Phone. | | **Inbound** | Whether calls to the number ring this member. | | **Hunt** | Include the member in the organization-wide hunt (and set ring priority for the Linear strategy). | | **VM** | Voicemail on/off and the **Set up** / **Edit VM** greeting button — see [Voicemail](https://docs.vinsi.ai/telephony/voicemail). | | **Rings** | **Both**, **Softphone only**, or **Desk phone only**. | | **Phone** | The member's desk phone(s): **Edit Phone**, deprovision, or **\+ Add another phone**. | ## Opening the Softphone - **Floating button** — the round phone button at the bottom-right of CRM pages (Contacts, Companies, Deals, Engagements). It pulses green and opens automatically when a call comes in. - **Phone → Softphone** — a full page with the softphone always open. Keep this tab open to receive calls while you work elsewhere. **Minimize** shrinks it to the header; **Close** hides it but you stay connected and can still receive calls. ### Connection Status | Header shows | Meaning | | ---------------------------------- | ------------------------------------------- | | Your phone number (or _Softphone_) | Connected and ready. | | _Connecting…_ | Starting up. | | _Reconnecting…_ | Connection dropped; retrying automatically. | | _Offline_ / _Connection error_ | Can't connect — see Troubleshooting. | ## Making Calls 1. Type a number in **Enter Number or Name**, or use the keypad. Type two or more letters to search your CRM contacts and pick a suggestion (Enter selects the top one). 2. Click **Call** (or press Enter). **Click-to-call:** clicking a phone number anywhere in the CRM opens the softphone with the number filled in — press **Call** to dial. The **Call back** button in missed-call emails works the same way. The first time you place or answer a call, your browser asks for microphone permission — click **Allow**. ### Calling Coworkers Dial a coworker's **extension** (2–6 digits) and press **Call**. Their phone shows your name and extension. Dialing a coworker's full phone number also connects internally. ## Answering Calls An incoming call shows **Incoming Call** with the caller. If the number matches a CRM contact, their name and company appear and the contact record opens so you have context before you answer; unknown callers open _Add Contact_ with the number filled in. Click **Accept** to answer or **Decline** to reject. ## During a Call | Control | What it does | | --------------------- | ---------------------------------------------- | | **Keypad** | Sends tones (for menus like "press 1"). | | **Mute** / **Unmute** | Turns your microphone off/on. | | **Speaker volume** | Adjusts call volume; remembered for next time. | | **Hold** / **Resume** | Puts the caller on hold. | | **Transfer call** | Sends the call to a teammate or number. | | **Conference call** | Adds another person to the call. | | **End Call** | Hangs up. | Calls are recorded and appear with their recordings in **CRM → Admin → Call Logs & Recordings**. ### Transfer & Conference 1. Click **Transfer call** or **Conference call**. 2. Pick a person on the **Teammate** tab, or enter an extension or number (e.g. `101` or `+12345678900`) on the **Number / Extension** tab. 3. For a transfer choose: - **Blind Transfer** — sends the caller immediately. - **Attended Transfer** — you talk to the recipient first while the caller holds, then click **Complete Transfer**(or **Cancel + Return** to go back to the caller). 4. For a conference click **Call to Add**; once they answer, click **Merge to Conference**. Teammates marked _no inbound_ have inbound calls turned off and may not ring. ## Missed Calls & Voicemail - **Missed calls** (phone icon with ✕ in the header, red badge = new) — your 30 most recent missed calls with a **Call back** button. - **Voicemails** (envelope icon) — search, sort, play, and delete your voicemails; unread messages have a blue dot and transcripts show under each message. Both refresh every minute while the softphone is open. More in [Voicemail](https://docs.vinsi.ai/telephony/voicemail). ## Audio Settings Click the gear (**Audio settings**) to choose your **Microphone** and **Speaker**. Changes save automatically and switch devices even mid-call. If device names are missing, allow microphone access (place a test call) and reopen. Choosing a speaker requires a browser that supports it (Chrome or Edge). ## Call Queue Status If you're an agent in a call queue, a status bar appears under the softphone header with a dropdown for **Available**, **Unavailable** (with a reason), and **Logged out**, plus wrap-up and disposition after queue calls. See [Call Queues → Agent Status](https://docs.vinsi.ai/telephony/queues#queues-agent-status). ## Troubleshooting | Problem | What to do | | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | "Microphone access denied" | Allow the microphone for the dashboard site in your browser's site settings, then reload. | | "No microphone found" | Connect a headset or microphone and reload. | | Stuck on _Offline_ or _Reconnecting…_ | Check your internet connection and any VPN/firewall, then reload the page. | | Calls don't ring my softphone | Ask your admin to check you have a number, **Inbound** is on, and **Rings** isn't _Desk phone only_. Keep a softphone tab open. | | Call button is greyed out | Wait for the softphone to connect, and make sure the box contains a number, not a name. | | Can't hear the caller | Check the speaker volume slider and the speaker chosen in Audio settings. | --- # Desk Phones Set up Fanvil desk phones on VINSI, keep them configured automatically, and use extensions, busy lamps, voicemail, and paging. Created: September 16, 2026 Updated: September 16, 2026 ## Overview A desk phone registers to the VINSI phone server (`pbx.vinsi.ai`) with its own credentials and shares its member's phone number and extension — so it can ring together with their [softphone](https://docs.vinsi.ai/telephony/softphone). Desk phones are added and managed by administrators in **CRM → Admin → Phone Settings → Member Phones**. ### Supported Phones **Fanvil** IP phones, including the V62, V62G, V63, V63G, V64, V65, V66, V67, V67G, V68, X3 series (X3, X3G, X3S, X3SP, X3U, X3UPro), X6U, X7A, X7C, X7C-V2, X210, and X210i. Other SIP phones may work with manual setup but aren't auto-configured. ## Add a Desk Phone 1. Go to **Phone Settings → Member Phones** and click **\+ Add Phone** at the bottom (or **\+ Add** in the member's row). 2. Select the **Member**. 3. Pick the **Phone Number** (required for a desk phone) and enter an **Extension**. 4. Choose the **Model**, or _I don't know / auto-detect_ — the model and MAC address are detected when the phone first checks in. 5. Click **Add**. To give a member a second desk phone, expand their row and click **\+ Add another phone**. ### Save the Credentials The **Desk Phone Provisioned** window shows the SIP address, user ID, **password**, and server. The password is shown **only once** — use **Copy All** or **Download Phone Config** before clicking **I saved the credentials**. | Setting | Value | | -------------------- | ------------ | | Server / Registrar | pbx.vinsi.ai | | Port | 5060 | | Transport | UDP | | Registration expires | 180 | ## Connect the Phone Plug the phone into your network, find its IP address (on the phone's status screen), and open that address in a browser to reach the phone's web admin page. ### Auto-Provisioning (Recommended) Set this up once and the phone keeps itself up to date with everything you change in VINSI: 1. In the phone's web admin, open the static provisioning settings. 2. Enter the **Server Address** and **Configuration File Name** shown in the Provisioned window (also under Edit Phone → **Status**). 3. Set **Protocol** to HTTPS, **Update Mode** to _Update at time interval_, and the interval to 1 hour. 4. Click **Apply**, then **Auto Provision Now**. The phone registers, loads its busy-lamp keys, company directory (_VINSI Directory_), voicemail key, and time settings, and checks for changes every hour. Use **Push Now** in Edit Phone to apply changes immediately. ### Import a Config File Alternatively, click **Download Phone Config** (or **Download Config** in Edit Phone) and import the `.txt` file on the phone under **System → Configurations → Import Configurations**. Imported files don't update automatically — re-import after changes, or set up auto-provisioning. Custom wallpaper and boot logo are uploaded once on the phone itself (Phone Settings → Background and Boot Logo). ## Edit Phone Click **Edit Phone** in the member's row. Tabs: | Tab | Settings | | ----------------- | ------------------------------------------------------------------------------------------------------------------------ | | **Basics** | Label, extension, display name (caller ID name), phone number, **Forward all calls to**, ringtone, SIP transport, notes. | | **Numbers** | Shared line and additional lines. | | **Function Keys** | Order and visibility of coworker busy-lamp keys, key label size. | | **Voicemail** | Send unanswered calls to voicemail, ring seconds before voicemail, email CC recipients. | | **Date & Time** | Time zone and daylight saving. | | **Status** | Last check-in, IP and MAC, provisioning details, firmware upgrade, web admin password. | | **Advanced SIP** | Keepalive and registration options — leave the defaults unless support asks you to change them. | ### Shared Lines & Extra Numbers - **Shared line** — turn on _Shared line (ring on multiple phones)_ to use the same line on up to 5 phones (e.g. a front desk with several handsets). - **Add another line** — up to 5 extra lines per phone: another phone number, an internal extension only, or an existing shared line. ### Busy-Lamp Keys Every coworker with an extension appears on the phone's side keys automatically. The light turns on when they're on a call; press the key to call them. In **Function Keys**, use **Move up** / **Move down** to reorder and **Hide from phone** to remove someone, then **Save function keys**. ### Status, Push & Reboot - **Push Now** — tells the phone to fetch its configuration right away. - **Reboot Now** — restarts the phone (active calls drop). - **Upgrade Now** — appears on the Status tab when newer firmware is available. - **Rotate Password** — changes the phone's web admin password; do this if it still uses the factory default. To remove a phone, click the trash icon (_Deprovision desk phone_) in the member's row. ## Using a Desk Phone - **Outside calls** — dial the 10-digit number, 1 + number, or +country code number. - **Coworkers** — dial their extension, press their busy-lamp key, or pick them from _VINSI Directory_. - **Voicemail** — the message light turns on when you have new voicemail; press the **Message** key to listen. - Calls are recorded and appear in **Call Logs & Recordings**. ### Feature Codes | Dial | What it does | | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | \*97 | Play your voicemail (same as the Message key) — press 7 to delete a message. See [Play & Delete Voicemail](https://docs.vinsi.ai/telephony/deskPhones#deskPhones-voicemail). | | \*724 | Page — make an announcement through every desk phone's speaker (administrators only). | | \*45 | Call queues: log in / log out. | | \*46 | Call queues: Unavailable / Available. | | \*47 | Call queues: done with wrap-up. | ### Play & Delete Voicemail When the message light is on, you have new voicemail. To listen from your desk phone: 1. Dial `*97` (or press the **Message** key). 2. You hear how many messages you have, then the newest message plays with the date and time it was left. 3. Press a key at any time while listening: | Press | To | | ------- | ------------------------ | | 1 | Skip to the next message | | 3 | Call the person back | | 7 | **Delete** the message | | 9 | Replay the message | | \* or # | Exit voicemail | - If you don't press anything, the next message plays after a few seconds. - Your newest 20 messages are available by phone. More options, like greetings and email notifications, are in [Voicemail](https://docs.vinsi.ai/telephony/voicemail). ### Outbound Caller ID Outside callers see the phone's assigned number — or your organization's default number if an admin turned on _Always use this number as the outbound caller ID_ (Phone Settings → Settings). The name comes from the phone's **Display Name**, falling back to your organization's default caller ID name, then the member's name. ## Troubleshooting | Problem | What to check | | ------------------------------------ | --------------------------------------------------------------------------------------------------------- | | Phone won't register | Re-check the server, user ID, and password; make sure your network allows outbound SIP (UDP 5060). | | Changes don't show on the phone | Click **Push Now**, or confirm auto-provisioning is set up (Edit Phone → Status shows the last check-in). | | Lost the SIP password | It can't be shown again — deprovision and add the phone again, then re-provision it. | | Phone doesn't ring on inbound calls | Check the member's **Inbound** is on and **Rings** isn't _Softphone only_. | | Too many coworkers for the side keys | Hide or reorder keys in **Function Keys**. | | Wrong time on the phone | Set the time zone in **Date & Time**, then re-import the config file (US time zones need a re-import). | --- # Voicemail Record greetings with AI voices, get voicemails by email with transcripts, and listen from the softphone, the dashboard, or your desk phone. Created: September 16, 2026 Updated: September 16, 2026 ## Overview When a call isn't answered within the ring timeout, the caller hears a greeting and can leave a message. VINSI saves the recording, transcribes it, emails it (with the audio attached), lights the message light on desk phones, and shows it in the softphone and dashboard. Voicemail is available for phone numbers on VINSI's Telnyx network. Each member has one voicemail box shared by all their devices. ## Set Up Voicemail ### For a Member 1. Go to **CRM → Admin → Phone Settings → Member Phones** (administrators). 2. Make sure the member has a phone number and **Inbound** is on. 3. Turn on the **VM** switch, then click **Set up** (or **Edit VM**). 4. Set **Ring timeout** — seconds to ring before voicemail answers (5–120, default 25). 5. Create the greeting (below) and click **Save voicemail**. Per-phone options — voicemail on/off, ring seconds, and extra email recipients — are also in **Edit Phone → Voicemail** for desk phones. ### Create a Greeting 1. Choose a **Voice** (ElevenLabs voices first, then other providers). 2. Type the **Greeting script** (up to 800 characters), or click **AI Generate** to draft one. Use **AI Polish** to tidy wording. 3. Click **Preview** to hear it. 4. Click **Save voicemail**. The current saved greeting has its own player so you can check it anytime. Example: "Hi, you've reached Jordan at Acme Plumbing. I'm helping another customer — leave your name, number, and a short message and I'll call you back today." ### Hunt Groups & Main Line - **Hunt groups** — edit the group in **Hunt Groups** and use **Set Up Greeting** in its Voicemail section. Set a **Notification email** and CC recipients. See [Hunt Groups](https://docs.vinsi.ai/telephony/huntGroups). - **Main (default) line after hours** — in **Phone Settings → Settings → Business Hours**, choose **Voicemail** for after-hours calls, then **Set Up Greeting** and fill in **Voicemail notification emails**. - **Call queues** — callers can overflow to voicemail; set the queue's notification email. See [Call Queues](https://docs.vinsi.ai/telephony/queues). ## Email Notifications Each new voicemail sends an email titled **New voicemail from ** with: - Caller, length, and time received (in your organization's time zone). - The **transcript** (if it's still processing, the email says so). - A **Play Voicemail** button — works without signing in and expires after 7 days. - The message as an MP3 attachment (when conversion finishes in time). | Who receives it | | ------------------------------------------------------------------- | | 1\. The member who owns the number that was called | | 2\. Otherwise the hunt group's (or queue's) notification email | | 3\. Otherwise the main line's voicemail notification email | | Plus any CC recipients set on the desk phone, number, or hunt group | Members using the VINSI mobile app also get a push notification. ## Listening to Voicemail ### Softphone Click the envelope icon in the softphone header (a red badge shows unread messages). Search by caller, number, or transcript; sort by **From**, **When**, or **Length**; click **Play** (marks it read) or the trash icon to delete. ### Voicemail Page **Phone → Voicemail** lists voicemails addressed to you under **Inbox** and **Archived**, with the transcript and a player for each. Use **Download** (MP3), **Archive** / **Restore**, or **Delete** (permanent). ### Desk Phone (\*97) Press the **Message** key or dial `*97`. You hear how many messages you have; each plays with the date and time it was received. Press a key at any time: | Key | Action | | ------- | -------------------- | | 1 | Next message | | 3 | Call the sender back | | 7 | Delete the message | | 9 | Replay the message | | \* or # | Exit | If you don't press anything, the next message plays after a few seconds. The newest 20 messages are available by phone. ## Admin Voicemails Tab Administrators can see every voicemail in the organization — members, hunt groups, queues, and after-hours — in **Phone Settings → Voicemails**. Filter by recipient, switch between Inbox and Archived, page through results (25, 50, or 100 per page), and play, download, archive, restore, or delete on anyone's behalf. ## Missed Calls When a call rings out and no voicemail is left, the member gets a **Missed call from ** email with a **Call Back** button that opens the softphone. Every missed call also appears in the softphone's **Missed calls** list and the call logs. ## Troubleshooting | Problem | What to check | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | The VM switch is greyed out | The member needs a phone number with **Inbound** on, and the number must be on VINSI's Telnyx network. | | Calls go to voicemail too fast (or too slow) | Change the **Ring timeout** in the greeting window or Edit Phone → Voicemail. | | No voicemail email | Check spam, the member's email address, and the hunt group / main-line notification emails. | | Email has no transcript | Transcription may still be running; open the voicemail in the dashboard later. | | "Play Voicemail" link doesn't work | Links expire after 7 days — listen in the dashboard instead. | | Message light stays on | Play or delete the voicemail in the dashboard; the light updates when messages are read or deleted. | --- # Text Messages Send and receive texts and picture messages from your VINSI phone numbers — one personal inbox, or a shared inbox for your whole team. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Open **Phone → Text Messages**. The page has two panels: **Conversations** on the left and the message thread on the right. You see the conversations for every number you've been given access to, merged into one list. - **Personal inbox** — a number granted to one person. Only they see its texts. - **Shared team inbox** — a number granted to several people. Everyone on it sees the same conversations and can reply from it. ## Who Can Use Text Messages | Requirement | Details | | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | A paid support plan | The Phone product is included with any purchased support plan. Without one, the page shows **Phone requires a plan** with a **View plans** button. See [Billing](https://docs.vinsi.ai/account/billing). | | Menu permission | Organization admins always see **Text Messages** in the Phone menu. Members need the **Phone** and **Text Messages** permissions — see [Roles & Permissions](https://docs.vinsi.ai/organization/manageOrganization#manageOrganization-roles). | | A granted number | An admin must give you access to at least one SMS-capable number before you can send or receive. | ## Grant Numbers (Admins) Organization admins decide who can read and send from each number. 1. On the Text Messages page, click the gear icon (**Change phone number**) next to **New Message**. 2. In the **Phone Number** window, find **Team number access**. 3. Choose a number in **Number…** and a person in **Member…**, then click **Grant**. 4. Repeat with other members to turn the number into a shared team inbox. Grants are listed by number, with **shared (N)** shown when more than one person has access. Click the × next to a name to revoke access — that person immediately stops seeing the number's conversations and email alerts. Only SMS-capable numbers owned by your organization appear in the list. To add one, [get a phone number](https://docs.vinsi.ai/telephony/phoneNumbers#phoneNumbers-buy). The **Team number access** section is hidden for members who aren't admins. ### Your Phone Number The same window has a **Your VINSI phone number** list for your own number. Pick it and click **Save** (you'll see **Phone number saved**). Members can only choose a number they've been granted, and a number can't be saved by two people. ## The Inbox Each conversation in the list shows: - The other person's phone number and the time of the last message (today's time, **Yesterday**, or the date). - A preview of the last message — prefixed with **You:** if you sent it. - An unread count badge when there are new incoming texts. - A small tag with the number the conversation is on (its friendly name, if it has one) — shown only when you have access to more than one number. If the same person texts two of your numbers, you get two separate conversations. Click a conversation to open it; replies always go out from the number that conversation is on. ## Start a Conversation 1. Click **New Message**. 2. In **To:**, enter the phone number, e.g. `+1 805 555 1234`. A 10-digit US number gets `+1` added automatically. 3. If you have access to more than one number, choose the sending number in **From**. Otherwise your number is used automatically. 4. Type in **Type a message...** and press **Enter** or click the send button. Press **Shift + Enter** for a new line. To reply to an existing conversation, open it and type in the box at the bottom. ### Photos, Video & Audio Click the paperclip (**Attach photo or video**) to add files. They upload right away and show as thumbnails above the message box — click × on a thumbnail to remove it. You can send attachments with or without text. | Rule | Details | | ------ | ----------------------------------------------------------------------------------------------------------------------------------- | | Images | JPEG, PNG, GIF, WebP | | Video | MP4, 3GP | | Audio | MP3, AMR | | Size | 5 MB per file. Larger images are automatically resized and compressed; video and audio are not, so they must already be under 5 MB. | | Count | Up to 10 attachments per message. | Send stays disabled until every upload finishes. Incoming pictures appear in the thread (click one to open it full size), videos play inline, and other files show as an **Attachment** link with their size. ### Delivery Status | Shown on your message | Meaning | | --------------------- | ---------------------------------- | | ✓ | Sent to the carrier. | | ✓✓ | The carrier reported it delivered. | | **Failed** | The message couldn't be delivered. | While a conversation is open, the page checks for new messages and status changes every 5 seconds. ## Unread Messages & Email Alerts Opening a conversation marks its incoming texts as read. On a shared inbox, read status is shared — once anyone opens the conversation, it's read for everyone on that number. If an incoming text stays unread for 5 minutes, VINSI emails everyone who has access to that number. The email comes from **VINSI.AI Text Messages** with the subject **New text from (805) 555-1234** (or **N new texts from…**), previews up to 5 messages, and has an **Open Text Messages** button. Alerts go out within about 10 minutes of the text arriving. Several texts from the same sender are bundled into one email, and each text is alerted only once. ## Writing Messages That Get Delivered The **Phone Number** window includes the guidance **Write messages that look real — even after 10DLC**. Even with a registered number, carriers such as T-Mobile filter texts by content. A message can show ✓✓ delivered and still be silently dropped before it reaches the phone. | Reaches the phone | Gets filtered | | ----------------------------------------------------------------------------------- | -------------------------------- | | Hi from Acme Co. Your invoice is ready at acme.com/inv/123\. Reply STOP to opt out. | test · hi · bit.ly/x · URGENT!!! | Checklist for a deliverable text: - Say who you are ("Hi from Acme"). - State a clear purpose ("your invoice is ready"). - Use full website addresses — no link shorteners like bit.ly. - Include opt-out language ("Reply STOP") at least monthly. ## SMS History on a Contact In **CRM → Contacts**, open a contact and choose the **SMS** tab to see texts between your organization's numbers and any of the contact's phone numbers, newest first. Each entry shows the message, **From** or **To**, the date and time, and the delivery status of sent texts. The tab is read-only — reply from **Phone → Text Messages**. ## SMS Templates & Workflows Reusable texts live in **CRM Admin → SMS Templates** (see [CRM Configuration](https://docs.vinsi.ai/crm/admin/crm-configuration#crm-cfg-sms-templates)). They're used by the **Send SMS** workflow action — they aren't offered in the Text Messages page. 1. Click **New SMS Template**. 2. Enter a **Template Name** (e.g. Appointment Reminder) and choose an **Icon**. 3. Write the **Message**. Use `{{name}}` for the contact's first name, plus `{{email}}`, `{{phone}}`, and `{{company}}`. A counter shows characters and segments (160 characters per segment). 4. Click **Create**. Use the arrows to reorder templates, the pencil to edit, and the trash icon to delete. Workflows that used a deleted template fall back to their own message text. In a [workflow](https://docs.vinsi.ai/crm/admin/data-automation#crm-da-workflows), the **Send SMS** action has these settings: | Setting | Details | | ----------------- | --------------------------------------------------------------------------------------------------------------------------- | | SMS Template | Pick a template or **Custom (no template)**. Appears only when templates exist. Edits to the template apply to future runs. | | From Phone Number | The organization number the text is sent from. | | To | **Phone (Primary)**, **Phone 2**, or **Phone 3** from the contact. | | Message | The text to send when no template is chosen. Supports the same placeholders. | ## Limits | Limit | Details | | ------------------------- | --------------------------------------------- | | Messages per conversation | A conversation shows up to 100 messages. | | Search | Conversations and messages can't be searched. | | Delete | Messages and conversations can't be deleted. | | Attachments | 10 per message, 5 MB each. | ## Troubleshooting | Problem | What to do | | ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | | "No sending number available. Ask an admin to grant you a number." | An admin needs to grant you a number under **Team number access**. | | "You can only use a number you've been granted." | Choose one of your granted numbers, or ask an admin for access. | | "That phone number is already assigned to …" | Another member already saved that number as theirs. Choose a different one. | | "SMS requires a Telnyx number." | That number can't text. Grant an SMS-capable number bought in VINSI. | | "Unsupported file type…" | Convert to JPEG, PNG, GIF, WebP, MP4, 3GP, MP3, or AMR. | | "File too large after compression…" | Trim or re-encode video and audio to under 5 MB. | | "Maximum 10 attachments per message." | Split the files across two messages. | | Shows ✓✓ but the recipient never got it | The carrier likely filtered the content. Rewrite it following the checklist above. | | **Failed** on a message | Check the number is a mobile number that can receive texts, then try again. | | No **Team number access** section | Only organization admins can grant numbers — ask an admin. | | No unread email alerts | Make sure you have access to the number, and check your spam folder. Opening the conversation within 5 minutes means no alert is sent. | --- # Call Logs & Recordings Search every call your AI agents and team make or take, listen to recordings, read transcripts and summaries, and export. Created: September 16, 2026 Updated: September 16, 2026 ## Overview The call log includes AI phone agent calls (inbound, outbound, batch, and web), plus softphone and desk phone calls — shown with the member's name followed by _(Softphone)_. ## Where to Find Call Logs - **AI Phone Agents → Call Logs** - **CRM → Admin → Phone → Call Logs & Recordings** - **Phone → Admin → Call Logs & Recordings** All three show the same list, based on your permissions. ## Search & Filter - **Search Call Logs** — matches phone numbers, call ID (e.g. `C-1234`), disposition, status, AI agent name, or member name and extension. - **Select Date & Time** — choose **Pick one Date** or **Filter by Range**, with optional start and end times, then **Apply**. With no date picked, all calls are shown. - **Ask AI** — type requests like "Calls longer than 5 minutes" or "Group by agent" to filter, sort, or group the grid. - Click a column header to sort, or drag a column to group by it. **Reset** clears everything. ## Columns | Column | Shows | | ------------------------------- | --------------------------------------------------------------- | | **Call ID** | Call number, e.g. C-1234. | | **Agent** | AI agent or member, with an icon for web, inbound, or outbound. | | **From Number** / **To Number** | Phone numbers (WEB for website calls). | | **Disposition** | The call outcome. | | **Date** / **Duration** | When and how long. | | **Recording** | Play, download, and delete. | | **Overview** | Summary and Transcript buttons, and live or error status. | ## Transcripts, Summaries & Recordings - **Transcript** — the full conversation (caller in green, agent in blue). Adjust text size or **Export** as a text file. - **Summary** — an AI summary, call information, and any **Data Collected** by the agent. Also exportable. - **Recording** — ▶ plays in a player with a waveform or live visualizer; ⬇ downloads either the **complete recording** (with welcome message) or the **original recording** (conversation only). ### When Recordings Appear Recordings usually appear within a minute or two after the call ends, but can occasionally take up to an hour. Softphone calls may show _processing_ until the recording is ready. ## Listening to Live Calls AI agent calls in progress show a **🎧 In Progress** badge. Click it to listen live; click **Stop Listening & Close** when done. For live coaching of human agents in queues, see [Call Center](https://docs.vinsi.ai/telephony/callCenter#callCenter-monitor). ## Export 1. Filter the list to the calls you want. 2. Click **Export**. 3. Choose **CSV**, **EXCEL**, or **PDF**, and **Filtered records** or **All records**. 4. Optionally tick **Include Transcript**, **Include Summary**, and **Include Data Content**. ## Deleting & Privacy - Organization admins (or members with call log write permission) can delete a recording with the 🗑 button. - Members whose calls should stay private can be hidden from the call log by an admin in Phone Settings → Member Phones; only they see their own calls. --- # Fax Send and receive faxes from your browser — no fax machine needed. Incoming faxes arrive by email as PDFs. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Open **Phone → Fax**. You dedicate one or more of your phone numbers as fax lines; each sends and receives faxes for the whole organization. Each fax sent or received uses **1 minute** from your organization's balance. Any member can send faxes and view history. Only **organization admins** can add or remove fax numbers and choose who is emailed. ## Set Up a Fax Number 1. [Get a phone number](https://docs.vinsi.ai/telephony/phoneNumbers#phoneNumbers-buy) if you don't have a free one. Numbers already used by a member, the main line, a hunt group, or an AI agent can't be used for fax. 2. In the **Fax numbers** card, choose a number and click **Use as fax number**. 3. Confirm. Callers to that number will now hear fax tones, and it stops ringing phones. To add more fax lines, choose another number and click **Add fax number**. ### Fax Email Notifications Under **Email new faxes to**, use **\+ Add member…** to choose who is emailed when a fax arrives on any fax line. Remove a person by clicking × on their name. With no one selected, notifications are off (faxes still appear in History). ### Stop Receiving Faxes Click **Stop receiving faxes** next to a fax line and confirm. The number goes back to normal voice routing and can be assigned to a member, hunt group, or queue again. ## Send a Fax 1. In the **Send a fax** card, pick **From (your fax line)** if you have more than one. 2. Enter the **To (fax number)**, e.g. `+1 805 555 1234`. 3. Choose the **Document** — a PDF up to 20 MB. 4. Click **Send fax**. The fax is queued and its status updates in History. There's no built-in cover page — include one as the first page of your PDF if needed. ## Receiving Faxes Incoming faxes appear in History and are emailed to the selected members as **New fax received from …**. The PDF is attached when it's 10 MB or less, and the email includes a **View fax (PDF)** link that works for 24 hours. ## Fax History **History** lists your organization's latest 100 faxes, sent (↗) and received (↙), with **From**, **To**, **Status**, **Pages**, and **Date**. It refreshes every 30 seconds, or click **Refresh**. Click the download button to open the PDF (the link is valid for an hour). | Status | Meaning | | ----------------------------- | ---------------------------------------- | | queued / processing / sending | Your fax is on its way. | | delivered | The recipient's fax machine accepted it. | | failed | Not delivered — hover the ⓘ to see why. | | received | An incoming fax with its PDF. | ## Troubleshooting | Problem | What to do | | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------- | | "All of your numbers are in use" | Get another number, or free one up from a member, hunt group, or AI agent. | | "Faxes must be PDF documents" | Save or print your document as a PDF first. | | "PDF is too large" | Keep files under 20 MB — scan at a lower resolution or in black and white. | | "Fax isn't available for your account yet" | Contact VINSI support to enable fax. | | No setup controls on the Fax page | Only organization admins can manage fax numbers — ask an admin. | | "Insufficient minutes" | Add minutes to your balance in Billing. | | Fax failed | Check the number is a fax line (not a voice line) and try again; busy fax machines often succeed on retry. | | No fax emails | Check **Email new faxes to** includes you, and your spam folder. | --- # Phone Dashboard & My Call Log Track your team's calls, texts, and faxes with charts and exportable reports, and review your own call history. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Switch to the **Phone** product from the product switcher in the header. Its **Dashboard** shows organization-wide activity for people using VINSI Phone — softphone and desk phone calls, text messages, and faxes. **Call Log** shows only your own calls. The Phone product is included with any purchased support plan. Without one, Phone pages show **Phone requires a plan** with a **View plans** button (see [Billing](https://docs.vinsi.ai/account/billing)). AI phone agent calls aren't included here — find those in [Call Logs](https://docs.vinsi.ai/telephony/callLogs). Voicemails have their own page, see [Voicemail](https://docs.vinsi.ai/telephony/voicemail). ## The Phone Menu Organization admins see every item. Members see the **Phone** product and each item only when their permissions allow it — see [Roles & Permissions](https://docs.vinsi.ai/organization/manageOrganization#manageOrganization-roles). | Menu item | What it does | Permission | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | | **Dashboard** | Charts and reports (this page). | Phone | | **Softphone** | Make and receive calls in the browser. See [Softphone](https://docs.vinsi.ai/telephony/softphone). | Softphone | | **Text Messages** | Send and receive texts. See [Text Messages](https://docs.vinsi.ai/telephony/textMessages). | Text Messages | | **Fax** | Send and receive faxes. See [Fax](https://docs.vinsi.ai/telephony/fax). | Fax | | **Call Log** | Your personal call history. | Call Logs | | **Voicemail** | Your voicemail inbox. See [Voicemail](https://docs.vinsi.ai/telephony/voicemail). | Organization admins | | **Admin** | Shortcut cards to **Phone Settings**, **Call Logs & Recordings**, **Phone Numbers**, and **AI Coach Settings**. See [Phone Settings](https://docs.vinsi.ai/crm/softphone). | Organization admins | ## Phone Dashboard The top of the **Phone Dashboard** has quick links to **Softphone**, **Text Messages**, **Fax**, and **Call Log**. Below are four tabs: **Overview**, **Call Analytics**, **Messaging & Fax**, and **Reports**. Each tab has its own date range in the top-right: **Last 7 days**, **Last 30 days** (default), **Last 90 days**, **Last 180 days**, or **Last 365 days**. Days and hours are grouped in UTC. ### Overview Tab Four totals for the period — **Calls**, **Call Minutes**, **Text Messages**, and **Faxes** — followed by: | Chart | Shows | | --------------------- | ------------------------------------ | | Calls per Day | Inbound and outbound calls each day. | | Call Minutes per Day | Total talk minutes each day. | | Text Messages per Day | Texts sent and received each day. | | Faxes per Day | Faxes sent and received each day. | ### Call Analytics Tab | Chart | Shows | | ------------------- | ---------------------------------------------------------- | | Calls by Member | Call count for the 12 busiest members. | | Minutes by Member | Talk minutes for the same members. | | Busiest Hours (UTC) | Calls by hour of the day. | | Calls by Status | Share of calls by outcome, such as completed or no-answer. | ### Messaging & Fax Tab | Chart | Shows | | --------------------- | ------------------------------------------------------- | | Texts by Member | Sent and received texts for the 12 most active members. | | Text Messages per Day | Texts sent and received each day. | | Fax Pages per Day | Total fax pages each day. | | Faxes by Status | Share of faxes by status, such as delivered or failed. | ## Reports The **Reports** tab lists report cards grouped into **Softphone Calls**, **Text Messages**, and **Fax**. Pick a date range, then click a card to open the report. Click **All Reports** to go back. ### Available Reports | Group | Report | Shows | | --------------- | ------------------------- | ------------------------------------------------------------------------- | | Softphone Calls | All Calls | Every call with member, direction, From, To, minutes, and status. | | Softphone Calls | Inbound Calls | Calls received on member lines and hunt groups. | | Softphone Calls | Outbound Calls | Calls placed from the dialer and desk phones. | | Softphone Calls | Missed / Incomplete Calls | Calls that didn't complete normally. | | Softphone Calls | Longest Calls | Calls ranked by duration. | | Softphone Calls | Calls by Member | Calls, inbound, outbound, total and average minutes per member. | | Softphone Calls | Daily Call Volume | Calls and minutes per day by direction. | | Softphone Calls | Hourly Call Distribution | Calls and minutes by hour (UTC). | | Softphone Calls | Calls by Status | Calls and minutes per outcome. | | Softphone Calls | Top Dialed Numbers | Most-called outbound numbers, with the last call time. | | Softphone Calls | Top Inbound Callers | Numbers that call you the most. | | Softphone Calls | Monthly Usage | Calls, minutes, texts, and faxes per month. | | Text Messages | All Text Messages | Every text sent and received, with a message preview. | | Text Messages | Texts by Member | Messages, sent, and received per member. | | Text Messages | Daily Text Volume | Messages sent and received per day. | | Text Messages | Text Conversations | Messages grouped by the other party's number, with the last message time. | | Text Messages | Unread Messages | Incoming texts nobody has read yet. | | Text Messages | Texts by Status | Counts by delivery status (sent, delivered, failed). | | Fax | All Faxes | Every fax with file name, pages, and status. | | Fax | Failed Faxes | Failed faxes with the error reason. | | Fax | Faxes by Status | Faxes and pages per status. | | Fax | Daily Fax Volume | Faxes sent and received, and pages, per day. | ### Sort, Page & Export - Click a column header to sort. - Choose 10, 25, 50, or 100 rows per page at the bottom of the table. The row count is shown next to the export button. - Click **Export to Excel** to download the report as an `.xlsx` file. Exports include up to 10,000 rows — narrow the date range if a report has more. ## My Call Log Open **Phone → Call Log** to see calls you placed or answered on your softphone or desk phone, newest first, 25 per page. The total appears at the top (for example, **42 total calls**). Use the arrows and page numbers at the bottom to move between pages. | Column | Details | | --------- | ----------------------------------------------------------------------------------------------- | | Direction | ↗ **Outbound** or ↙ **Inbound**. | | Number | The number you called, or the caller's number. | | Duration | Minutes and seconds (m:ss). Missed calls show 0:00. | | Status | **completed** (green), **No Answer** (yellow, includes missed calls), or another outcome (red). | | Date | Date and time in your browser's time zone. | New here? You'll see **No calls yet** until you make or take your first call. For recordings, transcripts, and organization-wide call history, use [Call Logs](https://docs.vinsi.ai/telephony/callLogs). ## FAQ | Question | Answer | | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | | Why don't the dashboard and my Call Log match? | The dashboard counts everyone in your organization; Call Log shows only your calls. | | Why are my AI agent calls missing? | Phone reports cover people's calls only. AI agent calls are in [Call Logs](https://docs.vinsi.ai/telephony/callLogs). | | Why do daily totals look shifted? | Days and hours are grouped in UTC, not your local time. | | I don't see the Phone product or a menu item. | Ask an organization admin to grant the Phone permission and the item's permission. | | "Failed to load dashboard data." | Refresh the page. If it persists, contact VINSI support. | | The Export button is disabled. | The report has no rows for the selected range — pick a longer range. | --- # Business Hours & After-Hours Routing Decide when your phones ring, and where callers go when you're closed — voicemail, an AI phone agent, or another queue. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Hours can be set in three places: - **Main line** — your organization's business hours, used by the default number (and optionally by hunt groups and queues). - **Hunt groups** — main hours, custom hours, or 24/7. - **Call queues** — 24/7, organization hours, or custom hours. All hours use your organization's time zone. Holidays aren't supported yet — change the hours or after-hours handling for closures. ## Set Your Time Zone Go to **CRM → Admin → Team Settings → Time Zone** and choose your organization's time zone. If none is set, Pacific Time (America/Los\_Angeles) is used. The Business Hours section shows this time zone read-only. ## Main Line Hours 1. Go to **CRM → Admin → Phone Settings → Settings** and set a [Default Phone Number](https://docs.vinsi.ai/telephony/phoneNumbers#phoneNumbers-default). 2. Under **Business Hours**, turn on **Enforce business hours**. 3. Set **Start** and **End** (default 9:00–17:00). An end time earlier than the start runs overnight. 4. Tick the **Days** you're open (default Monday–Friday). 5. Choose **After-hours handling**. Changes save automatically ("Business hours saved"). ### After-Hours Handling | Option | Setup | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **AI Phone Agent** | Pick the **After-hours AI Phone Agent**. After hours, the default number is handed to the agent, then back to your team when you open. If calls keep ringing your team after hours, click **Re-apply after-hours routing**. | | **Voicemail** | Click **Set Up Greeting** to create the after-hours greeting, then set who gets the messages in **Voicemail notification emails** (primary plus up to 10 CC). See [Voicemail](https://docs.vinsi.ai/telephony/voicemail). | ## Hunt Group Hours Open the group in **Phone Settings → Hunt Groups**, choose under **Business Hours**, and click Save: - **Use main business hours** (default) — follows the main line's hours. - **Custom hours for this group** — set Start, End, and Days, then **After hours, route to** **Voicemail** (the group's greeting) or **AI Phone Agent**. - **Always ring (24/7)**. The **AI Phone Agent** option for a hunt group only works when the group's number is your organization's default line. For other numbers, use Voicemail. Set the group's greeting and **Notification email** in its Voicemail box. See [Hunt Groups](https://docs.vinsi.ai/telephony/huntGroups). ## Queue Hours In the queue editor's **Business hours** section, set **Open** to: - **24/7** (default) - **Organization business hours** - **Custom hours** — start, end, and days in your organization's time zone Then choose **After hours, send callers to**: **Voicemail**, **An AI phone agent** (the agent needs a phone number), **Another queue**, or **Hang up**. Closed-queue callers skip the hold line and show as _After hours_ in reports. See [Call Queues](https://docs.vinsi.ai/telephony/queues). ## Comparison | | Main line | Hunt group | Queue | | -------------- | ------------- | ------------------ | -------------------------- | | Hours options | On/off | Main, custom, 24/7 | 24/7, organization, custom | | Voicemail | ✓ | ✓ | ✓ | | AI phone agent | ✓ | Default line only | ✓ | | Another queue | — | — | ✓ | | Hang up | — | — | ✓ | | Saves | Automatically | Save button | Save button | ## Tips - Mention your hours in the after-hours greeting so callers know when to call back. - Place a test call just after closing time to confirm routing. - Check the time zone first — most "wrong hours" problems are a time zone mismatch. --- # Hunt Groups Ring a team of people when one of your phone numbers is called — all at once, one at a time, or by skill. Created: September 16, 2026 Updated: September 16, 2026 ## Overview A hunt group is a named set of team members that rings when a caller dials one of the phone numbers (DIDs) attached to the group. Members answer on their **softphone** in the VINSI dashboard or on their **desk phone**. If nobody answers before the ring timeout, the caller goes to the group's voicemail. Hunt groups are managed in **CRM → Admin → Phone Settings → Hunt Groups**. Only organization administrators can create or change them. ### Hunt Groups vs. Queues | | Hunt Group | Queue | | ------------------- | ----------------------------------------------- | --------------------------------------------------------------------------- | | When nobody answers | Caller goes to voicemail after the ring timeout | Caller waits on hold (music, position announcements) until an agent is free | | Best for | Small teams, front desks, departments | Contact centers, support and sales lines with call volume | | Agent status | — | Available / Unavailable with reason codes, wrap-up, dispositions | | Reporting | Call logs | Live wallboard, service level, agent and queue reports | A phone number can go to **either** a hunt group or a queue, not both. See [Call Queues](https://docs.vinsi.ai/telephony/queues) for the queue setup guide. ## Before You Start - **Members need a phone.** Each member should have a softphone and/or a desk phone set up in **Phone Settings → Member Phones** (use the **\+ Add Phone** button at the bottom). - **You need a phone number.** Buy or port a number in **Phone Numbers**. Numbers already assigned to a single member, a desk phone line, a fax line, or an AI phone agent can't be attached to a hunt group — their own routing takes the call first. - **For skills routing**, create your skills first (see [Skills-Based Routing](https://docs.vinsi.ai/telephony/huntGroups#huntGroups-skills)). ## Create a Hunt Group 1. Go to **CRM → Admin → Phone Settings** and open the **Hunt Groups** tab. 2. Click **\+ New Hunt Group** at the bottom of the panel. The hunt group editor opens. 3. Enter a **Group name** (for example _Front Desk_ or _Warehouse_). 4. Choose the **Strategy** and **Ring timeout** (5–120 seconds). 5. Choose what **Show on member phones** displays while ringing: the _caller's number/name_ (default) or the _hunt group name_ — useful when members belong to several groups and need to know which line is ringing. 6. Check the **members** who should ring. 7. Check the **DIDs that use this group**. 8. Set **Business Hours**, the after-hours destination, and voicemail options. 9. Click **Create Group**. Calls to the attached numbers ring the group right away. ### Ring Strategy | Strategy | How it rings | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Ring All** | Every member rings at the same time. First to answer gets the call. | | **Linear** | One member at a time, always in the same order. | | **Round Robin** | One at a time, rotating who rings first so calls are spread evenly. | | **Longest Idle** | The member who has gone the longest without a call rings first. | | **Skills** | Members with the highest rating for the chosen skill ring first; the next rating tier rings after the ring timeout. Members already on a call are skipped. | ### Members The member list shows each person's extension. Members ring on whichever devices they have — softphone, desk phone, or both (controlled per member in Member Phones). A member who has turned off inbound calls won't ring. ### Phone Numbers (DIDs) Check every number that should ring this group. Several numbers can share one group. A number already in another hunt group shows _(in )_ — checking it moves it here when you save. Your organization's main line is marked and is pre-checked on new groups. ### Business Hours | Option | Behavior | | ------------------------------- | ----------------------------------------------------------------------------------- | | **Use main business hours** | Follows the organization-wide hours set on the Phone Settings → Settings tab. | | **Custom hours for this group** | Pick a start time, end time, and days for this group only (organization time zone). | | **Always ring (24/7)** | Ignores hours entirely. | Outside business hours, calls go to **Voicemail** (using the group's greeting) or an **AI Phone Agent**. After-hours routing to an **AI Phone Agent** currently works only when the hunt group's number is your organization's default (main) line. On other numbers, calls keep ringing the group. ### Voicemail - **Greeting** — open the voicemail greeting editor from the hunt group, type the greeting, pick a voice, preview it, and save. It plays when nobody answers or after hours. - **Notification email** — who is emailed when a voicemail is left. Add extra addresses in the CC list (type an email and press Enter). - Voicemails also appear in **Phone Settings → Voicemails** for administrators. ## Skills-Based Routing Skills let a group ring the best-qualified people first — for example, Spanish speakers for a Spanish line. 1. Open **Phone Settings → Skills** and click **\+ New Skill** at the bottom. Name it (e.g. _Spanish_) and click **Add skill**. 2. Go to **Member Phones**, click a member's **Skills** button, add the skill, and choose a proficiency: | Proficiency | Ring order | | ------------- | ------------------------------------ | | **Primary** | Rings first | | **Secondary** | Rings when no Primary member answers | | **Training** | Rings last | 3. Edit the hunt group, set **Strategy** to **Skills**, and pick the skill under **Rank members by skill**. In the Skills tab, click _N members rated_ under a skill to see who is rated and at what level. Leaving **Rank members by skill** empty rings everyone, so a group is never left without people to ring. ## Edit, Search & Delete - Click any hunt group card to open it, change settings, and click **Save Changes**. - Use the search box at the top right to find a group by name. - Click **Delete Group** in the editor to remove a group. Its numbers go back to the organization's default ring behavior. ## Troubleshooting | Problem | What to check | | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | A number isn't listed under DIDs | It's assigned to a member, a desk phone, a fax line, or an AI agent. Remove that assignment first. | | A member's phone doesn't ring | Check the member has a softphone or desk phone in Member Phones, the softphone is open and connected, and inbound calls aren't turned off for them. | | Skills group rings everyone | No skill is selected, or nobody is rated for it yet. | | Calls go straight to voicemail | The group is outside its business hours, or no members are reachable. | --- # Call Queues Hold callers in line with music and announcements until the right agent is free — with agent status, wrap-up, callbacks, supervisor tools, and reporting. Created: September 16, 2026 Updated: September 18, 2026 ## Overview When someone calls a number attached to a queue, they hear an optional greeting and then hold music. The queue offers the call to available agents using the strategy you choose. If nobody answers within the maximum wait, the caller overflows to voicemail, an AI phone agent, another queue, or is disconnected. Queues are set up in **CRM → Admin → Phone Settings → Queues**. Day-to-day monitoring and reporting live on the **Call Center** page in the CRM menu. Not sure whether you need a queue or a hunt group? See the comparison on the [Hunt Groups](https://docs.vinsi.ai/telephony/huntGroups) page. | Role | What they can do | | ----------------- | --------------------------------------------------------------------------------------------------------------- | | **Agent** | Anyone added to a queue. Sets their own status, picks dispositions, sees their own stats. | | **Supervisor** | Live wallboard and reports for their queues, change agents' status/queues/skills, alerts, listen/whisper/barge. | | **Administrator** | Organization admins: everything above for every queue, plus queue setup, codes, supervisors, and retention. | ## Before You Start - **Every agent needs a phone** — a softphone or desk phone in **Phone Settings → Member Phones**. Agents without one show a tag in the queue's agent list, because the queue can't ring them. - **A phone number** that isn't assigned to a member, desk phone, fax line, or AI phone agent. - **Optional:** skills (Phone Settings → Skills) for skills routing, and reason/disposition codes (see [Codes & Supervisors](https://docs.vinsi.ai/telephony/queues#queues-codes)) — sensible defaults are created automatically. ## Create a Queue 1. Go to **CRM → Admin → Phone Settings** and open the **Queues** tab. 2. Click **\+ New Queue** at the bottom of the panel. The queue editor opens. 3. Enter a **Name** (for example _Support_) and work through the sections below. 4. Click **Create queue**. To change it later, click the queue's card and use **Save changes**. ### Routing | Strategy | Who gets the call | | ---------------- | ------------------------------------------------------------------------------------ | | **Longest idle** | The available agent who has been free the longest (recommended default). | | **Skills** | Best proficiency first for the required skills, then longest idle within that level. | | **Ring all** | Every available agent rings at once. | | **Linear** | One agent at a time in a fixed order. | | **Round robin** | Rotates who gets the next call. | - **Required skills** (Skills strategy) — agents must be rated for _all_ of them; their weakest rating decides their tier. _Primary_ agents are offered calls first, then _Secondary_, then _Training_. The next tier opens after each ring timeout. Rate agents in Member Phones → Skills. - **Ring each attempt** — how long an agent rings before the queue tries again or opens the next tier. - **Queue priority for shared agents** — when an agent is in several queues, the queue with the higher number is served first. ### Agents Set each member to **Primary**, **Backup**, or **—** (not in the queue). Backup agents are only offered calls after the primary agents. Hover a name to see the member's email — useful when two people share a name. Agents on any call — a queue call, a direct call, or an outbound call, on their softphone _or_ desk phone — are not offered another queue call. A softphone open in more than one browser tab rings in all of them. ### DIDs & Caller Priority Under **DIDs that use this queue**, check each phone number that should send callers here. Next to each checked number, pick a caller priority: - **High** — answered ahead of Standard and Low callers already waiting (e.g. a VIP line). - **Standard** — normal first-come, first-served. - **Low** — answered after everyone else. A number on a hunt group or another queue is labeled and moves here when you save. ### After Each Call - **After-call work (seconds)** — time an agent gets to wrap up before the next queue call. `0` turns it off. - **Agents must pick a disposition** — requires an outcome (Resolved, Escalated, …) for each call. Wrap-up lasts at least 60 seconds when this is on. ### While Callers Wait - **Announce their place in line** and **Announce estimated wait**, repeated every N seconds (30–45 is typical). - **Hold music** — upload a WAV or MP3 (up to 20 MB), or leave the music-on-hold class as `default`. - **Greeting** — plays once when the caller joins. - **Repeating announcement** — plays at the announcement interval (e.g. opening hours or your website). For the greeting and announcement you can upload a file, or type the text, choose a **voice**, click **Preview** to hear it, then **Use this text**. Every saved audio item has a player so you can listen to exactly what callers hear. Audio chosen while creating a new queue is uploaded as soon as you click **Create queue**. ### Callback Turn on **Offer a callback** to let callers press **1** to hang up without losing their place in line. VINSI holds their spot; when an agent answers it, the agent's phone rings first and then VINSI calls the customer back from the queue's number. You can customize the offer text (it plays about every 45 seconds) and listen to it once saved. Callers with a blocked or hidden number are told a callback isn't possible and stay on hold. Callback requests and their outcomes appear on the Call Center wallboard. ### Limits & Overflow | Setting | Meaning | | --------------------------------------------------- | ---------------------------------------------------------------------------------- | | **Max wait (seconds)** | Longest a caller holds before overflowing. | | **Max callers in line** | 0 \= unlimited. Extra callers overflow immediately. | | **Overflow to** | Voicemail, an AI phone agent (it needs a phone number), another queue, or hang up. | | **Priority of callers overflowing into this queue** | High (ahead of callers already waiting), Standard, or Low. | | **Voicemail notification email** | Where queue voicemails are emailed. Empty = the number's owner. | Callers also overflow right away when no agent is logged in and reachable. ### Business Hours Choose **24/7**, **Organization business hours**, or **Custom hours** (start, end, and days in your organization's time zone). Outside hours, callers skip the queue and go to the **After hours** destination. ### Service Level & Alerts - **Answer within (seconds)** and **Service level target (%)** — e.g. 80% of callers answered within 30 seconds. - **Alert when a caller waits** N seconds, or **when this many are waiting** (`0` \= off). - **Alert when a caller overflows**. - **Also email alerts to** — extra addresses. The queue's supervisors always get alerts. Supervisors are also alerted when the last hour falls below the service-level target, or an agent stays on a break past its limit. ## Agent Status | Status | Receives queue calls? | | ------------------------ | ------------------------------------------------------------------- | | **Available** | Yes | | **On a call** | No (automatic) | | **Wrapping up** | No — after-call work, ends on its own or when the agent clicks Done | | **Unavailable · reason** | No — Break, Lunch, Meeting, … | | **Logged out** | No | Every status change is timestamped and used for time-in-status, occupancy, and adherence reporting. ### Softphone Members of at least one queue see a **status bar** under the softphone header (open the softphone; it isn't shown while minimized). Use the dropdown to switch between **Available**, **Unavailable** (pick a reason), and **Logged out**. The bar also shows how long you've been in the current status, how many callers are waiting, and a **My stats** link. ### Desk Phone Codes | Dial | Action | | ---- | --------------------------------------------------- | | \*45 | Log in / log out of all your queues | | \*46 | Unavailable (first reason code) / back to Available | | \*47 | Done with wrap-up — back to Available | A short spoken confirmation plays after each code. The codes also work from the softphone keypad. ### Wrap-up & Dispositions After a queue call, the softphone shows the call's queue and caller with an **outcome** dropdown and an optional note. Click **Save & ready** to record it and become available again. Desk phone users can finish wrap-up with `*47`. ## Codes & Supervisors Administrators manage these in **Phone Settings → Queues → Codes & supervisors** (or **Call Center → Settings**): - **Reason codes** — why an agent is Unavailable, each with an optional maximum in minutes. Supervisors are alerted when an agent goes over. Turn codes off instead of deleting them so history keeps its labels. - **Disposition codes** — the call outcomes agents choose during wrap-up. - **Supervisors** — click **Add supervisor**, pick a member, and check the queues they supervise. - **History retention** — how many days of queue history to keep (default 90). ## Call Center Page Open it from **CRM → Admin → Phone → Call Center** (agents can use **My stats** in the softphone). Supervisors and administrators see **Live** and **Reports**; administrators also see **Settings**. Agents see **My stats**. ### Live Wallboard - **Queue tiles** — callers waiting, longest wait, agents free and on calls, today's answered/abandoned and service level (green on target, red below). - **Alerts** — acknowledge each alert once handled. - **Agents** — status and time in status (red when a break runs over). Change an agent's status, log them in or out, or use **Queues & skills** to change their queues (Primary/Backup) and skill levels. - **Callback requests** — status of each callback; mark failed ones as called or dismiss them. ### Listen, Whisper & Barge For an agent on a call, click **Listen**, **Whisper**, or **Barge**. Your own softphone (or desk phone) rings — answer it to join. Keep your softphone open first. | Mode | Who hears you | Keypad while connected | | ----------- | ---------------- | ---------------------- | | **Listen** | Nobody | 4 | | **Whisper** | Only the agent | 5 | | **Barge** | Agent and caller | 6 | Each use is recorded in the change history. ### Reports Pick a date range (Today, 7, 30, 90 days, or custom), optionally a queue, then: - **Queue performance** — offered, answered, abandoned and abandon rate, overflow, callbacks, average speed of answer, handle time, service level, dispositions. - **Agent performance** — calls handled, handle and talk time, time in each status and reason, occupancy, adherence, dispositions. - **Skill coverage** — eligible agents per queue by proficiency vs. calls offered. - **Change history** (administrators) — who changed queues, skills, codes, supervisors, and monitoring. Click **Export CSV** to download the current report. **Adherence** uses each agent's Work Schedule (Tickets → Admin → Work Schedules). Agents without a schedule show _No schedule_. ## Troubleshooting | Problem | What to check | | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | I don't see the status bar in my softphone | You must be in a queue as _your own_ account (hover names in the agent list to confirm the email), and the softphone must not be minimized. | | Agent shows | Add a softphone or desk phone for them in Member Phones. | | Callers overflow immediately | No agent is Available with a connected phone, the queue is full, or it's outside business hours. | | An agent keeps getting skipped | They're Unavailable, wrapping up, already on a call, or (Skills) not rated for every required skill. | | "Use this text" shows an error | The message names the voice provider that failed — try another voice or contact support. | | Listen/Whisper/Barge says none of your phones are online | Open your softphone (or pick up your desk phone) and try again. | --- # Skills-Based Routing Send callers to the people best suited to help — Spanish speakers, billing experts, or senior technicians first. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Skills-based routing has three parts: 1. **Create skills** your team routes by (e.g. Spanish, Billing, Technical Support). 2. **Rate members** for each skill as Primary, Secondary, or Training. 3. **Use the Skills strategy** on a [hunt group](https://docs.vinsi.ai/telephony/huntGroups) or [call queue](https://docs.vinsi.ai/telephony/queues) — the best-rated people ring first. Skills and ratings are organization-wide, so one rating change affects every hunt group and queue that uses that skill. Managing skills requires an organization admin. ## Create Skills 1. Go to **CRM → Admin → Phone Settings → Skills**. 2. Click **\+ New Skill** at the bottom. 3. Enter a **Skill name** (must be unique) and click **Add skill**. To rename a skill, edit its name in the list — it saves when you press Enter or click away. Click **N members rated** to see who has the skill, in ring order. **Delete** removes the skill from every member, hunt group, and queue. Hunt groups ranking by it will ring everyone instead. ## Rate Members 1. Go to **Phone Settings → Member Phones**. A **Skills** column appears once your organization has at least one skill, showing each member's top three skills. 2. Click **Add skills** (or **Skills**) in the member's row. 3. Under **Add skills**, search and click **Add** next to each skill — new skills start at Primary. 4. Set each skill's level, or click **Remove**. 5. Click **Save N changes**. Supervisors can also change an agent's skills from the Call Center wallboard with **Queues & skills** — see [Call Center](https://docs.vinsi.ai/telephony/callCenter#callCenter-assign). ### Proficiency Levels | Level | Rating | Meaning | | ------------- | ------ | ---------------------------------------------------------- | | **Primary** | 10 | Routed to first. | | **Secondary** | 5 | Rings when no Primary is free (or after the ring timeout). | | **Training** | 1 | Lowest priority — the last to ring. | Older in-between ratings show as _Custom rating (N)_ and ring as their own tier between the standard levels. ## Skills in Hunt Groups 1. Open the hunt group in **Phone Settings → Hunt Groups**. 2. Set **Strategy** to **Skills — highest-rated for a skill first**. 3. Pick one skill in **Rank members by skill**. 4. Set the **Ring timeout** (5–120 seconds, default 20) and save. - Members with the same rating ring together; each level rings for the ring timeout before the next level starts. - Members already on a call are skipped. - Group members **without** a rating for the skill don't ring. - If nobody is rated (or no skill is picked), everyone rings at once. ## Skills in Call Queues 1. Open the queue in **Phone Settings → Queues**. 2. Set **Strategy** to **Skills — best proficiency first, then longest idle**. 3. Add one or more **Required skills (agents need all of them)**. You can't save a Skills queue without at least one. 4. Set **Ring each attempt (seconds)** (5–120, default 20) and save. Queue agents missing any required skill don't receive that queue's calls. ### How Tiers Ring An agent's level for a queue is their **weakest** required skill — someone who is Primary in Spanish but Training in Billing counts as Training for a queue that needs both. | Order | Who rings | | ----- | ------------------------------------------------------ | | 1 | Primary agents — Primary level | | 2 | Primary agents — Secondary level | | 3 | Primary agents — Training level | | 4 | Backup agents — Primary, then Secondary, then Training | Within a tier, the agent who has been idle longest gets the call. Each ring timeout opens the next tier while earlier tiers keep ringing as they free up. Backup agents always come after every primary agent, whatever their skill level. ## Checking Coverage In **Call Center → Reports → Skill coverage**, each queue shows its required skills, how many agents are eligible, how many are Primary / Secondary / Training, how many are **Available now** (red when zero), and **Calls per eligible agent**. Use it to spot skills with too few people. ## Tips - Keep skill lists short and specific — languages, product lines, and tiers of support work well. - Rate at least two Primary agents per skill so callers aren't waiting on one person. - Use Training for new hires so they get calls only when experienced agents are busy. - Members need a softphone or desk phone to ring — see [Softphone](https://docs.vinsi.ai/telephony/softphone) and [Desk Phones](https://docs.vinsi.ai/telephony/deskPhones). --- # Call Center Supervise call queues live, coach agents on calls, respond to alerts, and measure service level, occupancy, and adherence. Created: September 16, 2026 Updated: September 18, 2026 ## Overview Open it from **CRM → Admin → Phone → Call Center**. Agents can also get to their own stats from the **My stats** link in the softphone. It works with the queues you build in [Call Queues](https://docs.vinsi.ai/telephony/queues). Tabs: - **Live** — real-time wallboard (admins and supervisors; refreshes every 10 seconds). - **Reports** — queue, agent, and skill reports with CSV export. Agents see **My stats** instead. - **Settings** — reason codes, disposition codes, supervisors, and retention (admins). - **Queue setup →** — jumps to Phone Settings → Queues (admins). The same wallboard and settings are also in **Phone Settings → Queues** under the **Live** and **Codes & supervisors** views. ### Roles | Role | Who | Can do | | ----------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | **Administrator** | Organization admins and owners | Everything, for every queue — including Settings, Change history, and queue setup. | | **Supervisor** | Members assigned to queues in Settings → Supervisors | Live wallboard and reports for their queues; change their agents' status, queues, and skills; listen/whisper/barge; get alerts by email. | | **Agent** | Primary or backup members of a queue | Set their own status (softphone or \*45/\*46/\*47) and view **My stats**. | ## Add Supervisors 1. Go to **Call Center → Settings** (admins). 2. In **Supervisors**, click **Add supervisor**. 3. Pick a member, tick the queues they supervise, and click **Save**. Click **Edit** to change their queues; untick every queue and click **Remove supervisor** to remove them. A supervisor needs their own softphone or desk phone to monitor calls. ## Live Wallboard ### Queue Tiles | Metric | Meaning | | ---------------------------------- | -------------------------------------------------------------------------------- | | **Waiting** | Callers holding now. Amber when any are waiting, red at the queue's alert count. | | **Longest wait** | How long the oldest caller has held. Red at the queue's wait alert. | | **Agents free** | Agents ready for a call. Red at zero. | | **On calls** | Agents talking now. | | **Answered today** / **Abandoned** | Since midnight in your organization's time zone. | | **Service level** | Share answered within the queue's target seconds; green at or above target. | | **Avg answer** | Average time callers held before an agent answered. | ### Agents Table Columns: **Agent**, **Status**, **For**, **Queues**, **Handled today**, **Avg talk**. | Status | Meaning | | --------------------------- | ---------------------------------------------------------------------------------- | | Available | Ready for queue calls. | | Ringing / On a call | A call is ringing or connected. **For** shows the call timer. | | After-call work | Wrapping up; no queue calls until done. | | Unavailable · reason | On break, lunch, etc. **For** turns red when past the reason's limit. | | Logged out | Not taking queue calls. | | Available — no phone online | Marked available, but none of their phones are connected — calls can't reach them. | Action buttons on each row: - **Unavailable** (pick a reason) / **Available** — change the agent's status. - **End wrap-up** — end after-call work early. - **Log in** / **Log out** — add or remove the agent from queue calls. - **Listen** / **Whisper** / **Barge** — while the agent is on a call. - **Queues & skills** — change the agent's queues and skills. ### Queues & Skills In the **Queues & skills** dialog, set each queue to **Not in queue**, **Primary**, or **Backup** (backup agents only get calls after primary agents). Under **Skills**, set Primary / Secondary / Training, **Remove** skills, or search to add one. Click **Save** — changes apply to the phone system right away. Supervisors can only change queues they supervise, but skill changes affect every queue and hunt group. See [Skills-Based Routing](https://docs.vinsi.ai/telephony/skillsRouting). ## Listen, Whisper & Barge 1. On the Live wallboard, find an agent who is _On a call_. 2. Click **Listen**, **Whisper**, or **Barge**. 3. Your softphone and desk phone ring — answer to join the call. | Mode | Who hears you | Switch key | | ----------- | -------------------------- | ---------- | | **Listen** | Nobody — silent monitoring | 4 | | **Whisper** | Only the agent (coaching) | 5 | | **Barge** | Agent and caller | 6 | Press the keys during monitoring to switch modes. You can't monitor your own call. Every use is recorded in Change history. ## Alerts Alerts appear in the **Alerts** card on the wallboard (last 24 hours) until someone clicks **Acknowledge**, and are emailed as **Call center alert: …** to the queue's supervisors plus any addresses in the queue's **Also email alerts to** field. Admins who aren't supervisors see alerts on the wallboard but aren't emailed. | Alert | Triggers when | Set in queue | | ----------------- | --------------------------------------------------------------------------- | --------------------------------------------- | | Long wait | A caller waits past the limit (at most every 10 min per queue) | Alert when a caller waits (seconds) | | Too many waiting | Waiting callers reach the count (at most every 10 min) | Alert when this many are waiting | | Overflow | A caller times out, finds no agents, or finds the queue full | Alert when a caller overflows (on by default) | | Reason over limit | An agent stays Unavailable past the reason code's max minutes | Reason codes (Settings) | | Service level | Last hour had 5+ callers and service level is below target (at most hourly) | Answer within / Service level target | ## Callback Requests When queue callbacks are on, **Callback requests (last 7 days)** lists callers who pressed 1 to be called back. | Status | Meaning | | --------------------------------------------------------------- | ----------------------------------------------------------------- | | Holding their place | Waiting in line without staying on the phone. | | Agent connected — calling | An agent is free and the caller is being dialed. | | Called back | Completed. | | Caller didn't answer / Timed out in queue / No agents available | Needs follow-up — call them yourself, then click **Mark called**. | Click **Dismiss** to clear finished requests from the list. ## Reports Choose **From** / **To** dates or a preset (**Today**, **7 days**, **30 days**, **90 days**; up to 400 days) and a **Queue**. Click **Export CSV** to download the report you're viewing. ### Queue Performance | Metric | How it's calculated | | -------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | Offered | Every caller who reached the queue, including after-hours and overflow. | | Answered / Abandoned | Callers an agent answered / callers who hung up while waiting. | | Abandon rate | Abandoned ÷ finished calls. | | Overflowed | Timed out, no agents, or queue full. | | After hours | Callers who arrived while the queue was closed. | | Callbacks | Completed ÷ requested callbacks. | | Avg speed of answer | Average hold time of answered calls. | | Avg handle time | Average talk + wrap-up per answered call. | | Service level | Answered within the target seconds ÷ finished calls (excluding after-hours). Abandoned and overflowed calls count against it. | | Dispositions | Count of each outcome agents picked. | ### Agent Performance | Metric | How it's calculated | | --------------------------------------------- | -------------------------------------------------------------------------------- | | Handled | Queue calls the agent answered. | | Logged in / Available / Wrap-up / Unavailable | Time in each status, with Unavailable broken down by reason. | | Occupancy | Talk + wrap-up time ÷ time available or wrapping up. | | Adherence | Time available or wrapping up during the agent's Work Schedule ÷ scheduled time. | | No disposition | Answered calls without an outcome picked. | Adherence shows _No schedule_ until the agent is added to a Work Schedule in **Tickets → Admin**. **Skill coverage** shows eligible agents per queue by skill level — see [Skills-Based Routing](https://docs.vinsi.ai/telephony/skillsRouting#skills-coverage). ### Change History Admins see who changed what — queues, skills, agent queues and skills, codes, supervisors, settings, audio, and monitoring — with the most recent 500 entries in the date range. ## Settings ### Reason Codes Reasons agents pick when going Unavailable, each with an optional max minutes (1–1440). Supervisors are alerted when an agent stays longer. Add with **New reason, e.g. Coaching** → **Add**. Codes can't be deleted — use **Turn off** so old reports keep their names. | Default reason | Max | | ---------------- | -------- | | Break | 15 min | | Lunch | 60 min | | Meeting | 60 min | | Training | 120 min | | System Issue | 30 min | | Back-Office Work | No limit | ### Disposition Codes Outcomes agents pick during after-call work. Defaults: Resolved, Escalated, Transferred, Callback Scheduled, Voicemail, Misdirected. Turn on **Agents must pick a disposition** in a queue to require one (wrap-up then lasts at least 60 seconds). ### History Retention Queue call records, agent status history, alerts, and change history older than this many days (7–3650, default 90) are deleted automatically. --- # Call Screening & Blocked Callers Stop spam and scam calls automatically, and block specific numbers from reaching your team. Created: September 16, 2026 Updated: September 18, 2026 ## Overview Both tools are in **CRM → Admin → Phone Settings → Screen**, on two tabs at the top of the panel, and require an organization admin: - **Inbound Call Screening** — checks callers against spam and scam databases, per number. - **Blocked Callers** — your own list of numbers that can't call you. ## Spam Call Screening 1. On the **Inbound Call Screening** tab, find the number (the table shows who it's **Assigned To**). 2. Tick **Screening** to turn it on. 3. Choose the **Action**. It saves immediately. Screening only works on calls from the US and Canada, and only numbers bought through VINSI are listed. ### Reject vs. Flag | Action | What happens to a suspected spam call | | -------------------- | ----------------------------------------------------------------------- | | **Reject** (default) | The caller hears "call cannot be completed" and your phones never ring. | | **Flag only** | The call rings through as usual, marked as possible spam. | Start with **Flag only** on your main line if you're worried about blocking real customers. ## Blocked Callers 1. On the **Blocked Callers** tab, enter the **Phone number to block** (at least 10 digits). 2. Choose the scope: **Org-wide (all numbers)** or one of your numbers. 3. Optionally add a **Reason** so teammates know why. 4. Click **Block**. Blocked callers hear "call cannot be completed". Numbers match on their last 10 digits, so `5551234567` and `+1 (555) 123-4567` are the same entry. ### Org-wide vs. One Number - **Org-wide** — the caller can't reach any of your numbers. - **A specific number** — blocked only when calling that number (e.g. a harasser of your support line who is still a sales prospect). ### Unblock a Caller Click **Unblock** next to the entry and confirm. Their future calls ring through again. ## FAQ | Question | Answer | | ---------------------------------------------- | -------------------------------------------------------------------------------------- | | Can I block callers with no caller ID? | No — calls without a number can't be matched against the list. | | Does blocking affect outbound calls? | No, you can still call a blocked number. | | Can I block the same number twice? | No — you'll see "already blocked" for the same scope. | | Does screening work for international callers? | Spam screening only checks US and Canadian calls; the block list works for any number. | --- # VINSI Meet: Scheduling Meetings Video meetings for your team and customers — schedule, send invites, and join from any browser. Created: September 16, 2026 Updated: September 29, 2026 ## Overview VINSI Meet lives at **meet.vinsi.ai** and in **CRM → Admin → Team Settings → Video Meetings**. Meetings support up to 50 people, screen sharing, chat, backgrounds, recording, AI summaries, and remote control. - This page — scheduling and invites. - [Joining & In-Meeting Controls](https://docs.vinsi.ai/meet/joining) - [Recording & AI Summaries](https://docs.vinsi.ai/meet/recording) - [Remote Control](https://docs.vinsi.ai/meet/remote-control) ### Who Can Create Meetings Creating meetings requires a VINSI Meet subscription ($14.99/month) or an organization support plan. Anyone with a free VINSI account can **join** meetings they're invited to. Without a plan, **/meet** shows **Subscribe — $14.99/mo**. ## The Meet Home Page Sign in at **meet.vinsi.ai**. The page shows: - **New Meeting**, **Join**, and **Schedule** buttons. - Your meetings for the day — use the arrows or **Today**, or click the date to switch to week or month view. Click a meeting card to join it. - Your Google or Outlook events alongside VINSI meetings, once your calendar is connected. - The avatar menu: **Recordings**, **Integrations**, **Billing**, **Notifications**, **Settings**. Click **Allow notifications** to get a desktop reminder about 5 minutes before each meeting. ## Schedule a Meeting 1. Click **New Meeting** (starts at the next hour) or **Schedule** and pick a day. 2. Enter a title in **Add title**. 3. Set the date, start, and end time (shown in your time zone). 4. Type names or emails of people to invite — teammates and CRM contacts are suggested. Press Enter or comma to add each one. Tick **co-host** to let someone mute, admit, and record. 5. Optionally add notes — they're included in the invite email. 6. Click **Save**. If the time overlaps another of your meetings you'll see a heads-up, but you can still save. ### Meeting Settings | Setting | Default | What it does | | --------------------------- | ------- | ---------------------------------------------------------- | | **Auto-record meeting** | Off | Starts recording when the host joins. | | **Participants join muted** | Off | Everyone except the host starts with the mic off. | | **Enable Reactions** | On | Emoji reactions; choose which emojis are allowed. | | **Enable Throw Items** | On | Playful items (confetti, balloons…) thrown at video tiles. | | **Enable Arcade Games** | On | Quick multiplayer games for team meetings. | The host can also change these in the lobby or during the meeting with **Controls**. ## How Invites Are Sent Every invitee gets their own personal join link by email. - **Calendar connected:** the meeting is added to your Google or Outlook calendar with invitees as attendees, so RSVPs come back to you. Moving or renaming the meeting in VINSI updates the calendar event. - **No calendar connected:** VINSI emails _"{Host} invited you to a video meeting"_ with **Join the meeting**, **Add to Google Calendar**, and a `meeting.ics` file for Outlook and Apple Calendar. - Everyone gets a **Starting soon** reminder email about 15 minutes before the start. Invites are sent from your organization's email account — set one up under **Email Settings** first. Links for a scheduled meeting expire 24 hours after it ends. ### Which Organization Invites Come From If you belong to more than one organization, the one shown in the **meet.vinsi.ai** header decides which organization each meeting belongs to — and that controls the calendar account the invite is sent from, the name invitees see, and where the meeting is listed afterwards. To change it: 1. Go to **meet.vinsi.ai**. 2. Click the organization name in the header, next to **Video Meetings**. 3. Pick the organization under **Create meetings in**. The choice is saved to your account, so it stays put until you change it again. It applies to every new meeting you create — from the Meet page, the CRM, and the **VINSI Meet add-on in Google Calendar**. **If you manage several customers, set this before you schedule.** Switching organization elsewhere in the dashboard — to look at a customer's tickets or phone numbers, say — used to change where your next meeting went, so invites could go out from the wrong customer's calendar and branding. The header choice is now what decides it, and browsing another organization no longer changes it. Only organizations you are a member of are listed. Meetings already created keep the organization they were created with — changing this setting doesn't move them. ### Connect Your Calendar Go to avatar menu → **Integrations** and click **Connect** on **Google Calendar** or **Outlook Calendar**. This is the same connection used by the CRM. ## Edit, Copy Link & Delete Open a meeting card's ⋮ menu: - **Edit** — change details, add or remove invitees, and toggle co-hosts. Only new people are emailed. - **Copy meeting link** — copies your join link. - **Summary** / **Recording** — see [Recording & AI Summaries](https://docs.vinsi.ai/meet/recording). - **Delete** — removes the meeting; invite links stop working. This can't be undone. Only the meeting's host can edit or delete it. ## Meetings in the CRM In **CRM → Admin → Team Settings → Video Meetings**, enter a **Meeting Title**, optional date and time, and emails, then click **Create & Send Invites**. Leave the date empty for an _Anytime_ meeting whose link never expires. The table lists meetings with **Join**, **Summary**, **Recording**, **Edit**, and **Delete**. A contact's record has a **Video Meetings** tab listing meetings with that contact, including recordings and summaries. ## Custom Backgrounds Under **Custom Backgrounds** on the Meet home page (or the CRM panel), click **Upload Background** to add a PNG, JPG, or WEBP up to 2 MB. Uploads are available to everyone in your organization. ## Billing Avatar menu → **Billing** shows your subscription, renewal date, and invoices. **Cancel subscription** keeps access until the end of the billing period. --- # Joining & In-Meeting Controls Join from an invite link, admit guests, share your screen, use captions, and run breakout rooms. Created: September 16, 2026 Updated: September 16, 2026 ## Joining a Meeting 1. Click **Join the meeting** in your invite email (or a meeting card on meet.vinsi.ai). 2. Sign in, or click **Create an account & join** — a free VINSI account using the invited email address is required. 3. Check your camera and microphone in the lobby, then click **Join now**. On a phone you may be offered the VINSI Video app — choose **Open in the app** or **Continue in this browser**. Chrome or Edge on a computer gives the full experience. ### The Lobby - Preview your camera; toggle **Mic on** / **Muted** and **Camera on** / **Camera off**. - Choose your microphone and camera, and pick a **Background**. - See who's already in the meeting and who's invited. ### Waiting Room The host, invitees, and people with the same company email domain as the host or an invitee join directly. Anyone else sees **Waiting for host to admit you** and joins automatically once admitted. Hosts see _"{name} wants to join the meeting"_ and a **Waiting room** panel with **Admit** and **Deny**. ## Meeting Controls | Button | What it does | | ---------------------------------- | -------------------------------------------------------------------------- | | **Participants** | Who's here, **Copy invite link**, and who's invited. | | **Share** | Share a screen, window, or tab. | | Microphone / Camera | Turn on/off; the small arrow picks a device. | | **Background** | Blur or replace your background. | | **Raise hand** | Shows ✋ on your video and notifies everyone. | | **React** / **Throw** / **Arcade** | Emoji reactions, playful throwables, and games (if the host enabled them). | | **Captions** | Live transcript or translation, just for you. | | **Annotate** | Draw on a shared screen. | | **Chat** | Messages and files. | | **Leave** | Leave (or end) the meeting. | The person speaking moves to the front of the grid, and a shared screen becomes the main view. ### Backgrounds & Blur Click **Background** and choose **None**, **Blur**, a built-in image, or one of your organization's custom backgrounds. **Adjust quality settings** fine-tunes blur strength and edges; tick **Keep only me (hide people behind you)** to hide others in the frame. Your choice is remembered for next time. The button is hidden in browsers without WebGL2 support. ### Captions & Translation Click **Captions** and choose **Live transcript**, or **Translate to** English, Spanish, French, German, Portuguese, Italian, Dutch, Chinese, Japanese, Korean, Arabic, Hindi, Russian, Vietnamese, or Tagalog. Captions only appear on your screen. ### Chat Send to **Everyone** or privately to one person. Attach images, PDFs, text, CSV, or Office files up to 10 MB with the paperclip. Chat isn't saved after the meeting — download anything you need before leaving. ### Screen Share & Annotate While someone is sharing, click **Annotate** for pen, arrow, rectangle, ellipse, and text tools with colors and widths. Everyone sees the drawings. Use **Undo**, **Clear all**, or **Save as image**, then **Close annotate**. The person sharing can also offer [Remote control](https://docs.vinsi.ai/meet/remote-control). ### Pop Out In Chrome or Edge, **Pop out** floats the meeting in a small always-on-top window with mic, camera, share, and leave buttons — handy while you work in other apps. It opens automatically when you switch tabs or start sharing. Close it to bring the meeting back to the tab. ## Host Controls Hosts and co-hosts get extra options: - **Participants** — mute a microphone, stop a camera, **Mute everyone**, admit waiting guests, and **See attendance** (join and leave times). - **Make host** — hand host controls to someone else (host only). - **Controls** — turn reactions, throw items, and arcade games on or off for everyone (host). - **Record** and **AI summary** — see [Recording & AI Summaries](https://docs.vinsi.ai/meet/recording). ### Breakout Rooms 1. Click **Breakouts**. 2. Set the number of rooms, rename them, and **Auto-distribute** or **Assign people**. 3. Optionally set **Auto-close after** minutes, then click **Open rooms**. While rooms are open you can **Join** any room, **Message all rooms**, and **Close all rooms**. Participants can click **Ask for help** to flag the host. ## Leaving & Ending Click **Leave**. Hosts and co-hosts choose **End meeting for everyone** (also stops recording) or **Leave (meeting continues)**. If you refresh the page by accident, you rejoin automatically with the same camera, mic, and background. ## Troubleshooting | Message or problem | What to do | | ---------------------------------------------------- | -------------------------------------------------------------------------------------------- | | "Your camera & microphone are blocked for this site" | Click the camera/lock icon in the address bar, allow Camera and Microphone, then **Reload**. | | "This meeting link went dark" | The link expired or the meeting was removed — ask the host for a new invite. | | Wrong account error | Click **Switch account** and sign in with the invited email. | | Stuck on "Waiting for host to admit you" | Ask the host to check the Waiting room panel. | | No Background or Pop out button | Use a current version of Chrome or Edge. | | Echo or feedback | Use a headset, or mute when not speaking. | --- # Recording & AI Summaries Record meetings to watch later, and get an AI summary with key points, decisions, and action items. Created: September 16, 2026 Updated: September 16, 2026 ## Record a Meeting 1. As the host or a co-host, click **Record** in the control bar. 2. Everyone sees _"{name} started recording this meeting"_ and a **Recording** badge. 3. Click **Stop recording** when done. The whole meeting is recorded server-side (speaker view), so it keeps recording even if your own connection drops. Recording also stops when the host leaves or the meeting is ended for everyone. ### Auto-Record Turn on **Auto-record meeting** when scheduling (or in the lobby's Meeting settings) to start recording as soon as the host joins. ## Finding Recordings - **meet.vinsi.ai** → meeting card ⋮ → **Recording** — every recording of that meeting. - Avatar menu → **Recordings** — every recording you made, newest first. - **CRM → Admin → Team Settings → Video Meetings** → **Recording**. - The contact's **Video Meetings** tab in the CRM. Play recordings in the page or click **Download**. Links expire after an hour — refresh the page to renew them. A new recording can take a minute to appear after you stop. ## AI Summaries 1. As the host or a co-host, click **AI summary**. Everyone sees **Transcribing for AI summary**. 2. Have your meeting as usual. 3. Click **Stop AI**, then **Stop & generate summary**. The summary is saved to the meeting and emailed to you as **Meeting summary: {title}**. If you forget to stop, it's generated automatically once the meeting ends or goes quiet for 15 minutes. AI summary is separate from recording — start both if you want the video and the summary. Let participants know before transcribing. ### Reading a Summary Open the meeting card's ⋮ → **Summary** (or **Summary** in the CRM). Summaries include **Summary**, **Key points**, **Decisions**, and **Action items**. ## FAQ | Question | Answer | | -------------------------------------------- | ---------------------------------------------------------------------------------------- | | Who can record? | The host and co-hosts. | | Do participants know they're being recorded? | Yes — everyone gets a notice and sees the Recording badge. | | Is chat included in the recording? | No. Chat isn't saved after the meeting. | | "Nothing has been transcribed yet" | No speech was captured — check that people's microphones are on, then keep transcribing. | --- # Remote Control Let a teammate or support agent control your computer during a meeting — with your permission, and stoppable anytime. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Remote control works for the person **sharing their screen**. They install a small helper app, **VINSI Remote**, choose who gets control, and approve a prompt on their computer. Windows and macOS are supported. Only give control to people you trust. They can use your mouse and keyboard until you remove control or stop sharing. ## Install VINSI Remote Install once per computer, before or during a meeting: 1. On **meet.vinsi.ai** (or CRM → Admin → Video Meetings), find **VINSI Remote Helper** and click **Windows** or **macOS**. 2. Run the download. Choose **Install** to keep it for next time, or **Connect** for one-time access. In a meeting, the **Remote control** window offers the same download if the helper isn't found. After installing, click **I've installed it**; if several computers are listed, choose **This one**. ## Give Control 1. Click **Share** and share your screen. 2. Click **Remote control**. You should see _VINSI Remote is installed and ready on this computer_. 3. Under **Let someone control your computer**, pick the person and click **Allow control**. 4. When they connect, **accept the prompt** that appears on your computer. Everyone in the meeting sees who is controlling the shared screen. ## Take Control 1. You'll see _"{name} is letting you control their screen"_. Open **Remote control** and click **Connect**. 2. Wait for them to accept the prompt. Their screen opens inside the meeting, and the meeting pops out to a small window. 3. Use **Full screen** for more room, and **Stop controlling** when you're done. ## Stop Control The person sharing can end control at any time: - Open **Remote control** and click **Remove control**, or - Stop sharing your screen. Access links also expire automatically after 60 minutes. ## Troubleshooting | Message or problem | What to do | | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | | No **Remote control** button | Start sharing your screen first. | | "VINSI Remote isn't running on this computer" | Start the helper (or reinstall it) and try again. | | "Not detected yet" | Make sure the helper finished installing and is running, then click **I've installed it** again. | | "Your computer looks offline" | Check the computer is awake and connected, and the helper is running. | | Controller can't see the screen | Accept the permission prompt on the shared computer. | --- # DTMF (Dual-Tone Multi-Frequency) Capture user input through phone keypad presses for secure and discreet interactions. Created: April 24, 2025 ## Overview DTMF (Dual-Tone Multi-Frequency) allows callers to provide input using their phone keypad during a call. This input is captured in real time and made available to the AI agent for decision-making and workflow execution. This mechanism is especially useful for structured or sensitive inputs that should not be spoken aloud. ## Description VINSI.AI’s DTMF feature enables agents to collect numeric input such as PINs, menu selections, or confirmation codes directly from the caller’s keypad. DTMF input is automatically captured and considered in agent responses by default, without requiring additional configuration. ## Usage - Ideal for entering PIN numbers or verification codes - Useful in public environments where speaking is inconvenient - Commonly used in menu-based or IVR-style interactions Compared to spoken input, DTMF provides higher reliability for numeric data and reduces the risk of transcription errors. ## Implementation To use DTMF input, instruct the agent to prompt the caller to enter digits using their phone keypad. - The agent should explicitly request DTMF input - Callers must verbally indicate when they have finished entering digits - Captured input is immediately available to the agent ## Technical Features - Agents can send DTMF tones programmatically using the `digit to press` parameter - Supported through the Call API (see API documentation under Tools) - DTMF events are handled natively by the platform ## Example Prompt DTMF Menu Press 1 for appointments. Press 2 for more information. Press 3 to speak with a representative. --- # Function How to use tool-type function Created: April 29, 2025 ## Description A tool-type function allows AI agents to make API requests to your backend or to an n8n workflow automation system. ## What is a tool-type function A tool-type function is designed to make API requests to either your server or the n8n workflow automation system. When defining this function, you provide the following details: - Name: The identifier for the tool or function. - Description: A summary of the tool's purpose and intended operation. - Method: The HTTP method to be used, such as GET or POST. Edit Tool ![/images/tools-edit-form.png](https://docs.vinsi.ai/images/tools-edit-form.png) This example demonstrates how to retrieve the AI models available for testing from our API. It is accompanied by a screenshot to guide users visually through the process. To use this feature, first add the tool to the tools menu. When needed, press the `` ` `` key to open a menu displaying the selected tools. This is the result, providing you with the ability to utilize and call the tool effectively. New Agent ![/images/agent-form-add-tool.png](https://docs.vinsi.ai/images/agent-form-add-tool.png) --- # After Call Actions Automatically send an email or create a support ticket when an AI agent call ends with a specific disposition. Created: September 16, 2026 Updated: September 16, 2026 ## Overview Open **Tools** and select the **After Call Actions** tab ("Automatically trigger actions when a call ends with a specific disposition"). There are two kinds of action: | Tab | What happens when a call matches | | ---------- | --------------------------------------------------------------------------------------------------------------------------- | | **Email** | Sends your custom email (subject and HTML body with call variables), optionally with the transcript and recording attached. | | **Ticket** | Creates a ticket in VINSI Desk, optionally assigned to a user or group, and can email a notification. | Actions are triggered by **dispositions** — the call outcomes you define in the agent editor under **⚙️ Tools & Data → Dispositions** (for example _Appointment Booked_, _Needs Callback_, _Complaint_). At the end of each call the AI picks the disposition that fits; every action whose trigger list includes it runs. Matching ignores upper/lower case. Organization admins and members with write access to Tools can create and change actions. Others can view the list. ## Required Setup After Call Actions only run for agents that send their end-of-call data to VINSI. Do this once per agent (and per direction): 1. On the After Call Actions tab, in the **Required setup** box, click **Copy** to copy the webhook URL (it ends in `/api/webhooks/ai-phone-agent`). 2. Open the agent in **AI Phone Agents**. On the **Inbound Agent** tab, go to **⚙️ Tools & Data** and paste the URL into **After Call Webhook**. 3. If the agent also makes outbound calls, paste the same URL on the **Outbound Agent** tab. 4. Make sure the agent has **Dispositions** on each tab you use — they are what your actions trigger on. 5. Click **Save**. Each agent tab has one After Call Webhook field. If you put the VINSI URL there, you can't also send that tab's call data to your own endpoint (see [After Call Webhook](https://docs.vinsi.ai/tools/after-call-actions#aca-webhook)). ## Create an Email Action 1. On the **Email** tab, click **Add Email Action** (or **\+ Add your first email action**). 2. **Scope to agent** — leave **All agents** to run for calls from any agent, or pick one agent. Each agent is listed as "Name — Inbound" or "Name — Outbound", so you can target one direction. 3. **Disposition trigger(s)** — choose one or more dispositions. The list comes from the selected agent (or from all agents). 4. **Send email to** — the recipient address, e.g. `team@company.com`. 5. **Subject** — can include variables. 6. **Email body** — HTML supported, can include variables. 7. Optionally tick attachments. 8. Check the **Preview with sample data** tab, then click **Create action**. The button stays disabled until at least one disposition, a recipient, and a subject are filled in. The action is named automatically, e.g. **On "Appointment Booked, Needs Callback" → Email**. Emails are sent from **VINSI.AI **. ### Template Variables Click in the Subject or Email body, then click a variable chip to insert it at the cursor. You can also type them. | Variable | Value | | ------------------- | -------------------------------------------------------------------------------------- | | {{user\_phone}} | Caller's phone number (the person the agent spoke with) | | {{agent\_phone}} | The agent's phone number | | {{disposition}} | The call's disposition | | {{summary}} | AI-written call summary | | {{call\_id}} | Call ID | | {{recording\_url}} | Link to the call recording (empty if none) | | {{transferred\_to}} | Number the call was transferred to (empty if not transferred) | | {{transcript}} | Full transcript | | {{call\_data.KEY}} | A field the agent collected, where KEY is the **Key** of a Call Data item on the agent | When you scope the action to an agent that has **Call Data**, its fields appear as chips (e.g. `{{call_data.customer_name}}`). Otherwise example chips are shown — replace `KEY` with your own field key. If the caller never provided a Call Data field, the email shows **Not provided**. A misspelled variable is left as-is in the email, so check the preview. Example email body ```

New callback request from {{call_data.customer_name}} ({{user_phone}}).

Outcome: {{disposition}}

Summary: {{summary}}

Listen to the recording

``` ### Attachments | Option | Result | | ------------------------------------------------ | ------------------------------------------- | | **Include recording URL as attachment** | Attaches the call recording as an MP3 file. | | **Include call transcript as attachment (.txt)** | Attaches the transcript as a text file. | Phone recordings can take a while to become available after hang-up. When the recording attachment is ticked, the email waits until the recording is ready and is then sent automatically, so it may arrive later than the call ended. Website text chats have no recording and send right away. ## Create a Ticket Action 1. On the **Ticket** tab, click **Add Ticket Action**. 2. Set **Scope to agent** and **Disposition trigger(s)** as for email. 3. **Assign to user (optional)** — a member, or **Unassigned**. **Assign to group (optional)** — a ticket group, or **No group**. Assigned users and group members get the usual ticket assignment email. 4. Optionally tick **Send email notification when ticket is created**, enter **Send ticket notification to**, and choose attachments. 5. Click **Create action** (a disposition is the only required field). Each matching call creates a ticket in [VINSI Desk](https://docs.vinsi.ai/tickets/tickets) with: | Field | Value | | ------------------------ | ---------------------------------------------------------------------------------- | | Subject | Phone Support: followed by the start of the call summary | | Description | The summary and full call transcript | | Status / Priority / Type | Open / Medium / Support Request | | Source / Tag | AI Phone Agent / Phone Support | | Due | 4 days after the call | | Extra details | Call ID, caller and agent phone, recording link and transfer number when available | The notification email is titled **Ticket #… Created — \[disposition\]** and includes the summary and a **View Ticket in Vinsi Desk** button. Ticket workflows set to run on ticket creation also run. ## Edit, Duplicate, Delete Each tab lists its actions with **Name**, **Type**, **Description**, **Ownership**, and **Actions**. Use **Search by disposition or email...** to find one. - **Edit** — click the row or the edit button, change settings, and click **Save changes**. - **Duplicate** — creates _Copy of …_ with the same settings, handy for a second recipient. - **Delete** — confirm in the dialog. This can't be undone. Actions have no on/off switch — delete an action to stop it. ## Examples | Goal | Setup | | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | Email the front desk when an appointment is booked | Email action, disposition _Appointment Booked_, to frontdesk@clinic.com, subject New booking: {{call\_data.patient\_name}} | | Open a ticket for complaints | Ticket action, disposition _Complaint_, assign to group _Customer Care_, notification with transcript attached | | Send sales every hot lead with the recording | Email action scoped to your outbound agent, dispositions _Interested_ and _Callback Requested_, recording attached | ## After Call Webhook (Your Own Endpoint) Instead of the VINSI URL, you can enter your own HTTPS endpoint in **⚙️ Tools & Data → After Call Webhook** (placeholder `https://api.domain.com/endpoint`) to push call results into your CRM, Zapier, Make, or a custom app. Inbound and outbound tabs each have their own field. The agent won't save an invalid URL ("Please enter a valid url for the after call webhook"). When a call ends, VINSI sends one `POST` request with a JSON body to that URL. It isn't signed and isn't retried, so make your endpoint quick and reliable. ### Webhook Payload Phone call (inbound or outbound) ``` { "user_phone": "+16615550123", "agent_phone": "+16615550199", "variables": { "firstName": "Ada" }, "organization_id": "org_...", "disposition": "Appointment Booked", "summary": "The caller booked a cleaning for Tuesday at 10 AM.", "transcript": "BOT: Thank you for calling...\nHUMAN: Hi, I'd like to...", "recording_url": "https://...", "call_id": "c_...", "call_data": { "customer_name": { "value": "Ada Lovelace" } }, "transferred_to": null } ``` | Field | Notes | | -------------------------- | ---------------------------------------------------------------------------------------------- | | user\_phone / agent\_phone | Caller (or person called) and the agent's number. | | variables | Variables passed to the call (e.g. from Call Me, batch calls, or the API). | | disposition | One of the agent's dispositions. | | recording\_url | Temporary link (about 1 hour), or null if the recording isn't ready yet. Download it promptly. | | call\_data | Each Call Data key holds an object with a value. | | transferred\_to | Transfer destination, or null. | Conversations from the [website widget's text chat](https://docs.vinsi.ai/ai-phone-agents/website-widget) send the same fields except `variables`, with `user_phone` and `agent_phone` set to `text_chat`, `recording_url` `null`, and an extra `"call_type": "widget_text"`. See also [Call Logs](https://docs.vinsi.ai/telephony/callLogs) for the same data in the dashboard, and [Go High Level](https://docs.vinsi.ai/api-integration/gohighlevel) for a built-in CRM integration. ## Troubleshooting & FAQ | Problem / question | Answer | | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | No emails or tickets at all | Check the agent tab that handled the call has the VINSI webhook URL in **After Call Webhook** and was saved. | | Works for inbound, not outbound | Paste the URL on the **Outbound Agent** tab too. | | Disposition trigger list is empty | Add **Dispositions** to the agent, save, then reopen the action. | | Action didn't fire for a call | Open the call in [Call Logs](https://docs.vinsi.ai/telephony/callLogs) and compare its disposition with the action's triggers and agent scope. | | Email arrived late | The recording attachment was ticked; the email waits for the recording. Untick it for instant emails. | | Email never arrived with recording ticked | Make sure call recording is enabled for that number; without a recording the email can't be sent. Also check spam. | | {{something}} shows literally | The variable name is misspelled. Use the chips. | | Can one call trigger several actions? | Yes. Every matching email and ticket action runs. | | Can't add or edit actions | You need admin rights or write access to Tools. | --- # HubSpot Integration Connect HubSpot to VINSI.AI and access CRM data using Custom API tools inside AI Phone Agents. Created: Jan 26, 2026 ## Overview HubSpot can be integrated into VINSI.AI through OAuth authentication and accessed programmatically using **Custom API tools**. Once connected, AI agents can retrieve contacts, deals, and CRM metadata during live phone calls or automated workflows. ## Authentication HubSpot authentication is handled using OAuth 2.0. 1. Navigate to **Settings → API Integration → HubSpot** 2. Click **Connect with HubSpot API** 3. Review permissions and click **Connect app** Access tokens are securely stored and automatically refreshed. No API keys are exposed to agents. ## Using HubSpot via Custom API Tool To allow an AI Phone Agent to query HubSpot data, you must create a **Custom API** tool. This tool defines how the agent sends HTTP requests to HubSpot’s API using the authenticated OAuth context. ## Tool Configuration Add New Tool Navigate to **Tools → Add Tool** and configure the following fields. - **Tool Type:** Custom API - **Tool Name:** HubSpot – Get Contacts - **Description:** Fetch contacts from HubSpot CRM - **Server URL:** `https://api.hubapi.com/crm/v3/objects/contacts` - **Method:** GET - **Timeout:** 30 seconds (default) Authorization headers are injected automatically using the connected HubSpot account. ## Example: Fetch Contacts Custom API Tool Configuration Server URL: https://api.hubapi.com/crm/v3/objects/contacts Method: GET Headers: Content-Type: application/json Parameters (optional): limit = 10 The AI agent can now invoke this tool during a call to retrieve CRM data in real time. ## Important Notes - HubSpot may display the integration as an **unverified app** - Only grant access if you trust the application - Rate limits are enforced by HubSpot - Custom API tools should be scoped narrowly per use case --- # Salesforce API Integration Connect Salesforce to VINSI.AI to read and write CRM data through Salesforce’s REST API using OAuth 2.0 credentials. Created: January 26, 2026 ## Overview Salesforce offers a powerful REST API for accessing CRM objects such as Contacts, Accounts, Leads, and Opportunities using standard HTTP methods (GET, POST, PATCH, DELETE). By connecting your Salesforce org and defining Custom API tools, AI Phone Agents can safely query CRM data during live calls or automated workflows. ## Authentication Salesforce uses OAuth 2.0 for secure API access. You must create a Connected App in Salesforce and grant permissions that allow REST API usage. 1. In Salesforce Setup, open **App Manager** and create a new Connected App. 2. Enable **OAuth 2.0**. 3. Add the `api` scope (and optionally` refresh_token` for long-lived access). 4. Copy the Client ID, Client Secret, and configure the Host Domain in the VINSI dashboard. ## Salesforce REST API Salesforce REST API endpoints are exposed under the following path: - Query records:`/services/data/vXX.X/query?q=SELECT+Id,Name+FROM+Contact` - Get a single object:`/services/data/vXX.X/sobjects/Contact/{id}` Replace `vXX.X` with a supported API version (for example, `v60.0`). ## Custom API Tool Configuration Add New Tool Navigate to **Tools → Add Tool** and configure the following fields: - **Tool Type:** Custom API - **Tool Name:** Salesforce – Query Contacts - **Server URL:** `https:///services/data/v60.0/query?q=SELECT+Id,Name+FROM+Contact` - **Method:** GET - **Headers:** OAuth Authorization (auto-injected) ## Example: Query Contacts Salesforce Custom API Tool Server URL: https:///services/data/v60.0/query?q=SELECT+Id,Name+FROM+Contact Method: GET The AI agent can invoke this tool to fetch CRM data in real time during a call. ## Important Notes - Always scope tools to a single responsibility. - Use the correct Salesforce instance domain. - Salesforce enforces API rate limits per org. --- # GoHighLevel API Integration Connect GoHighLevel to VINSI.AI using OAuth 2.0 and expose CRM functionality to AI Phone Agents via Custom API tools. Created: January 26, 2026 ## Overview GoHighLevel provides a REST API that allows access to CRM data such as contacts, opportunities, conversations, and custom fields. VINSI.AI integrates with GoHighLevel using OAuth 2.0, enabling secure, location-scoped access without exposing API keys to agents. ## Authentication GoHighLevel authentication is handled via OAuth 2.0. 1. Navigate to **Settings → API Integration → GoHighLevel** 2. Click **Connect with GoHighLevel API** 3. Select the GoHighLevel location to authorize 4. Approve access to complete the connection Access tokens are stored securely and refreshed automatically. ## GoHighLevel API Once authenticated, GoHighLevel API endpoints can be accessed under: `https://services.leadconnectorhq.com` Example endpoints include: - `/contacts/` — list and manage contacts - `/opportunities/` — CRM pipeline data - `/conversations/` — messages and threads ## Custom API Tool Configuration Add New Tool Go to **Tools → Add Tool** and configure: - **Tool Type:** Custom API - **Tool Name:** GoHighLevel – Get Contacts - **Server URL:** `https://services.leadconnectorhq.com/contacts/` - **Method:** GET - **Headers:** OAuth Authorization (auto-injected) ## Example: Fetch Contacts GoHighLevel Custom API Tool Server URL: https://services.leadconnectorhq.com/contacts/ Method: GET This tool can be invoked by AI agents during a call to retrieve CRM contact data in real time. ## Important Notes - Access is scoped per GoHighLevel location. - OAuth tokens are automatically refreshed. - GoHighLevel enforces rate limits per account. - Custom API tools should be narrowly scoped per use case. --- # Epic on FHIR Integration Connect VINSI.AI to a health system's Epic environment so AI phone agents can look up patients and assist with appointment scheduling. [↓Download Hospital Activation Guide (PDF)](https://docs.vinsi.ai/downloads/VINSI-Epic-Hospital-Activation-Guide.pdf)For the health system's Epic / IT team · Rev. Jul 21, 2026 ## Overview Epic on FHIR is the VINSI.AI healthcare integration for Epic electronic health record environments. The integration uses Epic FHIR APIs to support patient lookup, appointment lookup, slot search, and appointment booking from AI phone agent workflows. Unlike HubSpot or Salesforce, each organization does not create its own OAuth app. VINSI.AI provides the Epic client ID and signing keys, and the health system's Epic team activates that client in their Epic environment. ## Activation Epic access must be enabled by the health system before the connection can be verified. Their Epic or Interconnect team should activate the VINSI.AI Epic on FHIR backend client and enable the required FHIR resources. Health system setup The health system provides its FHIR base URLs, OAuth token URL, service type codes, and test patient records for validation. - **Authentication:** OAuth 2.0 Backend Services with RS384-signed JWT client assertions - **Public keys:** `/api/epic/jwks` - **FHIR versions:** R4 for patients and appointment lookup; STU3 for Epic scheduling operations ## Client Registration The health system's Epic team activates VINSI.AI using the registration below. Everything on this page corresponds to the VINSI.AI app entry on **fhir.epic.com** (audience: Backend Systems, use case: General). VINSI.AI Epic on FHIR — client registration Application Name VINSI AI Scheduling Assistant Application Audience Backend Systems Use Case General Public Documentation https://docs.vinsi.ai/api-integration/epic Production Client ID dfad258d-8069-42bc-a500-b094d9d9bfa4 Non-Production Client ID 49d193bd-cb41-4856-b811-c246ce7d0f6c JWK Set URL (non-prod) https://dashboard.vinsi.ai/api/epic/jwks JWK Set URL (production) https://dashboard.vinsi.ai/api/epic/jwks-prod Signing algorithm RS384 Key rotation Distinct sandbox / production key pairs; rotated under change control with dual-key overlap so activated systems are never left offline. ### Requested FHIR resources These are the exact FHIR resources on the app registration. VINSI.AI does not request write scopes other than the two STU3 scheduling operations. Requested FHIR resources (matches Epic app entry) Reads Patient.Read (R4) Patient.Search (R4) Appointment.Read / Appointment.Search (R4) Slot.Read (STU3) Scheduling operations Appointment.$find (STU3) Appointment.$book (STU3) No chart writes, no demographic updates, no order entry, no document uploads. VINSI.AI holds no other Epic scopes. Health-system activation checklist - Activate the appropriate VINSI.AI client ID (non-prod first) in the health system's Epic environment. - Enable the requested FHIR resources above. - Share FHIR R4 base URL, FHIR STU3 base URL, OAuth token URL, and applicable service type codes with the VINSI.AI team. - Provision test-patient records for the pilot visit type. [↓Hospital Activation Guide (PDF)](https://docs.vinsi.ai/downloads/VINSI-Epic-Hospital-Activation-Guide.pdf) ## Data Handling & Security All Epic data is treated as PHI. This section is the primary reference for a health-system security review. ### What VINSI.AI reads from Epic - Patient demographics returned by `Patient.Search` (name, DOB, phone, MRN, internal FHIR id) — used only to identify the caller and hand the id to downstream tools. - Upcoming appointments returned by `Appointment.Search` — used to prevent duplicate booking. - Slots returned by `$find` — read only to offer times to the caller. ### What VINSI.AI writes to Epic - One `$book` call per confirmed appointment, with an optional caller-provided visit note. No other writes. ### Data flow Call → Epic → confirmation Caller (phone) │ ▼ Telephony (SIP) ──► VINSI.AI worker │ │ │ ▼ │ VINSI.AI language model (BAA-covered; no │ model-training on health-system data) │ │ │ ▼ │ Epic on FHIR tool calls (JWT-signed, │ per-health-system endpoint) │ │ ▼ ▼ Voice back Epic response to caller (patient, appointments, slots, $book confirmation) ### Storage & retention - **Tool-call log** (request, response, patient id, timestamp, agent id, call id) — encrypted at rest, retained per the health system's configured retention policy. - **Call recording & transcript** — encrypted at rest and in transit, retention configurable per organization. - **No LLM training on health-system data.** Prompts and tool results are not used to train or fine-tune any model. - **Encryption in transit:** TLS 1.2+ for every external hop (Epic, LLM provider, telephony, storage). ### Compliance posture - **HIPAA:** VINSI.AI signs a Business Associate Agreement (BAA) with the health system prior to enabling any production Epic environment. Sub-processors (LLM provider, storage, telephony) are BAA-covered. - **SOC 2 & HITRUST:** A formal SOC 2 Type II engagement and HITRUST CSF certification are on the VINSI.AI security roadmap. Current documentation and pen-test summaries are available under NDA on request. - **Access controls:** Production access is role-based, MFA-required, and audit-logged. Signing keys are held in restricted secrets storage. - **Incident response:** Suspected security incidents are triaged within one business hour and communicated to the health-system contact per the BAA terms. Revocation The health system may revoke VINSI.AI's Epic client at any time by deactivating the client ID in the health system's Epic environment. No further Epic access is possible after revocation. ## Connection Settings After the health system shares its Epic endpoint information, configure the connection in VINSI.AI. 1. Navigate to **Settings -> API Integration -> Epic** 2. Enter an **Environment Name**, such as the health system name and whether it is test or production 3. Enter the **FHIR R4 Base URL** 4. Enter the **FHIR STU3 Base URL** used for appointment search and booking 5. Enter the **OAuth Token URL** 6. Enable **Production Epic environment** only for the health system's live environment 7. Click **Save & Verify** If Epic has not activated the VINSI.AI client ID yet, the connection can be saved but may show as awaiting activation until verification succeeds. ## Agent Tool Actions Once Epic is connected, create a tool with the **Epic FHIR API** tool type. The available resources are **Patients** and **Appointments**. Available Epic FHIR API actions Patients - Look up Patient Endpoint: POST /api/epic/patient-lookup Required: family, birthdate Optional: given, phone Appointments - Get Patient Appointments Endpoint: POST /api/epic/get-appointments Required: patientId Optional: fromDate - Find Available Appointment Slots Endpoint: POST /api/epic/find-slots Required: startTime, endTime Optional defaults: serviceTypeCode, serviceTypeSystem - Book Appointment Endpoint: POST /api/epic/book-appointment Required: patientId, appointmentId Optional: note Patient IDs and appointment IDs should come from previous tool results. The agent should not ask callers to provide these internal Epic identifiers. ## Example Scheduling Flow 1. Ask the caller for last name and date of birth, then confirm the spelling and date before searching. 2. Use **Look up Patient** to find the patient record. 3. Use **Get Patient Appointments** to review upcoming appointments when needed. 4. Use **Find Available Appointment Slots** with a short date/time window and the configured service type values. 5. Read the available options to the caller and confirm their selected time. 6. Use **Book Appointment** with the selected appointment ID and an optional visit note. ## Important Notes - Epic activation is controlled by the health system's Epic team. VINSI.AI cannot verify the connection until that activation is complete. - Scheduling availability depends on the health system's Cadence configuration, departments, providers, visit types, and service type codes. - Keep appointment slot search windows short so the agent returns a manageable list of options to the caller. - Treat Epic responses as PHI. Only configure Epic tools for agents and workflows that are authorized to access patient information. ## Support & Governance How VINSI.AI stays accountable to a health system after go-live. ### Contacts - **Support:** [support@vinsi.ai](mailto:support@vinsi.ai) - **Security & incident response:** [security@vinsi.ai](mailto:security@vinsi.ai) - **Epic activation questions:** [epic@vinsi.ai](mailto:epic@vinsi.ai) ### Change management - Cadence build changes affecting the pilot (visit types, service type codes, provider filters, decision-tree updates) are handled via a change-notification agreement — the health system notifies VINSI.AI in advance, VINSI.AI validates in sandbox, both parties sign off before promotion. - Changes to the VINSI.AI agent prompt, escalation logic, or tool schema for a production organization require written approval from a named health-system owner. - Base LLM model changes are announced in advance and a regression suite is run against representative scenarios before promotion. ### Ownership split - **Health system owns:** Cadence build, decision trees, provider preferences, escalation targets, HIPAA/BAA compliance obligations, sign-off on production changes. - **VINSI.AI owns:** LLM behavior and prompt, Epic tool schema, uptime and monitoring, tool-call auditing, signing-key management, sandbox parity. Epic is a registered trademark of Epic Systems Corporation. --- # Vinsi CRM Integration Connect your agent to VINSI CRM using our API and have access to contacts, companies, deals, and more. Created: Jan 26, 2026 ## Overview You can enable the integration of the CRM directly from settings: 1. Go to Settings Page 2. From left menu click on "API Integration" 3. Click on "Vinsi SaaS CRM" 4. Click on the button "Enable Vinsi SaaS Integrations with your organization" API Integrations Page ![/images/settings-vinsi-crm-integrations.png](https://docs.vinsi.ai/images/settings-vinsi-crm-integrations.png) Once enabled, you can now configure the necessary tools to retrieve contacts, companies, and other CRM available objects ## Using Vinsi CRM via Tools To allow an AI Phone Agent to query Vinsi CRM data, you must create a **Tool**. This is the list of available resources in the CRM: 1. Contacts 2. Companies 3. Deals 4. Tickets 5. Tasks For each resource you can retrieve a list of records, create a new record and update an existing one. ## Tool Configuration Add New Tool Navigate to **Tools → Add Tool** and configure the following fields. - **Tool Type:** Vinsi Saas CRM - **Tool Name:** Get Contacts - **Description:** Fetch contacts from Vinsi CRM - **Resource:** Contacts - **Action:** Get List of Contacts Authorization headers are injected automatically using the Vinsi Settings. Tool form with 'Vinsi Saas CRM' type ![/images/create-tool-vinsi-crm.png](https://docs.vinsi.ai/images/create-tool-vinsi-crm.png) ## Important Notes - The AI will not recognize the records in the CRM immediately — you need to create a tool for each action so the agent can read/write data from the CRM. - We always recommend fetching the list of records before making a create or update action. For example: retrieve the list of contacts before creating or updating a contact, so the agent can validate whether the contact already exists. - Once a list of records is retrieved, the agent can perform any sort, filter, and search action. - `Tickets` and `Tasks` resources must always be assigned to a contact; therefore, it is necessary to retrieve the list of contacts first. - These recommendations can be configured in the `AI Phone Agent` instructions. --- # Get Calls Fetch a paged list of calls in your organization. Transcript and summary are not included here (use Get Call by ID); hasTranscript and hasSummary show whether they exist. Recording URLs are pre-signed and expire. Filters: direction (inbound | outbound | web | voicemail | no-answer | softphone), agentId, disposition, startDate and endDate (ISO dates), searchTerm, transcriptSearch, summarySearch, audited (audited | notAudited), favorites (true), excludeWebCalls (true), minDuration and maxDuration (seconds), batchId. Sort with sortField (default startTime) and sortDirection (asc | desc). pageSize defaults to 50, max 500. ```http GET https://dashboard.vinsi.ai/api/calls ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | page | no | 1 | | pageSize | no | 50 | | direction | no | inbound | | agentId | no | cmexampleagent000000000001 | | disposition | no | Appointment Booked | | startDate | no | 2026-09-01 | | endDate | no | 2026-09-16 | | searchTerm | no | 5555550142 | | transcriptSearch | no | cleaning | | summarySearch | no | appointment | | audited | no | notAudited | | favorites | no | false | | excludeWebCalls | no | false | | minDuration | no | 30 | | maxDuration | no | 600 | | batchId | no | | | sortField | no | startTime | | sortDirection | no | desc | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/calls' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "calls": [ { "id": "c_1757964000123", "agentName": "Front Desk Agent", "agentNameRaw": "Front Desk Agent", "softphone": false, "callerUserName": null, "callerUserEmail": null, "agentId": "cmexampleagent000000000001", "incomingPhone": "+15555550142", "outgoingPhone": "+15555550199", "contact": { "id": 1042, "name": "Alex Morgan", "phone": "+15555550142" }, "variables": {}, "duration": 94, "disposition": "Appointment Booked", "dispositions": [ "Appointment Booked", "Callback Requested", "Not Interested" ], "startTime": "2026-09-15T18:02:11.000Z", "endTime": "2026-09-15T18:03:45.000Z", "status": "completed", "recordingUrl": "https://example-bucket.s3.amazonaws.com/recordings/c_1757964000123.wav?X-Amz-Signature=...", "completeRecordingUrl": null, "transcript": null, "summary": null, "hasTranscript": true, "hasSummary": true, "audited": false, "auditedBy": null, "auditedByEmail": null, "auditedByName": null, "auditedAt": null, "favorite": false, "favoriteBy": null, "favoriteByEmail": null, "favoriteByName": null, "favoriteAt": null, "callScore": null, "callScoreNotes": null, "scoredAt": null, "scoredBy": null, "scoredByEmail": null, "scoredByName": null, "number": 48213, "comments": null, "batchId": null, "call_type": "inbound", "error": null, "data": {} } ], "pagination": { "page": 1, "pageSize": 50, "total": 1, "totalPages": 1, "hasMore": false, "totalInbounds": 1, "totalOutbounds": 0, "totalWebs": 0, "totalVoicemails": 0, "totalSoftphones": 0, "totalNoAnswer": 0, "grandTotal": 1 }, "filters": { "direction": "inbound", "agentId": "cmexampleagent000000000001", "startDate": "2026-09-01", "endDate": "2026-09-16", "sortField": "startTime", "sortDirection": "desc", "favorites": false, "excludeWebCalls": false } } ``` --- # Get Call by ID Fetch a single call with its transcript, summary, collected data and a pre-signed recording URL. contact is the CRM contact matched by phone number, or null. Returns 404 if the call does not belong to one of your organization's agents. ```http GET https://dashboard.vinsi.ai/api/calls/{callId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | callId | c_1757964000123 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/calls/c_1757964000123' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": "c_1757964000123", "agentName": "Front Desk Agent", "agentNameRaw": "Front Desk Agent", "softphone": false, "callerUserName": null, "callerUserEmail": null, "agentId": "cmexampleagent000000000001", "incomingPhone": "+15555550142", "outgoingPhone": "+15555550199", "contact": { "id": 1042, "name": "Alex Morgan", "phone": "+15555550142" }, "duration": 94, "startTime": "2026-09-15T18:02:11.000Z", "endTime": "2026-09-15T18:03:45.000Z", "status": "completed", "recordingUrl": "https://example-bucket.s3.amazonaws.com/recordings/c_1757964000123.wav?X-Amz-Signature=...", "transcript": "Agent: Thank you for calling Acme Dental, how can I help you today?\nCaller: I'd like to book a cleaning.", "summary": "Caller booked a cleaning appointment for next Tuesday at 10am.", "data": { "appointmentDate": { "label": "Appointment Date", "value": "2026-09-22 10:00" } }, "dispositions": [ "Appointment Booked", "Callback Requested", "Not Interested" ], "disposition": "Appointment Booked", "number": 48213, "batchId": null, "transferredTo": null, "call_type": "inbound" } ``` --- # Start Outbound Call Have an AI phone agent call a phone number now. phoneNumber (required): +1XXXXXXXXXX, or a 2-6 digit PBX extension for agents on a client PBX trunk. agentId (required): an active agent in your organization with outbound configured. variables (optional): key/value data passed to the agent for this call. voicemailMessage (optional): message the agent leaves if voicemail answers. The caller ID is the agent's default outbound number (Telephony → Set as default), otherwise its first assigned number. Each call uses minutes from your balance. ```http POST https://dashboard.vinsi.ai/api/calls/outbound ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "phoneNumber": "+18055551234", "agentId": "cm9t3bqos0000l404og1m9a9z", "variables": { "customerName": "Jordan", "appointmentTime": "Tuesday at 2 PM" }, "voicemailMessage": "Hi Jordan, this is Acme calling to confirm your appointment. Please call us back." } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/calls/outbound' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"phoneNumber":"+18055551234","agentId":"cm9t3bqos0000l404og1m9a9z","variables":{"customerName":"Jordan","appointmentTime":"Tuesday at 2 PM"},"voicemailMessage":"Hi Jordan, this is Acme calling to confirm your appointment. Please call us back."}' ``` ## Example response ```json { "status": 200, "roomName": "outbound-18055551234-a1b2c3", "dispatchId": "AD_7Xk2mP9qLr4s", "cluster": "vinsi-do" } ``` --- # Export Calls Convert call records into a CSV file (text/csv). The endpoint does not look calls up: send the call objects to include in the calls array, for example the calls returned by Get Calls or Get Call by ID. Columns: ID, AgentID, Call number, Agent, Outgoing, Incoming, Disposition, Start Time, End Time, Duration, Status, Summary, Transcript, Data, Error. Returns 400 when calls is empty. ```http POST https://dashboard.vinsi.ai/api/calls/export ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "calls": [ { "id": "c_1757964000123", "agentId": "cmexampleagent000000000001", "agentName": "Front Desk Agent", "number": 48213, "incomingPhone": "+15555550142", "outgoingPhone": "+15555550199", "disposition": "Appointment Booked", "startTime": "2026-09-15T18:02:11.000Z", "endTime": "2026-09-15T18:03:45.000Z", "duration": 94, "status": "completed", "summary": "Caller booked a cleaning appointment.", "transcript": "Agent: Thank you for calling...", "data": {} } ] } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/calls/export' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"calls":[{"id":"c_1757964000123","agentId":"cmexampleagent000000000001","agentName":"Front Desk Agent","number":48213,"incomingPhone":"+15555550142","outgoingPhone":"+15555550199","disposition":"Appointment Booked","startTime":"2026-09-15T18:02:11.000Z","endTime":"2026-09-15T18:03:45.000Z","duration":94,"status":"completed","summary":"Caller booked a cleaning appointment.","transcript":"Agent: Thank you for calling...","data":{}}]}' ``` ## Example response ```json "ID,AgentID,Call number,Agent,Outgoing,Incoming,Disposition,Start Time,End Time,Duration,Status,Summary,Transcript,Data,Error\n\"c_1757964000123\",\"cmexampleagent000000000001\",\"C-48213\",\"Front Desk Agent\",\"+15555550199\",\"+15555550142\",\"Appointment Booked\",\"2026-09-15 18:02:11\",\"2026-09-15 18:03:45\",\"1:34\",\"completed\",\"Caller booked a cleaning appointment.\",\"Agent: Thank you for calling...\",\"\",\"\"" ``` --- # Get Signed URL Get a temporary pre-signed URL for a call recording. Returns 404 if the call is not in your organization or has no recording. ```http GET https://dashboard.vinsi.ai/api/calls/signed-url/{callId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | callId | c_1757964000123 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/calls/signed-url/c_1757964000123' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "signedUrl": "https://example-bucket.s3.amazonaws.com/recordings/c_1757964000123.wav?X-Amz-Signature=..." } ``` --- # Get Agents Fetch a list of the active agents in your organization, sorted by name. Use Get Agent by ID for the full configuration, including the outbound settings and tools. ```http GET https://dashboard.vinsi.ai/api/agents ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/agents' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json [ { "id": "cmexampleagent000000000001", "name": "Front Desk Agent", "voiceId": "exampleVoiceId0001", "createdAt": "2026-09-01T17:22:57.945Z", "updatedAt": "2026-09-10T21:14:00.000Z", "isActive": true, "isAfterHoursFallback": false, "defaultOutboundPhoneNumberId": "phn_1757964000123_k2j4h5g6f" } ] ``` --- # Get Agent by ID Fetch an agent by ID ```http GET https://dashboard.vinsi.ai/api/agents/{agentId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | agentId | cm9t3bqos0000l404og1m9a9z | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/agents/cm9t3bqos0000l404og1m9a9z' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": "cmkoak2s90002l704zm7pkxbh", "userId": "cmg5ipqwt0000jp04a21yzv8b", "name": "New Agent", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "", "voiceId": "", "isActive": true, "createdAt": "2026-01-21T17:22:57.945Z", "updatedAt": "2026-01-21T17:22:58.290Z", "temperature": 0.6, "maxTokens": 250, "language": "en-US", "organizationId": "cmg5ipsl00001jp04ujljuq2w", "vad_threshold": 0.7, "knowledge_base": "", "dispositions": [], "timezone": "America/Los_Angeles", "afterCallWebhookUrl": null, "outbound_id": "cmkoak2ut0004l70405u76dw8", "mode": "prompt", "workflowDefinition": null, "firstActionToolId": null, "callData": {}, "waitingSound": "", "currentHistoryId": 1548, "integrations": null, "voicemailMessage": "", "allowInterruptions": "", "turnDetectionSensitivity": 0.7, "turnDetectionSettings": { "minEndpointingDelay": 0.5, "maxEndpointingDelay": 3, "minInterruptionDuration": 0.35, "minInterruptionWords": 1, "userAwayTimeout": 15, "preemptiveGeneration": true, "agentFalseInterruptionTimeout": 4, "vadMode": "fast" }, "voiceIds": [ "uYXf8XasLslADfZ2MB4u" ], "voiceSelectionMode": "cycling", "outbound": { "id": "cmkoak2ut0004l70405u76dw8", "userId": "cmg5ipqwt0000jp04a21yzv8b", "name": "New Agent", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "", "aimodel": "gpt-4o", "voiceId": null, "isActive": true, "createdAt": "2026-01-21T17:22:58.037Z", "updatedAt": "2026-01-21T17:22:58.400Z", "temperature": 0.6, "maxTokens": null, "language": "en-US", "organizationId": "cmg5ipsl00001jp04ujljuq2w", "vad_threshold": 0.7, "knowledge_base": "", "dispositions": [], "timezone": "America/Los_Angeles", "afterCallWebhookUrl": null, "outbound_id": null, "mode": "prompt", "workflowDefinition": null, "firstActionToolId": null, "callData": {}, "waitingSound": "", "currentHistoryId": 1547, "integrations": null, "voicemailMessage": "", "allowInterruptions": "yes", "turnDetectionSensitivity": 0.7, "turnDetectionSettings": { "minEndpointingDelay": 0.5, "maxEndpointingDelay": 3, "minInterruptionDuration": 0.35, "minInterruptionWords": 1, "userAwayTimeout": 15, "preemptiveGeneration": true, "agentFalseInterruptionTimeout": 4, "vadMode": "fast" }, "voiceIds": [ "uYXf8XasLslADfZ2MB4u" ], "voiceSelectionMode": "cycling", "tools": [] }, "tools": [] } ``` --- # Create Agent Create a new agent. name is required, and the outbound object (the settings used when the agent places outbound calls) must be included. waitingSound must be "", keyboard_typing or hold_music, and maxCallTime must be a whole number (0 = no limit). tools is a list of tool IDs. Responds 201 with the new agent. ```http POST https://dashboard.vinsi.ai/api/agents ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "name": "New Agent", "voiceId": "", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "Test", "knowledge_base": "", "temperature": 0.6, "vad_threshold": 0.7, "language": "en-US", "maxTokens": 250, "isActive": true, "tools": [], "dispositions": [], "afterCallWebhookUrl": null, "timezone": "America/Los_Angeles", "firstActionToolId": null, "callData": {}, "waitingSound": "", "allowInterruptions": "yes", "turnDetectionSensitivity": 0.7, "voiceSelectionMode": "cycling", "outbound": { "voiceId": "", "welcomeMessage": "Hi, this is Acme Dental calling about your appointment.", "instructions": "Confirm the appointment date and time.", "knowledge_base": "", "temperature": 0.6, "vad_threshold": 0.7, "language": "en-US", "maxCallTime": 0, "tools": [], "dispositions": [], "afterCallWebhookUrl": null, "timezone": "America/Los_Angeles", "firstActionToolId": null, "callData": {}, "waitingSound": "", "voicemailMessage": "", "allowInterruptions": "yes", "turnDetectionSensitivity": 0.7, "voiceSelectionMode": "cycling" } } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/agents' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"name":"New Agent","voiceId":"","welcomeMessage":"Thank you for calling. How can I help you today?","instructions":"Test","knowledge_base":"","temperature":0.6,"vad_threshold":0.7,"language":"en-US","maxTokens":250,"isActive":true,"tools":[],"dispositions":[],"afterCallWebhookUrl":null,"timezone":"America/Los_Angeles","firstActionToolId":null,"callData":{},"waitingSound":"","allowInterruptions":"yes","turnDetectionSensitivity":0.7,"voiceSelectionMode":"cycling","outbound":{"voiceId":"","welcomeMessage":"Hi, this is Acme Dental calling about your appointment.","instructions":"Confirm the appointment date and time.","knowledge_base":"","temperature":0.6,"vad_threshold":0.7,"language":"en-US","maxCallTime":0,"tools":[],"dispositions":[],"afterCallWebhookUrl":null,"timezone":"America/Los_Angeles","firstActionToolId":null,"callData":{},"waitingSound":"","voicemailMessage":"","allowInterruptions":"yes","turnDetectionSensitivity":0.7,"voiceSelectionMode":"cycling"}}' ``` ## Example response ```json { "id": "cmkoak2s90002l704zm7pkxbh", "userId": "cmg5ipqwt0000jp04a21yzv8b", "name": "New Agent", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "", "voiceId": "", "isActive": true, "createdAt": "2026-01-21T17:22:57.945Z", "updatedAt": "2026-01-21T17:22:58.290Z", "temperature": 0.6, "maxTokens": 250, "language": "en-US", "organizationId": "cmg5ipsl00001jp04ujljuq2w", "vad_threshold": 0.7, "knowledge_base": "", "dispositions": [], "timezone": "America/Los_Angeles", "afterCallWebhookUrl": null, "outbound_id": "cmkoak2ut0004l70405u76dw8", "mode": "prompt", "workflowDefinition": null, "firstActionToolId": null, "callData": {}, "waitingSound": "", "currentHistoryId": 1548, "integrations": null, "voicemailMessage": "", "allowInterruptions": "", "turnDetectionSensitivity": 0.7, "turnDetectionSettings": { "minEndpointingDelay": 0.5, "maxEndpointingDelay": 3, "minInterruptionDuration": 0.35, "minInterruptionWords": 1, "userAwayTimeout": 15, "preemptiveGeneration": true, "agentFalseInterruptionTimeout": 4, "vadMode": "fast" }, "voiceIds": [ "uYXf8XasLslADfZ2MB4u" ], "voiceSelectionMode": "cycling", "outbound": { "id": "cmkoak2ut0004l70405u76dw8", "userId": "cmg5ipqwt0000jp04a21yzv8b", "name": "New Agent", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "", "aimodel": "gpt-4o", "voiceId": null, "isActive": true, "createdAt": "2026-01-21T17:22:58.037Z", "updatedAt": "2026-01-21T17:22:58.400Z", "temperature": 0.6, "maxTokens": null, "language": "en-US", "organizationId": "cmg5ipsl00001jp04ujljuq2w", "vad_threshold": 0.7, "knowledge_base": "", "dispositions": [], "timezone": "America/Los_Angeles", "afterCallWebhookUrl": null, "outbound_id": null, "mode": "prompt", "workflowDefinition": null, "firstActionToolId": null, "callData": {}, "waitingSound": "", "currentHistoryId": 1547, "integrations": null, "voicemailMessage": "", "allowInterruptions": "yes", "turnDetectionSensitivity": 0.7, "turnDetectionSettings": { "minEndpointingDelay": 0.5, "maxEndpointingDelay": 3, "minInterruptionDuration": 0.35, "minInterruptionWords": 1, "userAwayTimeout": 15, "preemptiveGeneration": true, "agentFalseInterruptionTimeout": 4, "vadMode": "fast" }, "voiceIds": [ "uYXf8XasLslADfZ2MB4u" ], "voiceSelectionMode": "cycling", "tools": [] }, "tools": [] } ``` --- # Update Agent Update an existing agent. Send the full configuration, including the outbound object (with its tools array). Some omitted fields are reset rather than kept: tools, dispositions, callData and keyterms become empty, timezone becomes America/Los_Angeles and allowInterruptions becomes yes. waitingSound must be "", keyboard_typing or hold_music. Include a comment to save the change as a new version in the agent history. ```http PUT https://dashboard.vinsi.ai/api/agents/{agentId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | agentId | cm9t3bqos0000l404og1m9a9z | ## Example request body ```json { "name": "New Agent", "voiceId": "", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "Test", "knowledge_base": "", "temperature": 0.6, "vad_threshold": 0.7, "language": "en-US", "maxTokens": 250, "isActive": true, "tools": [], "dispositions": [], "afterCallWebhookUrl": null, "timezone": "America/Los_Angeles", "firstActionToolId": null, "callData": {}, "waitingSound": "", "comment": null, "allowInterruptions": "yes", "turnDetectionSensitivity": 0.7, "voiceSelectionMode": "cycling", "outbound": { "voiceId": "", "welcomeMessage": "Hi, this is Acme Dental calling about your appointment.", "instructions": "Confirm the appointment date and time.", "knowledge_base": "", "temperature": 0.6, "vad_threshold": 0.7, "language": "en-US", "maxCallTime": 0, "tools": [], "dispositions": [], "afterCallWebhookUrl": null, "timezone": "America/Los_Angeles", "firstActionToolId": null, "callData": {}, "waitingSound": "", "voicemailMessage": "", "allowInterruptions": "yes", "turnDetectionSensitivity": 0.7, "voiceSelectionMode": "cycling" }, "integrations": "" } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/agents/cm9t3bqos0000l404og1m9a9z' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"name":"New Agent","voiceId":"","welcomeMessage":"Thank you for calling. How can I help you today?","instructions":"Test","knowledge_base":"","temperature":0.6,"vad_threshold":0.7,"language":"en-US","maxTokens":250,"isActive":true,"tools":[],"dispositions":[],"afterCallWebhookUrl":null,"timezone":"America/Los_Angeles","firstActionToolId":null,"callData":{},"waitingSound":"","comment":null,"allowInterruptions":"yes","turnDetectionSensitivity":0.7,"voiceSelectionMode":"cycling","outbound":{"voiceId":"","welcomeMessage":"Hi, this is Acme Dental calling about your appointment.","instructions":"Confirm the appointment date and time.","knowledge_base":"","temperature":0.6,"vad_threshold":0.7,"language":"en-US","maxCallTime":0,"tools":[],"dispositions":[],"afterCallWebhookUrl":null,"timezone":"America/Los_Angeles","firstActionToolId":null,"callData":{},"waitingSound":"","voicemailMessage":"","allowInterruptions":"yes","turnDetectionSensitivity":0.7,"voiceSelectionMode":"cycling"},"integrations":""}' ``` ## Example response ```json { "id": "cmkoak2s90002l704zm7pkxbh", "userId": "cmg5ipqwt0000jp04a21yzv8b", "name": "New Agent", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "", "voiceId": "", "isActive": true, "createdAt": "2026-01-21T17:22:57.945Z", "updatedAt": "2026-01-21T17:22:58.290Z", "temperature": 0.6, "maxTokens": 250, "language": "en-US", "organizationId": "cmg5ipsl00001jp04ujljuq2w", "vad_threshold": 0.7, "knowledge_base": "", "dispositions": [], "timezone": "America/Los_Angeles", "afterCallWebhookUrl": null, "outbound_id": "cmkoak2ut0004l70405u76dw8", "mode": "prompt", "workflowDefinition": null, "firstActionToolId": null, "callData": {}, "waitingSound": "", "currentHistoryId": 1548, "integrations": null, "voicemailMessage": "", "allowInterruptions": "", "turnDetectionSensitivity": 0.7, "turnDetectionSettings": { "minEndpointingDelay": 0.5, "maxEndpointingDelay": 3, "minInterruptionDuration": 0.35, "minInterruptionWords": 1, "userAwayTimeout": 15, "preemptiveGeneration": true, "agentFalseInterruptionTimeout": 4, "vadMode": "fast" }, "voiceIds": [ "uYXf8XasLslADfZ2MB4u" ], "voiceSelectionMode": "cycling", "outbound": { "id": "cmkoak2ut0004l70405u76dw8", "userId": "cmg5ipqwt0000jp04a21yzv8b", "name": "New Agent", "welcomeMessage": "Thank you for calling. How can I help you today?", "instructions": "", "aimodel": "gpt-4o", "voiceId": null, "isActive": true, "createdAt": "2026-01-21T17:22:58.037Z", "updatedAt": "2026-01-21T17:22:58.400Z", "temperature": 0.6, "maxTokens": null, "language": "en-US", "organizationId": "cmg5ipsl00001jp04ujljuq2w", "vad_threshold": 0.7, "knowledge_base": "", "dispositions": [], "timezone": "America/Los_Angeles", "afterCallWebhookUrl": null, "outbound_id": null, "mode": "prompt", "workflowDefinition": null, "firstActionToolId": null, "callData": {}, "waitingSound": "", "currentHistoryId": 1547, "integrations": null, "voicemailMessage": "", "allowInterruptions": "yes", "turnDetectionSensitivity": 0.7, "turnDetectionSettings": { "minEndpointingDelay": 0.5, "maxEndpointingDelay": 3, "minInterruptionDuration": 0.35, "minInterruptionWords": 1, "userAwayTimeout": 15, "preemptiveGeneration": true, "agentFalseInterruptionTimeout": 4, "vadMode": "fast" }, "voiceIds": [ "uYXf8XasLslADfZ2MB4u" ], "voiceSelectionMode": "cycling", "tools": [] }, "tools": [] } ``` --- # Delete Agent Delete an existing Agent ```http DELETE https://dashboard.vinsi.ai/api/agents/{agentId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | agentId | cm9t3bqos0000l404og1m9a9z | ## Example request ```bash curl -X DELETE 'https://dashboard.vinsi.ai/api/agents/cm9t3bqos0000l404og1m9a9z' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "message": "Agent deleted successfully" } ``` --- # Get Voices Fetch the voices available to your organization (global voices plus any added to your organization), sorted by name. Use VoiceID as voiceId when creating or updating an agent. ```http GET https://dashboard.vinsi.ai/api/voices ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/voices' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json [ { "ID": 12, "VoiceName": "Alice", "VoiceID": "Xb7hH8MSUJpSbSDYk0k2", "VoiceProvider": "elevenlabs", "Sex": "WOMEN", "Languages": [ "English" ], "Description": "British Confident Middle aged", "userId": null, "createdAt": "2026-01-22T17:00:00.000Z", "updatedAt": "2026-01-22T17:00:00.000Z", "LanguagesCount": 1 } ] ``` --- # Get Phone Numbers Fetch every phone number in your organization, each with its assigned agent (or null). ```http GET https://dashboard.vinsi.ai/api/phone-numbers ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/phone-numbers' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json [ { "id": "phn_1757964000123_k2j4h5g6f", "phoneNumber": "+15555550199", "friendlyName": "Main Line", "providerId": "2468013579246801357", "provider": "telnyx", "capabilities": "{\"voice\":true,\"sms\":true}", "agentId": "cmexampleagent000000000001", "fallbackNumber": null, "isActive": true, "userId": "cmexampleuser0000000000001", "organizationId": "cmexampleorg00000000000001", "createdAt": "2026-09-01T18:00:00.000Z", "updatedAt": "2026-09-10T21:14:00.000Z", "SIPUserName": null, "SIPPassword": null, "SIPTerminationURI": null, "livekitTrunkConfigured": true, "trunkName": "Main Line", "livekitTrunkId": "ST_exampleTrunk01", "livekitOutboundTrunkId": null, "livekitOutboundConfigured": null, "stripeSubscriptionId": null, "routingMode": "agent", "routingDeskPhoneId": null, "voicemailEnabled": false, "voicemailPin": null, "huntGroupId": null, "queueId": null, "queuePriority": null, "livekitCluster": "vinsi-do", "agent": { "id": "cmexampleagent000000000001", "name": "Front Desk Agent", "integrations": null, "isAfterHoursFallback": false, "routeOutboundVia": "telnyx", "defaultOutboundPhoneNumberId": "phn_1757964000123_k2j4h5g6f" } } ] ``` --- # Get Phone Number by ID Fetch a single phone number in your organization, with the assigned agent. Returns 404 if the number does not exist in your organization. ```http GET https://dashboard.vinsi.ai/api/phone-numbers/{phoneNumberId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | phoneNumberId | phn_1757964000123_k2j4h5g6f | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/phone-numbers/phn_1757964000123_k2j4h5g6f' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": "phn_1757964000123_k2j4h5g6f", "phoneNumber": "+15555550199", "friendlyName": "Main Line", "providerId": "2468013579246801357", "provider": "telnyx", "capabilities": "{\"voice\":true,\"sms\":true}", "agentId": "cmexampleagent000000000001", "fallbackNumber": null, "isActive": true, "userId": "cmexampleuser0000000000001", "organizationId": "cmexampleorg00000000000001", "createdAt": "2026-09-01T18:00:00.000Z", "updatedAt": "2026-09-10T21:14:00.000Z", "SIPUserName": null, "SIPPassword": null, "SIPTerminationURI": null, "livekitTrunkConfigured": true, "trunkName": "Main Line", "livekitTrunkId": "ST_exampleTrunk01", "livekitOutboundTrunkId": null, "livekitOutboundConfigured": null, "stripeSubscriptionId": null, "routingMode": "agent", "routingDeskPhoneId": null, "voicemailEnabled": false, "voicemailPin": null, "huntGroupId": null, "queueId": null, "queuePriority": null, "livekitCluster": "vinsi-do", "agent": { "id": "cmexampleagent000000000001", "name": "Front Desk Agent", "integrations": null, "isAfterHoursFallback": false, "routeOutboundVia": "telnyx", "defaultOutboundPhoneNumberId": "phn_1757964000123_k2j4h5g6f" } } ``` --- # Update Phone Number Assign an agent to a phone number (or send agentId as null to unassign it) and set its fallback number. Assigning an agent also updates carrier and LiveKit routing so inbound calls reach that agent. The agent must belong to your organization. Returns the updated phone number; warnings lists any routing steps that did not complete. ```http PUT https://dashboard.vinsi.ai/api/phone-numbers/{phoneNumberId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | phoneNumberId | phn_1757964000123_k2j4h5g6f | ## Example request body ```json { "agentId": "cmexampleagent000000000001", "fallbackNumber": "+15555550100" } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/phone-numbers/phn_1757964000123_k2j4h5g6f' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"agentId":"cmexampleagent000000000001","fallbackNumber":"+15555550100"}' ``` ## Example response ```json { "id": "phn_1757964000123_k2j4h5g6f", "phoneNumber": "+15555550199", "friendlyName": "Main Line", "providerId": "2468013579246801357", "provider": "telnyx", "capabilities": "{\"voice\":true,\"sms\":true}", "agentId": "cmexampleagent000000000001", "fallbackNumber": "+15555550100", "isActive": true, "userId": "cmexampleuser0000000000001", "organizationId": "cmexampleorg00000000000001", "createdAt": "2026-09-01T18:00:00.000Z", "updatedAt": "2026-09-10T21:14:00.000Z", "SIPUserName": null, "SIPPassword": null, "SIPTerminationURI": null, "livekitTrunkConfigured": true, "trunkName": "Main Line", "livekitTrunkId": "ST_exampleTrunk01", "livekitOutboundTrunkId": null, "livekitOutboundConfigured": null, "stripeSubscriptionId": null, "routingMode": "agent", "routingDeskPhoneId": null, "voicemailEnabled": false, "voicemailPin": null, "huntGroupId": null, "queueId": null, "queuePriority": null, "livekitCluster": "vinsi-do", "agent": { "id": "cmexampleagent000000000001", "name": "Front Desk Agent", "isAfterHoursFallback": false, "routeOutboundVia": "telnyx" }, "warnings": [] } ``` --- # Get Phone Numbers by Area Code Search for local phone numbers available to purchase in a 3-digit area code (up to 100 results with voice and SMS). countryCode defaults to US. Purchase one with Create Phone Number. ```http GET https://dashboard.vinsi.ai/api/phone-numbers/available?areaCode={areaCode} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | areaCode | yes | 619 | | countryCode | no | US | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/phone-numbers/available?areaCode=619' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "numbers": [ "+16195550123" ], "numbersDetailed": [ { "phoneNumber": "+16195550123", "friendlyName": "+16195550123", "locality": "SAN DIEGO", "region": "CA", "postalCode": null, "rateCenter": "SAN DIEGO", "isoCountry": "US", "capabilities": { "voice": true, "sms": true, "mms": false, "fax": false } } ], "isTollFree": false } ``` --- # Create Phone Number Purchase a phone number (E.164, usually picked from Get Phone Numbers by Area Code) and add it to your organization. Uses 1 phone credit, which is refunded if provisioning fails. Toll-free numbers are not allowed. Returns 400 when you have no phone credits or the number is already in your account, and 409 when it belongs to another organization. Responds 201. Assign an agent afterwards with Update Phone Number. ```http POST https://dashboard.vinsi.ai/api/phone-numbers ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "phoneNumber": "+16195550123" } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/phone-numbers' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"phoneNumber":"+16195550123"}' ``` ## Example response ```json { "success": true, "phoneNumber": { "id": "phn_1757964000123_k2j4h5g6f", "phoneNumber": "+16195550123", "providerId": "2468013579246801357", "provider": "telnyx", "orderId": "3f1b2c4d-0000-4000-8000-000000000001", "orderStatus": "success", "livekitTrunkId": "ST_exampleTrunk01", "livekitTrunkConfigured": true, "dispatchRuleId": null } } ``` --- # Get Contacts List CRM contacts in your organization. Send paginated=true for a paged response ({ items, total, page, pageSize, counts }); without it the endpoint returns a plain array of the newest 1,000 contacts (10,000 with lite=true). Paged filters: search (name, email, phone, company, title, state, source, address), activeTab (leads | customers | archived | my | all, default leads), filterLeadStatus / filterType / filterSource (comma-separated lists), filterOwner (user ID, or __unassigned__), filterDisposition, filterCreated (today | week | month | 3months, applied to lastWorkDate), companyId, sortBy (contactName, email, phone, title, company, state, leadStatus, type, disposition, source, createdAt, updatedAt, lastWorkDate, assignedTo), sortDir (asc | desc). pageSize defaults to 10 and is capped at 100 (500 with lite=true, which returns a smaller set of fields). ```http GET https://dashboard.vinsi.ai/api/crm/contacts ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | paginated | no | true | | page | no | 1 | | pageSize | no | 25 | | search | no | morgan | | activeTab | no | leads | | filterLeadStatus | no | New,Contacted | | filterType | no | lead | | filterSource | no | Website | | filterOwner | no | cmexampleuser0000000000001 | | filterDisposition | no | Callback Requested | | filterCreated | no | month | | companyId | no | 318 | | sortBy | no | createdAt | | sortDir | no | desc | | lite | no | false | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/contacts' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "items": [ { "id": 1042, "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142", "company": "Acme Dental", "leadStatus": "New", "type": "lead", "source": "Website", "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-10T17:22:57.000Z", "updatedAt": "2026-09-12T15:04:11.000Z", "ext": "", "disposition": "", "lastWorkDate": null, "state": "CA", "phone2": "", "phone2Ext": "", "phone3": "", "phone3Ext": "", "title": "Office Manager", "isUnsubscribed": false, "unsubscribedAt": null, "email2": "", "companyId": 318, "address": "100 Main St", "city": "San Diego", "zip": "92101", "country": "US", "avatarUrl": null } ], "total": 1, "page": 1, "pageSize": 25, "counts": { "my": 1, "all": 214, "leads": 180, "customers": 30, "archived": 4 } } ``` --- # Get Contact by ID Fetch a single CRM contact by its numeric ID. Returns 404 if the contact does not exist in your organization. ```http GET https://dashboard.vinsi.ai/api/crm/contacts/{contactId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | contactId | 1042 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/contacts/1042' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": 1042, "organizationId": "cmexampleorg00000000000001", "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142", "company": "Acme Dental", "leadStatus": "New", "type": "lead", "source": "Website", "notes": "Asked for a callback next week.", "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-10T17:22:57.000Z", "updatedAt": "2026-09-12T15:04:11.000Z", "ext": "", "disposition": "", "lastWorkDate": null, "state": "CA", "phone2": "", "phone2Ext": "", "phone3": "", "phone3Ext": "", "title": "Office Manager", "isUnsubscribed": false, "unsubscribedAt": null, "email2": "", "companyId": 318, "address": "100 Main St", "city": "San Diego", "zip": "92101", "country": "US", "avatarUrl": null, "phoneNorm": "5555550142", "phone2Norm": null, "phone3Norm": null } ``` --- # Find Contact by Phone Find the first CRM contact whose phone, phone2 or phone3 matches the given number. Matching uses the last 10 digits, so formatting and country code are ignored (at least 7 digits are required). Returns 404 when no contact matches. lastAICallDisposition is the disposition of an AI call to that number that was transferred in the last 2 minutes, or null. ```http GET https://dashboard.vinsi.ai/api/crm/contacts/lookup-by-phone?phone={phone} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | phone | yes | +15555550142 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/contacts/lookup-by-phone?phone=+15555550142' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": 1042, "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "company": "Acme Dental", "phone": "+15555550142", "phone2": "", "phone3": "", "lastAICallDisposition": null } ``` --- # Create Contact Create a CRM contact. No field is strictly required; when email is empty a placeholder address is stored. Defaults: leadStatus New, type lead, source Website. companyId must be a company in your organization (the company name is then copied from it) and ownerId must be a user in your organization (otherwise it is ignored). dedupBy controls duplicate detection: email (default), name, company, phone, or none. A duplicate returns 409. Responds 201 with the created contact and runs any contact_created CRM workflows. ```http POST https://dashboard.vinsi.ai/api/crm/contacts ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142", "ext": "", "email2": "", "phone2": "", "phone2Ext": "", "phone3": "", "phone3Ext": "", "title": "Office Manager", "company": "Acme Dental", "companyId": 318, "leadStatus": "New", "type": "lead", "source": "Website", "disposition": "", "ownerId": "cmexampleuser0000000000001", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "notes": "Asked for a callback next week.", "dedupBy": "email" } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/crm/contacts' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"firstName":"Alex","lastName":"Morgan","email":"alex.morgan@example.com","phone":"+15555550142","ext":"","email2":"","phone2":"","phone2Ext":"","phone3":"","phone3Ext":"","title":"Office Manager","company":"Acme Dental","companyId":318,"leadStatus":"New","type":"lead","source":"Website","disposition":"","ownerId":"cmexampleuser0000000000001","address":"100 Main St","city":"San Diego","state":"CA","zip":"92101","country":"US","notes":"Asked for a callback next week.","dedupBy":"email"}' ``` ## Example response ```json { "id": 1042, "organizationId": "cmexampleorg00000000000001", "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142", "company": "Acme Dental", "leadStatus": "New", "type": "lead", "source": "Website", "notes": "Asked for a callback next week.", "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-10T17:22:57.000Z", "updatedAt": "2026-09-12T15:04:11.000Z", "ext": "", "disposition": "", "lastWorkDate": null, "state": "CA", "phone2": "", "phone2Ext": "", "phone3": "", "phone3Ext": "", "title": "Office Manager", "isUnsubscribed": false, "unsubscribedAt": null, "email2": "", "companyId": 318, "address": "100 Main St", "city": "San Diego", "zip": "92101", "country": "US", "avatarUrl": null, "phoneNorm": "5555550142", "phone2Norm": null, "phone3Norm": null } ``` --- # Update Contact Partially update a CRM contact. Only fields present in the body are changed. Setting disposition also sets lastWorkDate to now. Send companyId or ownerId as null to clear them. Changing email to one already used in your organization returns 409. Runs lead_status_changed, disposition_changed or contact_updated CRM workflows and returns the updated contact; _workflowDebug lists the workflows that ran. ```http PUT https://dashboard.vinsi.ai/api/crm/contacts/{contactId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | contactId | 1042 | ## Example request body ```json { "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142", "ext": "", "email2": "", "phone2": "", "phone2Ext": "", "phone3": "", "phone3Ext": "", "title": "Office Manager", "company": "Acme Dental", "companyId": 318, "leadStatus": "Contacted", "type": "lead", "source": "Website", "disposition": "Callback Requested", "ownerId": "cmexampleuser0000000000001", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "notes": "Asked for a callback next week.", "isUnsubscribed": false } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/crm/contacts/1042' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"firstName":"Alex","lastName":"Morgan","email":"alex.morgan@example.com","phone":"+15555550142","ext":"","email2":"","phone2":"","phone2Ext":"","phone3":"","phone3Ext":"","title":"Office Manager","company":"Acme Dental","companyId":318,"leadStatus":"Contacted","type":"lead","source":"Website","disposition":"Callback Requested","ownerId":"cmexampleuser0000000000001","address":"100 Main St","city":"San Diego","state":"CA","zip":"92101","country":"US","notes":"Asked for a callback next week.","isUnsubscribed":false}' ``` ## Example response ```json { "id": 1042, "organizationId": "cmexampleorg00000000000001", "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142", "company": "Acme Dental", "leadStatus": "Contacted", "type": "lead", "source": "Website", "notes": "Asked for a callback next week.", "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-10T17:22:57.000Z", "updatedAt": "2026-09-16T16:40:00.000Z", "ext": "", "disposition": "Callback Requested", "lastWorkDate": "2026-09-16T16:40:00.000Z", "state": "CA", "phone2": "", "phone2Ext": "", "phone3": "", "phone3Ext": "", "title": "Office Manager", "isUnsubscribed": false, "unsubscribedAt": null, "email2": "", "companyId": 318, "address": "100 Main St", "city": "San Diego", "zip": "92101", "country": "US", "avatarUrl": null, "phoneNorm": "5555550142", "phone2Norm": null, "phone3Norm": null, "_workflowDebug": [] } ``` --- # Delete Contact Permanently delete a CRM contact. Returns 404 if the contact does not exist in your organization. ```http DELETE https://dashboard.vinsi.ai/api/crm/contacts/{contactId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | contactId | 1042 | ## Example request ```bash curl -X DELETE 'https://dashboard.vinsi.ai/api/crm/contacts/1042' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "success": true } ``` --- # Get Companies List CRM companies in your organization. Send paginated=true for a paged response ({ items, total, page, pageSize, counts }) where each item includes customFieldValues keyed by custom tab ID; without it the endpoint returns a plain array of the newest 1,000 companies (lite=true returns fewer fields). Paged filters: search (name, industry, email, phone, address fields and custom field values), activeTab (all | my | ours | prospects, default all), filterType and filterIndustry (comma-separated lists), filterCreated (today | week | month | 3months), sortBy (name, industry, type, city, createdAt, updatedAt, email, phone, website, address, zip, country), sortDir (asc | desc, default desc). pageSize defaults to 25, max 100. ```http GET https://dashboard.vinsi.ai/api/crm/companies ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | paginated | no | true | | page | no | 1 | | pageSize | no | 25 | | search | no | acme | | activeTab | no | all | | filterType | no | prospect | | filterIndustry | no | Healthcare | | filterCreated | no | month | | sortBy | no | name | | sortDir | no | asc | | lite | no | false | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/companies' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "items": [ { "id": 318, "name": "Acme Dental", "industry": "Healthcare", "website": "https://acme-dental.example.com", "phone": "+15555550100", "email": "info@acme-dental.example.com", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "type": "prospect", "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-01T18:30:00.000Z", "updatedAt": "2026-09-01T18:30:00.000Z", "primaryContactId": 1042, "logoUrl": null, "customFieldValues": { "12": { "Number of Locations": "3" } } } ], "total": 1, "page": 1, "pageSize": 25, "counts": { "my": 1, "all": 42, "ours": 12, "prospects": 30 } } ``` --- # Get Company by ID Fetch a single CRM company by its numeric ID. Returns 404 if the company does not exist in your organization. ```http GET https://dashboard.vinsi.ai/api/crm/companies/{companyId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | companyId | 318 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/companies/318' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": 318, "organizationId": "cmexampleorg00000000000001", "name": "Acme Dental", "industry": "Healthcare", "website": "https://acme-dental.example.com", "phone": "+15555550100", "ext": "", "email": "info@acme-dental.example.com", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "type": "prospect", "notes": null, "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-01T18:30:00.000Z", "updatedAt": "2026-09-01T18:30:00.000Z", "primaryContactId": 1042, "reviewRating": "", "reviewCount": "", "logoUrl": null } ``` --- # Create Company Create a CRM company. name is required. type defaults to prospect. The owner is set to the user who owns the API key. If primaryContactId points at a contact with no company yet, that contact is linked to the new company (linkedContactsCount). Responds 201. ```http POST https://dashboard.vinsi.ai/api/crm/companies ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "name": "Acme Dental", "industry": "Healthcare", "website": "https://acme-dental.example.com", "phone": "+15555550100", "ext": "", "email": "info@acme-dental.example.com", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "type": "prospect", "notes": "", "primaryContactId": 1042 } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/crm/companies' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"name":"Acme Dental","industry":"Healthcare","website":"https://acme-dental.example.com","phone":"+15555550100","ext":"","email":"info@acme-dental.example.com","address":"100 Main St","city":"San Diego","state":"CA","zip":"92101","country":"US","type":"prospect","notes":"","primaryContactId":1042}' ``` ## Example response ```json { "id": 318, "organizationId": "cmexampleorg00000000000001", "name": "Acme Dental", "industry": "Healthcare", "website": "https://acme-dental.example.com", "phone": "+15555550100", "ext": "", "email": "info@acme-dental.example.com", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "type": "prospect", "notes": null, "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-01T18:30:00.000Z", "updatedAt": "2026-09-01T18:30:00.000Z", "primaryContactId": 1042, "reviewRating": "", "reviewCount": "", "logoUrl": null, "linkedContactsCount": 1 } ``` --- # Update Company Partially update a CRM company. Only fields present in the body are changed. ownerId must be a user in your organization; send it (or primaryContactId) as null to clear it. Returns the updated company. ```http PUT https://dashboard.vinsi.ai/api/crm/companies/{companyId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | companyId | 318 | ## Example request body ```json { "name": "Acme Dental", "industry": "Healthcare", "website": "https://acme-dental.example.com", "phone": "+15555550100", "ext": "", "email": "info@acme-dental.example.com", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "type": "client", "notes": "", "primaryContactId": 1042, "ownerId": "cmexampleuser0000000000001" } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/crm/companies/318' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"name":"Acme Dental","industry":"Healthcare","website":"https://acme-dental.example.com","phone":"+15555550100","ext":"","email":"info@acme-dental.example.com","address":"100 Main St","city":"San Diego","state":"CA","zip":"92101","country":"US","type":"client","notes":"","primaryContactId":1042,"ownerId":"cmexampleuser0000000000001"}' ``` ## Example response ```json { "id": 318, "organizationId": "cmexampleorg00000000000001", "name": "Acme Dental", "industry": "Healthcare", "website": "https://acme-dental.example.com", "phone": "+15555550100", "ext": "", "email": "info@acme-dental.example.com", "address": "100 Main St", "city": "San Diego", "state": "CA", "zip": "92101", "country": "US", "type": "client", "notes": null, "ownerId": "cmexampleuser0000000000001", "createdAt": "2026-09-01T18:30:00.000Z", "updatedAt": "2026-09-16T16:40:00.000Z", "primaryContactId": 1042, "reviewRating": "", "reviewCount": "", "logoUrl": null } ``` --- # Delete Company Delete a CRM company. Linked contacts are kept and unlinked. If activities, deals, engagements or invoices reference the company the request fails with 409 and a blockers object ({ activities, deals, engagements, invoices }) unless cascade=true, which unlinks those records and deletes the company. ```http DELETE https://dashboard.vinsi.ai/api/crm/companies/{companyId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | companyId | 318 | ## Query parameters | Name | Required | Example | |---|---|---| | cascade | no | true | ## Example request ```bash curl -X DELETE 'https://dashboard.vinsi.ai/api/crm/companies/318' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "success": true } ``` --- # Get Deals List CRM deals in your organization with owner, contact and company names. Send paginated=true for a paged response that also includes counts and totals (pipeline amount, MRR, annual); without it the endpoint returns a plain array of every deal. Paged filters: search (deal name), activeTab (open | won | lost | my | all, default open), filterStage, filterPriority and filterDealType (comma-separated lists), filterCreated (today | week | month | 3months), sortBy (dealName, dealStage, amount, amountEffective, closeDate, priority, pipeline, createdAt, updatedAt), sortDir (asc | desc, default desc). pageSize defaults to 25, max 100. ```http GET https://dashboard.vinsi.ai/api/crm/deals ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | paginated | no | true | | page | no | 1 | | pageSize | no | 25 | | search | no | annual | | activeTab | no | open | | filterStage | no | Appointment Scheduled | | filterPriority | no | High | | filterDealType | no | New Business | | filterCreated | no | month | | sortBy | no | amount | | sortDir | no | desc | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/deals' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "items": [ { "id": 77, "dealName": "Acme Dental - Annual Plan", "dealStage": "Appointment Scheduled", "pipeline": "Sales Pipeline", "dealType": "New Business", "priority": "High", "amount": 12000, "type": "one-time", "billingFrequency": null, "recurringAmount": null, "closeDate": "2026-10-31T00:00:00.000Z", "contactId": 1042, "companyId": 318, "dealOwnerId": "cmexampleuser0000000000001", "organizationId": "cmexampleorg00000000000001", "createdAt": "2026-09-05T16:00:00.000Z", "updatedAt": "2026-09-05T16:00:00.000Z", "dealOwnerName": "Jane Doe", "contactName": "Alex Morgan", "companyName": "Acme Dental", "companyLogoUrl": null, "hasEngagement": false } ], "total": 1, "page": 1, "pageSize": 25, "counts": { "my": 1, "all": 20, "open": 14, "won": 4, "lost": 2 }, "totals": { "pipeline": 12000, "mrr": 0, "annual": 0, "seats": 0 } } ``` --- # Get Deal by ID Fetch a single CRM deal by its numeric ID. Returns 404 if the deal does not exist in your organization. ```http GET https://dashboard.vinsi.ai/api/crm/deals/{dealId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | dealId | 77 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/deals/77' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": 77, "organizationId": "cmexampleorg00000000000001", "dealName": "Acme Dental - Annual Plan", "pipeline": "Sales Pipeline", "dealStage": "Appointment Scheduled", "amount": 12000, "closeDate": "2026-10-31T00:00:00.000Z", "dealOwnerId": "cmexampleuser0000000000001", "dealType": "New Business", "priority": "High", "contactId": 1042, "companyId": 318, "createdAt": "2026-09-05T16:00:00.000Z", "updatedAt": "2026-09-05T16:00:00.000Z", "type": "one-time", "billingFrequency": null, "recurringAmount": null } ``` --- # Create Deal Create a CRM deal. dealName is required. Defaults: pipeline Sales Pipeline, dealStage Appointment Scheduled, type one-time. For recurring deals set type to recurring with billingFrequency (Monthly, Quarterly, Semi-Annual, Annual) and recurringAmount. A deal created in a won stage must include amount (or recurringAmount for recurring deals), otherwise 400. Responds 201 and runs deal_created CRM workflows. ```http POST https://dashboard.vinsi.ai/api/crm/deals ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "dealName": "Acme Dental - Annual Plan", "pipeline": "Sales Pipeline", "dealStage": "Appointment Scheduled", "amount": 12000, "closeDate": "2026-10-31", "dealOwnerId": "cmexampleuser0000000000001", "dealType": "New Business", "priority": "High", "contactId": 1042, "companyId": 318, "type": "one-time", "billingFrequency": null, "recurringAmount": null } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/crm/deals' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"dealName":"Acme Dental - Annual Plan","pipeline":"Sales Pipeline","dealStage":"Appointment Scheduled","amount":12000,"closeDate":"2026-10-31","dealOwnerId":"cmexampleuser0000000000001","dealType":"New Business","priority":"High","contactId":1042,"companyId":318,"type":"one-time","billingFrequency":null,"recurringAmount":null}' ``` ## Example response ```json { "id": 77, "organizationId": "cmexampleorg00000000000001", "dealName": "Acme Dental - Annual Plan", "pipeline": "Sales Pipeline", "dealStage": "Appointment Scheduled", "amount": 12000, "closeDate": "2026-10-31T00:00:00.000Z", "dealOwnerId": "cmexampleuser0000000000001", "dealType": "New Business", "priority": "High", "contactId": 1042, "companyId": 318, "createdAt": "2026-09-05T16:00:00.000Z", "updatedAt": "2026-09-05T16:00:00.000Z", "type": "one-time", "billingFrequency": null, "recurringAmount": null } ``` --- # Update Deal Partially update a CRM deal. Only fields present in the body are changed. Moving a deal into a won stage requires an amount (recurringAmount for recurring deals), otherwise 400 with the missing field. Changing dealStage runs deal_stage_changed CRM workflows. Returns the updated deal. ```http PUT https://dashboard.vinsi.ai/api/crm/deals/{dealId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | dealId | 77 | ## Example request body ```json { "dealStage": "Closed Won", "amount": 12000, "closeDate": "2026-09-16" } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/crm/deals/77' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"dealStage":"Closed Won","amount":12000,"closeDate":"2026-09-16"}' ``` ## Example response ```json { "id": 77, "organizationId": "cmexampleorg00000000000001", "dealName": "Acme Dental - Annual Plan", "pipeline": "Sales Pipeline", "dealStage": "Closed Won", "amount": 12000, "closeDate": "2026-09-16T00:00:00.000Z", "dealOwnerId": "cmexampleuser0000000000001", "dealType": "New Business", "priority": "High", "contactId": 1042, "companyId": 318, "createdAt": "2026-09-05T16:00:00.000Z", "updatedAt": "2026-09-16T16:40:00.000Z", "type": "one-time", "billingFrequency": null, "recurringAmount": null } ``` --- # Delete Deal Permanently delete a CRM deal. Returns 404 if the deal does not exist in your organization. ```http DELETE https://dashboard.vinsi.ai/api/crm/deals/{dealId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | dealId | 77 | ## Example request ```bash curl -X DELETE 'https://dashboard.vinsi.ai/api/crm/deals/77' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "success": true } ``` --- # Get Activities List every CRM activity in your organization, newest first, with requester, assignee, department, group, contact and company details. Optionally filter by contactId, companyId, dealId or engagementId. This endpoint is not paginated. ```http GET https://dashboard.vinsi.ai/api/crm/activities ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | contactId | no | 1042 | | companyId | no | 318 | | dealId | no | 77 | | engagementId | no | | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/activities' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json [ { "id": 5120, "activityNumber": "ACT-00128-K3F9", "subject": "Follow up on pricing question", "description": "Customer asked for pricing on the annual plan. Send a quote.", "status": "Open", "priority": "Medium", "type": "Task", "source": "Portal", "dueBy": "2026-09-18T17:00:00.000Z", "organizationId": "cmexampleorg00000000000001", "requesterId": "cmexampleuser0000000000001", "assignedToId": "cmexampleuser0000000000002", "departmentId": null, "groupId": null, "tags": "[\"pricing\"]", "customFields": "{}", "contactId": 1042, "companyId": 318, "dealId": 77, "engagementId": null, "closedAt": null, "resolvedAt": null, "firstResponseAt": null, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:11:05.000Z", "updatedAt": "2026-09-15T20:11:05.000Z", "Requester": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" }, "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "Department": null, "Group": null, "Contact": { "id": 1042, "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142" }, "Company": { "id": 318, "name": "Acme Dental" } } ] ``` --- # Get Activity by ID Fetch a single CRM activity by its numeric ID, including its notes. Returns 404 if the activity does not exist in your organization. ```http GET https://dashboard.vinsi.ai/api/crm/activities/{activityId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | activityId | 5120 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/activities/5120' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": 5120, "activityNumber": "ACT-00128-K3F9", "subject": "Follow up on pricing question", "description": "Customer asked for pricing on the annual plan. Send a quote.", "status": "Open", "priority": "Medium", "type": "Task", "source": "Portal", "dueBy": "2026-09-18T17:00:00.000Z", "organizationId": "cmexampleorg00000000000001", "requesterId": "cmexampleuser0000000000001", "assignedToId": "cmexampleuser0000000000002", "departmentId": null, "groupId": null, "tags": "[\"pricing\"]", "customFields": "{}", "contactId": 1042, "companyId": 318, "dealId": 77, "engagementId": null, "closedAt": null, "resolvedAt": null, "firstResponseAt": null, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:11:05.000Z", "updatedAt": "2026-09-15T20:11:05.000Z", "Requester": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" }, "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "Department": null, "Group": null, "Contact": { "id": 1042, "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142" }, "Company": { "id": 318, "name": "Acme Dental" }, "Notes": [ { "id": 3301, "activityId": 5120, "userId": "cmexampleuser0000000000002", "body": "Left a voicemail, will try again tomorrow.", "isPrivate": false, "createdAt": "2026-09-15T22:00:00.000Z", "updatedAt": "2026-09-15T22:00:00.000Z", "User": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" } } ] } ``` --- # Create Activity Create a CRM activity. subject and description are required. Defaults: priority Low, type Incident, source Portal, status Open. The requester is the user who owns the API key. dueBy accepts any date string; a year other than the current one is replaced with the current year and an unparseable value is ignored. tags is an array of strings. When assignedToId is set the assignee receives an assignment email. Responds 201 with the activity and its related records. ```http POST https://dashboard.vinsi.ai/api/crm/activities ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "subject": "Follow up on pricing question", "description": "Customer asked for pricing on the annual plan. Send a quote.", "priority": "Medium", "type": "Task", "source": "Portal", "dueBy": "2026-09-18T17:00:00.000Z", "assignedToId": "cmexampleuser0000000000002", "tags": [ "pricing" ], "contactId": 1042, "companyId": 318, "dealId": 77 } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/crm/activities' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"subject":"Follow up on pricing question","description":"Customer asked for pricing on the annual plan. Send a quote.","priority":"Medium","type":"Task","source":"Portal","dueBy":"2026-09-18T17:00:00.000Z","assignedToId":"cmexampleuser0000000000002","tags":["pricing"],"contactId":1042,"companyId":318,"dealId":77}' ``` ## Example response ```json { "id": 5120, "activityNumber": "ACT-00128-K3F9", "subject": "Follow up on pricing question", "description": "Customer asked for pricing on the annual plan. Send a quote.", "status": "Open", "priority": "Medium", "type": "Task", "source": "Portal", "dueBy": "2026-09-18T17:00:00.000Z", "organizationId": "cmexampleorg00000000000001", "requesterId": "cmexampleuser0000000000001", "assignedToId": "cmexampleuser0000000000002", "departmentId": null, "groupId": null, "tags": "[\"pricing\"]", "customFields": "{}", "contactId": 1042, "companyId": 318, "dealId": 77, "engagementId": null, "closedAt": null, "resolvedAt": null, "firstResponseAt": null, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:11:05.000Z", "updatedAt": "2026-09-15T20:11:05.000Z", "Requester": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" }, "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "Department": null, "Group": null, "Contact": { "id": 1042, "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142" }, "Company": { "id": 318, "name": "Acme Dental" } } ``` --- # Update Activity Partially update a CRM activity (PATCH is also accepted). Only fields present in the body are changed. Setting status to Resolved or Closed records resolvedAt or closedAt the first time. Reassigning with a new assignedToId emails the new assignee. Returns the updated activity with its related records. ```http PUT https://dashboard.vinsi.ai/api/crm/activities/{activityId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | activityId | 5120 | ## Example request body ```json { "subject": "Follow up on pricing question", "description": "Quote sent by email.", "status": "Resolved", "priority": "Medium", "type": "Task", "source": "Portal", "dueBy": "2026-09-18T17:00:00.000Z", "assignedToId": "cmexampleuser0000000000002", "contactId": 1042, "companyId": 318, "tags": [ "pricing", "quote-sent" ] } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/crm/activities/5120' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"subject":"Follow up on pricing question","description":"Quote sent by email.","status":"Resolved","priority":"Medium","type":"Task","source":"Portal","dueBy":"2026-09-18T17:00:00.000Z","assignedToId":"cmexampleuser0000000000002","contactId":1042,"companyId":318,"tags":["pricing","quote-sent"]}' ``` ## Example response ```json { "id": 5120, "activityNumber": "ACT-00128-K3F9", "subject": "Follow up on pricing question", "description": "Quote sent by email.", "status": "Resolved", "priority": "Medium", "type": "Task", "source": "Portal", "dueBy": "2026-09-18T17:00:00.000Z", "organizationId": "cmexampleorg00000000000001", "requesterId": "cmexampleuser0000000000001", "assignedToId": "cmexampleuser0000000000002", "departmentId": null, "groupId": null, "tags": "[\"pricing\",\"quote-sent\"]", "customFields": "{}", "contactId": 1042, "companyId": 318, "dealId": 77, "engagementId": null, "closedAt": null, "resolvedAt": "2026-09-16T16:40:00.000Z", "firstResponseAt": null, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:11:05.000Z", "updatedAt": "2026-09-16T16:40:00.000Z", "Requester": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" }, "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "Department": null, "Group": null, "Contact": { "id": 1042, "firstName": "Alex", "lastName": "Morgan", "email": "alex.morgan@example.com", "phone": "+15555550142" }, "Company": { "id": 318, "name": "Acme Dental" } } ``` --- # Delete Activity Permanently delete a CRM activity and its tasks. With an API key the delete is allowed only when the key's user is the activity's requester or assignee; otherwise 403. ```http DELETE https://dashboard.vinsi.ai/api/crm/activities/{activityId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | activityId | 5120 | ## Example request ```bash curl -X DELETE 'https://dashboard.vinsi.ai/api/crm/activities/5120' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "success": true } ``` --- # Get Activity Tasks List the tasks of a CRM activity, ordered by sortOrder then creation time. activityId is required. ```http GET https://dashboard.vinsi.ai/api/crm/activity-tasks?activityId={activityId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Query parameters | Name | Required | Example | |---|---|---| | activityId | yes | 5120 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/activity-tasks?activityId=5120' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json [ { "id": 901, "activityId": 5120, "title": "Email the annual plan quote", "description": "Use the standard pricing template.", "status": "Open", "assignedToId": "cmexampleuser0000000000002", "dueBy": "2026-09-17T17:00:00.000Z", "createdById": "cmexampleuser0000000000001", "completedAt": null, "sortOrder": 1, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:15:00.000Z", "updatedAt": "2026-09-15T20:15:00.000Z", "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "CreatedBy": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" } } ] ``` --- # Get Activity Task by ID Fetch a single activity task by its numeric ID, including the parent activity's number and subject. Returns 404 if not found and 403 if the task belongs to another organization. ```http GET https://dashboard.vinsi.ai/api/crm/activity-tasks/{taskId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | taskId | 901 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/crm/activity-tasks/901' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": 901, "activityId": 5120, "title": "Email the annual plan quote", "description": "Use the standard pricing template.", "status": "Open", "assignedToId": "cmexampleuser0000000000002", "dueBy": "2026-09-17T17:00:00.000Z", "createdById": "cmexampleuser0000000000001", "completedAt": null, "sortOrder": 1, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:15:00.000Z", "updatedAt": "2026-09-15T20:15:00.000Z", "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "CreatedBy": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" }, "Activity": { "id": 5120, "activityNumber": "ACT-00128-K3F9", "subject": "Follow up on pricing question", "organizationId": "cmexampleorg00000000000001" } } ``` --- # Create Activity Task Add a task to a CRM activity. activityId and title are required. The task is created with status Open, placed last in the activity's task order, and createdById set to the user who owns the API key. Responds 201. ```http POST https://dashboard.vinsi.ai/api/crm/activity-tasks ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "activityId": 5120, "title": "Email the annual plan quote", "description": "Use the standard pricing template.", "assignedToId": "cmexampleuser0000000000002", "dueBy": "2026-09-17T17:00:00.000Z" } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/crm/activity-tasks' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"activityId":5120,"title":"Email the annual plan quote","description":"Use the standard pricing template.","assignedToId":"cmexampleuser0000000000002","dueBy":"2026-09-17T17:00:00.000Z"}' ``` ## Example response ```json { "id": 901, "activityId": 5120, "title": "Email the annual plan quote", "description": "Use the standard pricing template.", "status": "Open", "assignedToId": "cmexampleuser0000000000002", "dueBy": "2026-09-17T17:00:00.000Z", "createdById": "cmexampleuser0000000000001", "completedAt": null, "sortOrder": 1, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:15:00.000Z", "updatedAt": "2026-09-15T20:15:00.000Z", "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "CreatedBy": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" } } ``` --- # Update Activity Task Partially update an activity task (PATCH is also accepted). Only fields present in the body are changed. Setting status to Completed records completedAt; any other status clears it. Returns 403 if the task belongs to another organization. ```http PUT https://dashboard.vinsi.ai/api/crm/activity-tasks/{taskId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | taskId | 901 | ## Example request body ```json { "title": "Email the annual plan quote", "description": "Sent with the standard pricing template.", "status": "Completed", "assignedToId": "cmexampleuser0000000000002", "dueBy": "2026-09-17T17:00:00.000Z", "sortOrder": 1 } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/crm/activity-tasks/901' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"title":"Email the annual plan quote","description":"Sent with the standard pricing template.","status":"Completed","assignedToId":"cmexampleuser0000000000002","dueBy":"2026-09-17T17:00:00.000Z","sortOrder":1}' ``` ## Example response ```json { "id": 901, "activityId": 5120, "title": "Email the annual plan quote", "description": "Sent with the standard pricing template.", "status": "Completed", "assignedToId": "cmexampleuser0000000000002", "dueBy": "2026-09-17T17:00:00.000Z", "createdById": "cmexampleuser0000000000001", "completedAt": "2026-09-16T16:40:00.000Z", "sortOrder": 1, "lastDueReminderAt": null, "createdAt": "2026-09-15T20:15:00.000Z", "updatedAt": "2026-09-16T16:40:00.000Z", "AssignedTo": { "id": "cmexampleuser0000000000002", "firstName": "Sam", "lastName": "Rivera", "email": "sam.rivera@example.com" }, "CreatedBy": { "id": "cmexampleuser0000000000001", "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" } } ``` --- # Delete Activity Task Permanently delete an activity task. With an API key the delete is allowed only when the key's user created the task or is assigned to it; otherwise 403. ```http DELETE https://dashboard.vinsi.ai/api/crm/activity-tasks/{taskId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | taskId | 901 | ## Example request ```bash curl -X DELETE 'https://dashboard.vinsi.ai/api/crm/activity-tasks/901' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "success": true } ``` --- # Get Tools Fetch every tool in your organization, newest first. configuration is a JSON string. mine is true when the tool was created by the user who owns the API key. ```http GET https://dashboard.vinsi.ai/api/tools ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/tools' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json [ { "id": "cmexampletool000000000001", "name": "example-tool", "description": "example tool description", "type": "TransferCall", "configuration": "{\"phoneNumber\":\"+18001234567\",\"transferMessage\":\"transfer message\"}", "createdAt": "2026-01-27T16:15:42.751Z", "updatedAt": "2026-01-27T16:15:42.751Z", "userId": "cmexampleuser0000000000001", "organizationId": "cmexampleorg00000000000001", "dtmfOnly": null, "mine": true } ] ``` --- # Get Tool by ID Fetch a tool by ID. configuration is returned as a parsed object. Returns 404 if the tool does not exist and 403 if it belongs to another organization. ```http GET https://dashboard.vinsi.ai/api/tools/{toolId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | toolId | cmexampletool000000000001 | ## Example request ```bash curl -X GET 'https://dashboard.vinsi.ai/api/tools/cmexampletool000000000001' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json { "id": "cmexampletool000000000001", "name": "example-tool", "description": "example tool description", "type": "TransferCall", "configuration": { "phoneNumber": "+18001234567", "transferMessage": "transfer message" }, "createdAt": "2026-01-27T16:15:42.751Z", "updatedAt": "2026-01-27T16:15:42.751Z", "userId": "cmexampleuser0000000000001", "organizationId": "cmexampleorg00000000000001", "dtmfOnly": null } ``` --- # Create Tool Create a tool in your organization. name and type are required. type must be one of Function, DTMF, Documents, TransferCall, EndCall, GoHighLevelAPI, HubSpotAPI, SalesforceAPI, VinsiSaasCrmAPI, AfterCallAction, EpicFhirAPI. configuration can be an object or a JSON string and is stored as a JSON string. Responds 201. ```http POST https://dashboard.vinsi.ai/api/tools ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Example request body ```json { "name": "example-tool", "type": "TransferCall", "description": "example tool description", "configuration": { "phoneNumber": "+18001234567", "transferMessage": "transfer message" } } ``` ## Example request ```bash curl -X POST 'https://dashboard.vinsi.ai/api/tools' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"name":"example-tool","type":"TransferCall","description":"example tool description","configuration":{"phoneNumber":"+18001234567","transferMessage":"transfer message"}}' ``` ## Example response ```json { "id": "cmexampletool000000000001", "name": "example-tool", "description": "example tool description", "type": "TransferCall", "configuration": "{\"phoneNumber\":\"+18001234567\",\"transferMessage\":\"transfer message\"}", "createdAt": "2026-01-27T16:15:42.751Z", "updatedAt": "2026-01-27T16:15:42.751Z", "userId": "cmexampleuser0000000000001", "organizationId": "cmexampleorg00000000000001", "dtmfOnly": null } ``` --- # Update Tool Update a tool. name and type are required. type must be one of Function, DTMF, Documents, TransferCall, EndCall, GoHighLevelAPI, VinsiSaasCrmAPI, AfterCallAction, EpicFhirAPI. If configuration is omitted the existing configuration is kept. configuration is returned as a parsed object. ```http PUT https://dashboard.vinsi.ai/api/tools/{toolId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | toolId | cmexampletool000000000001 | ## Example request body ```json { "name": "example-tool", "type": "TransferCall", "dtmfOnly": false, "description": "example tool description", "configuration": { "phoneNumber": "+18001234567", "transferMessage": "transfer message" } } ``` ## Example request ```bash curl -X PUT 'https://dashboard.vinsi.ai/api/tools/cmexampletool000000000001' \ -H 'x-api-key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"name":"example-tool","type":"TransferCall","dtmfOnly":false,"description":"example tool description","configuration":{"phoneNumber":"+18001234567","transferMessage":"transfer message"}}' ``` ## Example response ```json { "id": "cmexampletool000000000001", "name": "example-tool", "description": "example tool description", "type": "TransferCall", "configuration": { "phoneNumber": "+18001234567", "transferMessage": "transfer message" }, "createdAt": "2026-01-27T16:15:42.751Z", "updatedAt": "2026-01-27T16:15:42.751Z", "userId": "cmexampleuser0000000000001", "dtmfOnly": null } ``` --- # Delete Tool Delete a tool and remove it from every agent that uses it. Responds 204 No Content with an empty body. ```http DELETE https://dashboard.vinsi.ai/api/tools/{toolId} ``` ## Authentication Send your API key in the `x-api-key` header. Create keys in the VINSI dashboard under Settings → API Keys. ## Headers | Name | Type | Required | |---|---|---| | Content-Type | string | yes (application/json) | | x-api-key | string | yes | ## Path parameters | Name | Example | |---|---| | toolId | cmexampletool000000000001 | ## Example request ```bash curl -X DELETE 'https://dashboard.vinsi.ai/api/tools/cmexampletool000000000001' \ -H 'x-api-key: YOUR_API_KEY' ``` ## Example response ```json {} ```