Use Case

Webhook & API Automation

Stop writing one-off webhook handlers. Tendrl gives you a visual workflow editor with 40+ connectors, conditional logic, human approvals, and full execution traces, so you can automate API integrations without deploying infrastructure.

Coming soon Strand docs

The problem with webhook integrations

One-off handlers

Every webhook needs a serverless function, a deployment pipeline, and error monitoring. You end up with a fleet of Lambdas that nobody owns.

Silent failures

A webhook fires, the handler crashes, and nothing happens. No retry, no alert, no trace of what went wrong.

No approval flow

When a webhook triggers something important (a refund, a deployment, a user deletion), there's no easy way to add a human checkpoint.

Hard to change

Adding a new step (send a Slack message, write to a database) means editing code, redeploying, and hoping you didn't break the existing flow.

How Tendrl solves it

Visual workflows replace glue code. Every step is traceable, retryable, and editable without redeploying.

1

Receive webhooks with a unique endpoint

Every Strand workflow gets its own HTTPS trigger URL. Point your service's webhook config at it and incoming payloads land directly in your workflow as payload: no routing, no parsing, no middleware.

2

Transform and validate with code or no-code

Use Transform nodes with Jinja2 templates for simple reshaping, or Python snippets when you need real logic. Access 20+ standard library modules (json, re, datetime, hashlib, collections) in a secure sandbox with vault secret access.

Python snippet: validate and enrich a Stripe webhook
event_type = payload.get("type", "")
amount = payload.get("data", {}).get("object", {}).get("amount", 0)

return {
  "event_type": event_type,
  "amount_dollars": amount / 100,
  "is_large": amount > 50000,
  "needs_review": event_type == "charge.dispute.created"
}
3

Route with conditional logic

Use if/else nodes to branch based on any field in the payload. Route high-value transactions through approvals, send errors to PagerDuty, and archive everything to S3, all in the same workflow.

If/else branching Jinja2 conditions on any payload field, nested as deep as you need
Filter nodes Drop events that don't match Python conditions and skip the rest of the workflow
Foreach loops Iterate over arrays in the payload with configurable batch sizes and delays
Error edges Route failures to a dedicated error-handling branch instead of losing them
4

Add human approvals for critical actions

Drop an approval node into your workflow. Execution pauses and notifies the right person via Slack, email, or in-app notification. They approve or reject with a signed, single-use link, no login required. The workflow resumes automatically with the decision and approver metadata attached.

5

Push to any destination

Connect to 40+ services without writing adapter code. Each connector stores credentials encrypted and handles retries automatically.

Slack Email HTTP / REST AWS S3 AWS SQS AWS Lambda Azure Blob Google Sheets MongoDB Redis Kafka Discord Telegram MQTT

Built for production webhook traffic

Automatic retries

HTTP and AI nodes retry with exponential backoff on 429s and 5xx errors. Configurable attempts, backoff type, and retryable status codes.

Concurrency control

Up to 8 concurrent workflow steps (Pro plan). Excess requests queue and wait up to 30 seconds, so no webhooks are dropped.

Full execution traces

Every run shows each node's input, output, timing, and errors. Debug failures without guessing what went wrong.

Circuit breaker

Connectors auto-disable after 5 consecutive failures. Prevents cascading errors from a single broken downstream service.

Scheduled triggers

Not just webhooks: trigger workflows on a cron schedule. Presets from every minute to weekly, or write custom cron expressions.

Nested workflows

Call workflows from workflows (up to 20 levels). Reuse common patterns like "enrich and notify" across multiple triggers.

Example: Stripe webhook to Slack + email

A payment dispute comes in. The workflow validates, classifies, and routes it, with a human approval step for high-value cases.

Webhook Stripe event
Python Validate & enrich
If/Else > $500?
Approve → Email + Slack Escalate & alert
Trigger

Stripe sends a charge.dispute.created webhook to the workflow's trigger URL. The full event payload arrives as payload.

Transform

A Python snippet extracts the dispute amount, customer ID, and reason. It flags disputes over $500 as needs_review: true.

Route & act

An if/else node checks needs_review. True: pause for manager approval via Slack, then send a high-priority escalation email to the billing team. False: post a summary to the #disputes Slack channel and log the dispute to your tracker via the HTTP connector.

Replace your webhook handlers with workflows

The free tier includes 10 workflows and 550 monthly runs. Build your first automation in minutes.

Coming soon Strand docs