Zymura documentation
Everything needed to build a flow, put it on a schedule, and know when something breaks. If you've used Power Automate, Zapier or n8n, most of this will feel familiar — the differences are called out where they matter.
Getting started
A flow is one trigger followed by a chain of actions. The trigger decides when it starts; the actions decide what happens. Nothing else is required.
- Create a flowFrom the home screen, pick Automated, Instant or Scheduled — or start from a template and change it.
- Set the triggerOpen the first card and fill in its fields. For a schedule, that's an interval and a unit.
- Add actionsPress the
+between cards. Search by what you want to do, not by connector name. - Test itPress Test. The flow runs immediately and every step reports status, duration, inputs and outputs.
- Turn it onFlip the switch in the top right. For schedules, also switch on Runs on the server so it fires without the app open.
Test before you turn on. Test runs are real — they call live endpoints and send real messages. Point them at a scratch channel first.
Triggers
| Trigger | Starts when | Use it for |
|---|---|---|
Schedule | A repeating interval elapses | Reports, syncs, polling, digests |
Request | An HTTP request arrives at your flow's URL | Webhooks from other systems, forms |
New row | A row is added to a Zymura table | Chaining flows, queues |
Manual | You press Run | One-off jobs and testing |
A flow has exactly one trigger. To start the same work two ways, build a second flow that writes to a table and let a New row flow do the work.
Request triggers
Each request-triggered flow gets its own URL. Anything POSTed to it becomes the trigger body, readable with @{triggerBody()}. Paste a sample payload into the trigger's schema field so field names autocomplete while you build.
Actions
Actions fall into groups. Control covers conditions, loops, scopes and repeat-until. Data covers variables, transforms, JSON, CSV and joins. Connectors covers the outside world — HTTP, Slack, Telegram, Discord, email, SMS, Sheets, OneDrive, Power BI, Notion, Airtable, GitHub, Teams, Excel, Trello, Todoist, Calendar, RSS, weather, X and an AI model. Code runs your own JavaScript when nothing else fits.
Steps run top to bottom. A step that fails stops the chain, unless it sits inside a scope you've handled.
Expressions
Any field accepts an expression. Wrap it in @{ } and Zymura evaluates it as the step runs.
@{outputs('Get rows').body.value[0].name}
@{concat('Hi ', triggerBody().first_name)}
@{formatDateTime(utcNow(), 'date')}
@{if(greater(length(items()), 0), 'has rows', 'empty')}
Referring to other steps
| Expression | Gives you |
|---|---|
outputs('Step name') | Everything a named step returned |
body('Step name') | Just the response body |
triggerBody() | The payload that started the flow |
variables('Name') | A variable you set earlier |
item(), items() | The current item inside a loop, and the whole list |
iterationIndex() | Which pass of the loop you're on, from 0 |
Step names are the reference, so renaming a step breaks expressions pointing at it. Rename early.
Every function
concattoUppertoLowertrimlengthsubstringreplacesplitjoin
firstlasttakeskipunion
addsubmuldivmodminmax
intfloatstringbooljson
equalsgreaterlessandornotcontainsemptycoalesceif
utcNowformatDateTimeaddDaysaddHoursticks
guidrandencodeUriComponent
Debugging an expression. Add a step that sets a variable to it and press Test. Run history shows the evaluated value, which is faster than guessing.
Connections
A connection holds the credentials for one service — a webhook URL, an API key, a bot token. Save it once and every step using that connector can select it, so a rotated key is changed in one place.
Credentials are stored on your device and, when you're signed in, synced to your account so server-side runs can use them. Secret fields never appear in run history: they're masked at the moment the run is written, not hidden in the interface, so the unmasked value is never stored.
Running on the server
By default a flow runs in the browser tab you built it in. Switch on Runs on the server and Zymura executes it on our servers instead, on the schedule you set, with nothing open.
This is available on every plan, including Free. What differs by plan is how often a schedule may fire:
| Plan | Fastest schedule | Runs a month |
|---|---|---|
| Free | Once an hour | 300 |
| Pro | Every 15 minutes | 10,000 |
| Team | Every 5 minutes | 100,000 |
A schedule set faster than your plan allows is slowed to the floor rather than refused — the flow still runs, just less often.
Sign in first. Server-side execution needs an account, because the server has to know whose flow it is and which credentials to use.
Failure alerts
A scheduled flow that fails at 3am is no use if nobody finds out. Open a server-side flow and press Alerts in the designer toolbar.
Alerts are sent through your own connection — your Slack webhook, your Discord webhook, your Telegram bot, or your email provider. Zymura never sends on your behalf, so the message arrives wherever you already look.
| Setting | What it does |
|---|---|
| Send it to | Slack, Discord, Telegram or email |
| Using this connection | Which saved credentials to send with |
| After this many failures | Wait for N failures in a row before the first message |
| How often at most | Caps how frequently one flow can message you |
Steps are already retried before this fires. A failed call is retried with increasing delays when the cause looks temporary — a rate limit, a server error, a dropped connection — and never when the request itself was wrong, because retrying a 400 just fails again. So an alert means it failed for real.
The message names the flow, the step that failed, the error and the time, and links to run history.
Run history
Every run records its status, duration, and for each step the inputs it received and the outputs it returned. Runs from the server appear alongside local ones, marked Server.
Large values are truncated rather than dropped, and marked as truncated so you know something was cut. Retried steps show their attempt count.
History is kept for 7 days on Free, 90 days on Pro and a year on Team.
Plans and limits
| Free | Pro | Team | |
|---|---|---|---|
| Flows | 5 | 100 | Unlimited |
| Runs a month | 300 | 10,000 | 100,000 |
| Fastest schedule | Hourly | 15 minutes | 5 minutes |
| Connectors | 20 | 32 | Every one |
| Run history | 7 days | 90 days | 1 year |
A run is a run regardless of how many steps it contains. Building a thorough flow costs the same as a trivial one.
Troubleshooting
My scheduled flow isn't running
- Is the flow switched on? The toggle is in the designer's top right.
- Is Runs on the server switched on? Without it the flow only runs while the app is open.
- Are you signed in? Server-side execution needs an account.
- Have you used your monthly runs? Check the plan section in Settings.
A step fails with 401 or 403
The credential is wrong, expired, or lacks permission. Open the connection and re-enter it. These are never retried, because the request itself is the problem.
A step fails with 429
You're being rate-limited. This is retried with backoff. If it persists, slow the schedule or add a delay inside loops.
A request works in a tool but not in Zymura
Browsers block many cross-origin calls. Turn on the proxy in Settings so requests are forwarded server-side.
An expression returns nothing
Check the step name matches exactly, including case and spaces, and check run history for the actual shape of what the earlier step returned — the field is often one level deeper than expected, under body or value.
Your data
Flows and connections are stored on your device, and synced to your account when you sign in so they can run on the server. Zymura sends no telemetry and shows no ads.
You can delete your account and everything in it at any time from the account deletion page. See the privacy policy for specifics, including sub-processors, and the terms and refund policy.
Something missing here? Email hello@zymura.app and tell us what you were trying to do — that's how this page grows.