# Calendar Endpoints Source: https://docs.vapify.agency/api-reference/calendar-endpoints Reference for availability checks, bookings, updates, and cancellations in the Vapify Calendar API. ## Overview This page documents the concrete Calendar API endpoints. Every request uses the base URL and authentication method described in the [Calendar API overview](/api-reference/introduction). *** ## Check Availability Retrieve available time slots for a date range. ```http theme={null} GET /calendar/availability ``` **Required permission:** `canCheckAvailability` ### Query Parameters | Parameter | Type | Required | Description | | ------------- | --------------- | -------- | -------------------------------------------- | | `startDate` | ISO 8601 string | Yes | Start of the availability window | | `endDate` | ISO 8601 string | Yes | End of the availability window | | `eventTypeId` | integer | No | Filter availability to a specific event type | | `duration` | integer | No | Desired slot duration in minutes | | `timezone` | string | No | IANA timezone such as `America/New_York` | ### Example Request ```http theme={null} GET /calendar/availability?startDate=2024-03-20T00:00:00Z&endDate=2024-03-21T00:00:00Z&timezone=America/New_York x-calendar-api-key: YOUR_API_KEY ``` ### Response `200 OK` Returns an array of days, each with the open `slots` for that day. `start` and `end` are ISO 8601 timestamps. ```json theme={null} [ { "date": "2024-03-20", "slots": [ { "start": "2024-03-20T09:00:00Z", "end": "2024-03-20T09:30:00Z" }, { "start": "2024-03-20T10:00:00Z", "end": "2024-03-20T10:30:00Z" } ] }, { "date": "2024-03-21", "slots": [] } ] ``` *** ## List Bookings Retrieve bookings with optional filters and pagination. ```http theme={null} GET /calendar/bookings ``` **Required permission:** `canGetBookings` ### Query Parameters | Parameter | Type | Required | Description | | ------------- | --------------- | -------- | ------------------------------------------------------------------------ | | `startDate` | ISO 8601 string | No | Return bookings starting on or after this time | | `endDate` | ISO 8601 string | No | Return bookings ending on or before this time | | `status` | string | No | Filter by `pending`, `confirmed`, `cancelled`, `completed`, or `no_show` | | `eventTypeId` | integer | No | Filter by event type | | `email` | string | No | Filter by attendee email address | | `limit` | integer | No | Number of results to return. Default: `50` | | `offset` | integer | No | Pagination offset. Default: `0` | ### Example Request ```http theme={null} GET /calendar/bookings?status=confirmed&limit=10&offset=0 x-calendar-api-key: YOUR_API_KEY ``` ### Response `200 OK` ```json theme={null} { "bookings": [ { "id": 123, "startTime": "2024-03-20T09:00:00Z", "endTime": "2024-03-20T09:30:00Z", "status": "confirmed", "title": "Consultation Call", "description": "Initial consultation", "location": "https://meet.google.com/abc-defg-hij", "timezone": "America/New_York", "metadata": {}, "attendees": [ { "id": 456, "email": "client@example.com", "name": "John Doe", "firstName": "John", "lastName": "Doe", "phone": "+1234567890", "timezone": "America/New_York", "isOrganizer": false, "createdAt": "2024-03-15T10:00:00Z", "updatedAt": "2024-03-15T10:00:00Z" } ], "confirmedAt": "2024-03-16T10:00:00Z", "cancelledAt": null, "completedAt": null } ], "total": 100, "limit": 10, "offset": 0 } ``` *** ## Get Booking Retrieve a single booking by ID. ```http theme={null} GET /calendar/bookings/:id ``` **Required permission:** `canGetBookings` ### Path Parameters | Parameter | Type | Required | Description | | --------- | ------- | -------- | ----------- | | `id` | integer | Yes | Booking ID | ### Example Request ```http theme={null} GET /calendar/bookings/123 x-calendar-api-key: YOUR_API_KEY ``` ### Response `200 OK` ```json theme={null} { "id": 123, "startTime": "2024-03-20T09:00:00Z", "endTime": "2024-03-20T09:30:00Z", "status": "confirmed", "title": "Consultation Call", "description": "Initial consultation", "location": "https://meet.google.com/abc-defg-hij", "timezone": "America/New_York", "metadata": {}, "attendees": [ { "id": 456, "email": "client@example.com", "name": "John Doe", "firstName": "John", "lastName": "Doe", "phone": "+1234567890", "timezone": "America/New_York", "isOrganizer": false, "createdAt": "2024-03-15T10:00:00Z", "updatedAt": "2024-03-15T10:00:00Z" } ], "confirmedAt": "2024-03-16T10:00:00Z", "cancelledAt": null, "completedAt": null } ``` *** ## Create Booking Create a booking for a specific event type. ```http theme={null} POST /calendar/event-types/:eventTypeId/bookings ``` **Required permission:** `canBook` ### Path Parameters | Parameter | Type | Required | Description | | ------------- | ------- | -------- | ------------------ | | `eventTypeId` | integer | Yes | Event type to book | ### Request Body ```json theme={null} { "idempotencyKey": "unique-key-for-this-booking", "startTime": "2024-03-20T09:00:00Z", "endTime": "2024-03-20T09:30:00Z", "timezone": "America/New_York", "title": "Consultation Call", "description": "Initial consultation", "attendees": [ { "email": "client@example.com", "name": "John Doe", "firstName": "John", "lastName": "Doe", "phone": "+1234567890" } ], "metadata": {} } ``` ### Body Fields | Field | Type | Required | Description | | ---------------- | --------------- | -------- | ------------------------------------------------ | | `startTime` | ISO 8601 string | Yes | Booking start time | | `endTime` | ISO 8601 string | Yes | Booking end time | | `attendees` | array | Yes | At least one attendee with a valid `email` | | `timezone` | string | No | IANA timezone such as `America/New_York` | | `title` | string | No | Booking title | | `description` | string | No | Booking description | | `idempotencyKey` | string | No | Unique retry key to prevent duplicate bookings | | `metadata` | object | No | Arbitrary key-value data attached to the booking | Use `idempotencyKey` when retrying a booking request from an AI agent or workflow. If the same key is reused, the existing booking is returned instead of creating a duplicate. ### Example Request ```http theme={null} POST /calendar/event-types/42/bookings x-calendar-api-key: YOUR_API_KEY Content-Type: application/json { "startTime": "2024-03-20T09:00:00Z", "endTime": "2024-03-20T09:30:00Z", "timezone": "America/New_York", "title": "Consultation Call", "attendees": [ { "email": "client@example.com", "name": "John Doe" } ] } ``` ### Response `201 Created` ```json theme={null} { "id": 123, "uid": "bk_abc123xyz", "startTime": "2024-03-20T09:00:00Z", "endTime": "2024-03-20T09:30:00Z", "status": "pending", "title": "Consultation Call", "description": null, "location": null, "timezone": "America/New_York", "metadata": {}, "attendees": [ { "id": 456, "email": "client@example.com", "name": "John Doe", "firstName": null, "lastName": null, "phone": null, "timezone": "America/New_York", "isOrganizer": false, "createdAt": "2024-03-15T10:00:00Z", "updatedAt": "2024-03-15T10:00:00Z" } ], "confirmedAt": null, "cancelledAt": null, "completedAt": null } ``` *** ## Update Booking Update booking details or reschedule an existing booking. ```http theme={null} PUT /calendar/event-types/:eventTypeId/bookings/:id ``` **Required permission:** `canBook` ### Path Parameters | Parameter | Type | Required | Description | | ------------- | ------- | -------- | -------------------------------------- | | `eventTypeId` | integer | Yes | Event type associated with the booking | | `id` | integer | Yes | Booking ID | ### Request Body All fields are optional. Only send the fields you want to change. ```json theme={null} { "startTime": "2024-03-20T10:00:00Z", "endTime": "2024-03-20T10:30:00Z", "timezone": "America/Chicago", "title": "Rescheduled Consultation", "description": "Rescheduled from earlier slot", "attendees": [ { "email": "client@example.com", "name": "John Doe" } ], "metadata": {} } ``` ### Example Request ```http theme={null} PUT /calendar/event-types/42/bookings/123 x-calendar-api-key: YOUR_API_KEY Content-Type: application/json { "startTime": "2024-03-20T10:00:00Z", "endTime": "2024-03-20T10:30:00Z" } ``` ### Response `200 OK` ```json theme={null} { "id": 123, "startTime": "2024-03-20T10:00:00Z", "endTime": "2024-03-20T10:30:00Z", "status": "pending", "title": "Rescheduled Consultation", "description": "Rescheduled from earlier slot", "timezone": "America/Chicago", "attendees": [ { "id": 456, "email": "client@example.com", "name": "John Doe", "createdAt": "2024-03-15T10:00:00Z", "updatedAt": "2024-03-20T08:00:00Z" } ] } ``` *** ## Cancel Booking Cancel an existing booking. ```http theme={null} DELETE /calendar/bookings/:id ``` **Required permission:** `canCancel` ### Path Parameters | Parameter | Type | Required | Description | | --------- | ------- | -------- | ----------- | | `id` | integer | Yes | Booking ID | ### Request Body ```json theme={null} { "reason": "Client requested reschedule" } ``` | Field | Type | Required | Description | | -------- | ------ | -------- | -------------------------------- | | `reason` | string | No | Optional reason for cancellation | ### Example Request ```http theme={null} DELETE /calendar/bookings/123 x-calendar-api-key: YOUR_API_KEY Content-Type: application/json { "reason": "Client requested reschedule" } ``` ### Response `200 OK` ```json theme={null} { "id": 123, "status": "cancelled", "cancelledAt": "2024-03-15T15:00:00Z", "cancellationReason": "Client requested reschedule" } ``` *** ## Error Responses All error responses follow the same structure: ```json theme={null} { "statusCode": 401, "message": "Invalid or inactive API key" } ``` ### Error Codes | Status Code | Meaning | Common Causes | | ----------------------- | --------------------- | ------------------------------------------------------------------------------------------------- | | `400 Bad Request` | Invalid request | Missing required fields, invalid date formats, duplicate `idempotencyKey`, or time slot conflicts | | `401 Unauthorized` | Authentication failed | Missing, invalid, expired, or inactive API key | | `403 Forbidden` | Permission denied | API key does not have the required permission for the operation | | `404 Not Found` | Resource not found | Booking or event type does not exist | | `429 Too Many Requests` | Rate limit exceeded | More than 60 requests per minute from one API key | ### Common `401` Messages | Message | Description | | -------------------------------------------- | ----------------------------------------------------- | | `"Invalid or inactive API key"` | The key does not exist or has been deactivated | | `"API key has expired"` | The configured expiry date has passed | | `"API key not associated with a subaccount"` | The key is not linked to a usable subaccount calendar | ### Common `403` Messages | Message | Description | | ----------------------------------------------------------- | ------------------------------------ | | `"API key does not have 'canCheckAvailability' permission"` | Key cannot check availability | | `"API key does not have 'canGetBookings' permission"` | Key cannot read bookings | | `"API key does not have 'canBook' permission"` | Key cannot create or update bookings | | `"API key does not have 'canCancel' permission"` | Key cannot cancel bookings | # Calendar API Source: https://docs.vapify.agency/api-reference/introduction Authenticate with scoped API keys to check availability and manage bookings for a subaccount calendar. ## Welcome The Vapify Calendar API is designed for AI agents, automation tools, and external systems that need to work with a subaccount's scheduling data. With the correct API key, an integration can check availability, retrieve bookings, create appointments, update bookings, and cancel them. Full request and response reference for every calendar endpoint This API is the **agent surface**: it covers calendar availability and bookings only. **Contacts are not exposed to this API key** — they're managed from the dashboard under an authenticated session. *** ## Get an API key From the sidebar, open **Calendar → API Keys**. Only agency owners can create calendar API keys. Click **Create API Key**, give it a name, optionally set an expiry, and select the permissions the integration needs (see the permission model below). Copy the plain-text key immediately — it's shown only once. The key is scoped to the selected subaccount. Full product walkthrough: [Calendar integration](/integrations/calendar). *** ## Base URL ```http theme={null} https://app.vapify.agency/v1/api ``` ## Authentication All endpoints require an API key in the `x-calendar-api-key` request header. ```http theme={null} x-calendar-api-key: YOUR_API_KEY ``` The plain-text API key is only shown once when you create it. Store it securely because it cannot be retrieved later. *** ## Permission Model Each key is permission-scoped. The key must include the correct permission for the operation being requested. | UI Label | Permission ID | Grants Access To | | ------------------ | ---------------------- | ------------------------------------- | | Check availability | `canCheckAvailability` | Availability lookup endpoints | | Get bookings | `canGetBookings` | Booking read endpoints | | Book appointments | `canBook` | Booking creation and update endpoints | | Cancel bookings | `canCancel` | Booking cancellation endpoints | This lets you create narrowly scoped keys for different automation jobs instead of reusing one all-access key everywhere. *** ## Rate Limiting * **Limit:** 60 requests per minute per API key * **Window:** Sliding 1-minute window * **Failure response:** `429 Too Many Requests` If you are building an AI workflow, add retry logic with backoff instead of sending burst retries. *** ## Endpoint Summary | Method | Endpoint | Required Permission | Purpose | | -------- | ------------------------------------------------- | ---------------------- | ----------------------------------------- | | `GET` | `/calendar/availability` | `canCheckAvailability` | Return available time slots | | `GET` | `/calendar/bookings` | `canGetBookings` | List bookings with filters and pagination | | `GET` | `/calendar/bookings/:id` | `canGetBookings` | Retrieve a single booking | | `POST` | `/calendar/event-types/:eventTypeId/bookings` | `canBook` | Create a booking | | `PUT` | `/calendar/event-types/:eventTypeId/bookings/:id` | `canBook` | Update or reschedule a booking | | `DELETE` | `/calendar/bookings/:id` | `canCancel` | Cancel a booking | Continue to [Calendar Endpoints](/api-reference/calendar-endpoints) for field-level request and response examples. *** ## Common Booking Fields Most booking responses use the same core fields: | Field | Type | Description | | ------------- | ---------------- | ------------------------------------------------------------------------------------ | | `id` | integer | Numeric booking identifier | | `uid` | string | Unique booking UID when returned | | `startTime` | ISO 8601 string | Booking start time | | `endTime` | ISO 8601 string | Booking end time | | `status` | string | Booking state such as `pending`, `confirmed`, `cancelled`, `completed`, or `no_show` | | `timezone` | string | Booking timezone | | `title` | string | Booking title | | `description` | string or `null` | Optional notes or description | | `location` | string or `null` | Booking location or meeting URL | | `metadata` | object | Arbitrary data attached to the booking | | `attendees` | array | Attendee list and attendee metadata | *** ## Error Format Calendar API errors use a simple JSON body: ```json theme={null} { "statusCode": 401, "message": "Invalid or inactive API key" } ``` The full list of common error codes and messages is documented on [Calendar Endpoints](/api-reference/calendar-endpoints). # How Billing Works Source: https://docs.vapify.agency/billing/how-billing-works The money flow from provider cost to client charge to your payout, in one place. ## Overview This is the anchor page for everything money-related in Vapify. Every other billing page links back here instead of re-explaining the flow. ## The flow ```mermaid theme={null} flowchart TD A["Your Client"] -->|"Pays you via Stripe"| B["You manage their account"] B --> C["Vapify tracks usage & handles billing"] C --> D["Voice Provider (Vapi/Retell) processes calls"] ``` * **Provider cost**: what Vapi or Retell charges for the call. * **Your markup**: what you add on top. * **Client charge**: what your client pays. **Example (Apex Voice / Riverside Dental):** Vapi charges \$0.15/minute. Apex Voice charges Riverside Dental \$0.20/minute. Apex Voice keeps \$0.05/minute profit. Vapify does not block a call before it happens. For **per-minute billing**, it runs a profitability check **after** each call: if your price came in below provider cost, the charge is held as pending and the assistant is flagged **Pricing Review Required**. Override this per sub account with **Support Unprofitable Calls**. **Package and overage billing are not checked at all** — price those above cost yourself. See [Profit Tracking](/billing/profit-tracking). ## Two billing models Vapify supports **per-minute + optional monthly fee** and **monthly packages with included minutes**. You can mix models across clients. See [Pricing Models](/billing/pricing-models) for the full comparison. ## Where clients' money comes from Clients fund calls from two "wallets": **Balance** (money they load themselves via Stripe) and **Credits** (bonus funds you grant). Credits are always spent first. See [Wallet & Credits](/billing/wallet-credits). ## Where your money goes Client payments go directly to your connected Stripe account. Vapify never holds your funds. See [Stripe Integration](/billing/stripe-integration). ## Related Articles * [Pricing Models](/billing/pricing-models): per-minute vs. monthly packages in detail * [Wallet & Credits](/billing/wallet-credits): Balance vs. Credits and how they're consumed * [Profit Tracking](/billing/profit-tracking): where your margin shows up in reporting # Invoices Source: https://docs.vapify.agency/billing/invoices Where client invoices come from and what they show. ## Overview Invoices are generated through your connected Stripe account and carry your agency's branding. Clients never see Vapify's name on a bill. ## What appears on an invoice * Monthly subscription or package fees, billed automatically on the client's billing anniversary * Per-minute usage charges for the billing period * Package base fee and overage charges, itemized separately ## Related Articles * [How Billing Works](/billing/how-billing-works): the charges that populate an invoice * [Stripe Integration](/billing/stripe-integration): where invoices are ultimately generated * [Pricing Models](/billing/pricing-models): how package overage is itemized # Pricing Models Source: https://docs.vapify.agency/billing/pricing-models Compare Monthly Fee + Per-Minute, Monthly Packages, and when to use each. ## Overview Vapify supports two billing models. You can run different models for different clients, or combine both for the same client. ## Model comparison | | Monthly Fee + Per-Minute | Monthly Packages | | --------------- | -------------------------------------- | ------------------------------------------- | | **Best for** | Simple, flexible pricing | Predictable monthly costs | | **Client pays** | Monthly fee + usage charges | One monthly price including minutes | | **Overage** | No overage concept, pure usage billing | Extra charge once included minutes are used | | **Example** | \$49/mo + \$0.40/min for all calls | \$99/mo for 200 min + \$0.60/min overage | ## Model 1: Monthly Fee + Per-Minute A fixed monthly platform fee (billed via Stripe subscription) plus a per-minute rate deducted from the client's prepaid Balance as calls happen. Sub Account Billing tab showing monthly fee and per-minute rate configuration **Example month:** client makes 150 minutes of calls at \$0.40/min. ``` Monthly Platform Fee: $49.00 (auto-charged) Usage Charges: 150 × $0.40 = $60.00 (from balance) Total: $109.00 ``` Set the monthly fee and per-minute rate in the sub account's **Billing** tab. Setting the monthly fee to \$0 gives you pure pay-as-you-go pricing. ## Model 2: Monthly Packages A fixed monthly price that includes a set number of minutes, with an overage rate once those minutes are used. **Example:** \$99/month package, 200 included minutes, \$0.60/min overage. Client uses 230 minutes: ``` Base Package: $99.00 (includes first 200 min) Overage: 30 min × $0.60 = $18.00 Total: $117.00 ``` New sub account users choose a package on first login if **Require Active Subscription for SubAccount Access** is enabled. Configure packages from **Billing & Usage → Subscription Settings**: name, description, price, included minutes, overage rate, and expiry period. A \$0 price makes a free trial package; a \$0 overage rate means excess minutes are **not charged**. Create voice package form with price, included minutes, and overage rate Client package selection screen shown on first login A \$0 overage rate caps **charges**, not usage. When included minutes run out, calls still connect and the extra minutes are still recorded — Vapify does not hard-stop a call. Set the overage rate above your provider cost if you want those minutes to be profitable. ## Which to choose * **Monthly Fee + Per-Minute**: unpredictable call volume, clients who want to pay for exactly what they use. * **Monthly Packages**: established clients who value predictability, or when you want to encourage higher usage with bundled minutes. ## Related Articles * [Configure Pricing](/getting-started/configure-pricing): setting your first client's rate * [How Billing Works](/billing/how-billing-works): the underlying money flow * [Wallet & Credits](/billing/wallet-credits): how Balance funds per-minute and overage charges # Profit Tracking Source: https://docs.vapify.agency/billing/profit-tracking How to calculate your margin per call and keep every assistant profitable. ## Overview Your profit is the gap between what you charge a client and what your provider charges you. Vapify checks this gap after each per-minute call and flags losses, but it does not prevent them — you set safe prices. ## The formula ``` Your Profit = What You Charge - Provider Cost ``` **Example (10-minute call):** provider charges \$3.00, you charge the client \$5.00 → \$2.00 profit, 40% margin. ## Post-call profitability check For **per-minute billing**, Vapify checks profitability after each call completes: * **Profitable call:** provider cost \$3.00, your price \$5.00 → billed normally. * **Unprofitable call:** provider cost \$6.00, your price \$5.00 → the charge is held as **pending** and the assistant is flagged **Pricing Review Required**. The call still happened — this is a billing hold, not prevention. Override this per sub account with **Support Unprofitable Calls**, which lets losing charges bill through anyway. This check covers per-minute billing only. **Package and overage billing are never checked** — a below-cost package or overage rate loses money silently, so price those above cost yourself. Set prices with at least a 25-50% margin so normal provider price fluctuations don't push a call into a loss. ## Example pricing by industry ``` Medical Practices: $0.60 - $0.80/min Dental Offices: $0.50 - $0.70/min Real Estate: $0.40 - $0.60/min General Business: $0.50 - $0.70/min ``` ## Related Articles * [How Billing Works](/billing/how-billing-works): the money flow this formula sits inside * [Configure Pricing](/getting-started/configure-pricing): setting per-minute rates * [Pricing Models](/billing/pricing-models): per-minute vs. package economics # Stripe Integration Source: https://docs.vapify.agency/billing/stripe-integration Reference for connecting, viewing, and disconnecting your Stripe account. ## Overview Stripe is how your clients pay you directly. This is the reference for managing that connection after initial setup. For first-time setup, see [Connect Stripe](/getting-started/connect-stripe). Stripe account connected, showing Connected Account ID and status ## Connection details | Field | Description | | ------------------------- | ---------------------------------------------------------------------- | | **Connected Account ID** | Your unique Stripe Connect account identifier, shown once linked | | **Account status** | Whether your Stripe account is active and able to accept payments | | **Stripe Dashboard link** | Opens your Stripe account to view payments, payouts, and customer data | ## Viewing your Stripe Dashboard From **Billing & Usage**, click **Stripe Dashboard** to see payments, payouts, and customer data directly in Stripe. ## Disconnecting Stripe From **Agency Settings → Billing**, click **Disconnect Stripe** and confirm. Disconnecting Stripe prevents new client payments and subscriptions immediately. Existing subscriptions may fail to renew until reconnected. ## Fees Vapify charges no platform fee on payments. You pay Stripe's standard processing fees (for US card payments, approximately 2.9% + \$0.30 per transaction; rates vary by country and payment method — see [Stripe's pricing](https://stripe.com/pricing)) plus your own Vapify subscription. All client payments go directly to your Stripe account. ## Refunds Issue a refund from the client's sub account (**Clients → \[client] → Billing → Issue Refund**) or directly from your Stripe Dashboard. Choose between a **Stripe Refund** (money returned to the client's payment method, typically 5-10 business days) or an **Account Credit** (stays as Balance in the client's Vapify account, no Stripe transaction). ## Related Articles * [Connect Stripe](/getting-started/connect-stripe): first-time setup walkthrough * [How Billing Works](/billing/how-billing-works): the full money flow * [Wallet & Credits](/billing/wallet-credits): Balance vs. Credits and refund implications # Wallet & Credits Source: https://docs.vapify.agency/billing/wallet-credits The difference between client Balance and agency-granted Credits, and how they get spent. ## Overview Clients fund calls from two separate wallets: **Balance** and **Credits**. Understanding the difference prevents billing confusion. ## Balance vs. Credits | | Balance | Credits | | --------------- | ------------------------------------- | --------------------------------- | | **Source** | Client loads it themselves via Stripe | Agency adds it manually | | **Control** | Client's, self-service | Agency's discretion | | **Typical use** | Ongoing prepaid funds | Promotions, bonuses, compensation | | **Expiry** | Doesn't expire | Never expires | | **Refundable** | Yes (Stripe refund or account credit) | No, non-refundable once added | Credits are always consumed before Balance. Example: \$25 Credits + \$75 Balance = \$100 available. After a \$30 charge: Credits drop to \$0, Balance drops to \$70. ## When Balance is required * **Monthly Fee + Per-Minute model**: Balance is required for every per-minute charge. * **Monthly Packages model**: Balance is only needed to cover overage once included minutes are used. * **Demo accounts**: not required; demo calls are free. ## Adding Credits From the sub account's **Billing** tab, click **Add Credits** to grant promotional or bonus funds. Credits cannot be removed once added. Sub Account Billing tab showing Balance, Credits, and onboarding fee settings ## Low balance behavior As Balance runs low, clients see dashboard banners and (if configured) email alerts; at \$0, service is suspended until funds are added. Clients can enable **auto top-up** to replenish Balance automatically. See [Notifications](/running-your-agency/notifications) to adjust alert thresholds. ## Related Articles * [How Billing Works](/billing/how-billing-works): where Balance and Credits fit in the money flow * [Pricing Models](/billing/pricing-models): how Balance funds per-minute and overage charges * [Notifications](/running-your-agency/notifications): low-balance alert configuration # Assign an AI Assistant Source: https://docs.vapify.agency/getting-started/assign-an-ai-assistant Sync assistants from your provider and assign one to your new client sub account. **Estimated time:** 4 minutes ## Overview Assistants are always created in your provider's dashboard (Vapi or Retell), never inside Vapify. This page covers syncing them and assigning one to the sub account you just created. ## Prerequisites * [Client created](/getting-started/create-your-first-client) * At least one assistant created in your provider's dashboard, with a phone number attached if it needs to take phone calls ## Steps Sub Account Assistants tab showing assignment options Open the client's sub account and go to the **General** tab. Add your provider API key here if this sub account uses a different provider account than your agency default, then click **Save Settings**. This syncs assistants from your provider. Switch to the **Assistants** tab, and under **Assign New Assistant**, select the assistant(s) to assign to this sub account. If a recently created assistant doesn't appear, click **Refresh Assistant List**. An assistant can only be assigned to one sub account at a time. For similar assistants across multiple clients, create separate assistants in your provider and assign each to its own sub account. ## Tips * Attach phone numbers to assistants that need to handle phone calls. Web-call-only assistants don't need one. * Use a consistent naming convention in your provider dashboard (e.g., "ClientName-SalesBot") to keep assignments easy to audit. ## Troubleshooting * **Assistant not appearing**: Confirm the provider API key is correct, save settings again, then click **Refresh Assistant List**. * **Cannot edit provider API key**: This sub account has already gone live (a Billing Start Date is set); provider keys lock permanently once that happens. ## Related Articles * [AI Assistants](/running-your-agency/ai-assistants): the full assistant management reference * [Configure Pricing](/getting-started/configure-pricing): set per-minute pricing for this assistant * [Vapi](/integrations/vapi) · [Retell AI](/integrations/retell): provider-specific key and setup details # Brand Your Agency Source: https://docs.vapify.agency/getting-started/brand-your-agency Set your agency name, logo, and favicon so clients see your brand, not Vapify. **Estimated time:** 3 minutes ## Overview This is the first step of the onboarding wizard. It sets the identity your clients will see throughout the platform (your agency name, logo, and favicon) instead of Vapify's. ## Prerequisites * A Vapify agency account (created at signup) ## Steps Agency Settings tab showing fields for agency name, logo upload, and favicon upload From the onboarding wizard's **Agency Details** step (or later, **Agency Settings → Agency tab**), enter your **Agency Name**. Use your registered business name. It appears in the dashboard, client-facing areas, emails, and invoices. Use a high-resolution PNG, 200×200px minimum (400×400px recommended), ideally with a transparent background. The small icon shown in browser tabs. Keep it simple; complex logos don't read well at 16×16px. Click **Save & Continue**. Branding changes require you to log out and log back in before they appear across the platform. Use your registered business name for professionalism. Your logo is visible to every client you onboard. ## Video Tutorial ## Troubleshooting * **Logo or favicon not appearing**: Log out and back in, clear your browser cache, and confirm your file is under 2MB (logo) or 100KB (favicon). ## Related Articles * [Custom Domain](/white-label/custom-domain): extend branding to your own subdomain * [Custom Email](/white-label/custom-email): send platform emails from your own domain * [Agency Branding](/white-label/agency-branding): full reference for logo, favicon, and name specs # Configure Pricing Source: https://docs.vapify.agency/getting-started/configure-pricing Set the per-minute rate and optional monthly fee you charge this client. **Estimated time:** 4 minutes ## Overview Set the price your client pays for the assistant you just assigned. Vapify supports per-minute billing, an optional monthly fee, and monthly packages. This page covers the two most common starting points. ## Prerequisites * [Assistant assigned](/getting-started/assign-an-ai-assistant) * Your provider's per-minute cost for this assistant (check your provider dashboard) ## Steps Sub Account Billing tab showing per-minute pricing configuration Open the sub account's **Billing** tab. Click **Start Per Minute Billing** if it isn't already enabled. For each assigned assistant, set the **price per minute** you'll charge this client. Keep it higher than what your provider charges you — Vapify accepts a below-cost price, but flags the assistant for pricing review after any call that loses money. Optionally, set a **Monthly Subscription Fee** to add a fixed recurring charge on top of usage. Vapify does **not** stop a below-cost call. It checks profitability **after** each per-minute call, and on a loss it holds the charge as pending and flags the assistant **Pricing Review Required** (unless **Support Unprofitable Calls** is enabled for the sub account). Package and overage billing aren't checked at all — verify your math before going live. Example: provider charges you \$0.15/min, you charge the client \$0.20/min. You keep \$0.05/min profit. Build in at least a 25-50% margin. ## Related Articles * [Pricing Models](/billing/pricing-models): per-minute vs. monthly retainer vs. hybrid, in depth * [How Billing Works](/billing/how-billing-works): the full money flow * [Wallet & Credits](/billing/wallet-credits): how client Balance and Credits are consumed # Connect Stripe Source: https://docs.vapify.agency/getting-started/connect-stripe Connect your Stripe account so clients pay you directly, under your own branding. **Estimated time:** 5-10 minutes ## Overview Connect Stripe so your clients pay you directly through your own branded checkout. Vapify never holds your funds. Payments go straight to your Stripe account. ## Prerequisites * [Provider connected](/getting-started/connect-your-ai-provider) * A business you can register with Stripe (or an existing Stripe account) ## Steps Connect Stripe Account card in Billing & Usage From **Billing & Usage**, find the **Connect Stripe Account** card and click **Get Started**. You'll be redirected to Stripe. Complete Stripe's onboarding: business information, banking details for payouts, and identity verification. Once connected, confirm you see a **Connected Account ID** and an active status on the Billing & Usage page. Stripe account connected, showing Connected Account ID and status Stripe onboarding typically takes 5-10 minutes. Your clients' payments go directly to your Stripe account. Vapify never touches the funds. ## Tips * Keep a link to your Stripe Dashboard handy. You'll use it to view payments, payouts, and issue refunds. ## Video Tutorial ## Troubleshooting * **Onboarding stuck or incomplete**: Return to **Billing & Usage** and click **Get Started** again to resume where Stripe left off. * **Need to disconnect**: Go to **Agency Settings → Billing**, click **Disconnect Stripe**, and confirm. This stops new client payments and subscriptions immediately. ## Related Articles * [How Billing Works](/billing/how-billing-works): how provider cost, markup, and Stripe payouts fit together * [Stripe Integration](/billing/stripe-integration): full reference including refunds and disconnecting * [Configure Pricing](/getting-started/configure-pricing): set the rates clients are charged # Connect Your AI Provider Source: https://docs.vapify.agency/getting-started/connect-your-ai-provider Connect Vapi or Retell so Vapify can retrieve your voice assistants and track usage for billing. **Estimated time:** 4 minutes ## Overview Connect your voice AI provider so Vapify can pull in your assistants and track usage for billing. This is the second step of the onboarding wizard. ## Prerequisites * [Agency branded](/getting-started/brand-your-agency) * A Vapi or Retell account with at least one assistant already created ## Steps Provider Setup screen showing Vapi and Retell provider options with API key fields In your [Vapi dashboard](https://vapi.ai), open **API Keys** and copy both your **Private API key** and **Public API key**. In Vapify's **Provider Setup** step (or later, in a sub account's **General** tab), select **Vapi**. Paste your **Private API key** in the first field and your **Public API key** in the second field. Click **Verify and Continue**. In your Retell dashboard, open **Settings → API Keys** and copy your API key. In Vapify, select **Retell**. Paste your API key and click **Verify and Continue**. API keys grant full access to your provider account. Never share them publicly or commit them to version control. Vapify stores them encrypted and shows them partially masked afterward. **Verify and Continue** tests your keys before proceeding. If verification fails, re-copy the key from your provider dashboard. Trailing spaces are the most common cause. ## Troubleshooting * **Verification fails**: Re-copy the key; for Vapi, confirm the private and public keys aren't swapped. * **Assistants don't sync**: Save the key again, then click **Refresh Assistant List** in the sub account's Assistants tab. ## Related Articles * [Vapi](/integrations/vapi): key types, rotation, and limits * [Retell AI](/integrations/retell): key setup details * [Assign an AI Assistant](/getting-started/assign-an-ai-assistant): next step in the setup path # Create Your First Client Source: https://docs.vapify.agency/getting-started/create-your-first-client Create a sub account for your first client and its primary user. **Estimated time:** 3 minutes ## Overview Create a dedicated sub account for your first client. This is where their assistants, users, and billing will live, isolated from every other client. ## Prerequisites * [Stripe connected](/getting-started/connect-stripe) * Your client's business name and their primary contact's name and email ## Steps Subaccounts page — click New Sub Account to create a client New Sub Account form — account name, provider selection, and private key From the onboarding wizard's **Create Your First Client Sub Account** step (or later, **Subaccounts → New Sub Account**), enter the **Sub Account Name** — your client's business name (e.g., "Riverside Dental"). Enter the **Primary User Full Name** (your client's main administrator) and **Primary User Email** (where login credentials will be sent). Enter a **Temporary Password** for their first login. Click **Create Client**. The temporary password is shown in plain text only once, on the next (Review & Launch) screen. Copy it before continuing. You cannot retrieve it later. Your client will be prompted to change it on first login. Use your client's official registered business name. It appears throughout their dashboard and helps you tell clients apart as you scale. ## Video Tutorial ## Troubleshooting * **Wrong email entered**: You can edit the primary user's email later from the sub account's **Users** tab. ## Related Articles * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): what a sub account contains * [Invite Your Client](/getting-started/invite-your-client): sharing credentials securely * [Clients](/running-your-agency/clients): managing sub accounts day to day # Invite Your Client Source: https://docs.vapify.agency/getting-started/invite-your-client Share dashboard access and login credentials with your client securely. **Estimated time:** 2 minutes ## Overview Once pricing is set, share access with your client so they can log in and see their assistant, usage, and billing. ## Prerequisites * [Pricing configured](/getting-started/configure-pricing) ## Steps Review and Launch screen showing sub account summary and primary user credentials From the wizard's **Review & Launch** step (or the sub account's **Users** tab), review the sub account summary: dashboard URL, subdomain status, connected provider, and masked API keys. Copy the **Temporary Password** shown for the primary user (the only time it appears in plain text) and note the **dashboard URL** your client will use to log in. Share the dashboard URL, email, and temporary password with your client through a secure channel (password manager, encrypted email, or a secure sharing service). Ask your client to change their password immediately after their first login. The temporary password is displayed in plain text only once, on this screen. If you didn't copy it, you'll need to reset the primary user's password from the sub account's Users tab. ## Tips * Use a secure password-sharing service or encrypted email rather than plain chat or SMS. * To invite additional team members to the same sub account later, use **New Sub Account User** from the Users tab. ## Related Articles * [Inviting Team Members](/team-management/inviting-team-members): adding more users to a sub account later * [Client Experience](/white-label/client-experience): what your client sees after logging in # Launch Your Agency Source: https://docs.vapify.agency/getting-started/launch-your-agency Place a test call and confirm your first client setup works end to end. **Estimated time:** 5 minutes ## Overview This is the capstone of your setup: a walkthrough that confirms everything you've configured (branding, provider, Stripe, client, assistant, pricing, and invite) actually works. You'll finish by placing a test call and seeing it appear in Call Logs. **Scenario:** Agency **Apex Voice** has connected Vapi, created a sub account for client **Riverside Dental**, assigned an assistant priced at \$0.20/min (provider cost \$0.15/min), and invited Riverside Dental's primary user. ## Prerequisites * [Client invited](/getting-started/invite-your-client) ## Steps The Billing Start Date can only be set once per sub account and cannot be changed afterward. Confirm your assistant assignment and pricing are correct before setting it. Open the Riverside Dental sub account and confirm, in the **Billing** tab, that per-minute pricing is set and the assistant shows as assigned. Set the **Billing Start Date** (also called the Go Live Date). This can be today or backdated, but it can only be set once and cannot be changed afterward. Setting it runs a live test against your provider key — if the key is invalid you'll see **"Please set a valid private key before you start billing"** and go-live is blocked until you fix it. Double-check your setup before confirming. Click **Start Per Minute Billing** (or enable Monthly Subscription, if configured) to activate billing. If **Allow customers to talk to the voice assistants** is enabled for this sub account, use the voice widget in the client dashboard to place a test call. If the assistant has an assigned phone number, you can also call it directly. Assistants without a phone number only support web calls, so use the voice widget for those. End the call, then open **Call Logs** in the sidebar and confirm the test call appears with a duration, ended reason, and (if enabled) a transcript and recording. Call logs only sync after the Billing Start Date is set. If you don't see your test call, confirm the sub account has actually gone live. ## Verify your result You've successfully launched your agency when you can see the test call in **Call Logs** with the correct assistant name, duration, and cost. That confirms provider connection, assignment, pricing, and billing are all working together. ## Related Articles * [Dashboard](/running-your-agency/dashboard): where usage metrics appear after go-live * [Call Logs](/running-your-agency/call-logs): reviewing transcripts and recordings * [Onboard Your First Client](/guides/onboard-your-first-client): the full narrative connecting every step you just completed # Charge Monthly Plans Source: https://docs.vapify.agency/guides/charge-monthly-plans When and how to use a fixed monthly fee, retainer, or monthly package instead of pure per-minute billing. ## Overview A monthly charge gives you predictable revenue and gives your client a predictable bill. Vapify supports this two ways: a flat **monthly subscription fee** stacked on top of per-minute billing, or a **monthly package** with included minutes and overage. ## When to choose this * The client wants one predictable number on their card each month * You want recurring base revenue independent of call volume * The client's usage is fairly consistent month to month ## The path 1. Read [Pricing Models](/billing/pricing-models) for the exact mechanics of both the subscription-fee and package approaches. 2. In the sub account's **Billing** tab, either set a **Monthly Subscription Fee** alongside your per-minute rate, or configure a **Voice Package** from **Billing & Usage → Subscription Settings** with included minutes and an overage rate. 3. Decide your overage rate carefully. See [Profit Tracking](/billing/profit-tracking) to keep even overage minutes profitable. 4. Communicate the model clearly to the client before go-live: what's included, what triggers extra charges, and when the monthly charge renews. Combine both: a monthly retainer for guaranteed base revenue, plus per-minute billing for any usage beyond what the retainer implies. Different clients can run different combinations. ## Related Articles * [Charge Per Minute](/guides/charge-per-minute): the alternative, usage-only model * [Pricing Models](/billing/pricing-models): full mechanics and examples * [Wallet & Credits](/billing/wallet-credits): how overage draws from client Balance # Charge Per Minute Source: https://docs.vapify.agency/guides/charge-per-minute When and how to charge purely by usage, with no monthly fee. ## Overview Pure per-minute pricing means the client pays only for the minutes they actually use, drawn from a prepaid Balance. No monthly fee, no bundled minutes. ## When to choose this * Call volume is unpredictable or seasonal * The client wants to pay for exactly what they use * You're testing a new client relationship before committing to a retainer ## The path 1. In the sub account's **Billing** tab, click **Start Per Minute Billing** and leave the Monthly Subscription Fee at \$0. 2. Set your **price per minute** above your provider's cost. See [Profit Tracking](/billing/profit-tracking) for margin guidance. 3. Ask the client to load **Balance** via Stripe top-up before their first call. Per-minute charges deduct from Balance (Credits first, then Balance) in real time as each call ends. 4. Set low-balance alert thresholds under [Notifications](/running-your-agency/notifications) so the client is warned before service is suspended at \$0. If a client runs out of Balance and Credits, calls fail until they top up. Consider enabling auto top-up so they don't get caught out. ## Related Articles * [Charge Monthly Plans](/guides/charge-monthly-plans): the retainer/package alternative * [Wallet & Credits](/billing/wallet-credits): Balance vs. Credits mechanics * [Notifications](/running-your-agency/notifications): configuring low-balance alerts # Launch Your First AI Agency Source: https://docs.vapify.agency/guides/launch-your-first-ai-agency The full narrative from signup to your first live client, with the reasoning behind each decision. ## Overview This guide chains the entire [Getting Started](/getting-started/brand-your-agency) path into one narrative, with the "why" behind each decision point. Useful if you want context, not just steps. ## The path 1. **[Brand Your Agency](/getting-started/brand-your-agency)**: do this first; every screen your client ever sees inherits this branding. 2. **[Connect Your AI Provider](/getting-started/connect-your-ai-provider)**: choose Vapi if you want built-in analytics and recordings, or Retell if your assistants are already built there. This choice locks in once a client sub account goes live, so decide deliberately. 3. **[Connect Stripe](/getting-started/connect-stripe)**: do this before creating clients, so pricing and billing are ready the moment a client is invited. 4. **[Create Your First Client](/getting-started/create-your-first-client)**: one sub account per client, always. Never share a sub account across clients. 5. **[Assign an AI Assistant](/getting-started/assign-an-ai-assistant)**: assistants live in your provider dashboard; Vapify only assigns and prices them. 6. **[Configure Pricing](/getting-started/configure-pricing)**: price above your provider cost. See [Profit Tracking](/billing/profit-tracking) for margin guidance. 7. **[Invite Your Client](/getting-started/invite-your-client)**: share credentials securely; the temporary password is shown only once. 8. **[Launch Your Agency](/getting-started/launch-your-agency)**: set the (permanent) Billing Start Date and confirm a test call appears in Call Logs. ## Related Articles * [Onboard Your First Client](/guides/onboard-your-first-client): a narrower guide focused purely on the client-onboarding half * [Recommended Agency Workflow](/guides/recommended-agency-workflow): what to do after your first client is live # Manage Multiple Clients Source: https://docs.vapify.agency/guides/manage-multiple-clients Operational habits for running several sub accounts without losing track of any one client. ## Overview Once you've onboarded a handful of clients, the challenge shifts from "how do I set one up" to "how do I keep them all straight." This guide covers the habits that scale. ## Naming and organization * Use the client's real business name as the sub account name. Never a placeholder you'll forget. * In your provider dashboard, adopt a naming convention like `ClientName-SalesBot` so assistants are traceable back to the right sub account even from the provider side. ## Cross-client visibility * Use **Assistants** in the sidebar for a global view across every sub account: which assistant belongs to which client, and which are unassigned. * Use **[Dashboard](/running-your-agency/dashboard)** for agency-wide usage trends, and drill into a specific client's sub account when something looks off. * Use **[Call Logs](/running-your-agency/call-logs)**' "All Assistants" filter to isolate one client's call activity from the rest. ## Billing hygiene at scale * Review [Profit Tracking](/billing/profit-tracking) margins periodically. Provider pricing can change, and a margin that was healthy at onboarding can erode. * Keep agency credit topped up (see [How Billing Works](/billing/how-billing-works)) so no client's service is interrupted by your own account running low. ## Related Articles * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): the isolation model this all rests on * [Recommended Agency Workflow](/guides/recommended-agency-workflow): a repeatable cadence for ongoing operations # Migrate Existing Clients Source: https://docs.vapify.agency/guides/migrate-existing-clients Bring clients you already serve elsewhere onto Vapify, one sub account at a time. ## Overview If you're already running voice AI for clients directly through Vapi or Retell, this guide covers moving them onto Vapify without disrupting service. ## The path 1. Create a sub account for each existing client using [Create Your First Client](/getting-started/create-your-first-client) as the template. One client, one sub account, always. 2. Assign each client's existing provider assistant (already built in Vapi/Retell) using [Assign an AI Assistant](/getting-started/assign-an-ai-assistant). You don't need to rebuild the assistant. Vapify only assigns and prices existing assistants. 3. Match your current pricing in [Configure Pricing](/getting-started/configure-pricing) so the client's bill doesn't change unexpectedly at cutover. 4. Invite each client using [Invite Your Client](/getting-started/invite-your-client), timed so their new login is ready before you retire their old access. 5. Set each sub account's Billing Start Date to the actual cutover date. It can be backdated, but only set once. The Billing Start Date is permanent once set. If you're migrating several clients at once, verify pricing and assistant assignment for each one before setting it. ## Related Articles * [Manage Multiple Clients](/guides/manage-multiple-clients): operating many sub accounts at once * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): the isolation model each migrated client gets # Onboard Your First Client Source: https://docs.vapify.agency/guides/onboard-your-first-client Chains client creation, assistant assignment, pricing, and invite into one client-focused narrative. ## Overview Assumes your agency is already branded, your provider is connected, and Stripe is live. This guide focuses purely on bringing on one client, start to finish. ## The path 1. **[Create Your First Client](/getting-started/create-your-first-client)**: use the client's real business name; it appears everywhere in their dashboard. 2. **[Assign an AI Assistant](/getting-started/assign-an-ai-assistant)**: decide up front whether this client needs phone-call capability (requires a phone number attached in your provider) or web-call only. 3. **[Configure Pricing](/getting-started/configure-pricing)** (choose per-minute, monthly, or both) see [Charge Per Minute](/guides/charge-per-minute) and [Charge Monthly Plans](/guides/charge-monthly-plans) if you're unsure which fits this client. 4. **[Invite Your Client](/getting-started/invite-your-client)**: share the dashboard URL and temporary password securely; remind them to change the password on first login. 5. Set the Billing Start Date to go live (see [Launch Your Agency](/getting-started/launch-your-agency)). This is permanent, so confirm pricing and assistant assignment are correct first. ## Related Articles * [Charge Per Minute](/guides/charge-per-minute): when usage-based pricing fits better * [Charge Monthly Plans](/guides/charge-monthly-plans): when a retainer or package fits better * [Manage Multiple Clients](/guides/manage-multiple-clients): once you're repeating this for client two, three, and beyond # Recommended Agency Workflow Source: https://docs.vapify.agency/guides/recommended-agency-workflow A repeatable weekly and monthly cadence for running a healthy Vapify agency. ## Overview Once your first client is live, the work shifts from setup to maintenance. This guide suggests a cadence, built from the best-practice notes scattered across other pages. ## Weekly * Scan **[Call Logs](/running-your-agency/call-logs)** for unusual ended-reasons (`assistant-error`, repeated `silence-timed-out`) that might indicate a misconfigured assistant. * Check the **[Dashboard](/running-your-agency/dashboard)** for any client whose usage spiked or dropped unexpectedly. * Confirm no client is sitting near a low-balance threshold (see **[Notifications](/running-your-agency/notifications)**). ## Monthly * Verify **[Agency Branding](/white-label/agency-branding)** still renders correctly, and that your custom subdomain and email are working. * Review provider pricing for any changes, and recheck **[Profit Tracking](/billing/profit-tracking)** margins per client. * Audit sub account **[Users](/team-management/users)** and remove access for anyone who no longer needs it. ## Quarterly * Walk the full **[Client Experience](/white-label/client-experience)** yourself, end to end. * Rotate provider and email-provider API keys where your security policy requires it. * Revisit pricing for long-standing clients. See **[Charge Monthly Plans](/guides/charge-monthly-plans)** and **[Charge Per Minute](/guides/charge-per-minute)** if a client's usage pattern has outgrown their current model. ## Related Articles * [Manage Multiple Clients](/guides/manage-multiple-clients): the operational habits behind this cadence * [White Label Best Practices](/guides/white-label-best-practices): the branding checklist referenced above # White Label Best Practices Source: https://docs.vapify.agency/guides/white-label-best-practices Keep every client-facing surface consistently branded as your agency, never Vapify. ## Overview White-labeling is only as strong as its weakest surface. This guide checks every place your brand (or a gap in it) becomes visible to a client. ## The checklist * **[Agency Branding](/white-label/agency-branding)**: name, logo, favicon set and saved, and you've logged out/in to confirm they took effect. * **[Custom Domain](/white-label/custom-domain)**: a branded subdomain instead of `app.vapify.agency`, if you're on a paid plan. * **[Custom Email](/white-label/custom-email)**: sender address on your own domain, so invitations and notifications don't come from a Vapify address. * **[Client Experience](/white-label/client-experience)**: walk through the client journey yourself, end to end, at least once per quarter, to catch anything that slipped. ## Common gaps * Logo uploaded but not visible. Usually a missed logout/login cycle. * Custom domain set up but email still unbranded. These are two separate settings tabs; both need configuring. * GoHighLevel-mapped clients seeing inconsistent branding. Confirm the [GoHighLevel](/integrations/gohighlevel) mapping matches the correct sub account. ## Related Articles * [Client Experience](/white-label/client-experience): the full client-facing journey * [Recommended Agency Workflow](/guides/recommended-agency-workflow): where branding checks fit into ongoing maintenance # Contact Support Source: https://docs.vapify.agency/help/contact-support How to reach the Vapify team for help beyond these docs. ## Overview If [Troubleshooting](/help/troubleshooting) and the [FAQ](/help/frequently-asked-questions) don't resolve your issue, reach out directly. ## Ways to get help * **Email:** [support@info.vapify.agency](mailto:support@info.vapify.agency) * **Strategy call:** book a free session at the [Vapify booking link](https://tidycal.com/team/vapify-booking/vapify-strategy-session) ## Before you contact support Include: * Screenshots of any error messages * What you've already tried * Your plan type (Free, Starter, Business, Scale, Partner) ## Related Articles * [Troubleshooting](/help/troubleshooting): check here first * [Frequently Asked Questions](/help/frequently-asked-questions) # Frequently Asked Questions Source: https://docs.vapify.agency/help/frequently-asked-questions Clear answers to the most common Vapify questions. ## Getting Started Vapify is a white-label management and billing layer for voice AI agencies. Vapi and Retell run the actual calls and host your assistants. Vapify sits on top, letting you package those assistants into a client-ready product with sub accounts, pricing, billing, and a branded client portal. It doesn't replace Vapi or Retell. Assistant creation still happens in those provider dashboards. Yes. Vapify doesn't create or host assistants. You need a Vapi or Retell account with at least one assistant already created. Vapify connects via provider API keys and syncs assistants from there. Create the sub account, connect provider API keys, sync assistants, assign the correct ones, set pricing (and monthly fee if applicable), set the Billing Start Date to go live, then invite users. Skipping a step here is the most common source of setup issues. See [Launch Your First AI Agency](/guides/launch-your-first-ai-agency) for the full path. Each sub account is a strict isolation boundary for assistants, pricing, users, and call logs. Sharing a sub account across clients or skipping steps here breaks that isolation and causes billing and security issues. It means billing activation. Usage after the Billing Start Date becomes billable, provider API keys lock permanently, and call logs begin syncing. You can still update assistant assignments after going live. The Billing Start Date can only be set once and cannot be changed afterward, and provider API keys lock permanently at the same time. Double-check your setup before confirming. ## Sub Accounts & Client Structure Sub accounts are strict isolation boundaries. Separate assistants, pricing, users, credits, and call logs. Sharing one sub account across clients breaks billing, reporting, and security. No. An assistant belongs to one sub account at a time. For similar needs across clients, create a separate assistant per client in your provider. Partially. Users can log in, but call logs won't appear until the Billing Start Date is set. ## Assistants & Provider Sync Usually an incorrect or unsaved API key, or the assistant list hasn't been refreshed. Save a valid key and click **Refresh Assistant List**. No. Assistants without phone numbers still sync and support web calls. ## Billing, Credits & Pricing The monthly subscription is a fixed recurring fee billed automatically via Stripe. Per-minute billing charges based on actual call duration. Most agencies combine both. See [Pricing Models](/billing/pricing-models). Credits are agency-assigned only, for promotions or onboarding. Balance is funded by the client via Stripe top-ups and used for per-minute charges once Credits are exhausted. Clients can enable auto top-up. See [Wallet & Credits](/billing/wallet-credits). ## Call Logs & Usage Most often billing isn't live yet, provider API keys are incorrect, or there's a brief provider-side sync delay. See [Troubleshooting](/help/troubleshooting) for the full checklist. ## Related Articles * [Troubleshooting](/help/troubleshooting): symptom-based fixes * [Glossary](/start-here/glossary): term definitions referenced throughout these answers # Troubleshooting Source: https://docs.vapify.agency/help/troubleshooting Fixes organized by symptom, not by feature. ## Client can't log in * Confirm they're using the correct dashboard URL (default `app.vapify.agency`, or your custom subdomain if configured). * Confirm their user status is **Active**, not **Invited** or **Inactive**, in the sub account's **Users** tab. * If they never received their invite email, check your [Custom Email](/white-label/custom-email) provider connection and test it. ## Calls not appearing in Call Logs * Confirm the sub account's **Billing Start Date** has been set. Call logs never sync before go-live. See [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts). * Confirm the provider API key is correct and the assistant list has been refreshed. * Allow a short delay. Provider-side syncing can lag slightly, especially under rate limits. ## Provider verification fails * Re-copy the key(s) from your provider dashboard; trailing spaces are the most common cause. * For Vapi, confirm the Private and Public keys aren't swapped. * See [Vapi](/integrations/vapi) or [Retell AI](/integrations/retell) for provider-specific steps. ## Assistant missing from assignment list * Confirm the provider API key is saved correctly, then click **Refresh Assistant List** in the sub account's **Assistants** tab. * Confirm the assistant actually exists in the correct provider account. Assistants tied to a different provider account won't appear. ## Branding not appearing * Log out and log back in. Logo and favicon changes require this to take effect. * Clear your browser cache and confirm file size/format meet the specs in [Agency Branding](/white-label/agency-branding). ## Custom subdomain not verifying or loading * Wait for DNS propagation (up to 48 hours); confirm you created a CNAME record, not an A record. * See [Custom Domain](/white-label/custom-domain) for the full troubleshooting reference. ## Client balance or billing issues * Confirm whether the client is on per-minute or package billing. See [Pricing Models](/billing/pricing-models). * Check whether **Credits** are fully consumed and **Balance** is low or at \$0. See [Wallet & Credits](/billing/wallet-credits). * Adjust alert thresholds under [Notifications](/running-your-agency/notifications) to catch this earlier next time. ## GoHighLevel recordings or menu not showing * Confirm the GHL subaccount is correctly mapped to the right Vapify sub account, and the user has relogged in. See [GoHighLevel](/integrations/gohighlevel). ## Related Articles * [Frequently Asked Questions](/help/frequently-asked-questions): conceptual questions, not symptom-based fixes * [Contact Support](/help/contact-support): when nothing here resolves it # Calendar Source: https://docs.vapify.agency/integrations/calendar Connect Google Calendar, define availability, publish event types, and manage bookings per client. ## Overview Each sub account gets its own scheduling workspace: connect an external calendar, define working hours, publish bookable event types, manage bookings, and create API keys for automated or AI-driven scheduling. Calendar week view with status legend and block time action Calendar settings are per sub account. Use the subaccount selector in the top-right of the Calendar page before making changes. ## The six tabs | Tab | What it's for | | ---------------- | ------------------------------------------------------------------------ | | **Calendar** | Month/week/day view of bookings, plus quick time-blocking | | **Bookings** | Filter and review scheduled appointments by time, status, and event type | | **Event Types** | The bookable services your client offers, with shareable booking links | | **Availability** | Working hours, availability profiles, and blocked time | | **Connections** | Connect a provider calendar to avoid double bookings | | **Settings** | Timezone, duration defaults, notice windows, location, and notifications | | **API Keys** | Scoped keys for AI agents, workflows, and third-party integrations | ## Recommended setup order 1. Connect a calendar provider (**Connections** tab) 2. Configure availability and blocked time 3. Create event types 4. Review booking settings 5. Share booking links or create API keys ## Connecting a provider Open **Calendar → Connections**, click **New Calendar Connection**, and choose a provider. Calendar connections page New calendar connection modal showing Google Calendar and Outlook options * **Google Calendar**: available now * **Outlook Calendar**: shown as Coming Soon Connect the calendar before publishing booking links, so Vapify can account for existing events and help prevent double booking. ## Setting availability The **Availability** tab sets working hours, additional availability profiles, and blocked time for breaks or time off. Availability profiles with working hours and blocked time ## Creating event types Each event type defines a booking name, duration, buffer time, location (e.g., a Google Meet link or physical address), and which availability profile to use. Use **Copy URL** to share the booking link once live. Event types list with active event card and copy URL action Create a separate event type per appointment purpose rather than reusing one link for everything. It keeps duration, buffers, and reporting clean. ## Reviewing bookings and settings Use the **Bookings** tab to filter by date, status, or event type, and the **Settings** tab to set timezone, duration defaults, and notice windows. Bookings view with filters and list/calendar toggle Calendar settings with timezone, duration, notices, and notifications ## Creating a calendar API key From the **API Keys** tab, click **Create API Key** and choose from these permissions: **Check availability**, **Book appointments**, **Get bookings**, **Cancel bookings**. Calendar API keys page Create Calendar API Key modal with scoped permissions The plain-text key is shown only once at creation. Store it securely before closing the modal. The plain-text key is used by AI agents, workflows, or external systems to check availability and manage bookings. ## Related Articles * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): how calendar settings stay isolated per client # GoHighLevel Source: https://docs.vapify.agency/integrations/gohighlevel Map GHL sub accounts to Vapify sub accounts, sync recordings, and trigger calls from workflows. ## Overview The GoHighLevel (GHL) integration wires your existing Vapify sub accounts and assistants into GHL, so calls, recordings, and workflows stay in sync, without exposing your prompts, provider configs, or pricing to clients. ## Prerequisites * Sub accounts already set up in Vapify with assigned assistants and pricing * A GoHighLevel account with marketplace access ## Steps 1. In GHL, open the marketplace, find **Vapify Voice AI**, click **Install**, and approve permissions. GoHighLevel Marketplace showing Vapify installation 2. Click through to Vapify login, sign in with your agency account, and approve the connection. Vapify authentication screen during GHL install 3. For each client, pick a **GHL subaccount** and map it to the matching **Vapify subaccount**. Repeat for all clients and save. Map GoHighLevel sub accounts to Vapify sub accounts 4. To trigger outbound calls from a workflow, add the **Make Phone Call (Vapi Voice AI)** action, choose the assistant from the mapped sub account, and target the workflow contact. 5. Test one inbound and one outbound call, and confirm the recording attaches to the correct GHL contact. Call recording attached to a GHL contact Map one GHL subaccount to exactly one Vapify sub account. This keeps pricing and data isolated between clients, the same isolation principle covered in [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts). ## What syncs automatically * **Inbound calls**: matched to the GHL contact by phone number; recording, duration, and timestamp attach automatically. * **Outbound calls**: triggered by workflow, batch, or direct call; recording attaches to the originating contact. * **What GHL users see**: a **Voice AI Assistants** menu, plus **Call summary** and **Call logs** scoped to the mapped sub account. Voice AI Assistants dashboard inside a mapped GHL sub account ## What stays hidden from clients Provider costs and prompts are never exposed. GHL users see only the assistants and prices set in the mapped Vapify sub account. ## Troubleshooting * **Recordings not showing**: check the subaccount mapping, confirm the contact exists with a matching phone number, and confirm the call completed. * **Voice AI menu missing**: confirm the subaccount is mapped and the user has relogged in. * **Workflow action fails**: test the assistant directly in Vapify, verify the mapping, and confirm the contact's phone number is valid. * **Wrong contact attached**: check for duplicate phone numbers in GHL and standardize number formatting. ## Related Articles * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): the isolation model this integration relies on * [Call Logs](/running-your-agency/call-logs): the Vapify-side call history behind GHL's synced view * [AI Assistants](/running-your-agency/ai-assistants): assistants that become callable through GHL # Mailgun Source: https://docs.vapify.agency/integrations/mailgun Recommended email provider. Setup steps and free tier details. ## Overview Mailgun is Vapify's recommended email provider: easy setup, strong deliverability, and a generous free tier. ## Free tier 100 emails/day on the Free plan. See [Mailgun's pricing page](https://www.mailgun.com/pricing/) for current limits and paid tiers. ## Setup 1. Sign up at [mailgun.com](https://www.mailgun.com/) and verify your sending domain. 2. In Mailgun, go to **Settings → API Keys** and copy your **Private API Key** (starts with "key-"). 3. In Vapify, go to **Agency Settings → Email Settings tab**, enter your sender email address, select **Mailgun**, and paste your Private API Key. 4. Click **Test Connection**, then **Save Settings**. ## Related Articles * [Custom Email](/white-label/custom-email): full walkthrough covering all providers * [Postmark](/integrations/postmark): an alternative recommended provider # Postmark Source: https://docs.vapify.agency/integrations/postmark Recommended email provider for transactional email. Setup steps and free tier details. ## Overview Postmark specializes in transactional email and is a strong choice when deliverability matters. ## Free tier 100 emails/month, permanently. Paid plans start at \$15/month for 10,000 emails. ## Setup 1. Sign up at [postmarkapp.com](https://postmarkapp.com/) and create a **Server** (Postmark's term for a sending configuration). 2. In your server's **API Tokens** tab, copy the **Server API Token**. 3. In Vapify, go to **Agency Settings → Email Settings tab**, enter your sender email address, select **Postmark**, and paste your Server API Token. 4. Click **Test Connection**, then **Save Settings**. ## Related Articles * [Custom Email](/white-label/custom-email): full walkthrough covering all providers * [Mailgun](/integrations/mailgun): an alternative recommended provider # Retell AI Source: https://docs.vapify.agency/integrations/retell Key setup, verification, and rotation for the Retell integration. ## Overview Retell is Vapify's alternative voice AI provider, with a streamlined single-key setup. A good fit if your assistants are already built in Retell. ## Key requirements | Key | Required | Purpose | | ----------- | -------- | ------------------------------------------------------------------ | | **API Key** | Yes | Authenticates Vapify with your Retell account and syncs assistants | ## Where to generate keys Log into your Retell dashboard, navigate to **Settings → API Keys**, and copy your API key. ## Entering keys in Vapify Select **Retell**, paste your API key, and click **Verify and Continue** (during onboarding) or **Save Settings** (in a sub account's General tab). See [Connect Your AI Provider](/getting-started/connect-your-ai-provider) for the full walkthrough. ## Verification Vapify tests the key before accepting it. If verification fails, re-copy the key from Retell. Trailing spaces are the most common cause. ## Rotation Once a sub account's Billing Start Date is set (gone live), its Retell API key cannot be edited. Plan your key setup carefully before going live. Before go-live, you can update the key any time from the sub account's **General** tab. ## Related Articles * [Connect Your AI Provider](/getting-started/connect-your-ai-provider): first-time connection steps * [AI Assistants](/running-your-agency/ai-assistants): syncing and assigning assistants after connecting * [Vapi](/integrations/vapi): the alternative provider # SMTP Source: https://docs.vapify.agency/integrations/smtp Reference for connecting a custom SMTP server for platform emails. ## Overview SMTP is the advanced option for custom email. Use it if you have an existing mail server, or want to send through Google Workspace or Microsoft 365 rather than a dedicated provider like Mailgun or Postmark. SMTP setup requires more technical knowledge than Mailgun or Postmark. Use it only if you have specific requirements. ## Required settings | Field | Description | | ------------------------ | ------------------------------------------------- | | **SMTP Server/Hostname** | Your mail server address (e.g., `smtp.gmail.com`) | | **Port** | Typically 587 (TLS) or 465 (SSL) | | **Username** | Your full email address | | **Password** | Your email password or an app-specific password | ## Google Workspace setup 1. Generate an app password: **Google Account → Security → 2-Step Verification → App passwords**, for "Mail". 2. Use `smtp.gmail.com`, port `587`, TLS/STARTTLS, your full Google Workspace email as username, and the app password (not your account password). 3. Enter these in Vapify's SMTP fields, click **Test Connection**, then **Save Settings**. ## Security * Never use your primary account password * Always use app-specific passwords when available * Use TLS/SSL encryption (port 587 or 465) * Rotate app passwords regularly ## Related Articles * [Custom Email](/white-label/custom-email): full setup walkthrough covering all providers * [Mailgun](/integrations/mailgun) · [Postmark](/integrations/postmark): simpler managed alternatives # Stripe Source: https://docs.vapify.agency/integrations/stripe Reference for the Stripe payment integration that powers client billing. ## Overview Stripe processes every client payment (subscriptions, per-minute top-ups, and package purchases) and pays out directly to your agency's own Stripe account. ## Connection method Stripe Connect, set up via OAuth from **Billing & Usage → Get Started**. See [Connect Stripe](/getting-started/connect-stripe) for first-time setup and [Stripe Integration](/billing/stripe-integration) for managing the connection afterward. ## What Stripe handles * Monthly subscription billing and retries on failed payments * Balance top-ups and package purchases * Refunds (Stripe Refund or Account Credit) * Payout of funds directly to your bank account ## Fees No Vapify platform fee on payments. Standard Stripe processing fees apply (for US card payments, approximately 2.9% + \$0.30 per transaction; rates vary by country and payment method — see [Stripe's pricing](https://stripe.com/pricing)). ## Related Articles * [Connect Stripe](/getting-started/connect-stripe): first-time setup * [Stripe Integration](/billing/stripe-integration): managing, viewing, and disconnecting * [How Billing Works](/billing/how-billing-works): where Stripe fits in the money flow # Vapi Source: https://docs.vapify.agency/integrations/vapi Key types, where to generate them, verification, and rotation for the Vapi integration. ## Overview Vapi is Vapify's primary voice AI provider integration, offering full call analytics and recordings streamed directly into your dashboard. ## Key requirements | Key | Required | Purpose | | ------------------- | -------- | -------------------------------------------------------------- | | **Private API Key** | Yes | Server-side authentication; retrieves assistants and call data | | **Public API Key** | Yes | Client-side integrations and widget functionality | ## Where to generate keys Log into your [Vapi dashboard](https://vapi.ai), navigate to **API Keys**, and copy both your Private and Public keys. ## Entering keys in Vapify Paste the Private key in the first field and the Public key in the second, then click **Verify and Continue** (during onboarding) or **Save Settings** (in a sub account's General tab). See [Connect Your AI Provider](/getting-started/connect-your-ai-provider) for the full walkthrough. ## Verification Vapify tests both keys before accepting them. If verification fails, re-copy the keys from Vapi. Trailing spaces are the most common cause, and swapped private/public keys are the second most common. ## Rotation Once a sub account's Billing Start Date is set (gone live), its Vapi API keys cannot be edited. Plan your key setup carefully before going live. Rotating keys after that point requires creating a new sub account. Before go-live, you can update keys any time from the sub account's **General** tab. ## Related Articles * [Connect Your AI Provider](/getting-started/connect-your-ai-provider): first-time connection steps * [AI Assistants](/running-your-agency/ai-assistants): syncing and assigning assistants after connecting * [Retell AI](/integrations/retell): the alternative provider # AI Assistants Source: https://docs.vapify.agency/running-your-agency/ai-assistants Sync, assign, and price the voice assistants your clients use. ## Overview **Assistants** in the sidebar shows every voice assistant across all your sub accounts. In the standard flow you build and edit assistants in your provider's dashboard (Vapi or Retell), and Vapify assigns them to clients and manages their pricing. Vapify can also provision certain assistants directly — for example demo and e-commerce assistants. Your day-to-day assistants still live in the provider dashboard. ## Common Tasks ### View all assistants across your agency Open **Assistants** in the sidebar for a global view: every assistant from every connected provider account, which sub account each is assigned to, status, and phone number. Platform Assistants screen showing all assistants across sub accounts ### Sync assistants from your provider Save a valid provider API key in a sub account's **General** tab, or click **Refresh Assistant List** in its **Assistants** tab, whenever you create a new assistant, attach a phone number, or rename one in the provider dashboard. ### Assign an assistant to a client See [Assign an AI Assistant](/getting-started/assign-an-ai-assistant) for the full steps. ### Set or change pricing See [Configure Pricing](/getting-started/configure-pricing). ### Control voice-widget access In a sub account's **Assistants** tab, toggle **Allow customers to talk to the voice assistants**. Enabled lets clients test assistants through a dashboard voice widget; disabled limits them to analytics only. An assistant can only be assigned to one sub account at a time. For similar assistants across clients, create a separate assistant per client in your provider dashboard. ## Troubleshooting * **Assistant missing from the assignment list**: Confirm the provider API key is correct and saved, then click **Refresh Assistant List**. * **Cannot edit provider API key**: The sub account has gone live; this lock is permanent. You can still add or remove assistant assignments after go-live. ## Related Articles * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): how assistants fit into a client's sub account * [Pricing Models](/billing/pricing-models): per-minute, monthly, and hybrid pricing * [Vapi](/integrations/vapi) · [Retell AI](/integrations/retell): provider-specific setup # Analytics Source: https://docs.vapify.agency/running-your-agency/analytics Where usage and call analytics live across the platform today. ## Overview Vapify doesn't currently have a separate "Analytics" screen distinct from the Dashboard and Call Logs. Analytics data is surfaced in those two places instead. ## Where to find analytics today * **[Dashboard](/running-your-agency/dashboard)**: daily total minutes, call count, and average call duration, aggregated per agency or per sub account. * **[Call Logs](/running-your-agency/call-logs)**: per-call detail: transcripts, recordings, duration, and ended reason, filterable by assistant, type, and outcome. * **GoHighLevel integration**: if you use the [GoHighLevel](/integrations/gohighlevel) integration, a mapped GHL sub account shows a **Call summary** and **Call logs** view scoped to that client. ## Related Articles * [Dashboard](/running-your-agency/dashboard) * [Call Logs](/running-your-agency/call-logs) * [Profit Tracking](/billing/profit-tracking): where margin shows up in reporting # Call Logs Source: https://docs.vapify.agency/running-your-agency/call-logs Search, filter, and review every call across your agency, including transcripts and recordings. ## Overview **Call Logs** shows every call processed through your agency's voice assistants, with search, filters, transcripts, and recordings for troubleshooting and quality review. Call Logs screen showing search, filters, and the calls table Call logs only sync after a sub account's Billing Start Date is set. If a sub account hasn't gone live, its calls won't appear here. ## Common Tasks ### Find a specific call Use the search bar to match assistant names, phone numbers, or any text in the logs. Combine with the three filter dropdowns: * **All Types**: `webCall` (voice widget/browser) or `Phone Call` (PSTN) * **All Assistants**: scope to one assistant across all your sub accounts * **All Ended Reasons**: e.g., `customer-ended-call`, `silence-timed-out`, `assistant-ended-call`, `assistant-error`, `exceeded-max-duration` ### Check for new calls The page shows "Last updated X minutes ago" and auto-checks periodically. Click **Check now** to refresh immediately without reloading the page. ### Review a call in detail Click any row to open its transcript, recording (if enabled), full timestamps, and cost/billing details. Call Details page showing call metadata, recording, and transcript ### Change how many calls are shown Use the **Show X** dropdown (10/25/50/100) at the bottom left, and the page navigation controls at the bottom right. ## Related Articles * [Dashboard](/running-your-agency/dashboard): the aggregate metrics behind these logs * [AI Assistants](/running-your-agency/ai-assistants): which assistant handled which call * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): why calls don't appear before go-live # Clients Source: https://docs.vapify.agency/running-your-agency/clients Manage sub accounts, the isolated space each client gets for assistants, users, and billing. ## Overview **Subaccounts** in the sidebar is where every client lives. Each sub account is a strict isolation boundary: its own assistants, pricing, users, credits, and call logs, never shared with another client. See [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts) for the full model. ## Common Tasks ### Create a new client See [Create Your First Client](/getting-started/create-your-first-client) for the full walkthrough. The same steps apply to your second client and beyond. ### Edit a sub account's General settings Open the sub account and use the **General** tab to rename it, change its provider API keys (only before go-live), or view its Danger Zone. ### Configure billing for a client Use the sub account's **Billing** tab to set per-minute pricing, enable a monthly subscription, add Credits, or set an onboarding fee. Full detail: [How Billing Works](/billing/how-billing-works). ### Manage who has access Use the sub account's **Users** tab to invite, remove, or check the status (`invited`, `active`, `inactive`) of each client user. See [Inviting Team Members](/team-management/inviting-team-members). ### Archive a client In the sub account's **General** tab, **Danger Zone**, click **Archive Sub Account**. Archiving is permanent and cannot be undone. Billing stops immediately, the sub account becomes inaccessible, and data is preserved but frozen. Only archive after you've completely finished with that client and reviewed all associated data. ## Related Articles * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): the sub account object model * [AI Assistants](/running-your-agency/ai-assistants): assigning assistants to a client * [How Billing Works](/billing/how-billing-works): the money model behind each client # Contacts Source: https://docs.vapify.agency/running-your-agency/contacts A per–sub account address book that fills itself from calls and bookings, keeps every call a contact has made, and that you can also manage by hand. ## Overview **Contacts** is each sub account's own address book. It holds the people your client's voice assistants talk to and book — captured automatically from calls and appointments, importable from GoHighLevel, and editable by hand. Each contact keeps a full **call history**, so you can see every call one person has made without searching the call log. Contacts are **scoped to a single sub account** and isolated between clients, the same way pricing and call data are (see [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts)). When you manage more than one client, use the sub account selector to choose whose contacts you're viewing. Contacts live in the sidebar, just below **Calendar** — the two work together: an appointment booked through Calendar creates or updates the matching contact automatically. ## How contacts get created You rarely start from an empty list. A contact can arrive four ways: | Source | How it's created | Shown as | | --------------- | --------------------------------------------------------------------------------------------- | ------------ | | **Manual** | You add it yourself from the Contacts page (or via the API). | `manual` | | **Voice call** | Created automatically when a call syncs in, matched on the caller's phone number (or email). | `voice call` | | **Appointment** | Created (or matched) automatically when the assistant books an appointment, matched by email. | `import` | | **GoHighLevel** | Synced in from a mapped GHL sub account. | `ghl sync` | Because calls and bookings populate contacts on their own, the list grows as your client's assistants work — no manual data entry required. Add contacts by hand only when you want a record ahead of the first interaction. ### Contacts created from call logs sync Every call that reaches Vapify is matched to a contact automatically — you don't have to import anyone. As [Call Logs](/running-your-agency/call-logs) sync from your voice provider, each call is checked against the sub account's existing contacts: Vapify takes the customer's phone number and email from the call. If the call carries neither, it's stored as a call but no contact is created. The phone number is matched first, then the email, against contacts already in **that sub account**. A match means the call is attached to the person you already have. If no contact matches, one is created with the caller's phone, email, and name (when the provider supplies it), and its source is set to **voice call**. When a matched contact is missing a field the call provides — an email, a last name — that field is backfilled. Details you entered yourself are never overwritten. Because matching is per sub account, the same caller reaching two different clients becomes a separate contact under each — client data stays isolated. Contacts appear as their calls sync, not the instant a call ends. If a caller you expect is missing, check **Call Logs Sync Status** first — a stalled sync holds back both the calls and the contacts they would create. See [Call Logs](/running-your-agency/call-logs). Repeat callers do **not** create duplicates. A second call from the same number attaches to the existing contact, which is what builds up their call history. ## The contacts list Open **Contacts** in the sidebar to see every contact for the selected sub account. Contacts page * **Columns:** Name, Phone, Email, Company, Source, Created, and row actions. * **Search:** filter by name, email, or phone. * **Sub account filter:** agency users can narrow the list to one client's contacts. * **Add Contact:** create a contact by hand (see below). * **Row actions:** edit or delete any contact. * **Export CSV:** download the current contacts as a spreadsheet (`contacts-export-.csv`), including every field — company, website, address, tags, custom fields, notes, and source. ### Add a contact manually Click **Add Contact** and fill in the details. A contact needs **at least an email or a phone number**; everything else is optional: Add a contact manually * Name (first, last), email, phone * Company, website * Address, city, state, country * Notes and tags * Custom fields Duplicate emails or phone numbers within the same sub account are rejected, so the same person doesn't get two records. ## The contact detail page Click a contact to open its detail page, which has three tabs: Contact detail page * **Contact Details** — the full record: contact info, company, address, tags, notes, and custom fields. * **Call History** — every call this contact has made or received (see below). * **Appointments** — every booking linked to this contact. Open one to see the appointment, or **cancel** it from here. This is the same booking data managed in [Calendar](/integrations/calendar). ### Call History The **Call History** tab shows every call linked to this contact, newest first, with a count of the total beside the heading. It answers "what has this person actually spoken to us about?" without digging through the full call log. Contact call history Each row shows: * **Call type and status** — such as `Answered`, `Ended`, or `Missed`. * **Summary** — the assistant's short account of what the caller wanted and what happened. * **Duration** — how long the call lasted (`0s` for missed calls). * **Date and time** — when the call started. Click any row to open the full call in [Call Logs](/running-your-agency/call-logs), with the recording, transcript, and analysis. This is the fastest way to prepare for a callback: open the contact, read the last two or three summaries, and you know the history before you dial. Only calls that synced in and matched this contact appear here. Calls with no caller phone number or email can't be attributed to anyone, so they stay in Call Logs without showing on a contact. ## Related Articles * [Call Logs](/running-your-agency/call-logs): the full call record — syncing calls is what creates contacts and fills their call history. * [Calendar](/integrations/calendar): where appointments are scheduled — bookings create and link contacts. * [GoHighLevel](/integrations/gohighlevel): map a GHL sub account to sync its contacts in. * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): why contacts stay isolated per client. # Dashboard Source: https://docs.vapify.agency/running-your-agency/dashboard Monitor usage, spend, and call outcomes across your agency or a single client. ## Overview The Dashboard is your agency's control center. It gives you a view of voice usage, spend, and call outcomes, aggregated across all sub accounts for agency users, or scoped to one client for sub account users. Use the **Year / Day / Week / Month** toggle at the top to change the time range. Dashboard screen showing summary tiles and usage charts ## Summary tiles Four tiles at the top summarize the selected period, each with a change indicator versus the previous period: * **Total Call Minutes**: voice-call minutes processed. * **Number of Calls**: total calls made. * **Total Spent**: your provider cost for the period. * **Average Cost per Call**: total spend divided by call count. ## Charts * **Call Minutes Over Time**: minutes trend across the selected range. * **Call Outcomes**: successful vs. unsuccessful calls, with a success-rate bar. * **Call Count**: calls per day. * **Average Call Duration**: average call length per day. * **Disconnection Reasons**: why calls ended (e.g., assistant ended call, error, user ended call, call completed), with counts and percentages. ## Reading the dashboard Use these to spot usage trends and catch anomalies early. A spike in call count with a drop in average duration, or a rising share of **Error** disconnections, can indicate a misconfigured assistant worth investigating in [Call Logs](/running-your-agency/call-logs). ## Related Articles * [Call Logs](/running-your-agency/call-logs): drill into the calls behind these numbers * [Usage](/running-your-agency/usage): usage tied to billing and package limits * [Platform Overview](/start-here/platform-overview): where the Dashboard sits in the sidebar # Notifications Source: https://docs.vapify.agency/running-your-agency/notifications Configure low-balance thresholds and the alerts your clients receive. ## Overview Vapify sends an email and dashboard alert when a client's available funds fall below a threshold you set. It uses two separate thresholds: one for the low-balance alert, one for auto top-up. ## Common Tasks ### Set the low-balance threshold Set a **low-balance notification threshold** for the sub account. When the client's Balance plus Credits falls below it, Vapify sends an email alert and shows a dashboard banner. Clients on a monthly package also see an "Approaching Monthly Limit" warning as they near their included minutes. ### Let clients avoid interruptions Clients can enable **auto top-up** with a separate threshold. When their Balance drops below it, Vapify charges their saved card to replenish it automatically. A low or \$0 balance does **not** stop calls in real time. Vapify bills in arrears from synced call logs — see [How Billing Works](/billing/how-billing-works). Calls placed while a client is out of funds still connect; the charges are held as **pending** and settle on the next top-up. The low-balance alert is your cue to collect funds before the pending balance grows. ## Related Articles * [Wallet & Credits](/billing/wallet-credits): how Balance and Credits work * [Usage](/running-your-agency/usage): where clients see their current usage * [Pricing Models](/billing/pricing-models): per-minute vs. monthly package billing # Phone Numbers Source: https://docs.vapify.agency/running-your-agency/phone-numbers How phone numbers connect to your assistants and appear in call logs. ## Overview Phone numbers are purchased and attached to assistants in your provider's dashboard (Vapi or Retell), not inside Vapify. Once attached, Vapify shows the number wherever that assistant's calls appear. ## Common Tasks ### Attach a phone number to an assistant In your provider's dashboard, attach a phone number to the assistant that needs to take phone calls. Web-call-only assistants don't need one. ### See which number an assistant is using Open **Assistants** in the sidebar, or the sub account's **Assistants** tab. Each assigned assistant shows its associated phone number, if any. ### Find calls from a specific number In [Call Logs](/running-your-agency/call-logs), use the search bar to filter by phone number. webCalls (made through a voice widget or web interface) show **N/A** in the Phone Number field, since they don't use a phone number. ## Related Articles * [AI Assistants](/running-your-agency/ai-assistants): assigning and refreshing assistants * [Call Logs](/running-your-agency/call-logs): filtering calls by number # Understanding Sub Accounts Source: https://docs.vapify.agency/running-your-agency/understanding-sub-accounts What a sub account contains and how its four tabs fit together. ## Overview A sub account is the isolated space for one client: its own users, assigned assistants, billing, and call logs. Every sub account's settings page has four tabs: **General**, **Assistants**, **Billing**, and **Users**. Sub Account General tab showing core configuration and provider integration ## The four tabs * **General**: sub account name, provider selection, and API keys. Once a Billing Start Date is set, provider API keys lock permanently. * **Assistants**: which voice assistants (synced from your provider) are assigned to this client, plus the voice-widget permission toggle. * **Billing**: Balance, Credits, per-minute pricing, monthly subscription, onboarding fee, and unprofitable-call protection. * **Users**: who can log into this sub account, and their status (`invited`, `active`, `inactive`). ## Going live "Going live" means setting the **Billing Start Date** (also shown as the Go Live Date). A one-time, permanent action — it cannot be changed once set. From that date forward, usage is billable, call logs begin syncing, and provider API keys lock. See [Launch Your Agency](/getting-started/launch-your-agency) for the full walkthrough. Setting the Billing Start Date runs a live test call against your provider key. If the key is invalid, go-live is blocked with **"Please set a valid private key before you start billing."** Fix the key, then set the date. Before the Billing Start Date is set, users can still log in, but call logs will not appear. ## Related Articles * [Clients](/running-your-agency/clients): day-to-day sub account management tasks * [How Vapify Works](/start-here/how-vapify-works): where sub accounts sit in the object hierarchy * [How Billing Works](/billing/how-billing-works): Balance, Credits, and pricing in depth # Usage Source: https://docs.vapify.agency/running-your-agency/usage See how much of a client's Balance, Credits, or package minutes have been used. ## Overview Usage tracking shows how a client is consuming their prepaid Balance, Credits, or monthly package minutes, in real time as calls complete. Billing & Usage page showing Billing Summary and Voice Usage Revenue ## Common Tasks ### Check a client's current usage Open the sub account's **Billing** tab to see current Balance, Credits, and (if a monthly package is active) minutes used versus included minutes. ### Understand the usage dashboard For per-minute billing, clients see their available Balance and Credits and a running total as calls complete. For package billing, clients see minutes used out of their included total (e.g., "187 / 200 minutes") and any overage charges accrued once the limit is passed. ### Respond to low balance Balance running low or reaching \$0 triggers dashboard banners and (if configured) email alerts. See [Notifications](/running-your-agency/notifications) to adjust thresholds, or ask the client to top up, or add [Credits](/billing/wallet-credits) yourself. ## Related Articles * [Wallet & Credits](/billing/wallet-credits): how Balance and Credits are consumed * [Pricing Models](/billing/pricing-models): per-minute vs. package billing * [Notifications](/running-your-agency/notifications): configuring low-balance and usage alerts # Glossary Source: https://docs.vapify.agency/start-here/glossary Definitions for every Vapify-specific term used across the documentation. | Term | Definition | | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Agency** | The Vapify customer account, you. Holds branding, provider connection, and all sub accounts. | | **Sub account** | One client's dedicated space: their users, assigned assistants, phone numbers, call logs, and billing. | | **User** | A person with login access to a specific sub account — your client's own staff. Every user belongs to one sub account and holds a role (Administrator or Member) scoped to it. Not to be confused with the agency owner (that's you). | | **Primary user** | A sub account's main administrator, created during onboarding. | | **Provider** | The voice AI backend, Vapi or Retell. Assistants are created and edited in the provider's own dashboard, not in Vapify. | | **Assistant / voice assistant** | A voice AI agent created in Vapi or Retell, then assigned to a sub account in Vapify. | | **Markup** | The per-minute amount you add above provider cost. Example: provider cost \$0.15/min, client rate \$0.20/min, markup \$0.05/min. | | **Go Live Date / Billing Start Date** | The date billing activates for a sub account. Can be set only once and cannot be changed afterward. | | **Balance** | Funds a client loads into their own account via Stripe (self-service). Used to pay for assistant minutes. | | **Credits** | Promotional or bonus funds the agency manually adds to a sub account. Always consumed before Balance. | | **Per-minute billing** | Billing model that charges a client per minute of call time. | | **Monthly subscription / retainer** | A fixed recurring fee, optionally combined with per-minute billing. Requires a paid plan. | | **Monthly package** | A fixed monthly price that includes a set number of minutes, with an overage rate once those minutes are used. | | **Onboarding fee** | A one-time fee a new sub account user must pay before accessing the platform. | | **Manual Payment Mode** | A sub account setting that disables Vapify's automatic Stripe billing so the agency can bill clients outside the platform. | | **Custom subdomain** | A branded URL (e.g., `voice.youragency.com`) that replaces `app.vapify.agency` for a given agency. Requires a paid plan and a CNAME DNS record. | | **CNAME record** | A DNS record that points a subdomain to Vapify's servers, required for custom subdomain setup. | | **Archiving** | Permanently deactivating a sub account. Irreversible; billing stops and data is frozen but preserved. | # How Vapify Works Source: https://docs.vapify.agency/start-here/how-vapify-works The Agency, Sub Account, and Assistant hierarchy that everything else builds on. ## Overview Every feature in Vapify sits inside one object hierarchy. Understanding it makes the rest of the platform predictable. ## The hierarchy ```mermaid theme={null} flowchart TD A["Agency
(you, the Vapify customer)"] --> B["Sub Account
(one per client business)"] B --> C["Users
Primary user + additional users"] B --> D["Assigned Voice Assistants
mapped from your provider account"] B --> E["Phone Numbers"] B --> F["Call Logs & Recordings"] B --> G["Billing
per-minute rate, monthly fee, wallet/credits"] ``` * **Agency**: your Vapify account. This is where branding, custom domain, custom email, and your provider connection live. * **Sub account**: one per client. Each has its own users, assigned assistants, phone numbers, call logs, and billing configuration. * **Assistant**: created in Vapi or Retell, then assigned to a sub account. Assistants are never built inside Vapify itself; Vapify only assigns and prices them. ## How money flows ```mermaid theme={null} flowchart LR A["Provider cost
$0.15/min"] --> B["Your markup
+$0.05/min"] --> C["Client charge
$0.20/min"] ``` Example: Vapi charges you \$0.15/min, you set the client rate at \$0.20/min, you keep \$0.05/min profit. See [How Billing Works](/billing/how-billing-works) for the full model, including monthly retainers and the wallet/credits system. ## How assistants get to clients 1. You create and configure the assistant in your provider's dashboard (Vapi or Retell). 2. You connect that provider account to your Vapify agency. 3. Vapify syncs the assistant list. 4. You assign a specific assistant to a specific sub account and set its price. See [Assign an AI Assistant](/getting-started/assign-an-ai-assistant) for the walkthrough. ## Related Articles * [How Billing Works](/billing/how-billing-works): the money flow in full detail * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): what lives inside a sub account * [Glossary](/start-here/glossary): definitions for every term used here # Platform Overview Source: https://docs.vapify.agency/start-here/platform-overview A tour of the Vapify dashboard, sidebar, and main areas of the app. ## Overview After logging in at `app.vapify.agency`, you land on your agency Dashboard. This page orients you to the main areas of the app before you start configuring anything. ## The Dashboard Your dashboard shows three charts: total minutes per day, total call count per day, and average call duration per day. As an agency user you see data aggregated across all sub accounts; a sub account user sees only their own data. Full detail: [Dashboard](/running-your-agency/dashboard). ## The Sidebar Vapify sidebar navigation The sidebar is your navigation hub. Main areas: | Sidebar area | What it's for | | ------------------------- | --------------------------------------------------------------- | | **Dashboard** | Agency-wide or sub-account usage metrics | | **Assistants** | Voice assistants synced from your provider | | **Phone Numbers** | Numbers attached to your assistants | | **Call Logs** | Call history, recordings, and transcripts | | **Calendar** | Per-sub-account scheduling: availability, event types, bookings | | **Contacts** | Contact records used for calls and bookings | | **Batch Call** | Trigger outbound calls to many contacts at once | | **Subaccounts** | Client management, one entry per client | | **Call Logs Sync Status** | Whether call logs are syncing from your provider | | **Billing & Usage** | Your agency's own billing and plan | | **Agency Settings** | Branding, custom domain, custom email | | **Professional Services** | Plan upgrades and paid add-ons | | **Get Help** | Support and documentation | ## Agency Settings vs. Sub Account Settings These are two different configuration surfaces and it's easy to confuse them: * **Agency Settings**: configures how *your agency* looks and operates (branding, subdomain, email provider). Applies to your whole account. * **Sub account settings**: configures one specific *client* (their provider keys, assigned assistants, pricing, users). Each client has their own. See [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts) for the sub account model. ## Related Articles * [Dashboard](/running-your-agency/dashboard): full metrics breakdown * [How Vapify Works](/start-here/how-vapify-works): the object model behind the sidebar * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): what lives inside a sub account # Quick Start Source: https://docs.vapify.agency/start-here/quick-start The 4-step onboarding wizard that gets your agency running in 5-10 minutes. **Estimated time:** 5-10 minutes ## Overview When you first log in, Vapify walks you through a 4-step onboarding wizard covering the essentials: branding, provider connection, your first client, and launch. This page condenses those four steps. Each step links to its full page in [Getting Started](/getting-started/brand-your-agency) for detail. ## Prerequisites * A Vapify agency account * A Vapi or Retell account with at least one voice assistant created ## Steps 1. **Agency Details**: Enter your Agency Name, upload your Agency Logo, and upload a Favicon. Click **Save & Continue**. Full page: [Brand Your Agency](/getting-started/brand-your-agency). 2. **Provider Setup**: Choose Vapi (Private + Public API key) or Retell (single API key), paste your key(s), click **Verify and Continue**. Full page: [Connect Your AI Provider](/getting-started/connect-your-ai-provider). 3. **Create Your First Client Sub Account**: Enter the Sub Account Name, Primary User Full Name, Primary User Email, and a Temporary Password. Click **Create Client**. Full page: [Create Your First Client](/getting-started/create-your-first-client). 4. **Review & Launch**: Review the sub account summary and copy the temporary password before continuing. Click **Continue to Dashboard**. Full page: [Launch Your Agency](/getting-started/launch-your-agency). The temporary password from Step 3 is shown in plain text only once, on the Step 4 review screen. Copy it before clicking **Continue to Dashboard**. You cannot retrieve it later. The wizard can be skipped and configured manually later from Agency Settings and each sub account's settings page. ## Related Articles * [Getting Started](/getting-started/brand-your-agency): the full 8-step setup path, one page per step * [What is Vapify?](/start-here/what-is-vapify): the business model behind these steps * [How Vapify Works](/start-here/how-vapify-works): the Agency → Sub Account → Assistant model # Welcome to Vapify Source: https://docs.vapify.agency/start-here/welcome A quick orientation to Vapify and where to go next. Vapify is a white-label platform for voice AI agencies. It lets you resell voice AI under your own brand (your logo, your domain, your pricing) while providers like Vapi and Retell handle the underlying voice technology. If this is your first time here, start with [What is Vapify?](/start-here/what-is-vapify) to understand the business model, then move to [Quick Start](/start-here/quick-start) to begin setup. The business model and who Vapify is for The 4-step onboarding wizard, condensed A tour of the dashboard and sidebar The Agency → Sub Account → Assistant model # What is Vapify? Source: https://docs.vapify.agency/start-here/what-is-vapify The Vapify business model, who it is for, and what your clients see. ## Overview Vapify is a white-label platform built for voice AI agencies. It lets you resell voice AI assistants under your own brand while Vapify handles client management, billing, and usage tracking behind the scenes. ## Who Vapify is for Vapify is for agencies that want to offer voice AI services to their own clients (dental practices, law firms, real estate teams, and similar businesses) without building a platform from scratch. ## The business model You connect a voice AI provider (Vapi or Retell), then resell assistant minutes to your clients at a markup: * **Per-minute markup**: provider charges you \$0.15/min, you charge your client \$0.20/min, you keep the \$0.05/min difference. * **Monthly retainer fees**: a fixed recurring fee on top of, or instead of, per-minute charges. Both models can run at once. See [How Billing Works](/billing/how-billing-works) for the full breakdown. ## What your clients see Clients never see Vapify or the underlying provider. They log into a dashboard branded entirely as your agency: your logo, your domain, your login page. Vapify pulls call logs and recordings through without exposing the provider account, and your agency's prompts and provider setup stay hidden. See [Client Experience](/white-label/client-experience) for the full walkthrough of what a client sees end to end. ## How the platform is organized Vapify is structured around three layers: your **agency**, your clients' **sub accounts**, and the **voice assistants** assigned to each. See [How Vapify Works](/start-here/how-vapify-works) for the full model. ## Related Articles * [How Vapify Works](/start-here/how-vapify-works): the Agency → Sub Account → Assistant model * [How Billing Works](/billing/how-billing-works): provider cost, markup, and client charge in detail * [Client Experience](/white-label/client-experience): what your clients see and never see # Inviting Team Members Source: https://docs.vapify.agency/team-management/inviting-team-members Add another user to a client sub account. **Estimated time:** 2 minutes ## Overview Add a teammate or additional client contact to a sub account beyond its primary user. ## Prerequisites * [A sub account already exists](/getting-started/create-your-first-client) ## Steps 1. Open the sub account and go to the **Users** tab. 2. Click **New Sub Account User**. 3. Enter their first name, last name, and email. 4. Choose their role: **Administrator** (can manage billing and top-ups) or **Member** (limited access). 5. Send the invitation. They'll receive an email to activate their account. The new user's status shows as **Invited** until they activate, then switches to **Active**. ## Related Articles * [Users](/team-management/users): status reference and table fields * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): where the Users tab sits # Permissions Source: https://docs.vapify.agency/team-management/permissions Capability matrix by role. ## Overview Two confirmed layers of permission exist: a per-user **role** (set when inviting a sub account user) and a per-sub-account **feature toggle** (set once, applies to everyone in that sub account). ## Role × capability | Capability | Administrator | Member | | --------------------------------- | ------------- | ------ | | View assistants, call logs, usage | Yes | Yes | | Manage billing and top-ups | Yes | No | ## Sub-account-wide toggle The **voice widget toggle** ("Allow customers to talk to the voice assistants") is controlled per sub account in the **Assistants** tab, not per user. When enabled, any user in that sub account can use the voice widget; when disabled, users see analytics only. ## Related Articles * [Roles](/team-management/roles): role types, pending verification * [AI Assistants](/running-your-agency/ai-assistants): the voice widget toggle in context # Roles Source: https://docs.vapify.agency/team-management/roles Role types available for sub account users. ## Overview Every sub account has one **primary user** (the client's main administrator, created during onboarding), plus any additional invited users, each assigned a role. ## Confirmed roles | Role | Access | | ----------------- | -------------------------------------------------------------- | | **Administrator** | Can manage billing and top-ups, in addition to standard access | | **Member** | Limited access; cannot manage billing | ## What is confirmed * Every sub account has exactly one **primary user**, set during sub account creation. * Additional users can be invited afterward via **New Sub Account User**, choosing **Administrator** or **Member**. ## Related Articles * [Permissions](/team-management/permissions): capability matrix, pending verification * [Inviting Team Members](/team-management/inviting-team-members): the invite flow # Users Source: https://docs.vapify.agency/team-management/users Reference for user status and the Users tab in each sub account. ## Overview A **user** is a person with login access to a specific sub account — your client's own staff. Every user belongs to a single sub account and holds a role (Administrator or Member) scoped to it. This is distinct from the agency owner (you), who manages the agency itself. User management in Vapify happens at the sub account level. Each sub account has its own **Users** tab listing everyone with access to it. Sub Account User Management tab ## User table fields | Column | Description | | -------------- | ------------------------------------------ | | **First Name** | User's first name | | **Last Name** | User's last name | | **Status** | `invited`, `active`, or `inactive` | | **Email** | Login email address | | **Actions** | Resend invite, remove, or edit permissions | ## User status reference * **Invited**: sent an invitation, hasn't activated yet * **Active**: has activated and can access the sub account * **Inactive**: access has been disabled ## Related Articles * [Inviting Team Members](/team-management/inviting-team-members): adding a new user * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): where the Users tab lives # Agency Branding Source: https://docs.vapify.agency/white-label/agency-branding Reference for agency name, logo, and favicon specs and where they appear. ## Overview Your agency name, logo, favicon, and theme color are available on every plan, including Free, and appear across the entire client-facing experience. They're set on the **Agency** tab of **Agency Settings** (alongside the **Domain**, **Email Settings**, and **Custom Menus** tabs). Agency Settings page showing the Agency tab with agency name, logo and favicon upload, and the Agency Theme Color picker ## Where branding appears | Element | Appears in | | --------------- | ------------------------------------------------------------------------------------------- | | **Agency Name** | Dashboard header/navigation, client dashboards, emails, login pages, invoices | | **Agency Logo** | Top-left of dashboard, client dashboards, email headers, loading screens, printed documents | | **Favicon** | Browser tab when clients access your platform | | **Theme Color** | Primary color across your whole agency dashboard and all client portals | ## Specifications | Asset | Format | Minimum size | Recommended | File size limit | | ----------- | ---------------------------------- | ------------------ | ---------------------------------- | --------------- | | **Logo** | PNG (transparent preferred) or JPG | 200×200px | 400×400px, square or 2:1/3:1 | Under 2MB | | **Favicon** | ICO or PNG | 16×16px or 32×32px | Simple, recognizable at small size | Under 100KB | ## Agency theme color On the **Agency** tab, **Agency Theme Color** sets the primary color used throughout your dashboard and every client portal. Pick a **Preset** swatch or use **Choose Own** for a custom color; a live preview shows how primary and outline buttons will look. ## Updating branding Go to **Agency Settings → Agency tab**, update the fields, and click **Save Agency Settings**. Logo and favicon changes require a log out/log in cycle to appear across the platform. ## Troubleshooting * **Logo or favicon not appearing**: Log out and back in, clear your browser cache, and confirm file size and format meet the specs above. ## Related Articles * [Brand Your Agency](/getting-started/brand-your-agency): first-time setup walkthrough * [Custom Domain](/white-label/custom-domain): extending branding to your own URL * [Custom Email](/white-label/custom-email): branding platform emails # Client Experience Source: https://docs.vapify.agency/white-label/client-experience What your client sees, end to end, and what they never see. ## Overview This page walks the client's entire view of the platform (from login to invoices) so you can predict exactly what they'll encounter. ## The client's journey 1. **Login**: a branded page at your custom subdomain (or `app.vapify.agency`), showing your logo and agency name. See [Custom Login](/white-label/custom-login). 2. **Dashboard**: usage charts scoped only to their sub account: total minutes, call count, and average duration per day. See [Dashboard](/running-your-agency/dashboard). 3. **Assistants / voice widget**: if enabled, clients can talk to their assigned assistant directly through a dashboard widget; otherwise they see analytics only. 4. **Call logs and recordings** (clients can view their own call history, transcripts, and recordings (if enabled)) never other clients' data. 5. **Billing**: clients see their Balance, Credits, active package (if any), and can top up funds or subscribe via your branded Stripe checkout. 6. **Invoices and emails**: all system emails and invoices carry your agency's name and sender address, never Vapify's. ## What clients never see * The Vapify name or branding, anywhere in their experience * Which provider (Vapi or Retell) powers their assistant * Your provider API keys, prompts, or assistant configuration * Other clients' sub accounts, data, or pricing ## Related Articles * [Agency Branding](/white-label/agency-branding): how the branding shown here is configured * [How Billing Works](/billing/how-billing-works): the billing screens clients interact with * [Understanding Sub Accounts](/running-your-agency/understanding-sub-accounts): the isolation that keeps clients from seeing each other # Custom Domain Source: https://docs.vapify.agency/white-label/custom-domain Host Vapify on your own subdomain instead of app.vapify.agency. **Estimated time:** 15 minutes, plus up to 48 hours DNS propagation ## Overview A custom subdomain (e.g., `voice.youragency.com`) replaces `app.vapify.agency` for your clients, completing the white-label experience. Domain tab showing custom subdomain setup and upgrade prompt Domain tab showing custom subdomain setup and upgrade prompt ## Prerequisites * A paid plan (Starter, Business, Scale, or Partner). Not available on Free * Access to your domain's DNS settings ## Steps 1. Go to **Agency Settings → Domain tab**. 2. Contact [**support@info.vapify.agency**](mailto:support@info.vapify.agency) to receive your unique CNAME target. 3. In your DNS provider (Cloudflare, GoDaddy, Namecheap, Google Domains, AWS Route 53, etc.), create a **CNAME record**: Name/Host = your subdomain (e.g., "voice"), Value/Points to = the target Vapify support gave you, TTL = Auto or 3600. 4. Back in Vapify, enter your full subdomain (e.g., `voice.youragency.com`) in the **Custom Subdomain** field and click **Verify Domain**. 5. Once verified, test by navigating to your custom subdomain in a new browser window. You should see the Vapify login page with your branding. DNS propagation can take a few minutes to 48 hours. If verification fails immediately, wait 1-2 hours and try again. The default `app.vapify.agency` URL keeps working after your subdomain goes live. ## Troubleshooting * **Verification failing**: Wait for DNS propagation, confirm you used a CNAME (not an A record), check for typos, and use a tool like whatsmydns.net. * **Subdomain not loading**: Clear your browser cache, try incognito mode, and allow up to 48 hours for full propagation. ## Related Articles * [Agency Branding](/white-label/agency-branding): the rest of your brand identity * [Custom Email](/white-label/custom-email): matching your domain in emails * [Client Experience](/white-label/client-experience): how the subdomain fits the client's view # Custom Email Source: https://docs.vapify.agency/white-label/custom-email Send platform emails from your own domain using Mailgun, Postmark, Sendgrid, or SMTP. **Estimated time:** 5-10 minutes ## Overview By default, platform emails (invitations, password resets, notifications) send from Vapify's address. Custom email settings let them send from your own domain instead. Email Settings tab showing custom email provider configuration ## Prerequisites * A paid plan (Starter, Business, Scale, or Partner). Not available on Free * An account with Mailgun, Postmark, Sendgrid, or an existing SMTP server ## Steps 1. Go to **Agency Settings → Email Settings tab**. 2. Enter your sender email address (e.g., `support@youragency.com`). 3. Select your provider and enter its credentials: * **Mailgun**: Private API Key (starts with "key-") from Mailgun's Settings → API Security. * **Postmark**: Server API Token from your Postmark server's API Tokens tab. * **Sendgrid**: API key with Mail Send permissions. * **SMTP**: server/hostname, port (587 for TLS, 465 for SSL), username, and password (use an app-specific password for Google Workspace or Microsoft 365). 4. Click **Test Connection**. 5. Once the test succeeds, click **Save Settings**. Mailgun and Postmark both offer free tiers and are the recommended starting points; check their pricing pages for current limits. Use SMTP only if you need a specific existing mail server. Never use your primary email password for SMTP. Use an app-specific password, and rotate API keys periodically. ## Troubleshooting * **Test connection fails**: Recheck the API key for typos, confirm it has send permissions, and confirm your sender address is verified with the provider. * **Emails not received**: Check the recipient's spam folder, and confirm your domain has SPF/DKIM records set up with your provider. ## Related Articles * [Agency Branding](/white-label/agency-branding): the rest of your brand identity * [Custom Domain](/white-label/custom-domain): matching your domain in the platform URL * [Mailgun](/integrations/mailgun) · [Postmark](/integrations/postmark) · [SMTP](/integrations/smtp): provider-specific integration references # Custom Login Source: https://docs.vapify.agency/white-label/custom-login How your login page reflects your branding and subdomain. ## Overview There's no separate "Custom Login" settings screen. Your login page's branding is a combination of two things you configure elsewhere: your [Agency Branding](/white-label/agency-branding) (name, logo, favicon) and your [Custom Domain](/white-label/custom-domain) (the URL clients see). ## What clients see at login * Your agency logo and name, not Vapify's * Your custom subdomain in the URL bar (e.g., `voice.youragency.com`), if configured * Vapify branding never appears, on any plan ## Related Articles * [Agency Branding](/white-label/agency-branding): logo, name, and favicon setup * [Custom Domain](/white-label/custom-domain): the URL your clients log in at * [Client Experience](/white-label/client-experience): the full client journey starting at login