unified.to evaluation: stay on Composio
ADR-056 — unified.to evaluation: stay on Composio
Section titled “ADR-056 — unified.to evaluation: stay on Composio”Status: Accepted 2026-05-18 Context: ADR-053 (Lean stack: Composio + Mem0 + Anthropic) — Composio is canonical OAuth-SaaS layer
Context
Section titled “Context”unified.to (https://unified.to) is a managed integration platform that surfaces 440+ vendor APIs through MCP and REST, with two distinguishing characteristics vs Composio:
- Normalized schemas across vendors — 2,100+ unified data objects so one query against the “CRM” object returns the same shape whether the customer is on HubSpot, Salesforce, Pipedrive, or Zoho.
- Stateless / data-access-heavy positioning — virtual webhooks for real-time data, designed for “consume customer data without standing up storage.”
Pricing (verified 2026-05-18):
- Grow: $750/mo — 750K API calls/mo, unlimited customer connections, $1/1000 overage.
- Scale: $3000/mo — 6M API calls/mo, $0.50/1000 overage.
- Enterprise: custom.
- 30-day free trial.
Ascend’s current state (post-PR #564): Composio carries 18 active connections across two tenants (Ascend, Kahuna), zero marginal cost per additional tenant, action-execution-heavy GTM workflows (HubSpot writes, Salesforce SOQL, Google Ads mutations, Slack sends, Apollo enrich, Gong fetches).
Decision
Section titled “Decision”Stay on Composio. Do not switch or augment with unified.to.
Comparison
Section titled “Comparison”| Dimension | Composio | unified.to | Winner |
|---|---|---|---|
| Marginal cost per new tenant | $0 | Capacity-share against $750/mo floor | Composio |
| Floor cost | Current (covered) | $750/mo | Composio |
| Positioning fit for Ascend workloads | Action-execution-heavy (writes, queries, mutations) | Data-access-heavy (normalized reads) | Composio |
| Vendor breadth | 982+ toolkits, 20,000+ curated actions | 440+ integrations, 22,566 callable tools, 2,100+ normalized objects | Composio for action breadth |
| MCP support | Native (SSE) | Native | Tie |
| Per-end-customer routing | user_id={slug} per call (shipped in PR #564) | Unlimited customer connections | Tie |
| Invariant 5 (no tokens in our KV) | ✅ tokens in Composio | ✅ tokens in unified.to | Tie |
| Schema normalization across vendors | ❌ vendor-specific slugs | ✅ unified objects | unified.to (not a current requirement) |
| Switching cost from current state | $0 | Throw away PR #564 + re-OAuth 18 connections + rewrite client.ts, auth-configs.json, routing-write.ts | Composio |
Decisive factor
Section titled “Decisive factor”The “scalability” problem that drove PR #564 (referenced by the driving question on ~/.claude/plans/are-we-connected-to-greedy-kitten.md) was manual onboarding labor, not coverage or schema mismatch. The onboarding CLI (~60 min → ~7 min, 1 click per tool from the client) eliminates that cost. unified.to’s normalized-schema value-add does not move that meter; it solves a different problem (multi-CRM read normalization) that no Ascend workflow currently has.
Every Ascend automation is vendor-specific: HubSpot for Ascend, Salesforce + HubSpot for Kahuna, Google Ads mutations against named accounts, Slack into specific channels, Apollo lookups returning Apollo-shaped contacts. A unified CRM read object would be paid-for and unused.
Triggers for re-evaluation
Section titled “Triggers for re-evaluation”Re-evaluate unified.to when any of:
- Cross-vendor normalization becomes a real product requirement — e.g., a client demands a single query returning contacts from any of HubSpot/Salesforce/Pipedrive/Zoho with the same shape, or we ship a feature that ingests CRM data from N different vendors.
- Composio raises prices materially above the $0 marginal we currently see, or removes a critical capability we depend on.
- A capability gap appears that Composio refuses to close within 30 days (per ADR-053 escalation rule for new SaaS needs).
Consequences
Section titled “Consequences”- Continue executing on PR #564 onboarding CLI and
docs/composio/onboarding.mdgolden path. - No vendor evaluation work scheduled.
- This ADR is the record so the next session does not re-evaluate from scratch.