Skip to content

Dynamic Post-Connection Configuration: Building Data-Driven SaaS Setup Flows

Learn how to build dynamic post-connection setup flows that fetch live data from third-party APIs, populate dropdowns, and eliminate manual configuration.

Uday Gajavalli Uday Gajavalli · · 18 min read
Dynamic Post-Connection Configuration: Building Data-Driven SaaS Setup Flows

You are sitting in the final review meeting for a six-figure enterprise contract. The prospect loves your core product. They finally clicked "Connect" on your shiny new Salesforce integration. The OAuth dance completes successfully. They are redirected back to your application, ready to sync their data.

Then, they hit a brick wall.

Your UI presents a blank text input asking for their "Salesforce Custom Object API Name" and a "Record Type ID". The user, a VP of Sales, has no idea what a Record Type ID is. They open a new tab to Google it, get distracted by a Slack message, and close the window.

Or perhaps your user just completed OAuth with Asana. The token exchange worked. The connection is live. And then your UI drops them onto a screen that says: "Please enter your Workspace ID."

They have no idea what a Workspace ID is, where to find it, or why you are asking. They close the tab. Your integration activation metric just took another hit.

That integration is functionally dead. The deal is now at risk, as broken or unusable integrations are a leading cause of customer churn.

This scenario plays out thousands of times a day across the B2B SaaS ecosystem. Engineering teams spend weeks navigating archaic SOAP endpoints, handling bizarre rate limits, and normalizing data schemas. But if the customer-facing integration drops the user into a confusing, manual setup flow immediately after authentication, all that engineering effort is wasted.

Your integrations page and setup flow are revenue surfaces. When someone searches for your integration capabilities, your integrations page gets them in the door. But the post-connection setup experience is what actually activates the account. This is the post-connection configuration problem, and it kills more integration setups than broken auth flows ever will. The good news: it is entirely solvable with the right architecture.

The Post-Connection Drop-Off: Why Integration Setup Flows Fail

Post-connection configuration is everything that happens between a successful authentication (OAuth callback, API key submission) and a fully operational integration. It includes selecting workspaces, mapping custom fields, choosing sync scopes, and picking which data subsets matter to this specific user.

If your team keeps hearing, "We connected the integration, but no data is syncing," you likely have a post-connection configuration problem.

Most B2B SaaS teams treat this phase as an afterthought. They nail the OAuth redirect, celebrate the 200 OK on the token exchange, and then punt the configuration step to a static form with text inputs. The result is predictable: users get stuck, file support tickets, or just leave.

The onboarding experience is a major factor in purchasing decisions. The data is clear on how much this matters. According to research by Wyzowl and Custify, 63% of customers consider the onboarding experience when deciding whether to subscribe to a SaaS product. A poor setup experience directly impacts revenue and conversion rates.

Dropping users into complex, manual configuration workflows too soon causes massive churn and integration abandonment. Userlens data shows that up to 75% of users will abandon a product within the first week if the onboarding or setup experience is confusing, and another 55% will stop using products they cannot figure out.

The integration setup screen is often the first real "work" a user does inside your product after connecting a third-party account. Initial setup screens lose another 30-50% of users who complete sign-up, because complex configuration steps, unclear instructions, and overwhelming option sets cause abandonment.

Why does this happen? Because traditional integration flows make the user do the work that the software should be doing.

Consider a standard ticketing integration. After authenticating with Zendesk, you want the user to select which ticket tags should trigger a sync to your platform. A lazy implementation asks the user to type the tags into a comma-separated text field. If they make a typo, the webhook filters fail silently. If they don't know their exact tag nomenclature, they have to leave your app, log into Zendesk, navigate to settings, copy the tags, and paste them back.

Every time you force a user to leave your application to find a configuration ID, you bleed conversion rate. If you are asking users to manually hunt down IDs, paste endpoint URLs, or configure field mappings through a spreadsheet, you are bleeding activations at the exact moment you should be delivering value.

What is Dynamic Post-Connection Configuration?

