Windmill vs Make
Eight questions teams ask when a visual automation builder starts carrying production work, with an honest answer on each one for where Windmill or Make is the better pick.
- 01What you can buildWhich solution fits for your specific use case
- 02TargetWho the platform is built for
- 03Build experienceHow you build on each platform
- 04IntegrationsHow the platform integrates with your existing stack
- 05Migration & lock-inHow hard to get in, how hard to get out
- 06Enterprise requirementsAudit logs, observability, security, performance
- 07Licensing & pricingOpen source, pricing, self-hosting
- 08VerdictThe verdict
An open-source workflow engine and developer platform to build and orchestrate all your internal software: scripts, workflows, data pipelines, AI agents and internal apps. Made for engineers who want full code flexibility and local dev experience, both to build internal software and to manage the underlying infrastructure.
A visual, no-code automation builder (formerly Integromat): scenarios you assemble on a canvas from modules, routers and filters across 3,500+ apps, billed in credits. Best for business teams who want a working automation this afternoon without involving an engineer.
Which internal software can you build and orchestrate?
Windmill is built to centralize and orchestrate all your internal software in one place. Scripts, workflows, data pipelines, full-code apps, AI agents and operator UIs run on a single runtime, with shared resources, auth and observability. Make is built around one primitive, the scenario: a visual canvas of modules drawn from a large app catalog, where most actions consume one credit, which is what makes high-row-count jobs an awkward fit.
| Primitive | ||
|---|---|---|
Chain steps with branching, retries and approval steps | ||
Cron jobs with retries, error handling and alerting | ||
Standalone functions exposed as APIs, webhooks or cron jobs without a wrapping workflow | ||
ETL, syncs and scheduled data jobs over large row counts | 1 credit per action | |
Agents that call tools, branch on outputs and run as workflow steps | Open beta | |
Isolated environments with persistent volumes for running coding agents | ||
Dashboards and admin UIs, low-code or written in React or Svelte | Not listed | |
Run the whole platform on your own infrastructure |
On Internal apps we have written "not listed" rather than a cross. Make's pricing page sells the no-code visual workflow builder, routers and filters, data stores and the app catalog, and its enterprise page adds Make Grid, scenario tagging and real-time analytics. Neither describes a builder for dashboards or admin UIs the way the Windmill app builder does, so we are reporting what their pages say rather than asserting a gap.
AI agent workflows exist on both sides. Make's own help center says the Make AI Agent (New) app "is available in open beta, so product functionality and pricing may change", which is why the cell is labelled rather than ticked.
Who is each platform built for?
Make is built so that a non-developer can ship an automation without asking anyone, and it is very good at that. Windmill is built for developer-led teams who want automations to live in the same place as the rest of their code, with review, versioning and ownership attached.
Primary audience
Developer-led teams. Engineers own the platform end-to-end: code, Git, local dev, workspace forks, code review, CI/CD, AI coding tools, infrastructure as code. Non-developers consume the result through auto-generated UIs, apps and run-only workspace roles.
Anyone in the business. The Free plan already includes the no-code visual workflow builder, routers and filters and the app catalog, so dragging modules onto a canvas and mapping fields between them needs no engineer, no infrastructure and no deploy. For connecting two SaaS tools this is genuinely the faster path of the two.
Working as a team
Everything the platform manages can be a file in Git, so the usual team mechanics apply: branches, pull requests, review, rollback. Permissions run through RBAC, groups and folders. Self-hosted Community Edition allows up to 50 users and a maximum of 4 groups; unlimited groups and granular permissions are Enterprise only.
Sharing is a plan boundary. Per the pricing page, teams and team roles, plus creating and sharing scenario templates, start on the Teams plan. Role-based access that controls who can build and change what is listed on the enterprise page.
Who ends up maintaining it
The same people who maintain the rest of your code. An automation is a script with tests, a diff and an owner, which is why it survives the author leaving.
Whoever built it, usually in the canvas itself. A scenario can be exported as a blueprint JSON file for backup or reuse, but that file carries modules, settings and mapped values rather than reviewable logic, and an imported blueprint has to be under 2 MB.
How do you build on each platform?
Make is canvas-first: you configure a scenario, and code is a narrow escape hatch, capped at 300 milliseconds and 5,000 characters with no libraries and no HTTP. Windmill is code-first: the step is the code, in a real runtime you size, with a local dev loop, package imports and whole-workspace Git sync. As AI writes more of the automation, that difference turns practical: a diff in a Python file is reviewable, testable and revertible in a way a changed field mapping is not.
On Windmill, every step of a flow is a script. Compose them visually as a DAG with branches, loops and approval steps, in any of the 20+ supported languages.
Authoring
Write scripts in 20+ languages in a dedicated script editor. Windmill parses the function signature to generate the input UI, the JSON schema and the argument types. Each script is a standalone primitive with its own UI, API endpoint and scheduler, no wrapper required. Flows compose scripts either visually in the flow editor or in full code with workflows as code in Python or TypeScript.
Build a scenario on a canvas: add modules from the app catalog, map fields between them, and branch with routers and filters. Make's own definition is that a scenario "defines how different apps communicate and work together in ways they wouldn't normally be able to". Every module run is metered, with two documented exceptions: the Router module and the error-handler modules (Rollback, Break, Resume, Commit, Ignore) consume no credits.
Code steps and their limits
There is no distinction between a code step and a normal step: every step is code, running in a real runtime on a worker you size. Timeouts are configurable at the instance level and per flow step, and memory and concurrency are configuration rather than a plan tier. Long-running jobs, heavy dependencies and native extensions are ordinary cases.
The in-product code surface is custom functions, and they are deliberately small: JavaScript ES6 only, Enterprise only, no third-party libraries, no HTTP requests, no recursion and no calling another custom function, synchronous only, at most 5,000 characters, and "a single custom function can't run for more than 300 milliseconds". They extend data transformation, they do not host business logic.
Local dev & IDE
Run and test scripts locally with the Windmill CLI. VS Code extension, native language tooling (LSP, type-checking, linting) and AI coding tools such as Claude Code and Codex work against real source files.
Scenario authoring happens in the browser. Access to the Make API, which the pricing page puts at 300+ REST endpoints and which can read a scenario's blueprint as JSON, starts on the Core plan. There is no local runtime to test a scenario against: a run happens on Make, and the Visual Studio Code route for building custom apps is marked deprecated in Make's developer docs.
Dependencies
Any npm, PyPI, Go, Maven or Cargo package is a first-class import. Windmill detects the import, resolves the version and pins it in a per-script lockfile, with no install step and no restart. Private PyPI and npm registries are Enterprise only.
There is no package layer. Custom functions state plainly that "no 3rd party libraries are supported", so anything the catalog does not already cover is reached through an HTTP module or a custom app you declare in JSON against a public API.
Resources & secrets
Connections are held by Make and authorized once through the app, which is a real convenience: you never handle the token. Exported blueprints deliberately leave them out, so anyone importing one sets up their own connections afterwards. Custom variables start on the Pro plan.
Git & CI
Scripts, flows, apps, resources, variables, schedules, folders, groups and permissions are all files in Git, deployed through the CLI and Git sync. Internal tooling runs like application code: pull requests, reviews, rollbacks, CI/CD. Git sync is free for up to 2 users; beyond that is Enterprise only.
No Git sync for scenarios. The closest equivalent is the blueprint: export it from the three-dot menu or read it through the API, then import it elsewhere. That gives you a file to keep, but the diff is of Make module references, mappers and designer coordinates rather than of the logic, and re-exporting is a manual step after every change.
AI while authoring
Because every script and flow is a real file, coding agents operate on them directly, and what they produce lands in a pull request like any other change. Windmill also has an in-product AI builder for generating and editing scripts and flows.
Make now points AI at the parts of the product that are text. Its custom apps documentation lists three ways to build an app and recommends an AI coding agent ahead of the Make web interface, with the Visual Studio Code route marked deprecated.
The logic is an ordinary Python function in a file. Windmill reads the signature to generate the input form, the JSON schema and the webhook contract, resolves requests into a per-script lockfile, and runs the same file locally through the CLI. The flow definition only wires steps together: the step code stands on its own and can also run as an API endpoint or a scheduled job with no flow around it.
- enrich_signup.py
- flow.yaml
import requests
import wmill
def main(email: str, company_domain: str, plan: str = "free"):
api = wmill.get_resource("f/crm/internal_api")
company = requests.get(
f"{api['base_url']}/companies/{company_domain}",
headers={"Authorization": f"Bearer {api['token']}"},
timeout=30,
).json()
if company.get("employees", 0) < 50:
return {"routed": False, "email": email}
return {
"routed": True,
"email": email,
"company": company["name"],
"employees": company["employees"],
"plan": plan,
}
summary: Route large-company signups to the sales channel
value:
modules:
- id: enrich
value:
type: script
path: f/crm/enrich_signup
input_transforms:
email:
type: javascript
expr: flow_input.email
company_domain:
type: javascript
expr: flow_input.company_domain
- id: notify
skip_if:
expr: "!results.enrich.routed"
value:
type: script
path: f/slack/post_message
input_transforms:
text:
type: javascript
expr: '"New signup: " + results.enrich.company'
A scenario is built on a canvas, so there is no source file to show for it. Where Make does have a text format is the custom app: a module is declared as JSON, with a communication block that templates the HTTP request and a mappable-parameters block that defines the fields a builder fills in. These two snippets are taken from Make's own custom apps documentation.
- communication.json
- parameters.json
- scenario
{
"url": "/api/users/create",
"body": {
"name": "{{parameters.name}}",
"email": "{{lower(parameters.email)}}"
},
"method": "POST",
"response": {
"output": {
"id": "{{body.id}}"
}
}
}
[
{
"name": "email",
"type": "email",
"label": "Email address",
"required": true
},
{
"name": "name",
"type": "text",
"label": "Name",
"required": true
}
]
1. Trigger Watch new rows in a connected app
schedule options: interval, once, daily, weekdays,
weekly, monthly, specific dates, on demand
"Immediately" is available for some triggers only
minimum interval: 15 minutes on Free, down to the
minute from Core
2. Router Split the scenario into branches
the Router module consumes no credits
3. Filter Only continue if Employees is greater than 50
4. Module Create a user through the custom app above
most actions consume 1 credit
5. Module Send a message in Slack
most actions consume 1 credit
How does the platform integrate with your existing stack?
Make has the catalog: 3,500+ apps with maintained modules and credentials it holds for you, which no code-first platform can match on breadth. Windmill trades the catalog for the package ecosystems: any npm, PyPI, Go or Maven library is an import away, so the integration you need is whatever the vendor publishes an SDK for.
Type import stripe in the script editor and run. Windmill detects the import, resolves the version and pins it in a per-script lockfile. No venv, no install step, no restart: a new integration is a new import.
Connecting out
Any npm, PyPI, Go or Maven package is a first-class import with automatic dependency resolution and no plugin layer in between: you call the vendor's real SDK with full type inference in the editor. 50+ pre-built resource types cover common databases (Postgres, Snowflake, BigQuery), SaaS (Slack, Stripe, GitHub, Notion, OpenAI) and infrastructure (S3, Redis, Kafka). A community Hub holds reusable scripts and flows.
This is where Make wins outright. The pricing page puts the catalog at 3,500+ apps, and Make's app documentation splits them into verified apps that Make builds and supports, custom apps built by users, community apps and built-in apps. Enterprise adds complex applications that Make names as Workday finance modules, Coupa, ServiceNow, Greenhouse and Infor M3. Nothing in a code-first platform matches the time-to-first-working-automation on a long-tail SaaS tool Make already supports.
Receiving events
Native triggers for HTTP, cron, Kafka, NATS, Postgres CDC, SQS, MQTT, SMTP, WebSocket, GCP Pub/Sub and Azure Event Grid. Every script and flow also gets an HTTP endpoint and a webhook URL for free. Postgres, WebSocket and MQTT triggers are self-hosted; Kafka, NATS, SQS, GCP and Azure triggers are Enterprise only.
Scenarios run on a schedule (interval, once, daily, weekdays, weekly, monthly, specific dates or on demand), and an "Immediately" option exists for some triggers only. The minimum interval is a plan boundary: 15 minutes on Free, with "more control with scheduled scenarios, down to the minute" starting on Core. Webhooks are supported, with a maximum payload of 5 MB regardless of tier.
Extending
A new integration is a script with a new import: save and run, no restart and no image rebuild, in the web editor, the CLI or Git sync. Custom logic can be exposed as a typed script, packaged as a resource type for shared use, or published to a private workspace Hub (Enterprise only).
Build a custom app to reach anything with a public API. A module is declared as JSON: a communication block that templates the request and response, and a mappable-parameters block that defines the fields a builder fills in. For one-off calls inside a scenario there is the HTTP module, and for transformations, Enterprise custom functions.
AI clients and MCP
Windmill works in both directions. It acts as an MCP server so Claude, Cursor or any MCP client can trigger your scripts and flows and inspect jobs, resources, variables, schedules and workers. It is also an MCP client: an AI session or an agent step can use external MCP servers, or Windmill scripts, as tools, with the tool schema generated from each script's typed signature.
Make also works in both directions. Its hosted MCP server at mcp.make.com/v2 runs over stateless Streamable HTTP: scenario-run tools are available on all plans, management tools require a paid plan, and a run call that exceeds 25 seconds over OAuth or 40 seconds with an API key returns an execution id while the scenario keeps running for up to 40 minutes. In the other direction, a Make AI agent can take module tools, whole scenarios or external MCP servers as its tools.
How hard to get in, and how hard to get out?
Make is far faster to get into, and that matters more than it sounds: a working automation this afternoon beats a better one next sprint. Windmill is far cheaper to get out of. Step logic is standard code that runs anywhere, the CLI exports the workspace as files, and the runtime itself is open source and self-hostable.
Getting in
Paste a function body into the script editor: Windmill infers the arguments, generates a UI and handles the dependencies. There is no DSL to learn, but there is code to write, so the first automation takes longer than it would on Make. Triggers, schedules, variables and apps migrate one at a time.
Minutes, and no infrastructure. Pick the trigger, add modules, map the fields, turn the scenario on. Starting from someone else's work is easy too: blueprints import from a JSON file or the clipboard, and creating and sharing scenario templates is a Teams plan feature. If your automation is two SaaS apps and a filter, Make will get you there first.
Getting out
Step logic is already standard code (TypeScript, Python, Go, Bash, SQL) that runs anywhere, and the CLI exports the whole workspace as plain files. What you lose by leaving Windmill is the runtime, not the step code. You can also keep the runtime and just move it: the core is AGPLv3 and self-hostable.
Better than nothing, and still not portable. A blueprint export gives you a JSON file, but its contents are Make's own structures: a flow array where each entry names a module type by URI, with its mapper, parameters and designer coordinates in metadata. Nothing in it runs outside Make, and connections are excluded, so a move means rebuilding each module, mapping and filter on the new platform.
The usual reason teams move
Volume, control or review. Credit billing is predictable until an automation starts touching thousands of rows, since most module actions consume one credit each; a code-first platform on workers you own prices that differently. Teams also move when the automation becomes load-bearing enough to need tests, code review and an owner.
Make is often the right place to stay. Low-volume, broad-catalog, non-developer automation is what it is built for, and replacing it with code you have to maintain is a real cost. The migration case is specific: high volume, logic that outgrew what a 300-millisecond custom function can hold, or a requirement that the automation run on your own infrastructure.
Audit logs, observability, security, performance
Both cover the enterprise basics, and both paywall them: role-based access and audit logs are Enterprise on Make, while uncapped SSO, SAML, SCIM and the SOC 2 Type II report are Enterprise on Windmill. The structural difference is where the work runs. Make executes on Make's infrastructure, with plan-tier ceilings on run duration, scheduling frequency and data transfer. Windmill executes on workers you own and size, so latency and throughput are an infrastructure decision rather than a pricing one.
Observability
Real-time streaming logs, per-run inputs, outputs and duration, and a trace ID on every job. Job run details are retained up to 30 days on self-hosted Community Edition and 60 days on cloud, unlimited on Enterprise. Queue metrics, Prometheus metrics, OpenTelemetry tracing and service logs on S3 are Enterprise only.
Every run is visible in the scenario's execution history. Full-text execution log search starts on the Pro plan. Make's security page puts default log retention at 30 days, with longer storage for Enterprise customers, and the enterprise page adds real-time analytics and Make Grid, "a live view of every automation and agent across the company".
Audit logs
A full trail of who ran, edited and deployed what, with the actor, timestamp and payload. Cloud Team retains 7 days. Self-hosted Community Edition does not include audit logs, and unlimited retention is Enterprise only.
Audit logs that record changes are listed under governance on Make's enterprise page, alongside role-based access and scenario tagging: Enterprise only.
Security & compliance
RBAC with groups and folders, SSO for up to 10 users, encrypted secrets at rest and sandboxed script execution in open source. Uncapped SSO, SAML and SCIM with group sync, custom OAuth, instance-level roles, service accounts and the SOC 2 Type II report are Enterprise only.
Make's security page lists GDPR, SOC 2 Type II and SOC 3, an ISO 27001 certified information security program, AES-256 full-disk encryption at rest with AWS KMS, and TLS 1.2 and 1.3 in transit. Sign-in is supported with Google, Facebook and GitHub; using your own SSO implementation is Enterprise only.
Isolation & tenancy
Multiple isolated workspaces on the same instance, each with their own users, resources, secrets and access controls, plus worker groups to pin sensitive jobs to specific machines. Self-hosted Community Edition is capped at 3 workspaces; unlimited is Enterprise only.
Scenarios are organized under an organization, with teams and team roles from the Teams plan up. Execution always happens on Make's infrastructure: AWS EC2 private instances across two zones, with the Enterprise platform running in a separately managed AWS environment isolated from self-service customers.
Performance & limits
Roughly 10ms cold starts on a queue-based worker pool you scale yourself. Dedicated-worker mode keeps runtimes and dependencies pre-warmed, and concurrency limits cap how many jobs a script runs at once. Both ship on the cloud plans; on self-hosted they are Enterprise only, as are autoscaling and step priority. Otherwise throughput is a function of the hardware you give the workers.
Limits are plan-shaped. A run that goes past 45 minutes ends with an ExecutionInterruptedError and leaves the remaining bundles unprocessed, and that ceiling is 10 minutes on the Free subscription. Data transfer is proportional to credits, at 5 GB per 10,000 credits licensed per month, and running out of it raises a DataSizeLimitExceededError that immediately disables scenario scheduling. Maximum file size also varies by subscription. Priority scenario execution starts on the Pro plan.
No benchmark chart on this page. Our reproducible engine benchmarks cover Airflow, Prefect, Temporal, Kestra, Hatchet and Windmill, all of which you can self-host and run under identical hardware. Make cannot be self-hosted, so there is no way to put it on the same machine and we would rather publish nothing than a number we cannot reproduce.
Open source, pricing, and self-hosting?
Windmill is open source at the core and free to self-host with unlimited executions, with published per-seat and per-compute pricing above that. Make is a hosted service billed per module action, which is the simpler proposition at low volume and the expensive one at high volume. Neither is fully open source: Windmill's Enterprise features live in a separate proprietary codebase.
Open source & self-hosting
AGPLv3 core, free to self-host with unlimited executions on Docker, Kubernetes or Fargate. Enterprise features (SSO beyond 10 users, dedicated workers, audit logs, external secret backends) ship in a separate proprietary codebase, so Windmill is not "fully" open source either. Managed cloud is available.
Make is a hosted service, and not open source. The pricing page lists cloud plans only, and the security page describes infrastructure on AWS EC2 private instances across two zones reachable only through a private network. The parts open to developers are the Make API, the MCP server and the custom apps format.
How you are billed
Seats plus compute. Self-hosted Community Edition is free and unmetered. Cloud Team is 10 USD per seat per month with 10,000 executions included per seat, capped at 10 seats. Enterprise is per seat plus compute units, where one compute unit is 2 worker-gb-month. Prices are published on the pricing page with a calculator, no sales call required.
In credits, which replaced operations as the billing unit: 1 operation equals 1 credit by default and "most actions consume 1 credit", with some AI features consuming more. Free includes 1,000 credits a month. At the 10,000 credits a month tier with annual billing, the pricing page lists Core at 12 USD a month, Pro at 21 USD and Teams at 38 USD, with Enterprise custom. Extra credits cost 25% more than the credits included in a plan, and unused credits expire at the end of the term.
What that means for cost
Cost tracks the infrastructure and the team, not the volume of work. An automation that fans out over 100,000 rows costs the same as one that runs once a day, provided the workers can keep up.
Cost tracks module actions, which is cheap and predictable at low volume and the main reason teams eventually look elsewhere. Make's own help center illustrates the upper end with a plan at 338.13 USD a month for 500,000 credits, and notes that Core now covers up to 300,000 credits a month while Pro reaches up to 8 million.
The verdict
Windmill and Make are not the same kind of product. Make models an automation as a scenario: modules drawn from a catalog of 3,500+ apps, arranged on a canvas with routers and filters, running on Make's infrastructure and billed in credits, where most actions cost one. Windmill models an automation as code: a script in TypeScript, Python, Go, Bash or SQL that is also a standalone API endpoint and scheduled job, with flows composing those scripts on workers you run.
Make is the right call if the people building the automations are not engineers, the integrations you need are in its catalog, and the volume is low enough that credit billing stays comfortable. The canvas is a genuinely good interface for seeing what a workflow does at a glance, the catalog and the managed connections remove a lot of work, and at the small end the price is hard to argue with.
Windmill fits the cases Make is not shaped for. The step is real code in a real runtime, so timeouts, memory and dependencies are your configuration rather than a plan tier, instead of logic squeezed into an Enterprise-only custom function capped at 300 milliseconds and 5,000 characters with no libraries. Everything the platform manages can live in Git, which means pull requests, review and rollback. The same runtime also carries data pipelines, AI agents and both low-code and full-code internal apps, with shared resources, auth and observability. And because nothing meters individual steps, cost tracks the infrastructure and the team rather than the number of module actions.
The AI question cuts in a specific direction. Both platforms are moving work to agents: Make has an agent app in open beta and now recommends building custom apps with an AI coding agent, and coding agents write Windmill scripts directly. The difference is what you are left holding. A generated Python file can be read in a diff, tested, and reverted by commit. A generated set of modules and field mappings is harder to review, and a blueprint JSON of module URIs and designer coordinates is a backup rather than a repository. The more of the automation an agent writes, the more that matters.
If you are deciding between the two, the honest test is your own worst automation: take the scenario that has grown to thirty modules, three routers and a custom function nobody understands, and rebuild it on each. The fastest way to judge is to spend an afternoon in each.
Frequently asked questions
Build your internal platform on Windmill
Scripts, flows, apps, and infrastructure in one place.