2605 Outgoing Webhooks
Outgoing Webhooks
Overview
Outgoing webhooks send data FROM Tadabase TO external systems automatically when specific events occur. They enable Tadabase to notify other applications, trigger workflows, synchronize data, and orchestrate complex multi-system processes—all in real-time without manual intervention.
This article provides a complete guide to configuring, testing, and troubleshooting outgoing webhooks in Tadabase.
What Outgoing Webhooks Do
Outgoing webhooks automatically push Tadabase data to external services:
The Process Flow
- Event occurs in Tadabase: Record created, updated, or deleted
- Trigger evaluates: Checks if conditions are met
- Webhook fires: If conditions met, webhook sends HTTP POST request
- Payload sent: Selected Tadabase data sent as JSON
- External system receives: Target endpoint processes the data
- Response logged: Tadabase logs success or failure
- Optional retry: If failed, automatic retry based on configuration
Common Use Cases
1. Notifications and alerts- Send Slack messages when important events occur
- SMS alerts for urgent situations via Twilio
- Email notifications through SendGrid or Mailgun
- Push notifications to mobile apps
- Team communication (Microsoft Teams, Discord)
- Update CRM when Tadabase contact changes
- Sync inventory levels with e-commerce platform
- Push customer data to email marketing platform
- Update accounting software with transaction data
- Replicate data to backup or analytics systems
- Trigger external approval processes
- Start fulfillment workflows in warehouse systems
- Create tasks in project management tools
- Initiate onboarding sequences
- Queue jobs in processing systems
- Process payments through payment gateways
- Generate documents via document services
- Geocode addresses using mapping services
- Validate data through verification services
- Archive records to cloud storage
Setting Up Outgoing Webhooks
Let's walk through complete webhook configuration:
Step 1: Create Outgoing Webhook
- Navigate to webhooks:
- Go to Builder → Settings → Webhooks
- Click Outgoing Webhooks tab
- Add new webhook:
- Click Add Outgoing Webhook
- Give it a descriptive name (e.g., "Send Order to Fulfillment")
- Configure endpoint:
- URL: External service webhook endpoint
- Example:
https://api.fulfillment.com/orders - Must be HTTPS (HTTP not recommended)
- Select HTTP method:
- POST: Create new resource (most common)
- PUT: Update entire resource
- PATCH: Update part of resource
- DELETE: Remove resource
Step 2: Configure Authentication
Most external APIs require authentication: 1. Bearer token (most common)- Add header:
Authorization: Bearer YOUR_TOKEN - Token provided by external service
- Example:
Authorization: Bearer sk_live_abc123def456ghi789
- Custom header with API key
- Example:
X-API-Key: your_api_key_here
- Username and password
- Automatically encoded by Tadabase
- Less secure than bearer tokens
- Add any headers required by API
- Common examples:
Content-Type: application/json Accept: application/json X-Custom-Header: custom_value
Step 3: Configure Payload
Define what data to send: Option 1: Field mapping (recommended)- Select specific Tadabase fields to include
- Map to external API field names
- Clean, controlled payload
- Example mapping:
Tadabase Field API Field Name Customer Name customer_name Email email Order Total total_amount
- Write custom JSON template
- Use field placeholders:
{field_slug} - More flexibility for complex structures
- Example:
{ "order": { "id": "{order_id}", "customer": { "name": "{customer_name}", "email": "{email}" }, "items": "{order_items}", "total": {total_amount}, "status": "{status}" }, "metadata": { "source": "Tadabase", "timestamp": "{created_date}" } }
- Include all fields automatically
- Simplest setup
- May include unnecessary data
- Less control over structure
Step 4: Set Trigger Conditions
Define when webhook should fire: 1. Record events- On record create: Fire when new record is created
- On record update: Fire when existing record is modified
- On record delete: Fire when record is deleted
- Can choose multiple events
- Add conditions to limit when webhook fires
- Example conditions:
- Only if Status = "Approved"
- Only if Total > $1000
- Only if Priority = "Urgent"
- Only if specific field changes
- Prevents unnecessary webhook calls
- Reduces costs for paid APIs
- Fire only when specific field changes
- Example: Only fire if Status field changes
- Useful for status-based workflows
- Event: Record created
- Condition: Lead Source = "Website"
- Result: Webhook fires for new website leads only
- Event: Record updated
- Condition: Status field changed
- Result: Webhook fires only when status changes
- Event: Record created
- Condition: Amount > $5000
- Result: Webhook fires only for large transactions
Step 5: Configure Retry Settings
Handle temporary failures gracefully:- Enable retries: Automatically retry failed webhooks
- Retry attempts: Number of retries (typically 3-5)
- Retry interval: Time between retries
- Fixed interval: Same delay each time (e.g., 5 minutes)
- Exponential backoff: Increasing delays (1min, 5min, 15min, 1hr)
- Timeout: How long to wait for response (typically 30 seconds)
- Attempt 1: Immediate
- Attempt 2: 1 minute later
- Attempt 3: 5 minutes later
- Attempt 4: 15 minutes later
- Attempt 5: 1 hour later
- After 5 failures: Alert administrator
Step 6: Test the Webhook
Always test before production deployment:- Use webhook testing tool:
- Configure webhook to send to Webhook.site temporarily
- Create/update test record in Tadabase
- Verify payload appears in Webhook.site
- Check payload structure is correct
- Test with sandbox environment:
- If external service offers sandbox/test environment, use it
- Send test data without affecting production
- Verify external service processes correctly
- Check webhook logs:
- Review Tadabase webhook logs
- Verify HTTP status code (200 = success)
- Check response body for any errors
- Confirm timing is acceptable
- Test error scenarios:
- Invalid endpoint URL (404 error)
- Invalid authentication (401/403 error)
- Timeout (endpoint very slow)
- Verify retry logic works
- Update to production endpoint:
- Once testing successful, update to real endpoint
- Monitor closely after deployment
- Be ready to disable if issues arise
Trigger Conditions
Sophisticated trigger conditions ensure webhooks fire at exactly the right time:
Simple Conditions
Single field comparison:- Status equals "Approved"
- Priority equals "High"
- Total greater than 1000
- Type equals "Enterprise"
Complex Conditions
Multiple conditions with AND/OR logic: Example 1: High-priority urgent items- Priority = "High" AND Status = "Urgent"
- Both conditions must be true
- Status = "Approved" OR Status = "Auto-Approved"
- Either condition triggers webhook
- (Amount > 5000 AND Customer Type = "New") OR Amount > 10000
- Nested logic for sophisticated rules
Field Change Detection
Trigger only when specific field changes: Use case: Status change notifications- Trigger: Status field changed
- Sends notification only when status updates
- Ignores updates to other fields
- Configure webhook to monitor specific field
- Set "Fire only if [Status] changes" option
- Webhook fires on status change regardless of other updates
Conditional Routing
Send to different endpoints based on conditions: Example: Priority-based routing- Webhook 1: If Priority = "High" → Send to escalation endpoint
- Webhook 2: If Priority = "Normal" → Send to standard endpoint
- Webhook 3: If Priority = "Low" → Queue for batch processing
- Create multiple webhooks on same table
- Each with different conditions and endpoints
- Appropriate webhook fires based on data
Payload Configuration
Crafting the perfect payload ensures external services receive exactly what they need:
Field Selection
Choose which fields to include: Considerations:- Required fields: What does external API require?
- Security: Don't send sensitive data if not needed
- Efficiency: Smaller payloads are faster
- Completeness: Include all data external system needs
{
"order_id": "{order_id}",
"order_date": "{order_date}",
"customer_name": "{customer_name}",
"shipping_address": {
"street": "{shipping_street}",
"city": "{shipping_city}",
"state": "{shipping_state}",
"zip": "{shipping_zip}"
},
"items": [
{
"sku": "{item_sku}",
"quantity": {item_quantity}
}
]
}
Data Formatting
Format data to match external API requirements: 1. Date formatting- ISO 8601 format:
2026-01-28T10:30:00Z - Unix timestamp:
1737978600 - Custom format:
01/28/2026 - Use calculated fields or pipes to transform
- Decimal places:
99.99vs100 - Currency cents:
9999(representing $99.99) - String vs number:
"99.99"vs99.99
- True/false:
true,false - 1/0:
1,0 - Yes/No:
"yes","no" - Match external API expectations
Nested Structures
Create complex nested JSON: Example: E-commerce order{
"order": {
"id": "{order_id}",
"status": "{status}",
"created_at": "{created_date}",
"customer": {
"id": "{customer_id}",
"name": "{customer_name}",
"email": "{customer_email}",
"phone": "{customer_phone}"
},
"billing_address": {
"street": "{billing_street}",
"city": "{billing_city}",
"state": "{billing_state}",
"zip": "{billing_zip}",
"country": "{billing_country}"
},
"shipping_address": {
"street": "{shipping_street}",
"city": "{shipping_city}",
"state": "{shipping_state}",
"zip": "{shipping_zip}",
"country": "{shipping_country}"
},
"totals": {
"subtotal": {subtotal},
"tax": {tax_amount},
"shipping": {shipping_cost},
"total": {total_amount}
}
}
}
Handling Arrays
Challenge: Tadabase record may have multiple related records (line items, etc.) Solutions: 1. Send as JSON string- Store line items as JSON in long text field
- Include in webhook payload
- External service parses JSON
- Webhook sends order header
- Use record rule to loop through line items
- Send separate webhook for each line item
- Create calculated field that combines items
- Example: "Widget (x2), Gadget (x1), Tool (x5)"
- Send as single string
Static Values
Include non-field values in payload: Use cases:- Source identifier:
"source": "Tadabase" - API version:
"version": "2.0" - Event type:
"event": "order.created" - Constant values required by API
{
"source": "Tadabase",
"version": "2.0",
"event_type": "order_created",
"data": {
"order_id": "{order_id}",
"customer": "{customer_name}"
}
}
Testing Webhooks
Comprehensive testing prevents production issues:
Testing Tools
1. Webhook.site- Free webhook testing service
- Provides unique URL
- Displays all incoming requests
- Shows headers, body, timing
- Perfect for initial testing
- Go to webhook.site
- Copy your unique URL
- Configure Tadabase webhook with this URL
- Trigger webhook in Tadabase
- View request in Webhook.site
- Verify payload structure
- Similar to Webhook.site
- Collects and displays HTTP requests
- Good for debugging
- Test external API endpoints before configuring webhook
- Verify payload format works
- Test authentication
- Useful for complex APIs
Test Scenarios
Must test: 1. Happy path- Normal operation with valid data
- Webhook fires and completes successfully
- External service responds with 200
- Data processed correctly
- Valid authentication succeeds
- Invalid authentication fails appropriately
- Missing authentication handled
- Webhook fires when conditions met
- Webhook doesn't fire when conditions not met
- Complex conditions evaluated correctly
- Invalid endpoint URL (404)
- Endpoint timeout
- External service error (500)
- Verify retries work
- All required fields present
- Optional fields missing
- Empty/null values
- Special characters in text
Testing Process
- Development testing:
- Use Webhook.site for initial tests
- Verify payload structure
- Confirm trigger conditions work
- Sandbox testing:
- Configure with external service's test environment
- Test full integration flow
- Verify external service processes correctly
- Staging testing:
- Test with staging/QA environment
- Use real-like data
- Test edge cases
- Production deployment:
- Update to production endpoint
- Monitor closely initially
- Have rollback plan ready
Webhook Logs and Monitoring
Tadabase provides comprehensive logging for troubleshooting:
Accessing Logs
- Go to Builder → Settings → Webhooks
- Click Outgoing Webhooks tab
- Select webhook to review
- Click View Logs
Log Contents
Each log entry shows:- Timestamp: When webhook was sent
- Status: Success or failed
- HTTP status code: Response from external service
- 200-299: Success
- 400-499: Client error (bad request, auth failure)
- 500-599: Server error (external service issue)
- Request payload: Exact data sent
- Request headers: Headers included
- Response body: What external service returned
- Response time: How long request took
- Retry information: If retries occurred
- Error message: Detailed error if failed
Interpreting Status Codes
Success codes (2xx):- 200 OK: Request succeeded
- 201 Created: Resource created successfully
- 202 Accepted: Request accepted for processing
- 204 No Content: Success with no response body
- 400 Bad Request: Invalid payload format
- 401 Unauthorized: Authentication missing or invalid
- 403 Forbidden: Authenticated but not authorized
- 404 Not Found: Endpoint doesn't exist
- 422 Unprocessable Entity: Validation failed
- 429 Too Many Requests: Rate limit exceeded
- 500 Internal Server Error: External service error
- 502 Bad Gateway: Gateway/proxy error
- 503 Service Unavailable: Service temporarily down
- 504 Gateway Timeout: Request timeout
Monitoring Best Practices
Regular monitoring:- Review logs weekly (or daily for critical webhooks)
- Track success rate trends
- Identify patterns in failures
- Monitor response times
- Email notification for failed webhooks
- Alert threshold (e.g., 3 consecutive failures)
- Include error details in alert
- Escalate persistent failures
- Monitor average response time
- Track webhook volume
- Identify slow endpoints
- Plan capacity accordingly
Real-World Examples
Let's implement complete outgoing webhook solutions:
Example 1: Slack Notification
Objective: Send Slack message when high-priority ticket created. Setup steps:- Create Slack Incoming Webhook:
- Go to Slack App settings
- Create incoming webhook
- Select channel (#support)
- Copy webhook URL
- Configure Tadabase outgoing webhook:
- Name: "High Priority Ticket Alert"
- URL: Your Slack webhook URL
- Method: POST
- Trigger: Record created
- Condition: Priority = "High"
- Configure payload:
{ "text": "🚨 New High-Priority Ticket", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*New High-Priority Ticket*\n*ID:* {ticket_id}\n*Customer:* {customer_name}\n*Subject:* {subject}\n*Description:* {description}" } }, { "type": "actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "View Ticket" }, "url": "https://yourapp.tadabase.io/tickets/{record_id}" } ] } ] } - Test:
- Create test ticket with Priority = "High"
- Check Slack channel for message
- Click "View Ticket" button to verify link
Example 2: CRM Sync
Objective: Sync Tadabase contacts to external CRM. Setup:- Configure outgoing webhook:
- Name: "Sync to CRM"
- URL:
https://api.crm.com/contacts - Method: POST
- Headers:
Authorization: Bearer YOUR_CRM_API_KEY Content-Type: application/json
- Trigger conditions:
- Event: Record created OR Record updated
- Condition: Status = "Active"
- Field change: Any of: Name, Email, Phone, Company
- Payload:
{ "contact": { "first_name": "{first_name}", "last_name": "{last_name}", "email": "{email}", "phone": "{phone}", "company": "{company}", "title": "{job_title}", "source": "Tadabase", "external_id": "{record_id}", "tags": ["tadabase", "{lead_source}"], "custom_fields": { "annual_revenue": {annual_revenue}, "employee_count": {employee_count} } } } - Configure retries:
- Enable automatic retries
- Max attempts: 5
- Exponential backoff
Example 3: Order Fulfillment
Objective: Send approved orders to warehouse system. Setup:- Webhook configuration:
- Name: "Send to Warehouse"
- URL:
https://api.warehouse.com/orders - Method: POST
- Authentication: Bearer token from warehouse system
- Trigger:
- Event: Record updated
- Condition: Status changed to "Approved for Fulfillment"
- Payload:
{ "order_number": "{order_id}", "order_date": "{order_date}", "priority": "{shipping_priority}", "customer": { "name": "{customer_name}", "email": "{customer_email}", "phone": "{customer_phone}" }, "shipping_address": { "name": "{shipping_name}", "address_line1": "{shipping_street}", "address_line2": "{shipping_street2}", "city": "{shipping_city}", "state": "{shipping_state}", "postal_code": "{shipping_zip}", "country": "{shipping_country}" }, "items": "{order_items_json}", "shipping_method": "{shipping_method}", "special_instructions": "{notes}" } - Success handling:
- When webhook succeeds (200 response)
- Use record rule to:
- Update Status to "Sent to Warehouse"
- Store warehouse confirmation number
- Log timestamp
- Failure handling:
- If webhook fails after retries
- Create alert record
- Notify fulfillment team
- Set order status to "Fulfillment Error"
Advanced Patterns
Sophisticated techniques for complex scenarios:
Webhook Chaining
Scenario: Single event triggers multiple webhooks in sequence. Example: Order approval workflow- Order status changes to "Approved"
- First webhook: Send to warehouse
- Second webhook: Update accounting system
- Third webhook: Notify customer via email service
- Fourth webhook: Log to analytics platform
- Create multiple webhooks on same trigger
- All fire automatically when event occurs
- Each handles specific integration
Conditional Endpoints
Scenario: Route to different endpoints based on data. Example: Geographic routing- Webhook 1: If State in ["CA", "OR", "WA"] → West warehouse
- Webhook 2: If State in ["NY", "NJ", "PA"] → East warehouse
- Webhook 3: All others → Central warehouse
Response Processing
Scenario: Process external API response. Challenge: External service returns data you need to store. Solution:- Configure webhook as usual
- External service responds with data (e.g., tracking number)
- Use record rule to parse response
- Extract needed values
- Update Tadabase record with response data
- Send order to shipping API
- API responds with tracking number and label URL
- Record rule extracts these values
- Updates order with tracking info
Rate Limit Handling
Challenge: External API has rate limits (e.g., 100 requests per minute). Solutions: 1. Batch processing- Instead of webhook per record, accumulate records
- Use scheduled task to process batch
- Send single API call with multiple records
- Webhook adds record to queue table
- Scheduled task processes queue respecting rate limits
- Gradual processing prevents exceeding limits
- High-priority records sent immediately
- Low-priority records queued for batch processing
- Optimizes important webhooks while respecting limits
Troubleshooting
Common issues and solutions:
Webhook Not Firing
- ☐ Check trigger conditions - are they met?
- ☐ Verify webhook is enabled
- ☐ Check if record event (create/update/delete) is configured
- ☐ Review conditional logic
- ☐ Check webhook logs for any attempts
Authentication Failures (401/403)
- ☐ Verify API key/token is correct
- ☐ Check authentication header format
- ☐ Confirm token hasn't expired
- ☐ Verify account has necessary permissions
- ☐ Check for typos in authentication values
Bad Request Errors (400)
- ☐ Verify payload structure matches API requirements
- ☐ Check for invalid JSON syntax
- ☐ Ensure all required fields included
- ☐ Verify data types are correct
- ☐ Review API documentation
Timeout Errors
- ☐ Increase timeout setting
- ☐ Check if external service is slow
- ☐ Reduce payload size if very large
- ☐ Consider asynchronous processing
Endpoint Not Found (404)
- ☐ Double-check webhook URL
- ☐ Verify endpoint path is correct
- ☐ Confirm external service is online
- ☐ Check for typos in URL
Best Practices
Follow these guidelines for reliable webhooks:
Design
- Start simple: Begin with basic webhooks, add complexity as needed
- Single responsibility: Each webhook should do one thing well
- Meaningful names: Clearly describe what webhook does
- Documentation: Document purpose, payload, and dependencies
Security
- Always use HTTPS: Never send data over unencrypted HTTP
- Secure credentials: Store API keys securely
- Minimal data: Only send what external service needs
- Sensitive data: Avoid sending passwords, credit cards, etc.
Reliability
- Enable retries: Handle temporary failures gracefully
- Set timeouts: Don't wait forever for response
- Monitor logs: Regularly review for issues
- Error alerts: Get notified of failures
Performance
- Conditional triggers: Only fire when necessary
- Efficient payloads: Include only needed data
- Respect rate limits: Don't overwhelm external services
- Batch when possible: Combine multiple operations
Testing
- Test before production: Always test thoroughly
- Use sandbox environments: Test with non-production systems
- Test edge cases: Not just happy path
- Monitor initially: Watch closely after deployment
Next Steps
You now understand outgoing webhooks comprehensively. The next article introduces the Tadabase REST API—a programmatic interface for external applications to interact with your Tadabase data.
Key Takeaways
Remember these core concepts:
- Purpose: Send data from Tadabase to external systems automatically
- Triggers: Configure conditions for when webhooks fire
- Payload: Carefully craft data format to match external API
- Authentication: Secure all webhook connections
- Testing: Thoroughly test before production
- Monitoring: Use logs to track and troubleshoot
- Reliability: Enable retries and error handling
- Documentation: Document all webhook configurations
Next: Article 7.7 - REST API Introduction
We'd love to hear your feedback.