Dynamic post-connection configuration is the architectural pattern of using a freshly acquired authentication token to fetch live data from a third-party API immediately after authentication, populating the setup UI with real options—dropdowns, multi-selects, and contextual forms—instead of asking users to manually input technical identifiers.

Instead of asking the user to type an ID, the system uses the newly minted OAuth token to query the upstream provider's API, retrieves the available options, and presents them in a dropdown.

Here is the difference in practice:

Static Configuration Dynamic Configuration
"Enter your Zendesk subdomain" Subdomain auto-detected from OAuth context
"Paste your Asana Workspace ID" Dropdown populated with the user's actual workspaces
"Type the tag names you want to sync" Multi-select showing all tags from the user's Zendesk account
"Map your CRM fields manually" Visual field mapper showing real fields from the connected account

If you need an Asana Workspace ID, your backend calls GET /workspaces, parses the response, and renders a clean select menu showing "Marketing Team" and "Engineering Hub". The user clicks once, and the underlying system stores the complex alphanumeric ID (1234567890gid) in the connection context.

The key insight: you already have the credentials. The moment OAuth completes, you have everything you need to call that third-party API and pull live metadata. There is no reason to make the user do this work manually.

This pattern works across every integration category—CRM, HRIS, ATS, ticketing, accounting. An HRIS integration can fetch the list of departments and locations. A ticketing integration can pull available projects and tag lists. An accounting integration can load the chart of accounts. The user picks from real data instead of guessing.

This shift from static forms to dynamic, data-driven flows is what separates enterprise-grade SaaS products from amateur integrations.

Key Elements of a Data-Driven Setup Flow

To eliminate setup friction, a well-designed dynamic configuration flow has four architectural components that work together.

1. Live Data Fetching via the Connected Account

The moment authentication succeeds, your platform should be able to make API calls on behalf of the user. This means the setup form's data source is the third-party API itself, not a static list you maintain.

Never ask a user to type something that your system can fetch. Dynamic dropdowns execute a live API call to populate options. This applies to selecting workspaces, choosing pipelines, picking default assignee users, or selecting Slack channels for notifications.

For example, when a user connects their Asana account, your setup form should:

  • Call the Asana API to list all workspaces the user belongs to.
  • Present those workspaces in a single-select dropdown.
  • On selection, call the API again to fetch projects within that workspace.

This requires your integration layer to support making authenticated API calls immediately after connection—before any sync jobs or data pipelines are configured.

2. Dependent Fields (Cascading Selections)

Configuration data is rarely flat; it is relational. Dependent fields are form elements where the options in Field B depend on what the user selected in Field A. This is where most custom-built solutions fall apart, because it requires managing state across multiple sequential API calls.

flowchart LR
    A["OAuth<br>Complete"] --> B["Fetch<br>Workspaces"]
    B --> C["User selects<br>Workspace"]
    C --> D["Fetch Projects<br>for Workspace"]
    D --> E["User selects<br>Projects"]
    E --> F["Config stored<br>on account"]

A user cannot select an Asana Project until they have selected an Asana Workspace. A user cannot map a Salesforce Custom Field until they have selected the specific Salesforce Object.

The dependent field pattern is common across SaaS integrations:

  • Jira: Organization → Project → Issue Type
  • Salesforce: Object Type → Record Type → Custom Fields
  • Zendesk: Brand → Group → Tags
  • HubSpot: Portal → Pipeline → Deal Stage

Without dependent fields, you would need to show the user every possible project across every workspace—an unusable wall of options. Dependent fields automatically reset and refetch their data based on the selection of a parent field. If the user changes the Workspace dropdown, the Projects dropdown must clear its state and execute a new API call scoped to the new Workspace ID.

3. Visual Custom Field Mapping

Enterprise SaaS instances are heavily customized. Your platform's standard data model will almost never perfectly align with a prospect's ten-year-old Jira instance.

Visual custom field mapping allows the user to map their unique downstream SaaS properties to your application's expected fields. Instead of writing code to handle these edge cases, you present a UI where the user maps jira_custom_field_10024 to your Priority field.

