Skip to main content
RapidDev - Software Development Agency
retool-integrationsRetool Native Resource

How to Integrate Retool with Stripe Connect

Connect Retool to Stripe Connect using the native Stripe Resource with your platform's secret API key. Use the query editor's operation dropdown to manage connected accounts, view transfers, monitor payouts, and handle disputes across your marketplace sellers. The native connector handles authentication and pagination automatically without any endpoint memorization.

What you'll learn

  • How to configure the Retool native Stripe Resource with a platform-level restricted API key
  • How to query connected account status, balances, and onboarding progress
  • How to list and filter transfers, payouts, and disputes across your marketplace
  • How to make requests on behalf of specific connected accounts using the Stripe-Account header
  • How to build a platform admin panel with account health indicators and dispute management
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced17 min read20 minutesPaymentLast updated April 2026RapidDev Engineering Team
TL;DR

Connect Retool to Stripe Connect using the native Stripe Resource with your platform's secret API key. Use the query editor's operation dropdown to manage connected accounts, view transfers, monitor payouts, and handle disputes across your marketplace sellers. The native connector handles authentication and pagination automatically without any endpoint memorization.

Quick facts about this guide
FactValue
ToolStripe Connect
CategoryPayment
MethodRetool Native Resource
DifficultyAdvanced
Time required20 minutes
Last updatedApril 2026

Why Build a Stripe Connect Admin Panel in Retool?

Running a marketplace or platform on Stripe Connect means managing a complex web of connected accounts — each with its own onboarding status, balance, payout schedule, and dispute history. Stripe's built-in dashboard shows aggregate data well, but it lacks the custom filtering, cross-referencing, and team-specific workflows that operations teams need. Retool fills this gap by letting you build a bespoke platform admin panel that surfaces exactly the Stripe Connect data your team acts on daily.

With Retool's native Stripe connector, your team can build dashboards that show all connected accounts with their onboarding completion status, flag accounts with pending verification requirements, drill into transfer histories for specific sellers, and process dispute responses — all in a single interface that can also pull in data from your own database. This is far more efficient than navigating between Stripe's dashboard, your internal database, and spreadsheets to get a complete picture of a connected account.

The Stripe Connect data model adds complexity beyond standard Stripe: platform-level charges versus direct charges, application fees, payouts across multiple accounts, and the distinctions between Standard, Express, and Custom connected accounts. Retool's query builder handles this complexity through straightforward configuration rather than requiring detailed knowledge of every API path and parameter combination.

Integration method

Retool Native Resource

Retool includes a native Stripe connector that authenticates with your platform API key and exposes Stripe's full API surface through an operation dropdown — no endpoint memorization required. For Stripe Connect specifically, you make requests on behalf of connected accounts by passing the 'Stripe-Account' header in Retool's advanced query options, targeting a specific connected account's data. All requests are proxied server-side, keeping your platform API key secure.

Prerequisites

  • A Retool account (Cloud or self-hosted) with permission to add Resources
  • A Stripe platform account with Stripe Connect enabled (not a standard Stripe account)
  • A Stripe restricted API key with read permissions for Connect resources (Accounts, Transfers, Payouts, Disputes) — create this in Stripe Dashboard → Developers → API keys
  • At least one connected Stripe account for testing queries
  • Understanding of Stripe Connect account types (Standard, Express, Custom) and how your platform uses them

Step-by-step guide

1

Create a restricted API key and add the Stripe Resource

Before configuring Retool, create a restricted API key in Stripe specifically for your Retool admin panel. Navigate to the Stripe Dashboard at dashboard.stripe.com, go to Developers → API keys, and click Create restricted key. Name it something identifiable like 'Retool Connect Admin' and grant read-only permissions for the resources your dashboard needs: Connected Accounts (read), Transfers (read), Payouts (read), Disputes (read), and Charges (read). If your Retool app will need to perform write actions like processing refunds or responding to disputes, add those write permissions explicitly. Copy the generated key — you will only see it once. Now open Retool and navigate to the Resources tab. Click Add Resource in the top right. Search for or scroll to find 'Stripe' in the resource list and click it. In the configuration panel: - Name: give it a descriptive name like 'Stripe Connect - Platform' - API Key: paste the restricted key you just created - Environment: select Live or Test depending on which Stripe environment you want to connect to first (create separate resources for each if you need both) Click Save Changes. The resource is now available in the query editor. It's best practice to create two separate Stripe resources — one for your test API key and one for your live API key — and use Retool's resource environments to manage which one apps use in development versus production.

