Skip to main content

CallRail Integration

🎯 Overview​

CallRail integration enables DashClicks to track marketing campaign phone calls, access call recordings, and manage tracking phone numbers. This integration provides multi-channel call attribution to measure advertising campaign performance and optimize marketing spend.

Provider: CallRail (https://www.callrail.com)
API Version: v3
Integration Type: REST API with API Key authentication

📁 Directory Structure​

Documentation Structure:

callrail/
├── 📄 index.md - Integration overview and setup
├── 📄 authentication.md - API key management and token storage
├── 📄 accounts-companies.md - Account and company management
├── 📄 calls.md - Call tracking, recordings, and analytics
└── 📄 trackers.md - Phone number tracker management

Source Code Location:

  • Base Path: external/Integrations/Callrail/
  • Controllers: Controllers/auth.js, Controllers/accounts.js, Controllers/companies.js, Controllers/calls.js, Controllers/trackers.js
  • Providers: Providers/account-api.js, Providers/companies-api.js, Providers/calls-api.js, Providers/trackers-api.js
  • Models: Models/keys.js
  • Routes: Routes/auth.js, Routes/accounts.js, Routes/companies.js, Routes/calls.js, Routes/trackers.js

🗄️ MongoDB Collections​

📚 Detailed Schema: See Database Collections Documentation

integrations.callrail.key​

  • Purpose: Store CallRail API keys per account
  • Model: shared/models/callrail-key.js
  • Primary Use: Store API authentication credentials

Document Structure:

{
"_id": ObjectId,
"account_id": ObjectId,
"api_key": "dfc7f89eaa8a9b4f0acbcd850a60a444",
"nickname": "Production CallRail Key",
"token_invalidated": false, // Set to true when API key becomes invalid
"deleted": ISODate, // Soft delete timestamp
"createdAt": ISODate,
"updatedAt": ISODate
}

analytics.callrail.userconfig​

  • Purpose: Store user-specific CallRail configuration for analytics
  • Model: shared/models/analytics-callrail-userconfig.js
  • Primary Use: Link CallRail account/company to DashClicks account for campaign tracking

Document Structure:

{
"_id": ObjectId,
"account_id": ObjectId,
"token": "callrail_key_doc_id",
"callrail_acountid": "470306151", // CallRail account ID
"callrail_companyid": "com_abc123", // CallRail company ID
"createdAt": ISODate,
"updatedAt": ISODate
}

🔐 Authentication & Configuration​

Authentication Method: API Key (Bearer Token)

Required Environment Variables:

VariableDescriptionRequired
NoneAPI keys stored in database per accountN/A

API Key Structure:

  • Format: 32-character hexadecimal string
  • Example: dfc7f89eaa8a9b4f0acbcd850a60a444
  • Header: Authorization: Token token="YOUR_API_KEY"

Obtaining API Keys:

  1. Sign up at CallRail Dashboard
  2. Navigate to Settings → API Keys
  3. Generate new API key
  4. Store key in DashClicks via /v1/e/callrail/auth endpoint

🏗️ Architecture Overview​

Key Responsibilities:

  • API key management and storage
  • Account and company listing
  • Call tracking and analytics
  • Call recording access
  • Phone number tracker management (session and source trackers)
  • Webhook integration for real-time call events

API Communication Pattern:

  • REST API with JSON responses
  • Token-based authentication (Bearer header)
  • Supports pagination, sorting, filtering, searching
  • All requests proxied through DashClicks API with token lookup

Token Invalidation Handling:

  • Automatic detection of 401 errors
  • Sets token_invalidated: true on API key documents
  • Requires re-authentication via dashboard

🔗 Features & Capabilities​

Core Features​

🔄 Integration Data Flow​

API Key Flow​

sequenceDiagram
participant Client as DashClicks Frontend
participant API as CallRail Controller
participant DB as MongoDB (callrail.key)
participant CallRail as CallRail API

Client->>API: POST /v1/e/callrail/auth {api_key, nickname}
API->>DB: Check existing key for account

alt Key exists and valid
DB-->>API: Return existing key
API-->>Client: Return key document
else Key invalidated
API->>DB: Delete invalidated key
API->>DB: Save new key
DB-->>API: New key document
API-->>Client: Return new key
else No key
API->>DB: Save new key
DB-->>API: Key document
API-->>Client: Return key
end

Call Data Request Flow​

sequenceDiagram
participant Client as API Consumer
participant API as CallRail Controller
participant KeysDB as MongoDB (callrail.key)
participant Provider as CallRail Provider
participant CallRail as CallRail API

Client->>API: GET /v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/calls
API->>KeysDB: Find API key by tokenId
KeysDB-->>API: Return API key document

API->>Provider: callList(apiKey, accountId, companyId, query)
Provider->>CallRail: GET /v3/a/{accountId}/calls.json
CallRail-->>Provider: Call data + pagination
Provider-->>API: Formatted response

API-->>Client: {data, pagination}

🔗 API Endpoints​

Authentication​

EndpointMethodDescription
/v1/e/callrail/authPOSTSave API key
/v1/e/callrail/authDELETEDelete API key (soft delete)
/v1/e/callrail/auth/configPOSTSave user analytics config

Accounts​

EndpointMethodDescription
/v1/e/callrail/{tokenId}/accountsGETList all accounts
/v1/e/callrail/{tokenId}/accounts/{accountId}GETGet account by ID

Companies​

EndpointMethodDescription
/v1/e/callrail/{tokenId}/accounts/{accountId}/companiesGETList companies
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}GETGet company by ID
/v1/e/callrail/{tokenId}/accounts/{accountId}/companiesPOSTCreate company
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}PUTUpdate company
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}DELETEDelete/disable company
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/webhookPOSTCreate webhook