For more on how this works at the data layer, see our guide on 3-Level API Mapping: Per-Customer Data Model Overrides Without Code.

4. Selection Storage in the Connection Context

Whatever the user picks during configuration needs to be persisted on the connection record itself—not in a separate configuration database, not in browser localStorage, and definitely not in an email thread with your support team.

The user's selections (workspace ID, project list, tag filters, field mappings) become part of the connected account's context. When a scheduled sync job runs or a webhook arrives, the system reads this context to know exactly how to filter or route the data. If the user selected workspace_id: 888, the sync job automatically appends ?workspace=888 to its outbound API calls. This keeps everything self-contained: one connected account record holds both the credentials and the configuration.

Architecting the Flow: Fetching and Storing Configuration Data

Building a dynamic post-connection flow requires a specific architectural sequence. You are transitioning from the OAuth redirect phase directly into a live data-fetching phase.

Let's get into the technical details of how this works under the hood.

The Request Chain

After OAuth completes and you have stored the access token, the setup flow triggers a series of authenticated API calls to the third-party service. Here is the exact sequence of events:

sequenceDiagram
    participant User
    participant SaaS App
    participant Integration Platform
    participant Upstream API

    User->>SaaS App: Clicks "Connect"
    SaaS App->>Integration Platform: Initiate OAuth
    Integration Platform->>Upstream API: Redirect to Provider Auth
    Upstream API-->>User: Prompts for Consent
    User->>Upstream API: Approves Access
    Upstream API-->>Integration Platform: Returns Auth Code
    Integration Platform->>Upstream API: Exchange Code for Token
    Integration Platform-->>SaaS App: OAuth Success Callback
    SaaS App->>Integration Platform: Request Form Config Data<br>(e.g., Get Workspaces)
    Integration Platform->>Upstream API: API Call with New Token
    Upstream API-->>Integration Platform: Returns Live Data
    Integration Platform-->>SaaS App: Returns Dropdown Options
    SaaS App-->>User: Renders Dynamic UI
    User->>SaaS App: Selects Options & Submits
    SaaS App->>Integration Platform: Store Selections in Context
  1. User completes OAuth - The access token and refresh token are stored on the connected account.
  2. Setup UI renders - The first form field triggers an API call through your integration layer (e.g., GET /workspaces).
  3. Response populates dropdown - The API returns a list of workspaces; the UI renders them as selectable options.
  4. User selects - Their choice triggers a dependent API call (e.g., GET /workspaces/{id}/projects).
  5. User confirms - All selections are written back to the connected account's context object.
  6. Integration is active - Sync jobs and webhooks now use the stored configuration.

Handling Rate Limits During Dynamic Fetching

Here is where many engineering teams fail when building dynamic setup flows: rate limits.

When your setup form is making live API calls to populate dropdowns, you are consuming the user's API quota with the upstream provider. If your application immediately fires off five different API calls to fetch workspaces, users, tags, pipelines, and custom fields to populate the setup UI, you can easily hit rate limits—especially with providers like Jira or HubSpot that have relatively tight per-account concurrent request ceilings. These calls will fail with an HTTP 429 Too Many Requests error. The user will see a broken form.

This is a problem that your integration platform needs to surface clearly, not silently absorb. If you are using an integration platform, you must understand exactly how it handles these limits.

Warning

Architectural Warning: Truto does NOT automatically retry, throttle, or apply exponential backoff when an upstream API returns a rate limit error. When a provider returns a 429, Truto passes that error directly back to your application. Your frontend or orchestration layer is responsible for reading the standardized rate limit headers and implementing its own retry or backoff logic.

What Truto does do is normalize the chaotic rate limit headers from hundreds of different APIs into the standardized IETF RateLimit specification. Regardless of whether HubSpot sends X-HubSpot-RateLimit-Remaining or GitHub sends X-RateLimit-Remaining, Truto intercepts the response and returns consistent headers to your application:

  • ratelimit-limit: The maximum number of requests allowed in the current window.
  • ratelimit-remaining: The number of requests left in the current window.
  • ratelimit-reset: The number of seconds until the quota resets.

