Services Plugins FAQs

Help needed with Stripe marketplace express pro please!

Hi all,

I’ve been wrestling with the ‘Stripe Marketplace Express pro’ plugin for the past week but to no avail. I just can’t seem to get the API calls to work, maybe my workflows are incorrect…

Either on here or a short 30m/1hr zoom call, could someone please breakdown what I need to setup from Bubble side and on stripe side for the following:

Inside my app (Wallet page)

  • The user is on the Wallet page in my Bubble app and clicks the “Set Up Payouts” button.

Step 1 – Stripe Onboarding Form

  • The user is redirected to a Stripe-hosted page.
  • This page will be branded with my app’s logo and colours.
  • Stripe will request only the minimum information required by financial regulations (e.g., name, address, and bank account details for payouts).
  • This process completes the KYC onboarding for my app.

Step 2 – Redirect Back

  • As soon as the user submits the form, Stripe redirects them back to my app’s Wallet page, and tells my app onboarding is complete

Step 3 – Verification Complete

  • On return, the user’s KYC is complete through Stripe and their bank account details are confirmed.
  • The Withdraw button on my Wallet page becomes active.

Step 4 – Payout Request

  • The user can now request a payout by clicking the Withdraw button in my app.
  • This triggers a workflow that sends a request to Stripe to transfer funds from my Stripe platform account to the user’s connected bank account.

Step 5 – Stripe Executes Payout

  • Stripe processes the payout and transfers the funds.

Step 5 isn’t necessary for now and can be manual since this is only an MVP design. Also the wallet feature in my app is just for illustration. the money actually moves between my apps stripe account and the user’s bank account which users setup.

Hi @dawoudaayoub,

Thanks for the clear breakdown - happy to map this to the Stripe Marketplace Express Pro setup in Bubble and what must exist on the Stripe side.

Prerequisites (once)