Calls​

EndpointMethodDescriptionQuery Parameters
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/callsGETList callspage, limit, filters
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/calls/summaryGETCalls summarygroup_by, filters
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/calls/timelineGETCalls timelinegroup_by, filters
/v1/e/callrail/{tokenId}/accounts/{accountId}/calls/{callId}/recordingGETGet recording URLNone

Trackers​

EndpointMethodDescription
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/trackersGETList trackers
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/trackers/{trackerId}GETGet tracker by ID
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/trackersPOSTCreate tracker
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/trackers/{trackerId}PUTUpdate tracker
/v1/e/callrail/{tokenId}/accounts/{accountId}/companies/{companyId}/trackers/{trackerId}DELETEDelete tracker

🚨 Error Handling​

Common Error Scenarios:

  1. Invalid API Key (401 Unauthorized):

    • Automatically sets token_invalidated: true
    • Returns error message: TOKEN_INVALIDATED
    • User must re-authenticate
  2. Missing Token ID (403 Forbidden):

    • Returns INVALID_TOKEN when token not found in database
  3. Invalid Account ID:

    • Returns 400 with INVALID_ACCOUNT_ID message
  4. CallRail API Errors:

    • Proxied from CallRail with original status code
    • Error details from CallRail response data

Error Response Format:

{
"success": false,
"errno": 400,
"message": "Error description"
}

📊 Monitoring & Logging​

Token Invalidation Tracking:

  • 401 errors automatically update token_invalidated flag
  • Logged with initiator: external/callrail
  • All account keys marked invalid simultaneously

Campaign Integration:

  • Soft delete preserves keys if campaigns exist
  • Hard delete only when no active campaigns
  • Notifications sent on disconnect (email, bell, browser)

⚠️ Important Notes​

  • 🔐 API Key Storage: Keys stored per account in MongoDB, not environment variables
  • 🔄 Token Invalidation: Automatic detection on 401 errors
  • 🗑️ Soft Delete: Keys marked as deleted but not removed if campaigns exist
  • 📞 Company Scoped: Most operations require company ID
  • 📊 Campaign Integration: CallRail integrated with DashClicks campaign analytics
  • 🔔 Notifications: Email and in-app notifications on integration connect/disconnect
  • 🎯 Pagination Support: All list endpoints support pagination, sorting, filtering
  • 🪝 Webhooks: Real-time call event notifications via webhook integration

🎛️ CallRail Concepts​

Account Hierarchy​

  • Top-level entity in CallRail hierarchy
  • One account can have multiple companies
  • Account ID format: 470306151 (numeric string)

Company Structure​

  • Sub-entity under accounts
  • Represents a business or client
  • Company ID format: com_abc123
  • Contains call trackers and call data

Tracking Numbers​

  • Phone numbers for call tracking
  • Two types:
    • Session Trackers: Dynamic number insertion based on visitor session
    • Source Trackers: Static numbers for specific marketing channels
  • Track marketing source attribution

Call Records​

  • Individual phone call records
  • Contains caller ID, duration, recording URL, source attribution
  • Supports filtering by date range, source, keywords
  • Summary and timeline analytics available
💬

Documentation Assistant

Ask me anything about the docs

Hi! I'm your documentation assistant. Ask me anything about the docs!

I can help you with:
- Code examples
- Configuration details
- Troubleshooting
- Best practices

Try asking: How do I configure the API?
09:30 AM