As the developer building the setup flow, you are responsible for reading these headers and implementing your own retry and backoff logic. In practice, this means your setup UI should read the ratelimit-remaining header after each API call, add a short delay if the count is low, and gracefully handle 429s by reading ratelimit-reset to show a brief "Loading..." state rather than an error screen.

Here is how you should handle fetching dynamic dropdown data using these standardized headers in TypeScript:

async function fetchDropdownDataWithBackoff(url: string, options: RequestInit, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options);
    
    if (response.status === 429) {
      // Read the standardized header provided by the integration platform
      const resetSeconds = parseInt(response.headers.get('ratelimit-reset') || '2', 10);
      console.warn(`Rate limited. Waiting ${resetSeconds} seconds before retry.`);
      
      // Wait for the window to reset before trying again
      await new Promise(resolve => setTimeout(resolve, resetSeconds * 1000));
      continue;
    }
    
    if (!response.ok) {
      throw new Error(`API call failed with status: ${response.status}`);
    }
    
    return await response.json();
  }
  
  throw new Error('Max retries exceeded while fetching configuration data');
}

For a deeper dive into this pattern, read our guide on Best Practices for Handling API Rate Limits and Retries Across Multiple Third-Party APIs.

Token Freshness During Setup

OAuth tokens can expire mid-configuration, especially for setup flows that involve multiple steps over several minutes. Your integration layer needs to handle token refresh transparently.

Truto, for instance, proactively refreshes OAuth tokens shortly before they expire. The platform checks token validity with a 30-second buffer before every API call and schedules work ahead of token expiry. If a refresh fails, the connected account gets flagged for re-authentication, and a webhook event fires to notify your system.

This matters because a user who is halfway through configuring their integration and gets hit with a "Session expired, please reconnect" error will not come back.

The Embedded iPaaS Approach vs. Native UI

Historically, companies have tried to solve this UI problem by buying embedded iPaaS solutions. Platforms like Workato provide embeddable iframes and connection widgets so users can configure integrations without leaving the host application.

While this is better than forcing users into a completely separate portal, iframe-based widgets often feel disconnected from your core product's design system. They introduce third-party cookies, styling conflicts, and a disjointed user experience. The modern approach is to use headless APIs to fetch the configuration data, allowing your frontend team to render the setup flow using your own native React, Vue, or Angular components.

How Truto's RapidForm Automates Dynamic Configuration

Building out the API orchestration to fetch live data, handle dependencies, and store user context is time-consuming. It requires building proxy endpoints for every integration just to populate UI dropdowns. Building a dynamic post-connection configuration flow from scratch means writing custom frontend components, managing API call chains, handling dependent field state, persisting selections, and wiring everything into your integration lifecycle. For one integration, that is maybe a week of engineering. For twenty integrations, it is a quarter of roadmap, adding to the already high cost of supporting SaaS integrations post-launch.

To solve this, Truto provides a feature called RapidForm.

RapidForm is a declarative configuration layer designed to collect input from end users as part of the integrated account connection flow. It streamlines the process of gathering necessary data and preferences immediately after the OAuth redirect, without requiring your engineering team to build custom API polling logic or write custom frontend React components.

How RapidForm Works

Instead of writing custom frontend components that make proxy requests to upstream APIs, Product Managers can define the required setup fields directly in Truto.

1. Define fields with live data sources. Each form field specifies where to fetch its options from. When you enable RapidForm for an integration, you define the fields you need. For example, to sync data from a specific Asana workspace, you define a field:

  • Type: Single-Select
  • Data Source: Unified API
  • Resource: ticketing/workspace
  • Method: list

When the user connects their Asana account, Truto automatically executes the list method against the Unified API, retrieves the workspaces, and renders the dropdown in the connection flow.

