Skip to main content
Back to Blog
actions philosophy no-code automation

Why Configurable Actions Beat Custom Code

Swifty Team Mar 16, 2026 4 min read

Developers are sometimes skeptical of "no-code" automation. The skepticism is earned — many no-code automation systems are powerful in demos and brittle in production. Conditions don't compose well. Error handling is limited. Debugging is a mystery. The appeal of custom code is that you know exactly what it does.

We share enough of that skepticism that we built Swifty's action system differently. Here's how we think about why configuration often beats custom code for business logic, and where the boundary is.

The Legibility Argument

Custom code for business logic is usually written once and read many times. The person who writes an "invoice approval" action in code puts their mental model of the approval process into functions and conditions. Six months later, when the process changes, someone has to read that code, understand that mental model, update it, and verify the result is correct.

A configuration-defined action chain externalizes the mental model. It's visible. The steps are named. The conditions use field names from the data model, not variable names from the developer's imagination. Non-developers can read it — and that's a significant practical advantage.

When an operations manager says "add a step that notifies the CFO when the amount exceeds $50,000," a developer can implement that in code. Or the operations manager can add that step themselves in the action chain builder. The second path is faster, doesn't require developer availability, and keeps the business logic visible to the people who own it.

The Auditability Argument

Every change to a configuration-defined action is recorded. Who changed it, when, what the previous configuration was, what it is now. Reverting to a previous version is a click.

Code changes go through version control, which is the right tool for developers — but version control diffs of business logic code aren't accessible to non-developers. Configuration change history is a different kind of audit trail: more accessible, more directly meaningful to the people accountable for the business process.

The Speed Argument

Configuration changes deploy immediately. A change to an action chain is live the moment it's saved. There's no build, no deployment pipeline, no waiting.

For business processes that change frequently — seasonal variations, regulatory updates, organizational changes — the deployment cycle for code changes is a real bottleneck. Configuration removes that bottleneck entirely.

Where Code Wins

Custom code wins for logic that can't be expressed in configuration:

  • Complex calculations that require actual programming constructs
  • Integrations that need specialized handling not covered by the standard integration layer
  • Performance-sensitive operations that need careful optimization
  • Edge cases that appear rarely but have significant consequences when they do

The extension system provides the right place for this code. The bar for reaching it should be high — not because code is bad, but because configuration is better for the common case.

The Practical Balance

We've found that roughly 80% of business logic that would historically require custom code is expressible in configuration using Swifty's action system. The remaining 20% genuinely needs code, and the extension system is there for it.

Getting that 80% into configuration makes it visible, auditable, and changeable by the people who own it. That's worth more than the comfort of familiar code for problems that don't require it.

Related posts

Composed Data Sources

Chain and relate data sources for rich dashboards — compose complex data views from simpler sources without writing code.

Computed Expressions

Transform data with template expressions and built-in functions — format, combine, and derive values from your data without code.

Cross-Source Data Joins

Combine data from multiple sources in one view — join records from your database with data from external services using a shared key.