Event actions
The Event Action Manager is a module that subscribes to events within the Propeller platform and executes actions with the event payload. You can execute multiple actions on the same event.
Two actions are currently supported: SEND_EMAIL and POST_TO_WEBHOOK.
SEND_EMAIL
Triggers the Template Module to render a template with the event payload and send it as email.
POST_TO_WEBHOOK
Posts the event payload as a JSON POST request to a webhook endpoint.
Supported events
Order events
| Event | Description | Payload |
|---|---|---|
ORDER_CREATED | A new order or quote is created | Order |
ORDER_UPDATED | An existing order or quote is updated | Order |
ORDER_DELETED | An order or quote is deleted | Order ID only |
ORDER_BULK | Batch operation on orders | Order |
ORDER_SEND_CONFIRMATION | Order confirmation triggered during checkout or via the "Send order to client" button in the Sales Hub | Order |
Quote events
| Event | Description | Payload |
|---|---|---|
QUOTE_SEND | A quote proposal is sent to the contact via the "Send to client" button in the Sales Hub | Order |
QUOTE_SEND_REQUEST | Confirmation sent after a quote is requested by a customer from the frontend | Order |
QUOTE_SEND_VALIDATION | A quote is sent to a senior account manager or sales manager for validation | Order |
Company events
| Event | Description | Payload |
|---|---|---|
COMPANY_CREATED | A new company is created | Company |
COMPANY_UPDATED | An existing company is updated | Company |
COMPANY_DELETED | A company is deleted | Company |
COMPANY_BULK | Batch operation on companies | Company |
Contact events
| Event | Description | Payload |
|---|---|---|
CONTACT_CREATED | A new contact is created | Contact |
CONTACT_UPDATED | An existing contact is updated | Contact |
CONTACT_DELETED | A contact is deleted | Contact |
CONTACT_BULK | Batch operation on contacts | Contact |
CONTACT_SEND_WELCOME_EMAIL | Welcome email sent to a new contact | Contact |
Customer events
| Event | Description | Payload |
|---|---|---|
CUSTOMER_CREATED | A new customer is created | Customer |
CUSTOMER_UPDATED | An existing customer is updated | Customer |
CUSTOMER_DELETED | A customer is deleted | Customer |
CUSTOMER_BULK | Batch operation on customers | Customer |
CUSTOMER_SEND_WELCOME_EMAIL | Welcome email sent to a new customer | Customer |
Cart events
| Event | Description | Payload |
|---|---|---|
CART_PURCHASE_AUTHORIZATION_REQUEST_SEND | A purchase authorization request is sent to the authorization manager | Cart |
Authentication events
| Event | Description | Payload |
|---|---|---|
SEND_INIT_PASSWORD | Initial password setup email sent to a contact or customer | PasswordReset |
SEND_RESET_PASSWORD | Password recovery email sent to a contact or customer | PasswordReset |
Other
| Event | Description | Payload |
|---|---|---|
CUSTOM_EVENT | User-defined event with a custom payload | CustomPayload |
Event payloads
Below is an example payload for each event type.
Order
{
"order": {
"id": 1,
"userId": 14644,
"accountManagerId": null,
"cartId": "01941780-c402-79ac-bade-0e9e37eb65c1",
"channelId": 1,
"shopId": 1,
"uuid": "01941781-1cb2-7993-bb33-60ed9da34d64",
"externalId": null,
"debtorId": "ANONYMOUS",
"status": "NEW",
"type": "dropshipment",
"source": "webshop",
"email": "noreply@acme.nl",
"emailDate": null,
"remarks": null,
"extra3": null,
"extra4": null,
"currency": "EUR",
"currencyRatio": "1.00000",
"language": "NL",
"date": "2024-12-30T12:18:45.000Z",
"statusDate": "2024-12-30T12:18:45.000Z",
"postageData": {
"method": "DELIVERY",
"taxPercentage": "0.00",
"requestDate": "2024-12-30T12:18:22.000Z",
"gross": "2000.00000",
"net": "2000.00000",
"tax": 0,
"partialDeliveryAllowed": "N",
"pickUpLocationId": 0,
"overruled": "Y",
"carrier": "Mark delivery company"
},
"paymentData": {
"net": "0.00000",
"gross": "0.00000",
"tax": "0.00000",
"taxPercentage": "0.00",
"method": "ACCOUNT",
"status": "UNKNOWN",
"statusDate": null,
"overruled": "N",
"accountingId": null
},
"total": {
"gross": "2050.00000",
"net": "2050.00000",
"tax": "0.00000",
"discountValue": "0.00000",
"discountType": "N",
"taxPercentages": []
},
"items": [
{
"id": 1,
"uuid": "01941780-df79-75a3-83a5-b851ac114c0c",
"class": "product",
"productId": 1,
"parentOrderItemId": null,
"quantity": 1,
"sku": "NCABD70004",
"notes": null,
"name": "Edge 1030 FietsComputer",
"supplier": "TECHDATA",
"supplierCode": "NCABD70004",
"manufacturer": "Lavazza",
"manufacturerCode": "NCABD70004",
"eanCode": null,
"originalPrice": "55.00000",
"price": "50.00000",
"priceTotal": "50.00000",
"priceNet": "50.00000",
"priceTotalNet": "50.00000",
"customerPrice": "50.00000",
"costPrice": "7.50000",
"discount": "5.00000",
"tax": "0.00000",
"taxPercentage": "0.00000",
"taxCode": "N",
"isBonus": "N",
"minimumQuantity": 1,
"unit": 1,
"package": "STK",
"packageUnit": "",
"packageUnitQuantity": "1",
"purchaseUnit": 1,
"purchaseMinimumQuantity": 1,
"requestDate": null
}
],
"invoiceUserId": 14644,
"validUntil": null,
"companyId": null,
"lastModifiedAt": "2024-12-30T12:18:45.048Z",
"originalOrderId": 0,
"exportedAt": null,
"exportStatus": "",
"exportMessage": null,
"addresses": [
{
"firstName": "Sophie",
"middleName": "",
"lastName": "Bakker",
"gender": "F",
"company": "",
"street": "Industrieweg",
"number": "12",
"numberExtension": "A",
"postalCode": "4283 GZ",
"city": "Giessen",
"region": "Zuid-Holland",
"country": "Netherlands",
"phone": "+31 20 123 4567",
"mobile": "+31 6 1234 5678",
"email": "sophie@acme.nl",
"code": "CUST-50123",
"notes": "",
"type": "invoice",
"icp": "N"
}
]
}
}
Contact
{
"contact": {
"tenant": "acme",
"id": 54321,
"firstName": "Sophie",
"middleName": "",
"lastName": "Bakker",
"phone": "+31 20 234 5678",
"email": "sophie@acme.nl",
"iban": "NL91ABNA0417164300",
"bankAccount": "041716430",
"bic": "ABNANL2A",
"notes": "",
"debtorId": "CONT-54321",
"login": "sbakker",
"gender": "F",
"mobile": "+31 6 8765 4321",
"expires": "2024-12-31T23:59:59.999Z",
"externalId": "EXT-54321",
"dateOfBirth": "1990-03-21T00:00:00.000Z",
"mailingList": "Y",
"createdAt": "2023-02-15T09:30:00.000Z",
"lastModifiedAt": "2023-07-01T14:45:00.000Z",
"company": {
"id": 9876,
"name": "Acme Corp B.V.",
"taxNumber": "NL123456789B01",
"cocNumber": "12345678",
"debtorId": "COMP-9876",
"phone": "+31 20 987 6543",
"email": "info@acme.nl",
"notes": "",
"path": "/companies/acme-corp",
"slug": "acme-corp",
"tag": "wholesale",
"createdAt": "2022-01-01T00:00:00.000Z",
"lastModifiedAt": "2023-06-30T12:00:00.000Z",
"parentUsergroupId": 1000
},
"companies": [
{
"id": 9876,
"name": "Acme Corp B.V.",
"taxNumber": "NL123456789B01",
"cocNumber": "12345678",
"debtorId": "COMP-9876",
"phone": "+31 20 987 6543",
"email": "info@acme.nl",
"notes": "",
"path": "/companies/acme-corp",
"slug": "acme-corp",
"tag": "wholesale",
"createdAt": "2022-01-01T00:00:00.000Z",
"lastModifiedAt": "2023-06-30T12:00:00.000Z",
"parentUsergroupId": 1000
},
{
"id": 5432,
"name": "Merford Cabins B.V.",
"taxNumber": "NL987654321B02",
"cocNumber": "87654321",
"debtorId": "COMP-5432",
"phone": "+31 30 123 4567",
"email": "info@merford.nl",
"notes": "",
"path": "/companies/merford-cabins",
"slug": "merford-cabins",
"tag": "manufacturing",
"createdAt": "2021-06-15T00:00:00.000Z",
"lastModifiedAt": "2023-05-20T10:30:00.000Z",
"parentUsergroupId": 2000
}
],
"channelId": 3,
"language": "NL"
}
}
Customer
{
"customer": {
"tenant": "acme",
"id": 12345,
"debtorId": "CUST-12345",
"gender": "M",
"firstName": "Jan",
"middleName": "de",
"lastName": "Vries",
"phone": "+31 20 123 4567",
"mobile": "+31 6 9876 5432",
"email": "jan@acme.nl",
"login": "jdevries",
"iban": "NL91ABNA0417164300",
"bankAccount": "123456789",
"bic": "ABNANL2A",
"notes": "",
"primaryLanguage": "NL",
"expires": "2025-12-31T23:59:59.999Z",
"externalId": "EXT-12345",
"dateOfBirth": "1985-06-15T00:00:00.000Z",
"mailingList": "Y",
"isLoggedIn": true,
"createdAt": "2023-01-01T10:00:00.000Z",
"lastModifiedAt": "2023-06-30T15:30:00.000Z",
"parentUsergroupId": 5,
"channelId": 2,
"language": "NL"
}
}
PasswordReset
{
"passwordReset": {
"email": "jan@acme.nl",
"resetLink": "https://www.acme.nl/reset-password",
"language": "NL"
}
}
Webhook security
Two security methods are available for verifying webhook requests.
HMAC signature verification
Propeller generates an HMAC-SHA256 signature using a secret salt that you configure. The signature is included in the X-Propeller-Signature header:
X-Propeller-Signature: sha256=<signature>
Your endpoint should compute the HMAC-SHA256 of the raw request body using the same secret and compare it against the header value to verify the request is authentic.
Basic authentication
Propeller sends a username and password with each webhook request using HTTP Basic Authentication:
Authorization: Basic <base64-encoded credentials>
Both username and password must be provided together. The password is stored securely and is not displayed after saving.