Stripe Dashboard

  • Enable Connect (Express) for your platform and finish your platform’s verification.
  • Copy Publishable / Secret keys (test & live) and Client ID.
  • Add your Redirect URIs (e.g., https://yourapp.com/wallet for live and version‑test for dev).

Bubble / Plugin

  • Install the plugin and paste keys + Client ID in the plugin settings (both Dev & Live).
  • Create two fields on User: stripe_account_id (text) and payouts_enabled (yes/no).

Step-by-step flow (matching your steps)

Step 1 - Onboarding (from your Wallet page)

  1. Create (or update) a Connected Account

    • Action: Create/Update Connected Account
    • Type: express
    • Save returned account_id (e.g., acct_...) to Current User's stripe_account_id.
  2. Generate onboarding link and redirect

    • Action: Create Onboarding Link (aka Account Link)

    • Params:

      • account = Current User's stripe_account_id
      • refresh_url = your Wallet page
      • return_url = your Wallet page
    • Navigate to result.url.

This shows Stripe’s hosted onboarding branded for your app.

Step 2 - Redirect back

On return to the Wallet page:

  • Action (Page load): Retrieve Connected Account for Current User's stripe_account_id.
  • Read (details_submitted, payouts_enabled, requirements) from the response.
  • Optional but recommended: set up a Connect webhook for account.updated. Update user fields when payouts_enabled becomes true and a bank/external account is attached.

Step 3 - Verification complete (show “Withdraw”)

Show the Withdraw button only if:

  • Current User's stripe_account_id is not empty, and
  • payouts_enabled is true (or Retrieve Connected Account’s payouts_enabled is yes), and
  • The account has an external bank account (Stripe shows this via requirements being empty for payouts).

Step 4 - Request a payout

Key concept: Funds must exist in the connected account’s balance.

Depending on how you charge:

  • Direct to connected account (recommended)
    When creating the payment, set transfer_data[destination]=acct_xxx (plugin action: Create PaymentIntent / Confirm Payment to Connected Account). Funds land directly in the connected account.
    Then either:

    • Let Stripe auto‑payout on schedule, or
    • If you want manual payouts, set schedule to manual (via dashboard or plugin action if you prefer API) and use Create a Payout (on Connected Account) when the user presses Withdraw.
  • Charge on platform, then move funds
    If you charged your platform account, first Create a Transfer to acct_xxx (amount/currency). After transfer settles in the connected account, use Create a Payout (on Connected Account) or let auto‑payout run.

Actions you’ll use for a manual “Withdraw” button:

  1. (If needed) Create a Transferdestination = Current User's stripe_account_id
  2. Create a Payout (Connected Account)account = Current User's stripe_account_id, specify amount & currency.

Step 5 - Stripe executes payout

Stripe processes the payout to the bank account attached to the connected account. You can display payout status by retrieving the payout or listening to payout.paid / payout.failed webhooks (Connect endpoint).


Common pitfalls to avoid

  • Missing Client ID or Redirect URI in Stripe → onboarding link fails.
  • Creating Standard instead of Express account.
  • Not saving acct_xxx to the User and later calling actions without it.
  • Trying to Create Payout when the connected account has no available balance (you must charge with transfer_data or transfer funds first).
  • Currency mismatch between charges, transfers, and payouts.
  • Testing with Live keys on a dev page (or vice‑versa).

If you’d like, please share:

  • A link to your Wallet page (dev),
  • Screenshots of your relevant workflows (onboarding, retrieve account, withdraw), and
  • The exact action where you’re stuck (error message or step that doesn’t return what you expect).

This could help us pinpoint the root of the issue.

Feel free to check the docs for reference: https://docs.zeroqode.com/plugins/stripe-marketplace-express-pro and the configuration of our demo editor

Best regards,
Support Team
Browse all Zeroqode Plugins for bubble
Banner_Last3

1 Like

Hi Constantin,

Thank you for your help.

I’m still encountering a persistent error with the “Create an account link” action in the plugin.


However, I have checked my Stripe Dashboard Logs, and they confirm that the API call to POST /v1/account_links is completely successful, returning a 200 OK status with the correct URL in the response body.

I have already confirmed that my API keys are correct in the plugin settings and that the correct Account ID is being passed to the action. (But you can double check - I also haven’t added Bearer)

Could you please advise why the plugin action might be returning an error state to Bubble, even when the underlying API call to Stripe is successful? It seems the plugin is not correctly handling the successful response from Stripe.

Thank you for your help.

Hello @dawoudaaayoub,

Thank you for the details and screenshots.

The 401 error indicates an authentication issue with the Stripe API call, specifically missing the "Bearer " prefix in the authorization header.

Based on the plugin documentation, you can try adding "Bearer " (with a space) before your secret keys in the plugin settings:

  • For Stripe Secret Key: Set to “Bearer sk_live_51Rp95VeUkUAYog…” (replace with your full key).
  • For Stripe Secret Key - dev.: Set to “Bearer sk_test_51Rp95VeUkUAYog…” (replace with your full key).

Leave the API Key fields as your secret keys without the prefix if they’re used separately, but prioritize the secret key fields for authentication in actions like “Create an account link”.

Test in preview mode (using dev keys) and check the test mode Stripe dashboard logs for the /v1/account_links call. If logs previously showed 200, they may be from live mode or a direct test—ensure consistency with your Bubble environment.

If the error persists after updating, share updated plugin settings screenshots and the exact Stripe log entry (test/live mode).

Best regards,
Support Team
Browse all Zeroqode Plugins for bubble
Banner_Last3

Hi @dawoudaayoub,

Just checking in - were you able to test after adding “Bearer ” before the secret keys and checking the Stripe logs in test mode?

If the 401 persists, please share screenshots of your plugin settings (both keys) and the exact Stripe log entry (request ID + mode), and we’ll dig in right away.

Best regards,
Support Team
Browse all Zeroqode Plugins for bubble
Banner_Last3