Authorising third-party apps is a persistent challenge for developers. Each service provider has its own quirks, and managing OAuth flows or API keys on behalf of users adds complexity to any system. Tools like Nango and Pipedream step in to handle this, abstracting the authorisation process so you can focus on building functionality. Both let you authorise on behalf of users, and they approach the problem similarly, but some differences.
Nango is a newer, developer-centric player. Itâs built for those who want control and flexibility, with a focus on integrating APIs into your app. Pipedream, on the other hand, has roots in workflow automation. Itâs primarily UI-driven but offers developer options through code-based components. Last year, Pipedream introduced Pipedream Connect, which aligns more closely with Nangoâs model of user authorisation. For this comparison, weâll zoom in on Pipedream Connect rather than its broader workflow features.
How They Handle Authorisation
Both Nango and Pipedream Connect let you authorise third-party apps for your users. You start by setting up a provider (or âappâ in Pipedream lingo) with a shared signing secret. The service handles the OAuth dance, generating a token tied to your user. Once authorised, you get a webhook response with the token, which you can store alongside your user_id in your database.
From there, both services let you use the token to act on behalf of the user. You can trigger actions directly or make proxy requests, where the service swaps your token for the providerâs OAuth bearer token behind the scenes. The flow is similar, but the execution diverges.
With Nango, when a token is created, users can be auto-subscribed to sync endpoints. Nango starts caching recordsâlike new emails or CRM updatesâand sends events to a single webhook (or two). You then fetch the data as needed. Pipedream takes a more manual approach. You create custom triggers for each user and app component, each tied to a unique webhook URL. Since the webhook payload doesnât inherently identify the user, that unique URL becomes your way to map events back to the right person.
Terminology Breakdown
The two services use different labels for similar concepts:
- Pipedream: App vs Nango: Provider â The third-party service youâre connecting to, like Gmail or Slack.
- Pipedream: Source/Event Source/Trigger/App Trigger Event vs Nango: Sync â A specific event, like ânew emailsâ or ânew contact addedâ.
- Pipedream: Components vs Nango: Endpoints â Pipedreamâs components include triggers (events) and actions (tasks), while Nango splits these into syncs (data pulls) and actions (tasks like sending an email).
For example, ânew emailsâ might be a trigger in Pipedream or a sync in Nango, while âsend emailâ is an action in both.
OAuth Clients: A Key Difference
Pipedream Connectâs killer feature when starting out is letting you use its OAuth client application instead of registering your own. For services like Google, where setting up your own client involves videos and manual approval, this can save serious time. However, itâs not without trade-offs: users authorise âPipedreamâ (e.g., âPipedream would like to access your Salesforce accountâ), which can confuse them or raise flags in security reviews at larger companies. If you switch platforms later, users must re-authorise, and if the API provider revokes Pipedreamâs accessâsay, over a policy disputeâyour tokens stop working. Some APIs even ban this credential-sharing in their terms. Nango, by contrast, requires you to bring your own client for each provider. Itâs more setup, but you keep full control, avoiding these risks and maintaining your branding throughout the auth flow.
Integration Coverage
Pipedream boasts over 2500 integrations out of the box, dwarfing Nangoâs 400+. Beyond sheer numbers, Pipedream also supports a broader set of endpoints per integration, giving you more pre-built options to work with. In saying that both claim you can âinstantly connectâ to these services, but in practice, youâll likely need to tweak each endpoint for your appâthereâs no true plug-and-play. Nango shines when you want to add custom endpoints, offering a straightforward process that, with an LLMâs help, becomes almost trivial. Pipedreamâs extensibility exists but leans heavier on its existing library, which might limit you if your needs fall outside its scope.
Code Examples
Hereâs how youâd work with each service, keeping it concise where possible.
Nango
-
Authorise a Connection:
import Nango from '@nangohq/frontend'; const nango = new Nango(); nango.openConnectUI({ onEvent: (event) => { if (event.type === 'connect') console.log('Auth successful'); } }); const res = await fetch('/sessionToken', { method: 'POST' }); nango.setSessionToken(res.sessionToken);
-
Webhook Event Payload (Sync Event):
{ "connectionId": "user123", "providerConfigKey": "google", "syncName": "gmail-emails", "model": "Email", "responseResults": { "added": 5, "updated": 0, "deleted": 1 }, "syncType": "INCREMENTAL", "modifiedAfter": "2025-03-26T10:00:00Z" }
-
List Records:
import { Nango } from '@nangohq/node'; const nango = new Nango({ secretKey: 'your-secret-key' }); const records = await nango.listRecords({ providerConfigKey: 'google', connectionId: 'user123', model: 'Email', modifiedAfter: '2025-03-26T10:00:00Z' });
-
Call an Action:
import { Nango } from '@nangohq/node'; const nango = new Nango({ secretKey: 'your-secret-key' }); const result = await nango.triggerAction('google', 'user123', 'send-email', { to: 'friend@example.com', subject: 'Hi' });
-
Proxy Request:
const options = { method: 'GET', headers: { 'Connection-Id': 'user123', 'Provider-Config-Key': 'google' } }; const response = await fetch('https://api.nango.dev/proxy/gmail/v1/users/me/messages', options);
Pipedream Connect
-
Authorise a Connection:
import { createFrontendClient } from '@pipedream/sdk/browser'; const pd = createFrontendClient(); async function connectAccount(token) { pd.connectAccount({ app: 'google', token, // From your server onSuccess: ({ id }) => console.log(`Connected: ${id}`) }); } const { token } = await fetch('/connectToken', { method: 'POST', body: JSON.stringify({ external_user_id: 'user123' }) }); connectAccount(token);
-
Deploy a Trigger:
import { createBackendClient } from '@pipedream/sdk/server'; const pd = createBackendClient({ credentials: { clientId: 'id', clientSecret: 'secret' }, projectId: 'proj123' }); const { data } = await pd.deployTrigger({ triggerId: { key: 'google-new-email' }, configuredProps: { google: { authProvisionId: 'apn_123' } }, externalUserId: 'user123', webhookUrl: 'https://yourapp.com/webhook/user123' });
-
Webhook Event Payload:
{ "steps": { "trigger": { "event": { "emailId": "abc123", "from": "someone@example.com" }, "context": { "id": "evt_123", "ts": "2025-03-26T10:00:00Z", "deployment_id": "dep_456" } } } }
-
Invoke an Action:
import { createBackendClient } from '@pipedream/sdk/server'; const pd = createBackendClient({ credentials: { clientId: 'id', clientSecret: 'secret' }, projectId: 'proj123' }); const { exports } = await pd.runAction({ actionId: { key: 'google-send-email' }, configuredProps: { google: { authProvisionId: 'apn_123' } }, externalUserId: 'user123', data: { to: 'friend@example.com', subject: 'Hi' } });
-
Proxy Request:
import { createBackendClient } from '@pipedream/sdk/server'; const pd = createBackendClient({ credentials: { clientId: 'id', clientSecret: 'secret' }, projectId: 'proj123' }); const resp = await pd.makeProxyRequest( { searchParams: { external_user_id: 'user123' } }, { url: 'https://gmail.googleapis.com/gmail/v1/users/me/messages', method: 'GET' } );
MCP and Introspection
The Model Context Protocol (MCP) is like a phonebook for large language models (LLMs). It standardises how AI agents discover what they can do and how to act on a userâs behalf. Both Nango and Pipedream are leaning into this as AI integration grows.
Pipedream recently launched mcp.pipedream.com, letting developers plug MCP API calls into their IDEs. Theyâre also planning to support MCP server calls on behalf of customers soon (according to their slack community support person). Triggers in Pipedream are configurableâthink form-based triggers with custom payloadsâbut this flexibility can limit live system introspection. Their MCP servers solve this by predefining how components trigger actions.
Nango offers an introspection API (docs.nango.dev/reference/api/scripts/config) that serves a similar role. It details available endpoints and syncs, which can be adapted for MCP-like use by AI agents. Customisation in Nango happens via custom endpoints, and these definitions flow into the introspection API, giving a clear view of the systemâs state.
Pipedreamâs ahead on MCP adoption, with a more polished vision for AI workflows. Nangoâs introspection is tighter, with precise typings and real-time system visibility, even if itâs less standardised.
Wrapping Up
Nango and Pipedream Connect tackle authorisation in distinct ways. Nango suits developers who want granular control and tight integration, with auto-syncs and a single webhook simplifying data flows. Pipedream Connect leans on its pre-built OAuth clients and custom triggers, ideal for those prioritising speed and flexibility over setup effort. As AI and MCP reshape how we interact with systems, Pipedreamâs pushing the envelope, while Nango keeps it precise and developer-focused. Choose based on where your priorities lieâcontrol or convenience.