
Trigger WebhookTrigger
CertifiedTrigger a flow from QuickBooks webhooks
Trigger WebhookTrigger
Trigger a flow from QuickBooks webhooks
Exposes a webhook URL .../executions/webhook/{namespace}/{flowId}/{key} to register in the Intuit developer portal. Every request is authenticated with the intuit-signature header, which must be the base64 HMAC-SHA256 of the raw request body keyed with the verifierToken of your webhook endpoint. A request with a missing or invalid signature gets a 401 and never starts an execution.
The key is part of the URL: keep it secret, for example with {{ secret('...') }}. Webhook payloads only describe what changed (entity name, id, operation); fetch the entity with the matching QuickBooks task. The inherited fetchType must stay FETCH (the default): the signature is computed over the request body, which is not available with STORE or NONE, so such a trigger answers 500 and starts nothing. Responses: 200 (triggered), 204 (conditions not met), 400 (invalid payload), 401 (invalid signature), 404 (unexpected path).
type: io.kestra.plugin.quickbooks.trigger.WebhookTriggerExamples
Start a flow on QuickBooks webhook notifications
id: qbo_webhook
namespace: company.finance
triggers:
- id: on_event
type: io.kestra.plugin.quickbooks.trigger.WebhookTrigger
key: "{{ secret('QBO_WEBHOOK_KEY') }}"
verifierToken: "{{ secret('QBO_WEBHOOK_VERIFIER_TOKEN') }}"
tasks:
- id: log
type: io.kestra.plugin.core.log.Log
message: "Received {{ trigger.eventNotifications | length }} QuickBooks notification(s)"
Properties
key *string
1256The unique key that will be part of the URL.
The key is used for generating the webhook URL.
::alert{type="warning"} Make sure to keep the webhook key secure. It's the only security mechanism to protect your endpoint from bad actors, and must be considered as a secret. You can use a random key generator to create the key. ::
verifierToken *string
Webhook verifier token
The verifier token shown for your webhook endpoint in the Intuit developer portal. Used to check the intuit-signature header of every request.
allowConcurrent boolean
falseSpecifies whether a trigger is allowed to start a new execution even if a previous run is still in progress.
fetchType string
FETCHNONEFETCHSTOREWhat the trigger does with the body of the webhook request.
FETCH: the body reaches the flow on thebodyoutput. A JSON body is deserialized, a binary one is base64-encoded. This is the default, and how a webhook has always behaved.STORE: the body is streamed into Kestra's internal storage as it is received, and the flow reaches it through theurioutput. Nothing of it travels through the execution, so this is the option to use for a large or binary payload - but note that a condition on the trigger can no longer read the body.NONE: the body is read off the connection and dropped. Use it for a caller whose payload the flow does not need.
This only concerns the body of a request. The file parts of a multipart/form-data request are always stored in the internal storage and exposed on parts, whatever this property is set to, as a file part has no meaningful representation inside an execution.
inputs object
The inputs to pass to the triggered flow
stopAfter array
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTEDList of execution states after which a trigger should be stopped (a.k.a. disabled).
when string
trueA condition that determines whether the trigger should run.
A Pebble expression evaluated at trigger time. The trigger fires only when the expression evaluates to a truthy value (true, a non-empty string, a non-zero number). Use this to gate trigger execution on dynamic runtime values such as execution labels, flow variables, or environment conditions.
Outputs
eventNotifications *array
Event notifications
The eventNotifications array of the webhook payload. Each entry holds a realmId and a dataChangeEvent.entities list describing the changed entities (name, id, operation, lastUpdated).