Trigger WebhookTrigger

Trigger WebhookTrigger

Certified

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).

yaml
type: io.kestra.plugin.quickbooks.trigger.WebhookTrigger

Start a flow on QuickBooks webhook notifications

yaml
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
Min length1
Max length256

The 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. ::

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.

Defaultfalse

Specifies whether a trigger is allowed to start a new execution even if a previous run is still in progress.

DefaultFETCH
Possible Values
NONEFETCHSTORE

What the trigger does with the body of the webhook request.

  • FETCH: the body reaches the flow on the body output. 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 the uri output. 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.

The inputs to pass to the triggered flow

SubTypestring
Possible Values
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTED

List of execution states after which a trigger should be stopped (a.k.a. disabled).

Defaulttrue

A 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.

SubTypeobject

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).