Skip to main content

Overview

Relixir sends webhooks to your configured endpoints for various events including visitor identification and CMS content changes. Use webhooks to integrate with your CRM, marketing automation, or custom systems in real-time.

Visitor Identification

Receive real-time visitor data including company enrichment, contact information, session details, traffic source attribution, and AI search detection

CMS Content Events

Get notified when CMS content is published, updated, or deleted

Supported Events

EventDescription
visitor.identifiedA visitor is identified on your website (contact or company level)
content.publishedA CMS content item is published for the first time
content.updatedA CMS content item is republished with changes
content.deletedA CMS content item is deleted

Setting Up Webhooks

1

Configure your endpoint

Create an HTTPS endpoint in your application that accepts POST requests with JSON payloads.
2

Add webhook subscription

Go to SettingsVisitor ID in your Relixir dashboard and add your endpoint URL in the Webhook Subscriptions section.
3

Select events

Choose which events you want to receive. You can select multiple event types per subscription.
4

Test the integration

Verify your endpoint receives and processes webhooks correctly by triggering an event.

Webhook Headers

Relixir sends webhooks with these headers:
HeaderValue
Content-Typeapplication/json
User-AgentRelixir-Webhook/1.0

Visitor Identification Webhook

When a visitor is identified, Relixir sends a visitor.identified webhook to your configured endpoint:

Payload Structure

{
  "event": "visitor.identified",
  "timestamp": "2025-11-07T15:11:55.835Z",
  "data": {
    "visit": {
      "id": "uuid",
      "session_id": "abc123",
      "visitor_kind": "contact",
      "captured_url": "https://example.com/features",
      "landing_path": "/",
      "referrer_url": "https://www.google.com/search?q=data+privacy",
      "ref_medium": "search",
      "came_from_ai_search": false,
      "is_paid_click": false,
      "timestamp": "2025-11-07T14:37:28.001Z",
      "ip_location": {
        "city": "Austin",
        "state": "Texas",
        "country": "United States"
      },
      "utm": {
        "source": "google",
        "medium": "cpc",
        "campaign": "brand-campaign",
        "content": "ad-variant-1"
      },
      "pages_viewed": [
        {
          "url": "https://example.com/",
          "path": "/",
          "viewed_at": "2025-11-07T14:37:28.048Z",
          "active_seconds": 85,
          "is_cms_content": false,
          "cms_content_item_id": null
        },
        {
          "url": "https://example.com/blog/post-slug",
          "path": "/blog/post-slug",
          "viewed_at": "2025-11-07T14:41:25.560Z",
          "active_seconds": 90,
          "is_cms_content": true,
          "cms_content_item_id": "uuid-of-blog-post"
        }
      ]
    },
    "company": {
      "id": "uuid",
      "domain": "acme.com",
      "name": "Acme Corp",
      "legal_name": "Acme Corporation LLC",
      "industry": "Software Development",
      "employees_range": "51-250",
      "employees_number": 125,
      "estimated_annual_revenue": "$10-$50M",
      "linkedin_handle": "company/acme-corp",
      "crunchbase_handle": "organization/acme-corp",
      "founded_year": 2015,
      "tags": ["B2B", "SaaS"],
      "tech": ["aws", "react", "postgres"],
      "location": {
        "city": "Austin",
        "state": "Texas",
        "country": "United States"
      }
    },
    "contact": {
      "id": "uuid",
      "email": "john.doe@acme.com",
      "first_name": "John",
      "last_name": "Doe",
      "title": "VP of Engineering",
      "linkedin_url": "https://www.linkedin.com/in/johndoe",
      "location": {
        "city": "Austin",
        "state": "Texas",
        "country": "United States"
      }
    }
  }
}

Visitor Kinds

Visitor KindDescription
contactIdentified visitor with contact information (email, name)
companyAnonymous visitor identified only at company level
The company and contact objects are only included when that data is available. Anonymous visitors may only have company-level identification.

Payload Data: AI Search Detection

The visitor.identified webhook automatically includes AI search detection:
AI EngineDetection Method
ChatGPTUTM source parameter contains “chatgpt”
Perplexity AIReferrer URL contains “perplexity.ai”
Google GeminiReferrer URL contains “gemini.google.com” or “bard.google.com”
Claude AIReferrer URL contains “claude.ai”
PhindReferrer URL contains “phind.com”
You.comReferrer URL contains “you.com”
Bing ChatReferrer URL contains “bing.com/chat”
PoeReferrer URL contains “poe.com”
ChatGPT is detected via UTM source parameter (e.g., ?utm_source=chatgpt) since ChatGPT doesn’t send a referrer header.

Payload Data: Traffic Classification

All traffic is classified into categories in the ref_medium field:
CategoryDescription
ai_searchAI search engines (ChatGPT, Perplexity, etc.)
paid_searchPaid advertising (UTM medium contains “cpc”, “ppc”, or “paid”)
searchOrganic search (Google, Bing, DuckDuckGo, etc.)
socialSocial media (LinkedIn, Twitter/X, Facebook, Reddit, etc.)
emailEmail campaigns (UTM medium is “email” or “newsletter”)
referralOther website referrals
directDirect traffic (no referrer)

Payload Data: CMS Content Attribution

The pages_viewed array in the webhook identifies which pages are Relixir-managed content:
  • is_cms_content: Boolean indicating if the page is Relixir CMS content
  • cms_content_item_id: UUID of the Relixir content item if applicable
This enables attribution of which Relixir blogs drive traffic and engagement.

CMS Content Webhooks

When CMS content is published, updated, or deleted, Relixir sends a webhook with the following payload structure:

Payload Structure

{
  "event": "content.published",
  "timestamp": "2026-02-13T15:30:00Z",
  "data": {
    "item_id": "uuid-of-content-item",
    "slug": "my-article-slug",
    "title": "My Article Title",
    "collection_id": "uuid-of-collection",
    "organization_id": "uuid-of-organization",
    "action": "published"
  }
}

CMS Event Types

EventActionDescription
content.publishedpublishedFirst-time publish of a content item
content.updatedupdatedRepublish of an existing content item
content.deleteddeletedContent item was deleted

Payload Fields

FieldTypeDescription
item_idstring (UUID)Unique identifier of the content item
slugstringURL slug of the content item
titlestringTitle of the content item (may be null)
collection_idstring (UUID)ID of the collection containing the item
organization_idstring (UUID)ID of your organization
actionstringAction that triggered the webhook
CMS webhooks are triggered for all deployment modes including hosted blogs, spreadsheet deployments, and external CMS integrations.

Troubleshooting

  • Verify your endpoint URL is correct and publicly accessible
  • Ensure your endpoint returns a 2xx status code within 10 seconds
  • Check your server logs for incoming POST requests
  • Verify your blog posts are published (not drafts)
  • Check that deployment slugs match URL paths
  • Confirm BlogSettings.blogSlugPrefix is configured correctly
  • AI search detection uses referrer URLs and UTM parameters
  • ChatGPT doesn’t send a referrer, so it requires utm_source=chatgpt in your URLs
  • Verify UTM parameters are preserved when visitors land on your site
  • Not all visitors can be identified at the contact level
  • Some visitors only have company-level identification
  • The company and contact fields are only present when data is available

Webhook Delivery

Relixir uses the following delivery behavior:
SettingValue
Timeout10 seconds
Retries3 attempts with exponential backoff
Content Typeapplication/json
Your endpoint should return a 2xx status code to acknowledge receipt. Non-2xx responses (except 4xx client errors) trigger automatic retries.
Need help setting up webhooks? Contact support@relixir.ai.