Yes. Zapier has a Code by Zapier step that runs Python or JavaScript. The code runs inside one step of a Zap, with a short timeout and a restricted set of packages.
Code by Zapier runs a script inside a Zap step. Here is what it handles and where the Zap around it takes over.
| Capability | What it does | Where it stops |
|---|---|---|
| Python support | Runs Python or JavaScript inside a Zap step | Restricted packages. No pip install, no pandas, no custom libraries |
| Billing | Available on all paid Zapier plans | Each code step execution counts as a task. Loops multiply the count |
| Timeout | Code runs between Zap steps | Short runtime limit. Rules out batch processing or long API sequences |
| Code reuse | Code lives inside one step | Cannot call functions from another step. Logic duplicates across the Zap |
| Testing | Test individual Zap steps | No assertion framework. No automated testing before going live |
| Version control | Zap version history | Not a line-level diff of the code |
| Control flow | Path steps for branching, Looping steps for iteration | Each is billed separately |
A Task is an AI automation written in Python, hosted on a managed runtime. A developer writes the script; anyone runs it from a form. Integrations, model calls, version control, and logging are built in.
Model and provider agnostic.
One script with loops, branches, and functions. Model calls and integrations are Python functions, billed per run.
invoices = aisle.integrations.xero.list_invoices(status="AUTHORISED") for invoice in invoices: match = aisle.ai.run_prompt( slug="match-invoices", variables={"invoice": invoice}, ) if match["confidence"] < 0.8: aisle.integrations.slack.create_message( "#finance", text=match["note"], )
All the logic in one file, billed per run, and the whole script is versioned.
qbash bills per run, not per step. A loop over 200 invoices with a model call and a Slack post on each is one run, not 600 tasks. A prompt is only used when you call it, so the model spend sits at points you chose.
result = aisle.parallel( reconcile, invoices, concurrency=5, max_per_minute=60, checkpoint="monthly-reconcile", retry=3, )
Write Python-style assertions against your functions in a tests.py file. Tests run in a sandbox, so they cannot post to a real channel or bill a model call. The tests are versioned in the same revision as the code.
def test_low_confidence_flags(): result = reconcile(mock_invoice(amount=0)) assert result["confidence"] < 0.8 assert "review" in result["note"].lower() def test_high_confidence_passes(): result = reconcile(mock_invoice(amount=100)) assert result["confidence"] >= 0.8
Every save writes a version with a line-level diff. The diff shows what changed in the code and the tests together. Any version restores in one click, and a broken change is one click to undo.
No. The sandbox includes requests and a small set of built-in modules. Custom packages, pandas, and other libraries are not available. If the logic needs a library outside the sandbox, it has to be rewritten or moved to an external service.
Yes. Each code step execution is one task on your Zapier plan. A Zap with three code steps that runs once costs three tasks. In a loop, the count multiplies by the number of iterations.
qbash bills per run, not per step. Adding a loop, a branch, or a code block does not increase the cost per run. Model calls are billed at the provider's rate, and a prompt is only used when you call it.
To build or change a task, yes, though the builder drafts the first version from a description. To run one, no. Typed inputs render a form, so the person who asked for the automation runs it without seeing the code.
The Python code itself is portable. The work is rebuilding the surrounding Zap logic as code. Describe the automation to the builder and it drafts the task. See the full qbash vs Zapier comparison for how the two platforms differ overall.
Competitor details reviewed . Vendors change plans and features without notice, so check theirs before deciding.
Open the editor, write a script against your connected accounts, and put it on a trigger. Or describe it, and the builder drafts the task as code you edit.