Truto vs Nango: Why Code-First Integration Platforms Don't Scale
A technical teardown of Truto vs Nango for engineering leaders. Learn why code-first platforms create technical debt and why declarative architecture scales better.
If you're searching for a Nango alternative, you've probably already experienced the honeymoon phase: the OAuth handling works, the first sync ships fast, and the TypeScript feels familiar. Then reality sets in. Your enterprise customer needs custom Salesforce fields mapped per-account. Your compliance team asks where synced data is stored and for how long. Your bill spikes because connections, records, requests, and compute time are all metered separately. And your engineers are spending more time maintaining integration scripts than building your actual product.
Nango is a strong auth and sync framework, but it fundamentally requires your team to own a pile of TypeScript integration code. Truto pushes that work into declarative configuration and JSONata, so you can ship and customize without treating "integrations" like a permanent org chart line item.
This post is a direct technical comparison of Truto vs Nango. (If you are evaluating other platforms, we also have a comparison of Truto vs Merge.dev). We'll break down exactly where Nango's architecture creates technical debt, the hidden costs in their pricing model, and why Truto's programmable, zero-data-retention architecture is the superior alternative for engineering teams that want to ship enterprise-grade integrations.
When Nango is a good fit
- You want to write and own the integration logic in TypeScript.
- You want a hosted platform to run that code, manage auth, and cache synced data.
- Your "customizations" are mostly "add another conditional" and you are staffed to keep doing that.
When Truto is the better fit
- You want the integration behavior to be mostly data-driven (config + JSONata), not a growing TypeScript codebase.
- You need per-customer field mapping without forking integration logic.
- You want real-time pass-through by default, with optional sync pipelines when you actually need them.
The "Code-First" Trap: Why Nango is a Glorified Starter Template
Nango positions itself as a developer-friendly platform by allowing you to write integration logic as TypeScript functions. They provide the auth infrastructure, and you write the code to fetch, transform, and sync the data. Nango says this directly: "Functions are Nango's TypeScript runtime for building custom integrations." (nango.dev)
This is a trap. When you use a code-first platform, you are taking on the perpetual maintenance burden of every third-party API you connect to.
Here's what a basic Nango sync looks like:
// You write this. You own this. You maintain this. Forever.
export default createSync({
description: 'Sync contacts from CRM',
frequency: 'every 10 minutes',
models: {
Contact: z.object({ id: z.string(), name: z.string(), email: z.string() })
},
exec: async (nango) => {
const config = { method: 'GET', endpoint: '/v3/contacts', retries: 10 };
for await (const page of nango.paginate(config)) {
const mapped = page.map(toContact); // Your mapping logic
await nango.batchSave(mapped, 'Contact');
}
},
});This looks clean for one integration. Now multiply it by 50 providers, each with different field names, pagination quirks, error formats, and rate limit behaviors. You're not buying a platform; you're buying a runtime to host your own integration code.
Truto takes a radically different approach. Our platform contains zero integration-specific code. Integration behavior is defined entirely as declarative JSON configuration blobs and JSONata expressions. Adding a new integration is a data operation, not a code deployment. Our engine handles pagination (cursor, page, offset, link header, range, dynamic), rate limiting, and error normalization automatically based on the API's JSON blueprint.
Feature Comparison: Truto vs Nango
| Capability | Truto | Nango |
|---|---|---|
| Architecture | Declarative JSON/JSONata (zero code) | Code-first TypeScript functions |
| Data Retention | Real-time pass-through (Zero retention) | Caches data (pruned at 30 days, deleted at 60) |
| Custom Fields | 3-level JSONata overrides (No code) | Requires custom TypeScript logic |
| OAuth App Ownership | Customer owns OAuth apps and tokens | Nango manages OAuth apps by default |
| Webhook Delivery | Queue-based, R2 storage, HMAC signatures | 2 retries, 20-second timeout |
| Sync Pipelines | RapidBridge (Declarative with transform nodes) | Manual orchestration via code |
| Post-Connect UI | RapidForm (Dynamic, data-driven forms) | Basic auth connection UI (build your own) |
| AI / MCP Servers | Auto-generated from API documentation | Manual coding via Nango Actions |
| Pricing | Predictable connector-based pricing | $50/mo base + per-connection & usage meters |
| Support | Direct Slack-based engineering support | Community / Ticketing |
Architecture & Data Privacy
Pass-Through vs Sync-and-Cache
The fundamental architectural difference between Truto and Nango lies in how data moves through the system.
Nango utilizes a sync-and-cache architecture. Data is pulled from the third-party API and stored in Nango's Postgres database via nango.batchSave(). Your application then reads from Nango's database.
Truto utilizes a real-time pass-through architecture. When you make a request to Truto's Unified API, Truto translates the request, proxies it directly to the third-party provider in real-time, transforms the response in memory, and returns it to your application.
flowchart LR
subgraph Nango["Nango: Sync-and-Cache"]
A1[Your App] -->|1. Trigger sync| B1[Nango Runtime]
B1 -->|2. Fetch data| C1[Third-Party API]
C1 -->|3. Return data| B1
B1 -->|4. Store in cache| D1[(Nango DB<br>Data cached up to 60 days)]
D1 -->|5. Query cached data| A1
end
subgraph Truto["Truto: Real-Time Pass-Through"]
A2[Your App] -->|1. API call| B2[Truto Engine]
B2 -->|2. Transform + proxy| C2[Third-Party API]
C2 -->|3. Return data| B2
B2 -->|4. Transform + return| A2
endZero Retention vs Data Caching
Because Nango caches data, it introduces compliance and security liabilities. Nango explicitly retains sync cache data with pruning after 30 days and deletion after 60 days of inactivity (nango.dev). If you are syncing HRIS data, CRM contacts, or financial records, your security team now has to audit a third-party vendor storing highly sensitive PII for two months.
Truto guarantees zero data retention for API payloads on the real-time path. Customer payload data never persists on Truto's infrastructure. You get always-fresh data with a drastically simplified compliance posture. For more on this, read our deep dive on the tradeoffs between real-time and cached unified APIs.
Schema Flexibility and Custom Fields
JSONata + 3-Level Overrides vs Hardcoded TypeScript
Traditional unified APIs force you into a rigid lowest-common-denominator schema. Nango attempts to solve this by making you write custom code. Truto solves this elegantly with JSONata and a 3-level override hierarchy.
JSONata is a Turing-complete transformation language for JSON. In Truto, all request and response mapping is handled by JSONata expressions stored as data. Truto applies these mappings in a deep-merge hierarchy:
- Platform Base: The default mapping that works for 90% of use cases.
- Environment Override: Your specific staging or production tweaks.
- Account Override: Per-customer customizations.
Custom Field Handling
When your biggest enterprise customer has 40 custom objects in their Salesforce instance, Nango forces you to write and deploy custom TypeScript logic specifically for that tenant. You fetch the custom fields, store the mapping in connection metadata, and write logic in your sync function to interpret it.
With Truto, you simply apply an Account Override. The JSONata expression is updated for that specific integrated_account_id via API. The runtime engine immediately applies the new mapping on the next request. No code deployments, no server restarts, no polluting your main codebase with customer-specific if statements.
// Account-level override for Enterprise Customer X's Salesforce
// Adds their custom fields to the unified response - no code deploy needed
response.{
"id": Id,
"name": Name,
"email": Email,
"custom_fields": {
"deal_priority": Custom_Priority__c,
"region_code": Regional_Code__c
}
}To understand why this declarative approach scales infinitely better than code forks, read Look Ma, No Code! Why Truto's Zero-Code Architecture Wins.
RapidBridge & Webhooks: Declarative Pipelines vs Manual Orchestration
Sync Pipelines
For asynchronous data movement, Nango requires you to write polling scripts, manage cron jobs, and handle orchestration manually in TypeScript.
Truto provides RapidBridge, a declarative sync pipeline engine. You define what data to sync, how to transform it, and where to send it - all as configuration.
{
"integration_name": "zendesk",
"resources":[
{
"resource": "ticketing/tickets",
"method": "list",
"query": {
"updated_at": { "gt": "{{previous_run_date}}" }
}
},
{
"resource": "ticketing/comments",
"method": "list",
"depends_on": "ticketing/tickets",
"query": {
"ticket_id": "{{resources.ticketing.tickets.id}}"
}
}
]
}RapidBridge handles incremental syncing natively via previous_run_date bindings, resource dependencies (e.g., sync tickets, then sync comments belonging to those tickets), and mid-pipeline JSONata transform nodes.
Webhook Architecture
Webhook reliability is a known weak point in Nango's infrastructure. Nango's official documentation explicitly states webhooks sent to your application have a 20-second timeout and a maximum of 2 retry attempts (nango.dev). If your receiving service drops offline for a deployment, you lose data permanently.
Truto provides enterprise-grade inbound and outbound webhooks. Outbound events are delivered with HMAC signatures (X-Truto-Signature), backed by queue-based reliability with exponential backoff, and payload storage in R2 to ensure zero data loss. For a deeper look at webhook reliability patterns, see our guide on designing reliable webhooks.
RapidForm: Dynamic Post-Connect Configuration Flows
Connecting an account is rarely just an OAuth handshake. Often, you need the user to provide additional context. For example, if a user connects Asana, you need to know which Workspace and which Project they want to sync.
Nango only provides basic authentication UI. To gather additional configuration, your engineering team has to build custom frontend components, handle the API calls to fetch the available options, and store the state.
Truto solves this natively with RapidForm. After a customer connects via OAuth, RapidForm presents dynamic, data-driven UI flows. Fields support cascading dependencies (a user selects a Workspace, and the Project dropdown instantly updates), handle pagination for large option lists, and use JSONata for form-level validation before saving the configuration directly to the integrated account context.
MCP Servers: Auto-Generated AI Agent Tools
If you are building AI agents, you need to expose third-party APIs as tools. Both platforms support the Model Context Protocol (MCP), but their approaches differ wildly.
Nango's MCP depends on Nango Actions. Your team is responsible for writing the TypeScript action, defining the tool descriptions, input schemas, and execution logic for every single tool.
Truto provides auto-generated MCP tools. Because Truto's architecture is entirely data-driven, the platform automatically generates MCP server definitions based on the integration's API surface and documentation records. Connect a HubSpot account, and your AI agent instantly gets tools like list_all_hubspot_contacts or create_single_salesforce_lead_by_id with proper JSON Schema inputs built-in. Zero manual coding required.
Pricing & Support: The True Cost of Nango at Scale
Nango markets itself as an accessible platform, but the unit economics break down rapidly as you scale due to their multi-variable pricing model.
Nango's Starter plan begins at $50/month but strictly includes just 20 connections. After that, you pay $1 per connection, plus metered usage on proxy requests, function compute time, runs, logs, sync storage, and webhooks (nango.dev).
Let's model the costs at different scales (ignoring compute/storage overages for Nango):
| Scale | Nango (Connections Only) | Truto |
|---|---|---|
| 20 connections | $50/mo | Predictable platform fee |
| 100 connections | $500/mo (Growth Plan) | Predictable platform fee |
| 500 connections | $500 base + $400 connections = $900/mo | Predictable platform fee |
The compute time variable is particularly nasty. Because your integration logic runs as TypeScript functions on Nango's runtime, you don't fully control how much compute time a sync consumes.
Truto uses predictable connector-based pricing with unlimited connections. We do not charge exorbitant per-connection fees that punish you for acquiring new customers.
Furthermore, Truto provides direct Slack-based engineering support on paid plans. You are not screaming into a ticketing black hole or community forum; you are communicating directly with the engineers who built the platform.
Strategic Wrap-Up: Stop Maintaining Integration Code
Code-first integration platforms sell you the illusion of control, but what you are actually buying is a lifetime maintenance contract for third-party API quirks.
Writing TypeScript functions for every integration is not a scalable architecture. It drains engineering velocity, creates compliance liabilities through data caching, and breaks down when enterprise customers demand custom field mapping.
Truto abstracts the complexity of integrations into declarative data structures. With zero integration-specific code, real-time pass-through architecture, and a Turing-complete mapping engine, you get the flexibility of custom code without the maintenance nightmare.
Stop writing integration boilerplate.
FAQ
- What are the main limitations of Nango?
- Nango requires your engineering team to write and maintain TypeScript functions for every integration. It also caches sensitive customer data for up to 60 days, severely limits outbound webhook retries to just two attempts with a 20-second timeout, and has complex multi-variable pricing.
- How much does Nango cost at scale?
- Nango's pricing scales poorly for growing SaaS companies. Their Starter plan costs $50/month but limits you to 20 connections. After that, you pay $1 per connection plus metered usage for proxy requests, function compute time, sync storage, and webhooks, making monthly bills unpredictable.
- Does Nango store my customers' data?
- Yes. Nango uses a sync-and-cache architecture where synced data is stored on their servers. Records not updated for 30 days have their payloads pruned, and syncs not executed for 60 days have all records permanently deleted. Truto uses a real-time pass-through architecture with zero payload retention.
- How does Truto handle custom fields compared to Nango?
- Truto uses a declarative JSONata engine with a 3-level override hierarchy, allowing you to map custom fields per-account without writing or deploying any code. Nango requires developers to fetch custom fields, store metadata, and write custom TypeScript logic for each unique customer requirement.