Make Triggers¶
This document describes how to receive WhiteLabelCRO events in Make scenarios.
How Triggers Work¶
In Make, you can receive WhiteLabelCRO events using two approaches:
Webhook Approach (Recommended)¶
For real-time event delivery:
1. Use Make's Custom Webhook module as the scenario trigger
2. Create a webhook subscription pointing to the Make webhook URL via POST /api/v1/webhooks/subscriptions
3. When events occur in WhiteLabelCRO, they are pushed to Make immediately
4. Your scenario processes each event as it arrives
Polling Approach¶
For periodic event retrieval:
1. Use Make's Scheduling feature (e.g., every 15 minutes)
2. Add HTTP module to poll GET /api/v1/events
3. Use cursor-based pagination to track last retrieved event
4. Process new events in subsequent scenario modules
Available Event Types (10)¶
Client Events¶
client.created - Fires when a new client is enrolled in the system - Key fields: client_id, first_name, last_name, email, phone, status, created_date
client.status_changed - Fires when a client moves to a different lifecycle stage - Key fields: client_id, previous_status, new_status, changed_date
lead.created - Fires when a new lead is captured - Key fields: client_id, first_name, last_name, email, phone, status, created_date
Billing Events¶
invoice.created - Fires when a new invoice is generated - Key fields: invoice_id, client_id, amount, due_date, description, invoice_status
invoice.status_changed - Fires when invoice payment status changes (Unpaid to Paid, etc.) - Key fields: invoice_id, previous_status, new_status, total_paid, balance
payment.succeeded - Fires when a payment processes successfully - Key fields: payment_id, invoice_id, client_id, payment_amount, payment_method, date_paid
payment.failed - Fires when a payment attempt is declined - Key fields: payment_id, invoice_id, client_id, amount_attempted, failure_reason
Partner Events¶
affiliate.created - Fires when a new referral partner is added - Key fields: employee_id, full_name, email, phone, is_approved_affiliate, created_date
Document Events¶
document.uploaded - Fires when a file is added to a client record - Key fields: client_doc_id, client_id, doc_name, doc_type_name, created_date
Compliance Events¶
agreement.signed - Fires when a client electronically signs a document - Key fields: agreement_signed_id, client_id, signed_date, name_signed, agreement_name
Setting Up Webhook Triggers¶
Step 1: Configure Custom Webhook Module¶
- In Make, create a new scenario
- Add a Custom Webhook module as the first module
- Click Add to create a new webhook
- Copy the webhook URL provided by Make
Step 2: Create Webhook Subscription¶
Using HTTP module or external tool, call:
POST /api/v1/webhooks/subscriptions
Request body:
{
"url": "https://hook.make.com/your-webhook-id",
"eventTypes": ["client.created", "payment.succeeded"],
"enabled": true
}
See /04-api-reference/webhooks-api.md for complete subscription API details.
Step 3: Verify Signature (Recommended)¶
Add signature verification to your webhook scenario:
- Extract
X-Webhook-TimestampandX-Webhook-Signatureheaders - Compute HMAC-SHA256 using signing secret (from subscription creation)
- Reject requests with invalid signatures
See /02-admin/webhook-subscriptions-and-security.md for verification implementation.
Setting Up Polling Triggers¶
Step 1: Add Scheduling¶
- In Make, create a new scenario
- Configure scenario scheduling (e.g., every 15 minutes)
- Right-click the clock icon to set interval
Step 2: Poll Events API¶
- Add HTTP module as first module
- Set method: GET
- Set URL:
https://your-api-url.com/api/v1/events - Add query parameters:
limit: 100 (max events per request)cursor: Use stored value from previous executiontype: (optional) Filter by event type- Configure connection with your API key
Step 3: Track Cursor¶
- Store the
nextCursorvalue from the response - Use it in the next polling cycle
- Use Make's data store or external database
See /04-api-reference/events-api.md for cursor-based pagination details.
Event Structure¶
Each event includes:
{
"id": 12345,
"type": "client.created",
"createdUtc": "2026-01-28T10:30:00Z",
"companyId": 92,
"payload": {
"client_id": 5678,
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com"
},
"metadata": {
"source": "web_portal",
"user_id": 42
}
}
Access fields in Make:
- Event ID: {{id}}
- Event type: {{type}}
- Client ID: {{payload.client_id}}
- Client name: {{payload.first_name}}
Processing Events¶
Filtering by Event Type¶
Use Make's Router module to route based on event type:
- Add filters to each route
- Filter condition: {{type}} equals client.created
Or use Filter module:
- Condition: {{type}} = client.created
Accessing Nested Data¶
Use dot notation in expressions:
- Email: {{payload.email}}
- Source: {{metadata.source}}
Handling Missing Fields¶
Some optional fields may be null. Use default values or conditions:
- Check with Filter module: {{payload.phone}} exists
- Use default: {{ifempty(payload.phone; "No phone")}}
Deduplication¶
For Webhook Triggers¶
Events may be delivered multiple times due to retries. Deduplicate using the event id:
1. Store processed event IDs in Make's data store
2. Check if {{id}} exists before processing
3. Skip if already processed
For Polling Triggers¶
Cursor-based pagination ensures each event is retrieved once, but you may still want to track processed IDs for safety.
Troubleshooting¶
Webhooks Not Arriving¶
- Verify Make webhook URL is publicly accessible
- Check webhook subscription is enabled in WhiteLabelCRO
- Verify event types match what you're expecting
- Check WhiteLabelCRO Admin Portal for delivery logs
- Test subscription using
/api/v1/webhooks/subscriptions/{id}/test
Signature Verification Failing¶
- Using correct signing secret (from subscription creation)
- Computing HMAC over
"{timestamp}.{raw_body}"(exact format) - Not parsing request body before verification
Polling Returns No Events¶
- Confirm events are actually occurring in WhiteLabelCRO
- Check cursor value is correct
- Remove
typefilter to see all events - Verify API key has
events:readscope
Rate Limits Hit¶
Polling too frequently can hit rate limits: - Read bucket: 60 requests/minute - Increase polling interval (e.g., every 15 minutes minimum) - Implement exponential backoff on 429 errors
Scenario Execution Incomplete¶
If webhook processing times out: - Simplify scenario logic - Break into multiple scenarios - Use queues for async processing
Platform Compatibility¶
The same events are available via: - Zapier - Using REST Hooks pattern - n8n - Using HTTP Request nodes - Custom code - Direct API calls
All platforms receive identical event structures and field names.
Related Documentation¶
- Event Catalog - Complete field definitions per event type
- Event Delivery Model - Delivery guarantees and retry behavior
- Events API - Polling implementation details
- Webhooks API - Webhook subscription management