2. Handle field dependencies automatically. RapidForm natively supports field dependencies without requiring custom frontend state management. Fields can declare dependencies on other fields. If you want the user to select multiple projects within their chosen workspace, you add a second field:

  • Type: Multi-Select
  • Data Source: Unified API
  • Resource: ticketing/project
  • Query Parameters: Pass the workspace_id from the first field.
  • Dependency: Set "Depends On" to workspace_id and check "Reset on Change".

Truto handles the event listeners. When the user selects a workspace, the projects field automatically fetches the relevant projects. If they change the workspace, the projects field clears itself and fetches the new list.

3. Transform expressions for complex mappings. For cases where the raw API response does not map cleanly to dropdown labels and values, RapidForm supports transform expressions that reshape API responses into the format the form field expects. This handles the real-world messiness of third-party APIs that return nested objects, inconsistent naming, or paginated lists.

A concrete example: configuring which Zendesk tickets to sync based on tags.

  • After the user connects their Zendesk account, RapidForm fetches the list of tags from the Zendesk API.
  • A multi-select field displays those tags as checkable options.
  • The user selects the tags they care about.
  • The integration stores those selections and uses them to filter tickets in all subsequent sync operations.

No one on your team wrote a Zendesk-specific React component. No one debugged state management for cascading dropdowns. The entire flow is configuration.

4. Storing Context for Downstream Use. The most powerful aspect of RapidForm is where the data goes. User selections from RapidForm are automatically stored as variables in the Integrated Account context.

If the user selects workspace_id: 12345 and Projects X, Y, Z, those variables are now permanently attached to their connection. When you configure a Sync Job to pull tickets, or when Truto processes an incoming webhook, that workspace_id is instantly available to filter the data. You do not need to build a separate database table to map your tenant IDs to third-party workspace IDs—the integration platform handles the state.

Tip

RapidForm supports field types including single-select, multi-select, text, password, checkbox, and hidden fields. Each can be populated dynamically from API responses or set statically. Custom validation logic is also supported for cases where selections need to meet specific constraints.

Best Practices for High-Converting Integration Onboarding

If you are a Product Manager or Engineering Leader tasked with improving your integration adoption rates, treat the post-connection flow with the same rigor as your primary user onboarding. Based on what we have seen work (and fail) across hundreds of integration setup flows, here are the core principles for designing high-converting setup flows:

1. Minimize Manual Data Entry at All Costs

Every text input is a liability. Appcues research shows that reducing the number of onboarding steps by 30% can increase completion rates by up to 50%. Simplifying the configuration process by dynamically fetching data rather than asking for manual input drastically improves the likelihood that a user will finish the setup.

Each additional form field reduces completion by an average of 5-7%. A text field that says "Enter your Workspace ID" is really three steps: figure out what a workspace ID is, find it in the third-party app, and copy-paste it. A dropdown that shows your workspace names is one step: pick the right one. Do not ask users to type API names, instance URLs, or internal IDs unless absolutely necessary.

2. Enforce Logic with Dependent Fields

Do not allow users to configure invalid states. Dependent fields aren't just a UX convenience—they are a validation mechanism. If a specific custom field is only available on the "Enterprise" record type in Salesforce, use dependent fields to ensure they can only select that field if they have first selected the correct record type.

If the user can only select projects that belong to their chosen workspace, it is physically impossible for them to misconfigure the workspace-project relationship. Preventing configuration errors during setup eliminates massive headaches for your customer success team later. The form structure enforces correctness.

3. Make it Feel Native

Users trust integrations that feel like a core part of your product. Intercom found that personalized onboarding flows have 65% higher completion rates than generic ones. For integrations, "personalized" means the setup form shows the user's actual data from their connected account—their real workspaces, their real tags, their real field names.

If your setup flow looks like a cheap, bolted-on iframe with different fonts and button styles, users will hesitate. Embed the configuration UI inline within your product's integration settings page. Whether you use Truto's RapidForm or build custom UI components consuming our Proxy API, ensure the design language matches your application. The moment a user feels like they have been "handed off" to a different tool, trust drops and abandonment rises.

4. Show a Quick Win Immediately After Configuration