Pro tip: Always use restricted API keys for Retool connections rather than your full secret key. Restrict the key to only the operations your dashboard actually needs — read-only for analytics dashboards, adding write permissions only for operational tools that need to process refunds or respond to disputes.

Expected result: A Stripe resource appears in the Resources list. When you create a query using this resource, the operation dropdown shows Stripe Connect-relevant actions like List Connected Accounts, List Transfers, and List Payouts.

2

Query all connected accounts with their onboarding status

In a Retool app, create a new query and select your Stripe Connect resource. Click the Action Type dropdown and select List Connected Accounts (or search for 'accounts' in the operation search). This maps to Stripe's GET /v1/accounts endpoint, which returns all connected accounts on your platform. In the query parameters that appear below the Action Type, configure: - Limit: 100 (maximum per request; Stripe Connect platforms often have hundreds or thousands of accounts so you may need pagination) - Expand: ['capabilities', 'requirements'] — expanding these fields adds onboarding status details to each account object without requiring separate queries Set the query to Run this query automatically when inputs change with Trigger on page load enabled, so the account list loads when the app opens. After running the query, add a Transformer to reshape the raw Stripe response into a flat format suitable for a Table component. Click the Advanced tab in the query editor, then click Add transformer. Write a JavaScript function that extracts the fields most relevant to your operations team from each account object. Drag a Table component from the Component panel onto the canvas and set its Data source to {{ listAccountsQuery.data }} (or {{ listAccountsQuery.data }} if using a transformer). Configure the table columns to show the most actionable fields: account ID, business name, charges_enabled, payouts_enabled, and a formatted requirements list.

connectedAccountsTransformer.js
1// JavaScript transformer to reshape Stripe connected accounts response
2// Apply this as a query transformer on the List Connected Accounts query
3const accounts = data; // raw response array from Stripe API
4return accounts.map(account => ({
5 id: account.id,
6 business_name: account.business_profile?.name || account.settings?.dashboard?.display_name || account.id,
7 email: account.email || '',
8 country: account.country,
9 account_type: account.type, // standard, express, or custom
10 charges_enabled: account.charges_enabled,
11 payouts_enabled: account.payouts_enabled,
12 details_submitted: account.details_submitted,
13 created: new Date(account.created * 1000).toLocaleDateString(),
14 outstanding_requirements: (account.requirements?.currently_due || []).join(', ') || 'None',
15 capabilities_card_payments: account.capabilities?.card_payments || 'inactive'
16}));

Pro tip: For platforms with more than 100 connected accounts, implement pagination by storing the last account ID and using it as the starting_after parameter in the next query call. Retool's Table component has built-in pagination controls that you can connect to a query parameter.

Expected result: A table displays all connected accounts with their onboarding status, charges/payouts enabled flags, and any outstanding verification requirements. Accounts with incomplete onboarding are identifiable at a glance.

3

Query data on behalf of a specific connected account

