Unified API Buyer's Guide: True TCO & The Zero-Downtime Migration Playbook (2026)
A definitive guide for B2B SaaS PMs evaluating unified APIs. Covers true TCO calculation, architectural evaluation criteria, zero-downtime migration playbooks, and a prescriptive guide for migrating NetSuite off SOAP before the 2028 deadline.
If your engineering team is spending more time fixing broken OAuth tokens and updating deprecated API endpoints than building core product features, your integration strategy is failing. Senior product managers at B2B SaaS companies eventually hit a wall where shipping new integrations fast becomes mathematically impossible using an in-house team. You are likely evaluating unified APIs or embedded iPaaS solutions to stop the bleeding.
The problem is that evaluating these platforms based purely on their marketing sites leads to disastrous architectural lock-in. You need to understand the true Total Cost of Ownership (TCO) over a three-year horizon, and you need a tactical plan to migrate away from your current setup without forcing hundreds of enterprise customers to re-authenticate their accounts.
If you are evaluating integration platforms and trying to figure out what one actually costs over three years—not just the price on the sales deck—this guide is for you. It walks through the full TCO calculation for unified API platforms, gives you a weighted evaluation framework based on architectural transparency and zero data retention, and provides a step-by-step migration playbook for switching providers safely.
What a Unified API Platform Actually Costs (Beyond the Invoice)
Most teams drastically miscalculate the cost of integrations because they only measure the initial build phase. Writing the code to connect to a REST API takes a competent engineer a few days. The financial drain comes from what happens after the integration goes live.
Total cost of ownership (TCO) for an integration platform includes the subscription fee, implementation effort, ongoing maintenance, engineering opportunity cost, and the hidden tax of vendor lock-in. Most teams underestimate this by a wide margin.
Sixty-two percent of SaaS implementations exceed initial budget projections by at least 25%, and hidden costs include implementation (averaging 30% to 45% of year one fees), custom integrations, training, and ongoing optimization. Integration platforms are no exception. The sticker price is the tip of the iceberg.
Data suggests that real SaaS TCO ranges between 3-5 times the subscription costs when integrating all associated expenses. For integration infrastructure specifically, the multiplier can be even higher because integrations touch every part of your product—from onboarding flows to data sync to customer support escalations.
The Reality of Building In-House
According to Gartner's 2024 Global Software Buying Trends report, the ability to integrate into other systems is the number one sales-related factor driving software purchasing decisions. You have to build them to close deals. But maintaining them is a massive operational tax.
Here is the reality of building in-house:
- Initial Build: 2-4 weeks per integration (reading terrible vendor documentation, mapping data models, setting up webhooks).
- Maintenance: 10-15 hours per month, per integration.
- Infrastructure: Building and hosting reliable cron jobs, token refresh workers, and secure credential vaults.
If you support 30 integrations, your team is spending roughly 300 to 450 hours every single month just keeping the lights on. That is two to three full-time senior engineers doing nothing but babysitting third-party APIs. At Silicon Valley salaries, your in-house integrations are costing you upwards of $500,000 a year in pure maintenance, which is why many teams look for tools to ship enterprise integrations without a dedicated integrations team.
The TCO Formula for Integration Platforms
Here is a concrete formula you can use to model a 3-year TCO for any integration approach, whether you are building in-house, using an embedded iPaaS, or evaluating a unified API:
TCO (3-Year) = Initial Build/Setup Cost
+ (Annual Platform Fee × 3)
+ (Annual Engineering Maintenance × 3)
+ (Incident Response Cost × 3)
+ Migration/Switching Cost
+ Opportunity Cost of Engineering TimeThe average annual integration maintenance cost usually runs between 10% and 20% of the initial development cost. Migration costs are often overlooked, costing 1.5 to 2.5 times the annual subscription.
Let's put real numbers against this for a mid-market B2B SaaS company maintaining 20 integrations:
| Cost Category | Build In-House | Unified API Platform |
|---|---|---|
| Initial build/setup | $400K-$1M (20 integrations × $20K-$50K each) | $15K-$40K (implementation + mapping) |
| Annual platform fee | $0 (but see maintenance) | $24K-$120K (varies by pricing model) |
| Annual engineering maintenance | $200K-$400K (2-4 FTEs) | $20K-$60K (0.25-0.5 FTE) |
| Annual incident response | $50K-$100K | $10K-$20K |
| 3-year total | $1.15M-$2.5M | $177K-$580K |
These numbers are not hypothetical. 88% of companies encounter problems with third-party APIs that require troubleshooting on a weekly basis, and 36% of companies spent more effort troubleshooting API issues than developing new features last year. That troubleshooting time is a direct cost that most TCO analyses miss.
The Opportunity Cost Trap: The hardest cost to quantify is the features your team did not build because they were debugging a broken Salesforce sync or handling a BambooHR pagination change. If your engineers cost $150K-$250K fully loaded, every month spent on integration maintenance is $12K-$21K per engineer that did not go toward your core product.
Hidden Costs That Blow Up Your Budget
Beyond the obvious line items, watch for these:
- Per-connection pricing at scale. Some platforms charge per linked customer account. At 500 customers × 5 integrations each, that is 2,500 connections. At $2-$5 per connection per month, you are looking at $60K-$150K annually just in connection fees—before any API calls.
- Overage charges on usage-based models. If your platform bills per API call or synced record, a single enterprise customer running a historical sync on 500,000 Jira tickets can blow through your annual integration budget in an afternoon.
- Re-authentication costs during migration. If you switch platforms and your vendor owns the OAuth apps, every customer must re-authorize. For 500 customers, expect a 30-60 day campaign, significant support ticket volume, and 5-15% connection loss from customers who never complete the flow.
- Custom field and custom object gaps. If the platform's common data model does not cover a field your enterprise customers need, you are building workarounds. That "unified" API just became a point-to-point integration with extra steps.
Analyzing Vendor Pricing Models
When you decide to buy rather than build, you will encounter three dominant pricing models in the unified API market. As detailed in our 2026 pricing breakdown, choosing the wrong one will destroy your margins as you scale.
| Pricing Model | How It Works | Best For | Watch Out For |
|---|---|---|---|
| Per-connection | Pay per linked customer account | Early-stage with few customers | Costs explode as you grow. This model actively punishes you for growing. 500 customers × $3/connection = $18K/year for just one integration. |
| Usage-based | Pay per API call or synced record | Low-volume, sporadic access patterns | A single large customer can blow your budget. Hard to forecast, entirely unpredictable. |
| Per-integration flat fee | Pay a flat fee per connector activated | Scaling companies with many customers per integration | Higher upfront per-connector cost, but marginal cost per customer is zero. |
For most B2B SaaS companies scaling past 100 customers, per-integration pricing provides the most predictable cost curve, making it the best unified API approach for startups on a budget. Truto uses this model—a flat fee per connector regardless of how many customers connect through it, or how much data flows through it. This aligns your infrastructure costs with your product capabilities, making financial forecasting highly predictable.
Base subscription represents only 30-50% of first-year costs for complex platforms. When you model TCO, plug in your projected customer count at 12, 24, and 36 months and calculate costs under each pricing model. The difference is often 3-5x at scale.
Buyer's Guide: Core Architectural Requirements
When evaluating unified APIs, look past the logo walls. You need to interrogate the underlying architecture. If the vendor's architecture conflicts with your enterprise compliance requirements, the deal is dead on arrival.
The integration platform market is crowded. iPaaS vendors, unified APIs, embedded integration platforms, and code-first tools all compete for your budget. During assessment, buyers are primarily concerned with a software provider's ability to provide integration support (44%), according to Gartner's 2024 Global Software Buying Trends report—making it the number one sales-related factor in driving a software decision.
That means your integration infrastructure is not just a technical decision. It directly impacts whether you win or lose deals. Here is the evaluation framework:
The 8-Dimension Evaluation Framework
| Dimension | Weight | What to Test |
|---|---|---|
| API category coverage | 20% | Does it cover CRM, HRIS, ATS, accounting, ticketing, and your specific verticals? |
| Data model flexibility | 15% | Can you map custom fields? Handle custom objects? Override the common data model per customer? |
| Auth scheme support | 15% | OAuth 2.0 (auth code + client credentials), API key, custom header, session-based? |
| Rate limit handling | 10% | Does it pass through rate limit headers transparently, or silently retry and hide failures? |
| Compliance posture | 10% | SOC 2 Type II, data residency options, zero-data-retention architecture? |
| Pricing predictability | 10% | Per-integration flat fee vs. per-connection vs. usage-based. Model your cost at 2x and 5x current scale. |
| Migration support | 10% | OAuth app ownership, token portability, parallel run capability? |
| Escape hatches | 10% | Proxy API for raw access, custom resource definitions, webhook normalization? |
Let's break down the most critical architectural requirements in detail.
1. Data Storage and Retention (Pass-Through vs. Caching)
This is the most critical security decision you will make. Many legacy unified APIs and embedded iPaaS platforms work by pulling your customers' data from the third-party system, storing it in their own databases (caching), and then letting you query their database.
Do not accept this architecture if you sell to enterprise, healthcare, or financial services. Storing your customers' highly sensitive CRM or HRIS data on a third-party vendor's servers introduces massive compliance liabilities for SOC 2, HIPAA, and GDPR.
Look for a zero data retention architecture. The platform should act as a stateless proxy. It authenticates the request, normalizes the payload, routes it to the provider, and returns the response directly to your application without persisting the payload to disk.
2. Handling Custom Fields and Objects
Standardized data models look great in a demo, but they fall apart in production. No two enterprise companies use Salesforce or Jira exactly the same way. If a unified API forces you into a rigid, lowest-common-denominator schema, you will not be able to support your customers' custom workflows.
Evaluate how the platform handles extensibility. Can you map custom provider fields to your application's data model without writing custom code? Platforms should offer declarative mapping overrides—allowing you to define per-customer data model configurations using expressions like JSONata, entirely bypassing the need for integration-specific code in your backend.
3. Transparent Rate Limit Handling
A common misconception is that a unified API will magically absorb rate limit errors. Radical honesty: they do not, and they should not. If an upstream provider like Shopify or Zendesk rejects a request with an HTTP 429 (Too Many Requests), a transparent integration platform passes that error directly back to your application.
For example, Truto does not retry, throttle, or apply backoff on rate limit errors. When an upstream API returns an HTTP 429, Truto passes that error to the caller. Truto normalizes the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. Your application is responsible for reading these headers and implementing the appropriate exponential backoff or retry logic. This prevents the integration layer from becoming a black box where requests silently queue up, timeout, and create cascading failures.
4. Webhook Normalization
Polling APIs for changes is inefficient and expensive. You need webhooks. However, third-party providers all send webhooks differently. Some send arrays of events, some send single objects, and everyone uses different signature verification methods.
Your chosen platform should ingest these disparate provider webhooks, verify their specific security signatures, normalize the payload into a standard format, and deliver a unified webhook to your application with a single, consistent signature format (e.g., verifying an X-Truto-Signature header).
Red Flags During Vendor Evaluation
After talking to dozens of teams who have gone through this process, these are the patterns that predict a bad outcome:
- "We handle rate limits for you." Sounds great until you realize you have zero visibility into how close you are to a provider's limit. Transparent rate limit passthrough with normalized headers beats hidden retry logic every time.
- "Our common data model covers everything." It doesn't. Ask what happens with Salesforce custom objects, HubSpot custom properties, or BambooHR custom fields. If the answer is "we're working on it," that is a no.
- "Migration is easy - it takes a day." For a trivial proof-of-concept, maybe. For a production migration with hundreds of connected accounts, custom field mappings, and webhook subscriptions, plan for 4-8 weeks.
- No SOC 2 Type II report available. If the platform handles OAuth tokens and customer data, they need to prove their security posture. Ask for the report, not a marketing page about security.
- Pricing that requires a sales call. If you cannot model your cost at 2x and 5x scale without talking to a salesperson, you cannot plan your budget.
The "Hardest Integration" Test: Do not evaluate a platform using your easiest integration. Pick the one that causes the most support tickets—typically a heavily customized Salesforce org or a legacy ERP like NetSuite. If the platform handles that well, the rest will follow.
Questions Your Engineering Team Should Ask During a POC
- "What happens when the upstream API returns a 429?" You want transparency, not magic.
- "Can I access the raw API response when your common data model doesn't cover a field?" If the answer is no, you will hit a wall the moment an enterprise customer needs a custom Salesforce object.
- "Who owns the OAuth app credentials - us or you?" This is the single most important migration question. If the vendor owns the OAuth app, your customers' tokens are trapped. Switching vendors means re-authenticating every connected account.
- "How do you handle an upstream API deprecation or breaking change?" The vendor should be able to update their integration configuration without requiring you to deploy new code. Ask for a specific recent example.
- "What does your pricing look like at 5x our current usage?" Model this explicitly.
What to Do If You Are Building In-House Today
If your team is currently maintaining a portfolio of in-house integrations and considering whether to migrate to a platform, here is the honest trade-off analysis:
When staying in-house makes sense:
- You have fewer than 3 integrations and no plans to add more.
- Your integrations require deep, bidirectional sync with complex business logic.
- You have a dedicated integrations team with capacity.
- Your compliance requirements prohibit any third-party data handling.
When migrating to a platform makes sense:
- You maintain 5+ integrations and your roadmap demands more.
- Integration maintenance is eating into your core product velocity.
- Enterprise prospects keep asking for integrations you don't have.
- Your team spends more time on auth token management and pagination bugs than on features.
When asked to compare their efforts on troubleshooting API issues versus developing new features over the past year, 36% of companies focused slightly more on troubleshooting, 30% focused slightly more on development, and 30% allocated equal effort to both. If you are in that first group, your integration infrastructure is actively holding your product back.
For a detailed cost breakdown of building integrations yourself versus buying a platform, see our build vs. buy analysis.
Making the Business Case to Your Leadership
If you are a PM trying to get budget approval for an integration platform, here is the framing that works:
- Quantify the current cost. Use the TCO formula above. Pull actual hours from your engineering team's time tracking. Multiply by fully loaded cost. The number is always higher than leadership expects.
- Tie integrations to revenue. During assessment, buyers are primarily concerned with a software provider's ability to provide integration support (44%). If your sales team is losing deals because you lack specific integrations, that is quantifiable pipeline impact.
- Show the maintenance trajectory. Every new integration you build in-house adds 10-20% of its build cost annually in maintenance. Plot the cumulative maintenance cost over 3 years against a platform subscription. The lines cross surprisingly fast.
- Frame the migration as a one-time cost. The 4-8 week migration project has a defined scope and end date. The ongoing savings compound every quarter.
For a more detailed guide on building this internal business case, check out how to convince your CEO to invest in integrations.
The Migration Playbook: Switching Providers Safely
Migrating between integration platforms is the part everyone dreads. If you are already using an integration platform and want to switch to a better architecture, your biggest fear is the re-authentication cliff.
The Re-Authentication Cliff If your current integration vendor owns the OAuth Client ID and Secret used to authenticate your customers, you are locked in. You cannot migrate those connections. Your customers will have to log in and re-authenticate every single integration. Always use your own developer credentials.
Assuming you own your OAuth applications (meaning you registered the app in Salesforce, HubSpot, etc., and simply gave the Client ID/Secret to your current vendor), you can execute a zero-downtime migration. It does not have to be painful if you plan for three things: token portability, data parity validation, and phased cutover.
flowchart LR
A["Phase 1:<br>Audit & Plan"] --> B["Phase 2:<br>Configure & Import"]
B --> C["Phase 3:<br>Shadow Mode"]
C --> D["Phase 4:<br>Canary Rollout"]
D --> E["Phase 5:<br>Full Cutover"]
E --> F["Phase 6:<br>Decommission"]
style A fill:#e8f4fd,stroke:#2196F3
style B fill:#e8f4fd,stroke:#2196F3
style C fill:#fff3e0,stroke:#FF9800
style D fill:#fff3e0,stroke:#FF9800
style E fill:#e8f5e9,stroke:#4CAF50
style F fill:#f3e5f5,stroke:#9C27B0Phase 1: Audit and Plan (Week 1-2)
Goal: Know exactly what you have before you move anything.
- Inventory every connected account. Export a list of all active linked accounts from your current vendor. You need the internal tenant ID (your customer's ID), the provider name, and the raw OAuth tokens (specifically the refresh token).
- Determine OAuth app ownership. Check whether your current platform registered the OAuth apps with providers under their developer account or yours.
- Map your data model usage. Document which unified model fields you actually use in your product. Most teams use 30-50% of the available fields. The migration only needs to cover what you actually consume.
- Identify custom field dependencies. Any per-customer mapping overrides or custom object access needs to be documented and replicated on the new platform.
OAuth App Ownership is the Migration Killswitch. If you bring your own OAuth app, switching integration platforms is mostly a configuration exercise. The tokens stay valid. If you don't own the OAuth app, every migration becomes a customer-facing re-authentication project. For a deeper analysis, see our guide on OAuth app ownership and vendor lock-in.
Phase 2: Configure the New Platform and Import Tokens (Week 2)
Goal: Establish the baseline infrastructure.
Set up your new unified API environment. Input your existing OAuth Client IDs and Secrets into the new platform. Ensure that your redirect URIs in the third-party developer portals are updated to include the new platform's callback URL alongside the old one.
You do not need the short-lived access tokens. You only need the refresh tokens. Use the new platform's API to programmatically create linked accounts by passing the refresh token directly.
Here is an example of what that payload looks like when migrating a connection:
{
"tenant_id": "customer_12345",
"integration_id": "salesforce",
"credentials": {
"refresh_token": "5Aep861...",
"instance_url": "https://na139.salesforce.com"
}
}The new platform will take this refresh token, immediately exchange it with the provider for a fresh access token, and establish a valid connection without the end-user ever knowing a migration occurred.
Phase 3: Shadow Mode (Week 3-4)
Goal: Run both platforms in parallel without affecting production traffic. Do not flip the switch all at once.
- Route 10% of read requests through the new platform. Compare the normalized output against your legacy system to ensure data parity.
- Build a lightweight validation script to automate this comparison:
import json
def compare_responses(old_response: dict, new_response: dict, fields: list[str]) -> dict:
"""Compare specific fields between old and new platform responses."""
mismatches = {}
for field in fields:
old_val = old_response.get(field)
new_val = new_response.get(field)
if old_val != new_val:
mismatches[field] = {
"old": old_val,
"new": new_val
}
return mismatches
# Example: validate employee records from HRIS integration
old_employees = fetch_from_old_platform("/unified/hris/employees")
new_employees = fetch_from_new_platform("/unified/hris/employees")
for old_emp in old_employees:
new_emp = find_by_remote_id(new_employees, old_emp["remote_id"])
if new_emp:
issues = compare_responses(
old_emp, new_emp,
fields=["first_name", "last_name", "email", "department", "employment_status"]
)
if issues:
log_mismatch(old_emp["remote_id"], issues)Phase 4: Canary Rollout (Week 5)
Goal: Validate the new platform with real production traffic from a small cohort.
- Pick 5-10 connected accounts that represent your range of use cases (different CRMs, different HRIS providers, one with heavy custom fields).
- Route their production traffic to the new platform.
- Monitor for: API error rates, response time differences, webhook delivery reliability, and data completeness.
- Set a rollback trigger: if error rates exceed 2% or any critical field mapping fails, automatically revert to the old platform.
Phase 5: Full Cutover (Week 6-7)
Goal: Move all traffic to the new platform.
- Roll out in batches of 20-50 accounts per day. Not all at once.
- Move all read requests to the new platform.
- Move write operations and webhook ingestion to the new platform.
- For accounts that require re-authentication (if you don't own the OAuth app), send a clear email with a one-click re-authorization link. Follow up twice. Expect 70-85% completion within two weeks.
- Keep the old platform running in read-only mode as a safety net for two weeks after full cutover.
Phase 6: Decommission (Week 8)
Goal: Clean shutdown of the old platform.
- Revoke API keys and OAuth tokens on the old platform.
- Cancel the old subscription (watch for auto-renewal traps).
- Archive any logs or audit data you need for compliance.
- Update your internal documentation and runbooks.
A Practical NetSuite Migration Guide: Moving Off SOAP Before 2028
NetSuite is the integration that breaks teams. It is the "hardest integration test" we referenced above - and it is also the one facing the most urgent forced migration in the ERP world right now. If your product connects to NetSuite via SOAP, everything in this section applies directly to you.
With the 2028.2 NetSuite release, all endpoints will be disabled, and SOAP-based integrations will stop working. This is not a soft deprecation. Starting with the 2026.1 NetSuite release, you should build any new integrations using REST web services, and with the 2027.1 NetSuite release, it will no longer be possible to build new integrations using SOAP web services.
The good news: the replacement is not "just REST." The real replacement for SOAP isn't just REST. It is a combination of three distinct API surfaces, each handling what it does best. A naive 1-to-1 SOAP-to-REST migration will hit NetSuite's concurrency limits almost immediately. The correct architecture uses SuiteQL for reads, the REST Record API for writes, and SuiteScript RESTlets for edge cases that neither can handle.
For the full architectural deep-dive on building a reliable NetSuite integration from scratch, see our NetSuite API integration guide. For a detailed treatment of the SOAP migration specifically, see our practical NetSuite SOAP migration guide. This section focuses on the prescriptive timeline, mapping matrix, and operational playbook.
The SOAP Deprecation Timeline
Here is the hard schedule you are working against:
flowchart LR
A["2025.2<br>Last SOAP<br>endpoint"] --> B["2026.1<br>No new SOAP<br>endpoints"]
B --> C["2027.1<br>Cannot create<br>new SOAP<br>integrations"]
C --> D["2028.2<br>All SOAP<br>disabled"]
style A fill:#fff3e0,stroke:#FF9800
style B fill:#fff3e0,stroke:#FF9800
style C fill:#ffebee,stroke:#f44336
style D fill:#ffebee,stroke:#f44336| Milestone | Release | What Changes |
|---|---|---|
| Last SOAP endpoint shipped | 2025.2 | The 2025.2 SOAP endpoint is the last planned SOAP endpoint and any later SOAP endpoints would be released only as necessary. |
| New integrations must use REST | 2026.1 | Starting with the 2026.1 NetSuite release, all newly built integrations should use REST web services with OAuth 2.0. |
| SOAP creation blocked | 2027.1 | With the 2027.1 release, you will not be able to build any new integrations using SOAP web services. |
| Full SOAP removal | 2028.2 | All SOAP endpoints disabled permanently. Any remaining SOAP calls fail. |
Strict 3-Year Support Lifecycle: Each SOAP Web Services endpoint (WSDL) is fully supported for three years after its release. Once this period ends, Oracle will no longer provide updates, patches, or technical support for that version. If you are on a WSDL older than 2023.1, you are already inside the risk window.
SOAP to Modern API Mapping Matrix
The replacement for SOAP is not a single API - it is three APIs working together. Here is how common SOAP operations map to their modern equivalents:
| SOAP Operation | Modern Replacement | API Surface | Notes |
|---|---|---|---|
get (single record) |
GET /services/rest/record/v1/{type}/{id} |
REST Record API | Direct 1:1 replacement. Use expandSubResources=true for sublists. |
getList (multiple records by ID) |
GET /services/rest/record/v1/{type}/{id} per record, or SuiteQL WHERE id IN (...) |
REST + SuiteQL | No native batch-get in REST. SuiteQL is faster for bulk lookups. |
getAll (all records of a type) |
SELECT * FROM {table} via POST /services/rest/query/v1/suiteql |
SuiteQL | Far more powerful - supports JOINs, WHERE clauses, pagination. |
search / searchMoreWithId |
SuiteQL with WHERE + ORDER BY + offset pagination |
SuiteQL | Replaces saved searches for most integration use cases. |
add (create record) |
POST /services/rest/record/v1/{type} |
REST Record API | JSON body instead of XML. |
update |
PATCH /services/rest/record/v1/{type}/{id} |
REST Record API | Use PATCH, not PUT. PATCH only updates specified fields. |
upsert |
PATCH with externalId lookup, or check-then-create |
REST Record API | REST supports upsert via external ID on some record types. |
delete |
DELETE /services/rest/record/v1/{type}/{id} |
REST Record API | Direct replacement. |
attach / detach |
Subresource operations on the parent record | REST Record API | Manage relationships through record sublists. |
getCustomizationId |
GET /services/rest/record/v1/metadata-catalog/{type} |
REST Metadata | Returns schema including custom fields and custom record types. |
| Saved Search execution | SuiteQL query | SuiteQL | SuiteQL is more flexible than saved searches for complex queries: JOINs across any tables. |
PDF rendering (renderAsPDF) |
Custom SuiteScript Suitelet using N/render module |
RESTlet | The REST API has no PDF rendering capability. Requires a deployed Suitelet. |
| Complex tax rate lookups | SuiteQL salestaxitem + SuiteScript RESTlet for full details |
SuiteQL + RESTlet | When an object or method is not available in REST web services, you should use SuiteScript RESTlets instead. |
Async bulk operations (asyncAddList, etc.) |
Prefer: respond-async header on REST calls |
REST Record API | Available from 2026.1 for homogeneous batch operations. |
Do not expect 100% parity. You should not expect 100% parity of REST with SOAP, because some legacy functionalities in SOAP should not be used any longer and will not be exposed in REST web services. For any gaps, SuiteScript RESTlets are the official escape hatch.
Instance Detection and Feature-Adaptive Routing
One of the trickiest parts of a NetSuite integration is that no two NetSuite accounts are configured the same way. A OneWorld account with multi-currency enabled requires completely different SQL queries than a standard single-subsidiary account. If you hard-code queries for one edition, they will fail on the other with cryptic "Record not found" errors.
The solution is to run a feature detection step immediately after a customer connects their NetSuite account. This probes the instance to determine which features are enabled, then stores the results as context that drives every subsequent query.
Here is a script that performs this detection:
import requests
def detect_netsuite_features(base_url: str, auth_headers: dict) -> dict:
"""Probe a NetSuite instance to detect edition-specific features."""
context = {}
suiteql_url = f"{base_url}/services/rest/query/v1/suiteql"
# Detect multi-currency
resp = requests.post(
suiteql_url,
headers={**auth_headers, "Prefer": "transient"},
json={"q": "SELECT id FROM currency FETCH FIRST 1 ROWS ONLY"}
)
if resp.status_code == 200:
context["multi_currency"] = True
elif "Record 'currency' was not found" in resp.text:
context["multi_currency"] = False
# Detect OneWorld (multi-subsidiary)
resp = requests.post(
suiteql_url,
headers={**auth_headers, "Prefer": "transient"},
json={"q": "SELECT id FROM subsidiary FETCH FIRST 1 ROWS ONLY"}
)
if resp.status_code == 200:
context["multi_subsidiary"] = True
elif "Record 'subsidiary' was not found" in resp.text:
context["multi_subsidiary"] = False
return contextThese two flags create a matrix of four possible query shapes for every resource:
| multi_currency | multi_subsidiary | Query Behavior |
|---|---|---|
false |
false |
No currency JOINs, no subsidiary JOINs. Hardcode "USD" as currency. |
false |
true |
No currency JOINs, but include subsidiary JOIN + parent lookup. |
true |
false |
Include currency JOIN for symbol/code, no subsidiary JOIN. |
true |
true |
Full JOINs to both currency and subsidiary tables. |
Every SuiteQL query your integration runs needs to branch on these flags. For example, a vendor list query on a OneWorld multi-currency account JOINs vendor, entityaddress, vendorsubsidiaryrelationship, and currency tables. The same query on a standard single-currency account skips the last two JOINs entirely.
This is exactly the kind of per-customer complexity that a unified API platform should handle for you. Truto's NetSuite connector runs this feature detection automatically at connection time and adapts all downstream queries based on the results - your application just calls /unified/accounting/contacts and gets consistent data regardless of the customer's NetSuite edition.
The NetSuite SOAP Migration Roadmap
Here is a phased migration roadmap for moving an existing SOAP-based NetSuite integration to the modern SuiteQL + REST + RESTlet architecture:
flowchart TD
A["Phase 1: Audit<br>(Week 1-2)"] --> B["Phase 2: Read Migration<br>(Week 3-5)"]
B --> C["Phase 3: Write Migration<br>(Week 6-7)"]
C --> D["Phase 4: Edge Cases<br>(Week 8)"]
D --> E["Phase 5: Parallel Run<br>(Week 9-10)"]
E --> F["Phase 6: Cutover<br>(Week 11-12)"]
style A fill:#e8f4fd,stroke:#2196F3
style B fill:#e8f4fd,stroke:#2196F3
style C fill:#fff3e0,stroke:#FF9800
style D fill:#fff3e0,stroke:#FF9800
style E fill:#e8f5e9,stroke:#4CAF50
style F fill:#e8f5e9,stroke:#4CAF50Phase 1: Audit (Week 1-2)
Before you write any code, catalog every SOAP call your integration makes.
- List every SOAP operation (
get,getList,search,add,update,delete,getAll, etc.) and the record types involved. - Identify which WSDL version you are on. Review your integrations and focus first on any that use SOAP API versions already unsupported or nearing their three-year mark.
- Check your NetSuite APM dashboard (
Customization > Performance > SOAP Web Services Analysis) to see actual SOAP request volumes and error rates. This gives you a baseline. - Flag any SOAP-only capabilities: saved search execution, async bulk operations, PDF rendering, tax rate lookups.
Phase 2: Migrate Reads to SuiteQL (Week 3-5)
This is the highest-impact phase. Most SOAP integrations spend the majority of their API calls on reads - search, getList, getAll. SuiteQL replaces all of these with a single, more powerful interface.
- Replace every
search/getAllcall with aPOST /services/rest/query/v1/suiteqlrequest containing the equivalent SQL. - Implement feature detection (see above) so your queries adapt to OneWorld and multi-currency accounts.
- SuiteQL returns up to 1,000 rows per page. Implement offset pagination (
OFFSET/FETCH NEXT) for large result sets. - Migrate one record type at a time. Start with the simplest (accounts, currencies) and work toward complex ones (transactions with line items).
Phase 3: Migrate Writes to REST (Week 6-7)
- Replace
addwithPOST,updatewithPATCH,deletewithDELETEon the REST Record API. - Translate XML request bodies to JSON. The REST API uses the same internal field names, but the structure is flatter.
- Test custom field writes carefully - custom field
scriptIdvalues (e.g.,custbody_po_notes) work as JSON keys in REST. - For records with sublists (like Purchase Orders with line items), use the
item.itemsarray structure in the REST body.
Phase 4: Handle Edge Cases with RESTlets (Week 8)
Some SOAP capabilities have no REST equivalent. For these, deploy a custom SuiteScript Suitelet:
- PDF generation: Use the
N/rendermodule'srender.transaction()to generate transaction PDFs. - Dynamic form field metadata: Use
record.create()to introspect runtime field configuration, including form-specific visibility, select options, and mandatory flags. - Complex tax rate data: If your integration needs full tax rate records with nested subsidiary assignments, a RESTlet can query the internal record and return the full structure as JSON.
Phase 5: Parallel Run and Validation (Week 9-10)
Run your legacy SOAP integration and your new SuiteQL/REST integration side-by-side.
- Compare output field-by-field for every record type. Watch for date format differences (SOAP returns XML date types, REST returns ISO 8601 strings), null handling differences, and sublist ordering.
- Use NetSuite's sandbox environment for initial testing, then validate against production with read-only queries.
- Use NetSuite's APM (Application Performance Management) tools to analyze web services performance. Compare request latency and error rates between the two paths.
Phase 6: Cutover and Decommission SOAP (Week 11-12)
- Switch production traffic to the new integration. Keep SOAP running in read-only mode for one more week as a fallback.
- Revoke SOAP-specific integration records and tokens.
- Update your WSDL endpoint to 2025.2 if you need to maintain any temporary SOAP fallback - this buys you support until 2028.2.
- Remove all SOAP client libraries and XML parsing code from your codebase.
Testing Plan and Rollback Strategy
NetSuite integration testing is uniquely tricky because every customer's instance is different. Here is what to validate:
Pre-cutover validation checklist:
- Feature detection returns correct flags for OneWorld and multi-currency on 3+ test accounts
- SuiteQL queries return identical record counts to the SOAP equivalents
- All date fields parse correctly to ISO 8601 (watch for NetSuite's inconsistent date formats)
- Custom fields are present and correctly typed in REST responses
- Write operations (create, update, delete) succeed on all record types you use
- Sublist data (line items on invoices, POs) round-trips correctly
- Pagination works for result sets exceeding 1,000 rows
- Authentication works for both TBA (OAuth 1.0a) and OAuth 2.0 accounts
Rollback plan:
Keep your SOAP integration code deployed but dormant behind a feature flag. If the new integration produces data inconsistencies or elevated error rates after cutover:
- Flip the feature flag to route traffic back to SOAP.
- The SOAP endpoint will still work as long as you are on a supported WSDL version.
- Diagnose the issue using the parallel-run comparison data.
- Fix and re-deploy, then attempt cutover again.
The key constraint: your SOAP fallback has an expiration date. Do not let the rollback become permanent. Every month on SOAP is a month closer to the 2028.2 hard cutoff.
Monitoring, Logging, and Observability Checklist
Once you have cut over, you need to monitor the new integration actively. NetSuite provides built-in tools, and you should layer your own observability on top.
NetSuite-side monitoring:
- The Application Performance Management (APM) SuiteApp features a web services performance dashboard that allows you to monitor SOAP web services record processing, operation status, and rejected operations. The same dashboard covers REST.
- The APM SuiteApp includes a Concurrency Monitor tool that helps you monitor web services and RESTlet integrations in relation to your account's concurrency limits, allowing you to view and optimize integration scheduling.
- Check
Setup > Integration > Integration Management > Integration Governancefor rejected request ratios and peak concurrency.
Your-side monitoring:
- Track error rates by API surface. Log whether each request went through SuiteQL, REST, or a RESTlet. If one surface starts failing, you need to know which one.
- Monitor concurrency slot usage. NetSuite's default is 15 concurrent requests shared across all API surfaces. If your integration consumes too many, it blocks the customer's other integrations.
- Alert on HTTP 429 and 403 spikes. These indicate you are hitting concurrency or rate limits. Implement exponential backoff with jitter.
- Log response times per query. SuiteQL queries that JOIN many tables can slow down on large accounts. Set a 10-second latency alert threshold.
- Track feature detection drift. If a customer enables multi-currency or OneWorld after initial setup, your cached context flags become stale. Re-run feature detection periodically or on error.
Customer Communication and Cutover Playbook
If your product integrates with your customers' NetSuite instances, the SOAP migration has a customer-facing dimension. Some customers may need to take action, especially if your integration requires a deployed Suitelet.
When customers do NOT need to do anything:
- You are switching from SOAP reads to SuiteQL reads. This is transparent - same OAuth credentials, same permissions, different API endpoint.
- You are switching from SOAP writes to REST writes. Same credentials, same permissions.
When customers DO need to take action:
- You are deploying a new SuiteScript Suitelet for PDF generation or field metadata. The customer (or their NetSuite admin) must install the Suitelet in their account.
- You are migrating from SOAP's password-based authentication to OAuth 2.0. The customer must authorize the new OAuth app.
- Your integration previously required a role with SOAP permissions only. The new integration may require REST Web Services and SuiteAnalytics permissions on the role.
Communication template:
- 30 days before cutover: Email explaining the migration, why it is happening (Oracle is deprecating SOAP), and what action is required (if any). Include a specific date.
- 7 days before cutover: Reminder with step-by-step instructions for any required action.
- Day of cutover: Notification that the switch is complete. Include a support contact for issues.
- 7 days after cutover: Follow-up confirming everything is working. Proactively flag any accounts that show errors in your monitoring.
For enterprise accounts with dedicated CSMs, schedule a 15-minute call to walk through the change. For self-serve accounts, an in-app banner plus email is sufficient.
Strategic Wrap-Up & Your Next Move
Integrations are a revenue driver, but the infrastructure required to run them is a commodity. Building and maintaining OAuth flows, pagination normalization, and webhook ingestion in-house is a massive misallocation of highly paid engineering talent.
The decision tree is straightforward:
- If you don't have a TCO number for your current integrations, run the audit first. You cannot evaluate alternatives without a baseline.
- If you have a TCO baseline and it's painful, use the evaluation framework to shortlist 2-3 platforms. Demand architectural transparency, zero data retention, and declarative overrides for custom fields. Run a POC against your hardest integration.
- If you've picked a platform and need to migrate, follow the phased playbook above. The shadow mode and canary rollout phases are not optional—they are what separate a smooth migration from a customer-impacting incident.
- If you're choosing a platform for the first time, prioritize OAuth app ownership and per-integration pricing. These two factors have the largest impact on your long-term flexibility and cost.
- If you have NetSuite SOAP integrations, treat the migration as urgent. The 2028.2 hard deadline is not negotiable, and every new SOAP investment today is technical debt you are scheduling for 2027. Use the mapping matrix and phased roadmap above, or let a platform like Truto handle the SuiteQL routing, feature detection, and RESTlet orchestration for you.
The worst outcome is not picking the wrong platform. It is staying stuck in a setup where your best engineers spend their weeks maintaining OAuth token refreshes and debugging pagination edge cases instead of building the product your customers are paying for.
FAQ
- What is the Oracle NetSuite SOAP deprecation timeline?
- The 2025.2 release is the last planned SOAP endpoint. Starting with 2026.1, no new SOAP endpoints will be released. With the 2027.1 release, you cannot create new SOAP-based integrations. By the 2028.2 release, all SOAP endpoints will be permanently disabled and SOAP-based integrations will stop working. Each endpoint has a 3-year support window from its release date.
- What is the best alternative to NetSuite SOAP API?
- The replacement is three APIs working together: SuiteQL for reads (SQL-like queries via POST to /services/rest/query/v1/suiteql with JOINs and complex filtering), the SuiteTalk REST Record API for writes (create, update, delete), and SuiteScript RESTlets for edge cases like PDF generation and dynamic form metadata that REST cannot handle. Oracle's official guidance is to use REST web services with OAuth 2.0 for all new integrations.
- How does NetSuite REST compare to SOAP for integrations?
- REST uses lightweight JSON payloads instead of verbose XML, supports OAuth 2.0 authentication, and when combined with SuiteQL provides more powerful read capabilities (JOINs, complex WHERE clauses, up to 1,000 rows per page). REST also supports asynchronous batch operations starting in 2026.1. The trade-off is that REST lacks some legacy SOAP capabilities like native saved search execution and PDF rendering, which require SuiteScript RESTlets instead.
- How do you calculate the true TCO of an integration platform?
- Use this formula: TCO (3-Year) = Initial Build/Setup Cost + (Annual Platform Fee × 3) + (Annual Engineering Maintenance × 3) + (Incident Response Cost × 3) + Migration/Switching Cost + Opportunity Cost of Engineering Time. Research shows real SaaS TCO ranges between 3-5x the subscription cost. For a mid-market company with 20 integrations, building in-house typically costs $1.15M-$2.5M over 3 years versus $177K-$580K with a unified API platform.
- How do you migrate between unified API providers without re-authenticating customers?
- The key is OAuth app ownership. If you registered the OAuth apps (in Salesforce, HubSpot, etc.) under your own developer account, you can export refresh tokens from the old platform and import them into the new one. The new platform exchanges the refresh token for a fresh access token without any customer action. If the vendor owns the OAuth app, your tokens are trapped and every customer must re-authenticate.
- What is NetSuite feature-adaptive routing?
- NetSuite instances vary by edition - OneWorld accounts have subsidiaries, multi-currency accounts have currency tables. Feature-adaptive routing detects these capabilities at connection time by probing SuiteQL for the existence of currency and subsidiary tables, then dynamically adjusts all subsequent queries. This creates a matrix of four possible query shapes per resource (multi_currency × multi_subsidiary), ensuring queries include the right JOINs without hard-coding for a single edition.