Products with a "quick win" in onboarding retain 80% more users. For integrations, the quick win is seeing their data. As soon as the user finishes configuration, show them a preview of what is going to sync. Pull a handful of records from the connected account using the configuration they just set and display them. "Here are the 3 most recent tickets from the tags you selected."

This closes the loop between configuration and value. The user sees that their choices worked, the data looks right, and the integration is doing what they expected.

5. Handle Edge Cases Gracefully

Real-world configuration flows hit edge cases that product demos never show:

  • Empty states: The user's Asana account has zero projects. Show a helpful message, not an empty dropdown.
  • Permission gaps: The OAuth scope does not grant access to list workspaces. Surface a clear error explaining what additional permission is needed.
  • Large option sets: A Salesforce org with 400 custom fields. Add search/filter to the dropdown instead of rendering a 400-item list.
  • Slow APIs: Some third-party APIs take 5+ seconds to return workspace lists. Show loading states, not blank screens.
  • Rate limits: When APIs return a 429 Too Many Requests error, do not show a generic "Something went wrong" alert. Catch the error, read the ratelimit-reset header, and show a helpful loading state: "Fetching your workspaces... this will take a few seconds due to provider limits." Implement the backoff logic silently in the background.

Each of these edge cases, handled poorly, becomes a drop-off point. Handled well, they build trust.

6. Pre-Select Sensible Defaults

If an API returns a list of pipelines, and one is explicitly marked is_default: true in the payload, pre-select it in the dropdown. Save the user a click.

7. Architect for Post-Setup Changes

Users will need to change their configuration after the initial setup. A PM adds a new tag in Zendesk and wants it included in the sync. A team restructures their Jira projects. Your integration settings page should allow re-running the configuration flow without disconnecting and reconnecting the account.

This means your setup flow needs to support both "first run" and "edit" modes, and the stored configuration should be patchable rather than requiring a full replacement. Integration platforms that store user selections in a mutable context object on the connected account handle this naturally—you update the context, and downstream processes pick up the change.

Stop Bleeding Pipeline at the Finish Line

The post-connection configuration step is where integration activation lives or dies. Getting a prospect to authorize an integration is hard enough. Do not lose them in the final mile with a static, confusing configuration screen. It is the gap between "connected" and "actually working"—and it is where most B2B SaaS products leak activation without realizing it.

If you notice a 40% drop-off during the integration configuration step, that is a clear area for improvement.

By architecting dynamic post-connection configuration flows, you transform a frustrating engineering hurdle into a smooth, data-driven onboarding experience. Fetch the data, handle the dependencies, and store the context automatically. The competitive advantage goes to teams that treat integration setup as a product surface, not a checkbox buried in settings.

Stop asking users to paste Workspace IDs. Start fetching them.

FAQ

What is dynamic post-connection configuration in SaaS integrations?
It is the process of using a freshly acquired authentication token to fetch live data from a third-party API immediately after authentication. This populates the setup UI with real options like dropdowns and multi-selects, eliminating the need for manual data entry.
How do dependent fields improve integration setup?
Dependent fields prevent configuration errors by automatically resetting and refetching data based on a parent field's selection (e.g., selecting a workspace to fetch its specific projects). This ensures users only choose valid combinations and simplifies the user experience.
How should developers handle API rate limits during dynamic setup flows?
Developers must read standardized rate limit headers (like ratelimit-remaining and ratelimit-reset) from the integration platform and implement their own retry and backoff logic. Rate limit errors (HTTP 429) should be caught to show a brief loading state rather than displaying an error screen.
What is Truto RapidForm?
RapidForm is a declarative form system in Truto that allows PMs to build dynamic, data-driven setup forms. It fetches live data, handles field dependencies, applies transform expressions, and automatically stores user selections in the connected account context without requiring custom frontend code.
How do dynamic setup forms reduce integration drop-off?
Dynamic forms replace manual text inputs with auto-populated dropdowns showing real data. Research shows that reducing onboarding steps by 30% can increase completion rates by up to 50%, and each additional form field reduces completion by 5-7%.

More from our Blog