Skip to main content

Workflows

Overview

Workflows let you automate actions in response to events inside Financely. They are built as directed graphs: a trigger fires, then a sequence of steps executes. Go to Workflows in the sidebar to create and manage workflows.

Concepts

All available triggers

Invoice events

Lead events

Contact events

Proposal events

Product events

User events

Schedule

Manual trigger

External webhooks

Trigger a workflow from an external system using the webhookHandler endpoint with a custom eventType. This lets you fire Financely workflows from any external tool that can make an HTTP request.

HTTP Request step

The most common step type. Sends an HTTP request to any URL. Configuration fields:

Template variables

Use {variable} syntax in URL, headers, and body to inject dynamic data from the triggering event.

Invoice variables

Customer/contact variables

Proposal variables

Lead variables

Secrets

Secrets are stored encrypted and are never exposed in the workflow UI after being set.

Example: notify on invoice payment

A workflow that POSTs to a Slack webhook when an invoice is paid: Trigger: invoice.paid Step 1 — HTTP Request:
  • Method: POST
  • URL: https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
  • Body:

Example: cron — daily overdue check

Trigger: schedule.cron0 8 * * * (every day at 8 AM UTC) Step 1 — HTTP Request: POST to your CRM or notification endpoint with a daily summary payload.

Manual trigger endpoint

To trigger a workflow externally via HTTP:
Response:
Optional headers:
  • x-correlation-id — for tracing across systems
  • x-idempotency-key — prevents duplicate executions for the same key

External webhook trigger

Trigger a workflow from an external system with a custom event type:
Create a workflow with a trigger matching payment.received to handle this.

Workflow run history

Every workflow execution creates a Run record. View run history from the workflow detail page:
  • Status: pending, running, completed, failed
  • Started / completed at timestamps
  • Step results: per-step status, request/response data, error messages
Use this to debug failed runs — expand any step to see the exact HTTP request sent and the response received.

Troubleshooting

Confirm the trigger event type matches exactly (case-sensitive). For Firestore-based triggers (invoice.paid, lead.converted, etc.), the trigger fires when the document field changes — make sure the status change is actually happening in the app.
Open the run history and expand the failed step. The response body and status code are logged. Common issues: wrong URL, missing auth header, body format mismatch, or the target server is rejecting requests.
Variable names are case-sensitive. Use the exact names listed in this document. If a variable is empty (e.g. customer has no company), the placeholder is replaced with an empty string.
Cron expressions use UTC. Adjust accordingly for your local timezone. Crons are checked every minute — a workflow set to 0 9 * * * fires once per day at exactly 09:00 UTC.