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 thewebhookHandler 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
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.cron → 0 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:x-correlation-id— for tracing across systemsx-idempotency-key— prevents duplicate executions for the same key
External webhook trigger
Trigger a workflow from an external system with a custom event type: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
Troubleshooting
Workflow is not triggering
Workflow is not triggering
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.
HTTP Request step is failing
HTTP Request step is failing
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.
Template variables are not being replaced
Template variables are not being replaced
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 workflow is not running on schedule
Cron workflow is not running on schedule
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.