No-Code API Mapping Guide: Architecting Per-Customer SaaS Integrations
Stop letting custom Salesforce fields kill enterprise deals. Learn how to architect a declarative, 3-level per-customer API mapping system without custom code.
You are losing six-figure enterprise deals because your SaaS product cannot read a prospect's custom Salesforce fields.
The technical evaluation goes perfectly. The demo is flawless. The prospect's VP of Sales is ready to sign. Then their systems administrator sends over their organization's schema: 147 custom fields on the Contact object, three custom objects driving their entire revenue motion, and a Forecast_Override__c rollup field that the CFO checks every Monday morning. Your integration page says you support Salesforce, but your application's unified API only maps four of those fields. The deal stalls. Engineering says "six weeks minimum" to add the rest. Sales loses the quarter.
Buyers mostly or fully define their purchase requirements 83% of the time before speaking with sales (6Sense, 2025). If your documentation cannot prove you handle bespoke schemas, you are disqualified before the first call. Roughly 77% of B2B buyers prioritize integration capabilities when evaluating software, and solutions that fail to integrate with existing workflows are deprioritized regardless of features or price (Demandbase/Gartner, 2025). Compound that with enterprise sales cycles that average 8 months end-to-end, and a single schema mismatch can torch a quarter of pipeline.
The fix is not a bigger common data model. It is not a custom branch in your codebase. It is a declarative, no-code API mapping architecture built on a three-level override hierarchy where mappings live as configuration data. This guide breaks down how to build a per-customer mapping system that unblocks enterprise deals without draining engineering resources.
The Enterprise Integration Trap: Why Standard APIs Fail
Standard unified APIs solve the 80% problem beautifully. They abstract away the differences between third-party systems, forcing disparate data structures into a single, canonical schema. They flatten Salesforce, HubSpot, and Pipedrive into one canonical contacts resource with first_name, last_name, and email. For your SMB customers, this works perfectly.
Enterprise SaaS deployments, however, are heavily customized by default. Salesforce allows up to 3,000 custom objects per org and 800 custom fields per object on Unlimited Edition. NetSuite, Microsoft Dynamics, and HubSpot Enterprise all allow comparable extensibility. Your prospect's admin has spent five years building complex business logic on top of that flexibility. When a standard unified API flattens this massive surface area into basic fields, it destroys the business logic the enterprise relies on. Unified API data models break on custom Salesforce objects because they prioritize consistency over depth.
To save these deals, engineering teams often fall into predictable technical debt traps:
- The bespoke script trap: You write a one-off handler for Acme Corp's
Deal_Registration__cobject. Six months later, your codebase has 14 customer-specific branches and aif (customer_id === 'acme')graveyard nobody wants to touch. - The passthrough escape hatch: You expose a raw SOQL endpoint and tell the customer to write their own queries. You have now sold them a thin wrapper around the Salesforce API, which is exactly what they were trying to avoid.
- The schema expansion trap: You add
custom_field_1throughcustom_field_50to your unified model. Now every customer sees fields that mean nothing to them, and your schema documentation is unreadable.
The consequences of these rigid schemas are severe: lost revenue as enterprise buyers refuse to adopt software that ignores their core data, massive maintenance nightmares when hardcoded custom field logic breaks during third-party API updates, and blocked Customer Success teams who cannot fix integration issues without filing Jira tickets.
What is Per-Customer API Mapping?
Per-customer API mapping is a declarative architectural pattern. It allows tenant-specific data transformations without altering the underlying integration code. Instead of writing imperative scripts to handle custom fields, the transformation logic—field translations, custom object handling, and request/response transformations—is stored as configuration data.
This approach cleanly separates the integration execution engine from the integration behavior. The runtime execution engine is generic. It knows how to construct HTTP requests, handle OAuth refresh cycles, manage pagination, and parse JSON responses. The behavior—which fields to fetch, how to map them, and what custom objects to include—is defined entirely by declarative configurations.
When a customer connects their account, your application loads their specific configuration. The mapping layer translates between your application's standard schema and the customer's highly customized third-party environment.
The contrast with code-first approaches is sharp:
| Dimension | Code-first integration | Declarative per-customer mapping |
|---|---|---|
| Adding a custom field | Pull request, review, deploy | Insert/update a config row |
| Who can make changes | Backend engineers | CS, solutions engineers, customer admins |
| Blast radius of a bad change | Affects all customers on that integration | Scoped to one account or environment |
| Time to unblock a deal | Days to weeks | Minutes to hours |
| Maintenance burden | Grows with customer count | Grows with unique API patterns |
The key insight is that the intelligence of an integration is data, not logic. A Salesforce response that handles PascalCase fields, dynamic URL generation, complex array filtering, and dynamically-discovered custom fields can be a single transformation expression stored in one database row. You do not need a salesforce.ts file with 4,000 lines of conditional logic.
Architecting a 3-Level Override System
Handling infinite enterprise schema variations requires a structured hierarchy. If you store mappings flatly, you lose the benefits of standardization. The solution is a 3-level override hierarchy for enterprise SaaS. Every API request flows through this stack, deep-merging configurations at runtime from least-specific to most-specific.
flowchart TD
A[Level 1: Platform Base Mapping<br>The default that works for 80% of customers] --> B[Level 2: Environment Override<br>Tenant-wide customizations<br>e.g., 'all of Acme uses these fields']
B --> C[Level 3: Account Override<br>Instance-specific tweaks<br>e.g., 'this one Salesforce org has X']
C --> D[Runtime Merge Engine<br>Final Execution Payload]
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#ffe1e1
style D fill:#e1ffe1Level 1: Platform Base
This is the default mapping shipped with the integration that works for 80% of customers. It defines the standard behavior for the integration. For a CRM contacts resource, it maps the standard fields most customers care about: name, email, phone, company. Your engineering team maintains this baseline.
{
"response_mapping": {
"id": "Id",
"first_name": "FirstName",
"last_name": "LastName",
"email": "Email",
"phone": "Phone"
}
}Level 2: Environment Override
An environment represents a specific tenant or organization using your software. Environment overrides apply across every connected account inside that tenant. If a customer has a unique workflow that applies to all their users, the environment override modifies the base mapping. For example, "every Salesforce account connected by Acme Corp needs the Deal_Registration__c object surfaced as a unified partner_deals resource."
{
"response_mapping": {
"partner_tier": "Partner_Tier__c",
"deal_registration_id": "Deal_Registration__c.Id"
}
}The runtime deep-merges this on top of the platform base. The customer now sees standard fields plus their custom fields, without you touching the base mapping.
Level 3: Account Override
Individual connected accounts can have their own mapping overrides. Some custom fields exist only inside one specific connected account. If one subsidiary of Acme uses a Regional_Tax_ID__c field nobody else needs, that specialized mapping lives here and applies only to requests for that specific integration instance.
The JSONata Transformation Engine
To make this architecture work without code, you need a robust transformation language. JSONata is a functional query and transformation language for JSON. It is Turing-complete, declarative, and side-effect free.
Instead of writing JavaScript functions to map fields, you achieve per-customer data model customization without code by storing a JSONata expression as a string in your database. The execution engine evaluates this string against the incoming API payload. Because it is just a string, it can be overridden at any of the three hierarchy levels instantly.
Deep-merge semantics matter. If your override system replaces entire objects rather than merging field-by-field, customers will copy the entire base mapping into their override just to change one field. That defeats the inheritance model. Use a proper deep-merge with array-overwrite semantics.
Declarative Mapping Format: Concrete Override Examples
The three levels above look abstract until you see stored configurations. Here is what each level looks like for a Salesforce CRM accounts resource, where a customer needs Industry_Vertical__c mapped as a first-class segment field.
Level 1 - Platform Base stores a JSONata expression as a string. This ships with the integration and handles standard Salesforce Account fields:
{
"resource": "accounts",
"method": "list",
"response_mapping": "response.{ \"id\": Id, \"name\": Name, \"website\": Website, \"industry\": Industry, \"phone\": Phone, \"created_at\": CreatedDate, \"updated_at\": LastModifiedDate, \"custom_fields\": $sift($, function($v, $k) { $k ~> /__c$/i and $boolean($v) }) }"
}The custom_fields expression uses a regex to catch every field ending in __c and dumps them into a generic bag. This passthrough works for most customers who just need access to custom field data without promoting specific fields.
Level 2 - Environment Override promotes specific custom fields into first-class unified fields. Acme Corp needs Industry_Vertical__c as segment across all their Salesforce orgs:
{
"response_mapping": "response.{ \"segment\": Industry_Vertical__c, \"partner_tier\": Partner_Tier__c }"
}At runtime, this is deep-merged on top of Level 1. The final response includes id, name, website, industry, phone from the base, plus segment and partner_tier from the override. No base fields are lost.
Level 3 - Account Override handles instance-specific problems. One of Acme's Salesforce orgs renamed the field to Vertical_Segment__c during a CRM migration:
{
"response_mapping": "response.{ \"segment\": Vertical_Segment__c }"
}This replaces only the segment mapping for that one connected account. The Level 2 partner_tier addition and every Level 1 base field still apply through inheritance.
Override Resolution at Runtime
When a unified API request arrives, the runtime resolves the final mapping by deep-merging all three levels in sequence. Here is the resolution logic:
function resolveMapping(platformBase, envOverride, accountOverride) {
let resolved = structuredClone(platformBase);
if (envOverride) {
resolved = deepMerge(resolved, envOverride, {
arrayMerge: (target, source) => source // arrays overwrite
});
}
if (accountOverride) {
resolved = deepMerge(resolved, accountOverride, {
arrayMerge: (target, source) => source
});
}
return resolved;
}Three rules govern the merge:
- Last writer wins. If Level 3 defines a
segmentmapping, it replaces Level 2's definition of the same field. The most-specific override always takes precedence. - Arrays overwrite, not concatenate. If Level 2 overrides a
phone_numbersmapping that produces an array, it replaces the base array entirely. Without this semantic, you get duplicate entries from both expressions. - Unset fields inherit. If Level 3 only redefines
segment, every other field from Levels 1 and 2 passes through untouched.
For JSONata-based systems, each level's expression is evaluated independently against the same raw API response. The results are then deep-merged:
// All expressions evaluate against the same raw Salesforce response
const baseResult = await jsonata(platformMapping).evaluate(apiResponse);
const envResult = envMapping
? await jsonata(envMapping).evaluate(apiResponse) : {};
const acctResult = acctMapping
? await jsonata(acctMapping).evaluate(apiResponse) : {};
// Merge in precedence order: platform < environment < account
const final = deepMerge(
deepMerge(baseResult, envResult, { arrayMerge: overwrite }),
acctResult,
{ arrayMerge: overwrite }
);This means an override expression only needs to define the fields it changes. A Level 3 expression of response.{ "segment": Vertical_Segment__c } produces { "segment": "Healthcare" }, which merges into the full base result without clobbering id, name, or any other field.
Building a No-Code Admin UI for Customer Success
Architecting the backend is only half the battle. To truly unblock enterprise deals, you must expose this mapping capability to Customer Success teams or the end-users. If overrides require hand-writing JSONata expressions, you have simply shifted the bottleneck from engineering to a different specialist. You need a visual interface that generates the declarative configuration under the hood.
Building per-account API mappings requires field discovery. You cannot ask a non-technical user to type raw API field names from memory.
Step 1: Dynamic Field Discovery
Your application must query the third-party API's metadata endpoints to discover available fields dynamically at connect time. For Salesforce, this means calling the /services/data/vXX.0/sobjects/Contact/describe endpoint. For HubSpot, it is the properties API. The response contains every standard and custom field available to that specific authenticated user.
When fetching heavy enterprise schemas, handle rate limits carefully. Salesforce's describe API counts against daily API limits, while HubSpot has strict per-second caps. Truto's architecture, for example, passes HTTP 429 rate limit errors directly to the caller with standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) rather than masking them. Your discovery service must implement its own exponential backoff to respect these limits, and cache the schema aggressively with TTLs of 6 to 24 hours.
Step 2: The Visual Mapping Interface
Once you have the schema, render a two-column UI. The left column displays your application's required unified fields. The right column provides dropdowns populated by the discovered third-party fields.
flowchart LR
A[Unified Field<br>e.g., partner_tier] -->|user clicks| B[Provider Field Picker<br>Loaded from describe API]
B --> C[Selected: Partner_Tier__c]
C --> D[Saves JSONata override row<br>in database]When the user selects a field, the backend generates the underlying JSONata expression. The user never sees the code. For transformations (like normalizing a picklist to an enum, or parsing a date format), the UI exposes preset transformation types that compile down to expressions.
{
"status": {
"path": "Lead_Status__c",
"operator": "to_enum",
"options": {
"Hot": "qualified",
"Warm": "working",
"Cold": "unqualified"
}
}
}Step 3: Test Mode With Live Sample Data and Storage
Before saving this JSON payload to your database under the specific tenant's ID, let the user click 'Test'. This previews the actual unified output rendered against a real record from the connected account. Storing the override is a config write; previewing it is a stateless re-run of the mapping pipeline against a cached sample payload. This catches typos, misunderstood field semantics, and casing issues before they hit production.
Do not let customers edit overrides directly in production without a review step. A wrong mapping on a write endpoint can corrupt third-party data. Stage changes in a sandbox environment, run a validation pass, then promote.
End-to-End Example: Mapping Custom Salesforce Fields Across Customers
Here is the complete lifecycle of handling a custom Salesforce field - Industry_Vertical__c on the Account object - across three enterprise customers with different requirements. This covers discovery through write-back, the full path a custom field takes from a Salesforce org to your application's unified schema.
Step 1: Discover the Customer's Schema
When a customer connects their Salesforce org, your application queries the sObject Describe endpoint to discover available fields on the target object:
GET /services/data/v59.0/sobjects/Account/describe
Authorization: Bearer {access_token}
The response includes every standard and custom field, with type metadata and picklist values:
{
"fields": [
{ "name": "Id", "type": "id", "label": "Account ID" },
{ "name": "Name", "type": "string", "label": "Account Name" },
{
"name": "Industry_Vertical__c",
"type": "picklist",
"label": "Industry Vertical",
"picklistValues": [
{ "value": "Healthcare", "active": true },
{ "value": "Financial Services", "active": true },
{ "value": "Manufacturing", "active": true },
{ "value": "Technology", "active": true }
]
}
]
}Cache this per connected account with a TTL of 12-24 hours. The cached schema feeds your field picker UI and your drift-detection pipeline.
Step 2: Configure Mappings Per Customer
Three customers, three different requirements for the same underlying field:
Customer A (Acme Corp) wants Industry_Vertical__c exposed as segment across all their Salesforce orgs. This is a tenant-wide requirement, so it lives at Level 2 (environment override):
{
"level": "environment",
"environment_id": "env_acme",
"resource": "accounts",
"method": "list",
"overrides": {
"response_mapping": "response.{ \"segment\": Industry_Vertical__c }"
}
}Customer B (Globex) needs the same field but wants picklist values normalized to internal codes. Also Level 2, with a $lookup transform:
{
"level": "environment",
"environment_id": "env_globex",
"resource": "accounts",
"method": "list",
"overrides": {
"response_mapping": "response.{ \"segment\": $lookup({ \"Healthcare\": \"HC\", \"Financial Services\": \"FS\", \"Manufacturing\": \"MFG\", \"Technology\": \"TECH\" }, Industry_Vertical__c) }"
}
}Customer C (Initech) has one Salesforce org where the admin renamed the field to Vertical__c. This is a single-instance problem, so it lives at Level 3 (account override) on top of an existing environment override:
{
"level": "account",
"integrated_account_id": "ia_initech_sf_prod",
"resource": "accounts",
"method": "list",
"overrides": {
"response_mapping": "response.{ \"segment\": Vertical__c }"
}
}Three customers, three different configurations, zero code changes.
Step 3: Runtime Transform (Read Path)
When your application calls GET /unified/crm/accounts?integrated_account_id=ia_acme_sf_01, the engine:
- Loads the platform base mapping for Salesforce CRM accounts (Level 1)
- Loads the environment override for
env_acme(Level 2) - Checks for an account override on
ia_acme_sf_01(Level 3 - none exists here) - Deep-merges all levels in precedence order
- Calls Salesforce's REST API with the resolved query mapping
- Evaluates the merged response mapping expression against each record
Salesforce returns:
{
"Id": "001xx000003DGTAL",
"Name": "Stark Industries",
"Industry_Vertical__c": "Technology",
"Website": "https://stark.com",
"CreatedDate": "2024-03-15T10:30:00Z"
}The merged mapping produces:
{
"id": "001xx000003DGTAL",
"name": "Stark Industries",
"segment": "Technology",
"website": "https://stark.com",
"created_at": "2024-03-15T10:30:00Z",
"custom_fields": {
"Industry_Vertical__c": "Technology"
}
}The segment field appears as a first-class unified field. The raw value also remains in custom_fields for any downstream consumer that needs the original.
For Customer B (Globex), the same Salesforce record produces "segment": "TECH" instead - the $lookup expression normalizes the picklist value at transform time. If the picklist contains a value not in the lookup table, the expression returns null, which the validation layer can flag.
Step 4: Reverse Mapping (Write Path)
When your application creates or updates an account, the write path needs the reverse translation. A request_body_mapping override at the same level converts unified fields back to Salesforce-native fields:
{
"overrides": {
"request_body_mapping": "body.{ \"Industry_Vertical__c\": segment, \"Name\": name, \"Website\": website }"
}
}Your application sends a unified create request:
{
"name": "Stark Industries",
"segment": "Technology",
"website": "https://stark.com"
}The engine transforms this to a Salesforce-native payload:
{
"Industry_Vertical__c": "Technology",
"Name": "Stark Industries",
"Website": "https://stark.com"
}And sends it as a PATCH to /services/data/v59.0/sobjects/Account/001xx000003DGTAL. The caller never constructs Salesforce-native payloads. The mapping handles both read and write directions.
For Customer B (Globex), the write-path mapping needs the reverse lookup - translating "HC" back to "Healthcare" before sending to Salesforce. Build this into the request_body_mapping expression with an inverted lookup table:
{
"overrides": {
"request_body_mapping": "body.{ \"Industry_Vertical__c\": $lookup({ \"HC\": \"Healthcare\", \"FS\": \"Financial Services\", \"MFG\": \"Manufacturing\", \"TECH\": \"Technology\" }, segment) }"
}
}Handling Schema Drift Without Developer Intervention
Enterprise schemas are not static. Salesforce administrators constantly add, rename, and delete custom fields to support changing business processes. A customer's admin might rename Deal_Registration__c to Partner_Deal__c on a Tuesday afternoon. If a mapped field is deleted, your integration silently drops data or throws a 400 Bad Request error. Nobody notices until the customer's CFO does.
Schema drift is the silent killer of custom integrations. A production-grade per-customer mapping system needs robust drift-detection mechanisms:
- Scheduled Metadata Refresh & Hashing: Re-fetch the provider's describe/metadata API on a daily cadence per connected account. Compute a hash of the returned schema structure and store it. Diff the new schema against the cached version. New fields, removed fields, and renamed fields all generate events.
- Mapping Reference Validation: When the metadata diff produces a removed field, cross-reference the missing fields against the customer's active Level 2 or Level 3 overrides. If any active mapping references it, flag the override as broken.
- Runtime Null-Rate Monitoring: Track the percentage of records where a mapped field returns null. A sudden spike (e.g., jumping from 5% to 95%) usually means the upstream field was renamed, deleted, or had its data wiped.
- Automated Remediation: The notification surface matters as much as the detection. If an active mapping is broken, trigger an internal alert via Slack or PagerDuty to your Customer Success team. Send an automated email to the environment admin prompting them to log in and remap the field. Expose a 'mappings needing attention' view in your admin UI.
This proactive approach turns a critical integration failure into a routine administrative task.
Validation and Conflict-Resolution Rules
When mappings span three levels and hundreds of custom fields across tenants, failures are inevitable. Build these rules into the mapping engine from the start rather than retrofitting them later.
Type coercion. When a JSONata expression maps a Salesforce picklist (string) to a field your application expects as an enum, validate the output after transformation. If Industry_Vertical__c returns "Healthcare" but your unified schema expects one of ["HC", "FS", "MFG"], the validation layer should flag the mismatch before persisting data. A practical default: pass the raw value through and attach a _warnings array to the response indicating the coercion issue.
Missing fields and fallbacks. If a mapped source field does not exist on the connected account's schema, the JSONata expression evaluates to null. Define explicit fallback chains in your mapping expressions:
$firstNonEmpty(Industry_Vertical__c, Industry__c, "Unknown")This tries Industry_Vertical__c first, falls back to Industry__c (a common alternate name after field renames), and defaults to "Unknown" if neither exists. This pattern handles cross-org field name inconsistencies without breaking the integration.
Override conflict detection. When a Level 3 override redefines a field that Level 2 also defines, the system should log which level won. Expose this in an admin audit view so Customer Success teams can trace why a field has an unexpected value. Without audit visibility, debugging a wrong mapping across three merge levels becomes guesswork.
Null-rate thresholds. Set per-field null-rate thresholds. If segment returns null for more than 20% of records after a mapping change, flag the override for review. This catches scenarios where the field exists in the schema but has no data populated, or where the expression has a subtle error that only surfaces on certain record types.
Write-path validation. Before sending a write request to the third-party API, validate the reverse-mapped payload against the provider's field metadata. If Industry_Vertical__c is a restricted picklist, verify the outbound value is in the allowed set. Reject the write with a clear error rather than letting Salesforce return a cryptic INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST response.
Build vs. Buy: The Cost of Code-First Customization
When evaluating integration infrastructure, product managers face a fragmented market. The approach you choose dictates your engineering overhead for years. Here is the honest comparison between approaches:
Option A: Build a code-first integration layer in-house
You hire 2-4 backend engineers to write salesforce_handler.ts, hubspot_handler.ts, etc. Custom fields per customer become if-statements. Every new enterprise prospect requires a sprint. Schema drift becomes a P1 incident pattern. Total cost: roughly $400k-$800k in engineering salary in year one, plus massive opportunity cost on your core product roadmap.
Option B: Visual iPaaS builders (Workato, Tray, Paragon) Visual workflow builders provide dynamic field mapping but force you to build and maintain a separate workflow per integration per customer. Workflows are point-to-point pipelines, not a unified API. Per-customer schema variations require duplicating workflows. At scale, this becomes an unmanageable web of graph spaghetti, and you inherit per-task pricing that gets ugly at enterprise scale.
Option C: Heavy mapping platforms & AI agents (Ampersand, Nango) Heavy mapping platforms focus deeply on declarative object mapping but carry steep entry prices that punish early-stage scaling. Code-first platforms utilizing AI coding agents fundamentally miss the point of a no-code admin experience. They still require developer resources to review, test, and deploy the generated code for every custom enterprise requirement.
Option D: Declarative unified API with override hierarchy Shipping new API connectors as data-only operations is the only sustainable path. A platform that ships integration behavior as data exposes the override hierarchy as a first-class concept. The runtime engine is shared across all integrations and all customers. Adding the 101st integration is a config operation, not a code deploy. Adding the 50th customer-specific override is a database insert.
The trade-off worth being honest about: declarative systems have a learning curve for engineers used to writing code. JSONata is powerful but it is a new language. Mapping configurations need versioning and code review processes. The win is not zero discipline; it is the right discipline applied to data instead of compiled artifacts.
Next Steps for PMs Shipping This
If you are evaluating whether to build or buy per-customer mapping infrastructure, work through these checkpoints in order:
- Audit your enterprise pipeline: Pull the last 10 deals that stalled or lost in technical evaluation. How many died on custom-field or custom-object requirements? If the number is more than two, this is a revenue problem, not a tech-debt problem.
- Inventory your current integration code: Count the
if (customer_id)branches. Count the customer-specific handler files. That is your existing technical debt baseline. - Define the override surface: Decide what your customers can override (response fields, request bodies, routing) and what stays platform-controlled (auth, rate limits, base URL).
- Pick your transformation language: JSONata is the standard for declarative JSON transformations and has excellent tooling. Avoid inventing your own proprietary DSL.
- Design the UI before the backend: If a Customer Success engineer cannot map a field in under 90 seconds in your mockups, the backend complexity is wrong.
- Plan drift detection from day one: Retrofitting schema-change alerts onto a live system is significantly more expensive and painful than designing them in from the start.
Enterprise buyers demand software that adapts to their data. Standardized unified APIs force their data to adapt to your software. By implementing a declarative mapping architecture, you remove engineering from the critical path of enterprise deals. You empower your go-to-market teams to say "yes" to complex technical requirements, accelerating your sales cycle and driving revenue.
FAQ
- What is no-code API mapping?
- No-code API mapping is the practice of storing field translations, custom object handling, and request/response transformations as declarative configuration data (like JSONata) rather than as compiled code. A generic runtime engine reads the configuration at request time, meaning changes are database operations instead of deploys.
- How do you handle custom Salesforce fields in a unified API?
- Use a three-level override hierarchy: platform base mappings for standard fields, environment-level overrides for tenant-wide custom fields, and account-level overrides for one-off custom fields on a single connected account. The runtime deep-merges all three levels at request time.
- What is the difference between per-customer API mapping and iPaaS workflows?
- iPaaS workflows are point-to-point automations built per use case, requiring you to duplicate an entire workflow for each customer's customization. Per-customer API mapping keeps a single unified API contract and applies declarative overrides at the field level, sharing one runtime across all customers.
- How do you detect schema drift in third-party APIs?
- Combine three signals: scheduled metadata refresh (re-fetching describe APIs daily and diffing/hashing against the cached schema), mapping reference validation (flagging overrides pointing to removed fields), and runtime null-rate monitoring (alerting on sudden spikes in null values for mapped fields).
- Can Customer Success teams safely edit API mappings without engineering?
- Yes, if the system exposes a visual UI that generates declarative config under the hood, validates mappings against live sample data before saving, and scopes changes to a specific environment or account using a sandbox-to-production promotion path.