Incoming Webhooks
Automatically create Crove documents when external systems send data to your webhook endpoint.
Incoming Webhooks
Incoming webhooks let external systems send data to Crove to automatically create documents. When your CRM, form builder, or any other system sends a POST request to the webhook URL, Crove creates a document from a template and pre-fills it with the received data.
Setting up an incoming webhook
- Go to Settings > Webhooks
- Click Create Incoming Webhook
- Configure the webhook:
| Field | Description |
|---|---|
| Name | A descriptive name for the webhook |
| Template | The template to use for document creation |
| Field mapping | Map incoming data fields to template variables |
| Action | What to do (currently: Create Document) |
| Auto-name | Expression for automatic document naming |
- Save the webhook and copy the generated URL
Webhook URL
Each incoming webhook gets a unique URL:
https://crove.app/api/webhooks/incoming/{webhook_slug}Send POST requests with JSON data to this URL.
Field mapping
Map incoming payload fields to your template variables:
Simple mapping
// Incoming payload
{
"customer_name": "Acme Corporation",
"customer_email": "john@acme.com",
"deal_value": 50000
}Field mapping:
customer_name → clientName
customer_email → clientEmail
deal_value → contractAmountNested data
Access nested fields using dot notation:
// Incoming payload
{
"contact": {
"name": "John Smith",
"email": "john@acme.com"
},
"deal": {
"amount": 50000,
"currency": "USD"
}
}Field mapping:
contact.name → clientName
contact.email → clientEmail
deal.amount → contractAmountAuto-naming
Use expressions to generate document names automatically from the incoming data:
"Contract - " + customer_name + " - " + dateThis creates documents named like "Contract - Acme Corporation - 2026-02-18".
Sample data
When setting up field mapping, you can provide sample data to test the mapping:
- Paste a sample JSON payload
- Crove shows how the data maps to template variables
- Adjust the mapping until it's correct
- Save and go live
Example: CRM integration
Create a contract when a deal is closed in your CRM:
# Your CRM sends this when a deal closes
curl -X POST https://crove.app/api/webhooks/incoming/your_webhook_slug \
-H "Content-Type: application/json" \
-d '{
"deal_name": "Enterprise Deal",
"company": "Acme Corporation",
"contact_email": "john@acme.com",
"value": 50000,
"close_date": "2026-02-18"
}'Crove creates a new document from your contract template with all the fields pre-filled.
Example: Website form
Create a document when someone submits a form on your website:
// Your form submission handler
async function handleFormSubmit(formData) {
// Send to Crove incoming webhook
await fetch('https://crove.app/api/webhooks/incoming/your_webhook_slug', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: formData.name,
email: formData.email,
company: formData.company,
service: formData.selectedService,
}),
});
}Response
The incoming webhook returns:
Success (201)
{
"success": true,
"documentId": "doc_new789",
"message": "Document created successfully"
}Error (400)
{
"success": false,
"error": "Missing required field: customer_name"
}Best practices
- Validate on your end — Ensure required data is present before sending to the webhook
- Test with sample data — Use the sample data feature to verify field mapping
- Use descriptive auto-names — Include key identifiers (company name, date) in auto-naming
- Monitor document creation — Check the Documents page to verify webhooks are working
- Handle errors — Check the response from the webhook and handle errors in your system