Custom CRM Integration
Thinkific offers native integrations with popular CRM and marketing tools including HubSpot, Salesforce, ActiveCampaign, and ConvertKit. Discover these in the App Store If you need a more flexible or customized experience, you can build your own integration using Thinkific's API and Webhooks.
This guide walks through how to sync Thinkific data - users, enrollments, and purchases - into any CRM in real time.
How it works
A CRM integration with Thinkific typically combines two approaches:
- Webhooks for real-time event-driven updates (e.g., a new user signs up, a purchase is made)
- API queries for fetching current state or backfilling historical data
Together, these let you keep your CRM in sync without polling continuously.
Step 1: Subscribe to webhooks
Webhooks push data to your system the moment something happens on your Thinkific site. For a CRM integration, the following webhook topics are most relevant:
User events
| Topic | When it fires |
|---|---|
user.created |
A new user registers on your site |
user.updated |
A user's profile is updated (name, email, custom fields) |
Use these to create or update contact records in your CRM as soon as a user appears in Thinkific.
Enrollment events
| Topic | When it fires |
|---|---|
enrollment.created |
A user is enrolled in a course or bundle |
enrollment.updated |
An enrollment's status changes (e.g., expired, activated) |
enrollment.completed |
A user completes a course |
Use these to track which products a contact has accessed, update lifecycle stages, and trigger follow-up sequences in your CRM.
Purchase events
| Topic | When it fires |
|---|---|
order.created |
A new order is placed on your site |
Use this to log purchase activity against a contact record, update revenue fields, or trigger post-purchase automations.
Registering a webhook
Use the Webhooks API to register your endpoint programmatically, or configure webhooks directly in your Thinkific admin settings.
Your endpoint should respond with a 200 OK within 5 seconds. Thinkific will retry failed deliveries with exponential backoff.
Step 2: Query the API for current state
Webhooks cover new activity, but you'll also need to fetch existing data - for example, when first setting up your integration or backfilling historical records.
GraphQL API (recommended)
Thinkific's GraphQL API is the recommended approach for new integrations. It gives you precise control over what data you fetch and reduces over-fetching.
Base URL: https://api.thinkific.com/stable/graphql
Fetch a user with their enrollments:
query GetUser($userId: ID!) {
user(id: $userId) {
id
email
firstName
lastName
createdAt
enrollments {
edges {
node {
id
activatedAt
expiresAt
percentCompleted
product {
id
name
}
}
}
}
}
}List users (paginated):
query ListUsers($cursor: String) {
users(first: 50, after: $cursor) {
edges {
node {
id
email
firstName
lastName
createdAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}Use the pageInfo.endCursor value as the cursor argument on subsequent requests to paginate through all users.
Explore the full schema and test queries using Apollo Explorer.
REST API
The REST API covers the same core resources and is useful for simpler use cases or existing integrations.
Base URL: https://api.thinkific.com/api/public/v1
| Resource | Endpoint | Description |
|---|---|---|
| Users | GET /users |
List all users on your site |
| User | GET /users/{id} |
Get a specific user by ID |
| Enrollments | GET /enrollments |
List all enrollments |
| Enrollment | GET /enrollments/{id} |
Get a specific enrollment |
| Products | GET /products |
List all products (courses and bundles) |
Example: List users
curl https://api.thinkific.com/api/public/v1/users \
-H "Authorization: Bearer {access_token}" \
-H "X-Auth-Subdomain: {your-subdomain}"Results are paginated. Use the page and limit query parameters to navigate through large result sets.
Full endpoint reference: REST Admin API Reference
Step 3: Map Thinkific data to your CRM
Here is a suggested mapping for common CRM fields:
| Thinkific field | CRM field |
|---|---|
user.email |
Contact email |
user.firstName + user.lastName
|
Contact name |
user.createdAt |
Lead created date |
enrollment.product.name |
Product / course interest |
enrollment.activatedAt |
Enrollment date |
enrollment.percentCompleted |
Course progress |
enrollment.completed (webhook) |
Course completion date |
order.created (webhook) |
Purchase date / revenue |
Authorization
Both the GraphQL and REST APIs require an access token. Thinkific supports two authorization methods:
- API Access Token - for private integrations you build and run yourself
- OAuth 2.0 - for apps you intend to distribute or list on the Thinkific App Store
See the Authorization docs for setup instructions.
Note: API Key authorization is not supported for GraphQL. Use API Access Token or OAuth.
Next steps
- Webhooks documentation - full list of webhook topics and payload schemas
- GraphQL API Introduction - getting started with the GraphQL API
- Apollo Explorer - interactive schema explorer and query builder
- REST API Reference - full endpoint documentation