Stripe Connect's most powerful feature is the ability to make API calls on behalf of a specific connected account to view or manage their data — charges, balance, payouts, and more. In Retool, you implement this using the Stripe-Account header, which tells Stripe to scope the request to a specific connected account ID. Create a new query using your Stripe resource. Select the Action Type (e.g., List Charges to see charges for a specific seller). In the Advanced section of the query editor, find the Additional Headers configuration. Add a header: - Key: Stripe-Account - Value: {{ table1.selectedRow.id }} — this dynamically passes the selected connected account's ID from your accounts table This pattern allows your dashboard to drill down into any connected account by clicking that account's row in the accounts table. The charge list query re-runs automatically (since the input changes when a row is selected) and shows charges belonging only to that connected account. Repeat this pattern for other account-scoped queries: List Payouts (to show a specific account's payout history), Get Balance (to show their current platform balance), and List Disputes (to show disputes on that account's charges). All of these queries use the same Stripe-Account header technique. For platform-level transfers (money moving between your platform and connected accounts), do NOT use the Stripe-Account header — List Transfers without that header shows transfers at the platform level, which is what finance teams typically need for reconciliation.

accountScopedChargesTransformer.js
1// Query configuration for account-scoped charges
2// Add this in the Advanced > Additional Headers section of the query
3{
4 "Stripe-Account": "{{ table1.selectedRow.id }}"
5}
6
7// JavaScript transformer for the charges response
8const charges = data;
9return charges.map(charge => ({
10 id: charge.id,
11 amount: '$' + (charge.amount / 100).toFixed(2),
12 currency: charge.currency.toUpperCase(),
13 status: charge.status,
14 description: charge.description || '',
15 customer_email: charge.billing_details?.email || '',
16 created: new Date(charge.created * 1000).toLocaleString(),
17 refunded: charge.refunded,
18 dispute: charge.disputed ? 'Yes' : 'No'
19}));

Pro tip: When querying account-scoped data, always check that a row is actually selected in the accounts table before the query runs. Add a 'Only run when' condition in the query settings: {{ table1.selectedRow.id !== undefined }} to prevent errors when no account is selected.

Expected result: Clicking on a connected account row in the accounts table triggers the account-scoped query, and the charges panel below updates to show only that specific account's payment history. Switching rows switches the displayed data accordingly.

4

Build a transfers and payouts view for finance reconciliation

Platform-level transfers and payouts are critical for finance teams reconciling what money went where. These queries operate at the platform level (no Stripe-Account header needed) and show the flow of funds between your platform and connected accounts. Create a query using List Transfers (platform-level) to show all transfers from your platform to connected accounts. Configure parameters: - Limit: 100 - Created[gte]: {{ dateRangePicker.startDate }} — filter by creation date start - Created[lte]: {{ dateRangePicker.endDate }} — filter by creation date end Drag a DateRangePicker component onto the canvas and set the default range to the last 30 days. This gives finance teams an immediate filtered view without loading all historical data. For the payouts view (money moving from Stripe to your bank account or connected accounts' bank accounts), create a second query using List Payouts. This is a separate endpoint that shows settlement batches. Add a Select component for filtering by payout status: paid, pending, in_transit, failed, canceled. Create a transformer that calculates summary statistics from the transfer results — total volume, count by status, and average transfer amount. Bind these to Text components at the top of the page as summary cards, giving finance teams a quick snapshot before diving into the detailed table. For complex integrations that need to combine Stripe Connect data with your internal accounting records or cross-reference multiple data sources, RapidDev's team can help architect multi-resource Retool apps that join Stripe data with your internal database seamlessly.

internalAccountEnrichment.sql
1-- If you also have an internal database resource, use this pattern
2-- to enrich Stripe transfer data with your internal account names
3-- Run this as a separate database query, then join in a JS transformer
4SELECT
5 account_id,
6 seller_name,
7 seller_tier,
8 signup_date
9FROM marketplace_accounts
10WHERE account_id = ANY({{ transfersQuery.data.map(t => t.destination) }}::text[]);

Pro tip: Use a JavaScript query (no resource required) to join Stripe transfer data with data from your internal database query, creating an enriched table row that shows both the Stripe transfer details and your internal seller metadata like name and tier in a single table.

Expected result: A transfers table shows all platform-level transfers within the selected date range with totals summarized at the top. Finance teams can filter by date range and status to get the exact reconciliation view they need.

5

Add a disputes management view with evidence tracking

Disputes are high-priority items that require timely responses — missed deadlines result in automatic losses. Build a dedicated disputes panel that surfaces all open disputes across connected accounts with their evidence deadlines prominently displayed. Create a query using List Disputes at the platform level. In the query parameters: - Status: can be filtered by 'needs_response', 'under_review', 'warning_needs_response' - Add an Expand parameter for 'charge' and 'payment_intent' to get the associated payment details in the same response Add a Select component for filtering disputes by status, and wire it to the query parameter: {{ disputeStatusFilter.value }}. Create a transformer that adds a calculated 'days_until_deadline' field based on the evidence_due_by timestamp from each dispute object. This lets you sort the table by urgency and highlight disputes with fewer than 7 days remaining using Retool's Table conditional row styles. In the Table component Inspector, find Conditional Row Styles and add a rule: when {{ self.days_until_deadline <= 7 }}, apply a red background color to flag urgent disputes. Add a second rule for disputes due within 30 days with an orange or yellow background. Drag a form panel or Modal component for the dispute detail view. When a dispute row is selected, the detail panel shows the full dispute object including the reason, charge amount, connected account, and evidence requirements. Add a Text area component for internal notes and a button that updates an internal disputes tracking table in your database with the note content — creating an audit trail outside of Stripe's system.

disputesTransformer.js
1// JavaScript transformer for disputes with urgency calculation
2const disputes = data;
3const now = Date.now() / 1000; // current time in Unix seconds
4
5return disputes
6 .map(dispute => ({
7 id: dispute.id,
8 amount: '$' + (dispute.amount / 100).toFixed(2),
9 currency: dispute.currency.toUpperCase(),
10 reason: dispute.reason,
11 status: dispute.status,
12 connected_account: dispute.charge?.on_behalf_of || 'Platform',
13 charge_id: dispute.charge?.id || '',
14 evidence_due: dispute.evidence_details?.due_by
15 ? new Date(dispute.evidence_details.due_by * 1000).toLocaleDateString()
16 : 'N/A',
17 days_until_deadline: dispute.evidence_details?.due_by
18 ? Math.ceil((dispute.evidence_details.due_by - now) / 86400)
19 : null,
20 created: new Date(dispute.created * 1000).toLocaleDateString()
21 }))
22 .sort((a, b) => (a.days_until_deadline || 999) - (b.days_until_deadline || 999));

Pro tip: Set up a Retool Workflow with a daily schedule trigger that queries for disputes with fewer than 3 days until the evidence deadline and sends a Slack notification to your operations channel — this acts as an automated escalation system for time-sensitive disputes.

Expected result: A disputes table shows all open disputes sorted by deadline urgency, with red highlighting for disputes due within 7 days. Clicking a row shows full dispute details and allows internal note-taking. The table updates when the status filter is changed.

Common use cases

Build a marketplace seller onboarding tracker

Create a Retool dashboard that lists all connected accounts with their onboarding status: whether they have submitted required verification documents, whether capabilities like card payments are enabled, and what outstanding requirements are blocking full activation. Operations teams can click into any account to see the exact requirements list from Stripe and initiate follow-up actions. This dashboard replaces manual Stripe dashboard searching for each seller.

Retool Prompt

Build a connected accounts dashboard that shows all Stripe Connect accounts with columns for account ID, business name, onboarding status (complete/incomplete), charges enabled (yes/no), payouts enabled (yes/no), and a list of outstanding requirements. Add a filter for accounts with incomplete onboarding and a button to copy the account's Stripe onboarding link.

Copy this prompt to try it in Retool

Platform dispute management panel

Build a Retool app for managing disputes across all connected accounts on your marketplace. The panel shows all open disputes with their associated charge, connected account, amount, dispute reason, and deadline. Support agents can click on any dispute to view the evidence submission window and update internal notes in your database. A separate view shows dispute win/loss rates by account to identify problematic seller patterns.

Retool Prompt

Create a dispute management dashboard that queries all disputes across the platform with status 'needs_response' or 'under_review', showing the connected account name, charge amount, dispute reason, and evidence due date. Include a detail panel that shows the full dispute object when a row is selected, with a button to mark it as reviewed in the internal disputes table.

Copy this prompt to try it in Retool

Payout monitoring dashboard for finance teams

Build a payout monitoring panel that shows all recent payouts across connected accounts, with filters by date range, status (paid, in_transit, failed), and account ID. Finance teams can see total payout volume by day, identify failed payouts that need remediation, and export filtered results to CSV. A chart component visualizes payout volume trends over the selected date range.

Retool Prompt

Build a payout monitoring panel with a date range picker and status filter. Show a table of all payouts across connected accounts with amount, status, arrival date, and account display name. Add a bar chart showing daily payout volume for the selected period. Include a row action to view the full payout details and associated transfer.

Copy this prompt to try it in Retool

Troubleshooting

List Connected Accounts returns an empty array even though accounts exist in the Stripe Dashboard

Cause: The API key used is not a platform-level key — it may be a key from a connected account itself, or the account does not have Connect enabled and therefore has no connected accounts to list.

Solution: Verify in the Stripe Dashboard that you are using the API key from your platform account (the one with Stripe Connect enabled), not from a connected account. Navigate to Stripe Dashboard → Developers → API keys and confirm the key prefix matches your platform account. Also confirm that Stripe Connect is activated on your platform account under Dashboard → Connect → Overview.

Account-scoped query returns 'You do not have permissions to perform this request' when using Stripe-Account header

Cause: Your restricted API key does not have the required permissions to act on behalf of connected accounts, or the connected account has not authorized your platform to access that particular resource.

Solution: Check your restricted key's permissions in Stripe Dashboard → Developers → API keys → (your key) → Permissions. Ensure the key has access to the resource type you are querying for connected accounts. For Custom connected accounts, verify the account has granted the required capabilities to your platform. Standard accounts require explicit permission delegation which happens during the Connect onboarding flow.

Transformer shows 'Cannot read property of undefined' errors on some account rows

Cause: Stripe Connect account objects have different structures depending on account type (Standard, Express, Custom). Express and Custom accounts may not populate all business_profile fields that are present on Standard accounts.

Solution: Use optional chaining and null coalescing in your transformer to safely access nested properties. Always provide fallback values for optional fields rather than assuming they exist on every account object.

typescript
1// Safe field access in transformer - handle missing fields gracefully
2return accounts.map(account => ({
3 business_name: account.business_profile?.name
4 ?? account.settings?.dashboard?.display_name
5 ?? account.id,
6 email: account.email ?? '',
7 outstanding_requirements: account.requirements?.currently_due?.join(', ') ?? 'None'
8}));

Payout list shows payouts for the platform bank account but not for connected account bank accounts

Cause: List Payouts at the platform level only shows payouts to the platform's own bank account. Connected account payouts require making the request with the Stripe-Account header targeting the specific connected account.

Solution: To see payouts for a specific connected account, add the Stripe-Account header to your List Payouts query pointing to the selected connected account ID. Platform-level payout queries (no header) will always only show your platform's own settlement payouts.

Best practices

  • Always create restricted API keys with minimal permissions for Retool — grant read-only access for dashboards and add write permissions only for operational tools that actively process refunds or dispute responses.
  • Create separate Stripe Resources for test and live environments, and use Retool's resource environments feature to prevent test data from appearing in production apps.
  • Add 'Only run when' conditions to account-scoped queries (Stripe-Account header queries) to prevent them from running with an undefined account ID when no row is selected in the table.
  • Store your Stripe API key in Retool Configuration Variables (Settings → Configuration Variables, marked as secret) rather than hard-coding it in resource settings — this allows rotating the key without editing every resource.
  • Use Retool's confirmation modals on any query that writes to Stripe (refunds, dispute responses) to prevent accidental execution by team members.
  • Implement a daily Retool Workflow that checks for disputes with upcoming evidence deadlines and sends Slack or email alerts — missing dispute deadlines results in automatic losses.
  • For platforms with thousands of connected accounts, use server-side pagination (starting_after parameter) rather than loading all accounts at once — this keeps the app responsive and avoids hitting Retool's 100 MB query result limit.
  • Combine Stripe Connect data with your internal database in JavaScript transformers to enrich account records with internal metadata like seller tier, signup source, and account manager assignment.

Alternatives

Frequently asked questions

What is the difference between the Retool Stripe integration and the Stripe Connect integration?

Both use the same native Stripe Resource in Retool, but they are configured for different use cases. Standard Stripe covers direct payment operations on a single account — charges, refunds, customers, and subscriptions. Stripe Connect adds multi-party payment management: querying across connected accounts, making account-scoped requests using the Stripe-Account header, managing transfers and payouts, and handling marketplace-specific operations. Your API key type determines which operations are available — platform keys for Connect, standard secret keys for direct payments.

Can I process refunds for connected account charges from a Retool app?

Yes. Create a query with the Create Refund operation and add the Stripe-Account header pointing to the connected account that owns the original charge. You need a restricted API key with write permission for Refunds. Add a confirmation dialog in Retool before the query runs, and log the refund action in your internal database for audit purposes. Always test refund flows with Stripe test mode keys before enabling on live data.

How do I handle pagination for platforms with thousands of connected accounts?

Stripe's List Connected Accounts returns a maximum of 100 accounts per request. For larger platforms, implement cursor-based pagination using the has_more field and last account ID. Create a Retool state variable to track the current page cursor, add Previous/Next buttons with event handlers that update the cursor and retrigger the query with the starting_after parameter set to {{ cursorState.value }}. The table updates with each page load.

Can Retool connect to both Stripe test mode and live mode at the same time?

Yes. Create two separate Stripe Resources in the Resources tab — one configured with your test mode restricted key (sk_test_...) and one with your live mode key (sk_live_...). In your Retool apps, select the appropriate resource based on context. For development, point queries at the test resource; for production dashboards, use the live resource. Retool's resource environments feature can automate this switching based on app environment.

Does Retool support Stripe Connect's Express account onboarding link generation?

Yes, through the Create Account Link operation in the Stripe query editor. Configure the query to generate an onboarding URL for a specific connected account ID, set the refresh_url and return_url parameters to point back to your Retool app or an external page, and surface the generated link as a button in your dashboard. This allows operations teams to re-send onboarding links to accounts with incomplete verification directly from Retool.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire Retool integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.