Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stripe Connect: limit the number of steps during the account linking onboarding

I'm testing Stripe Connect to allow users to pay other users. I'm testing it with the Stripe Java library (in Kotlin).

As the documentation suggest I need the users that will receive money to create a Stripe account with the Account.create API, and then to link the account with the AccountLink.create API.

When the user go through the Stripe onboarding flow (the Stripe url received by the AccountLink.create API) they are required to input a lot of data in many steps.

This steps are:

  • 01: "Get started with Stripe": user is asked to enater the email
  • 02: "Create your free Stripe account": user need to enter email and password
  • 03: "Secure your account with a mobile number": enable the 2FA
  • 04: "Let’s start with some basics": user is asket to enter the Business location and the Type of business
  • 05: "Verify your personal details": user is asked to enter Name, Address, Email address and Phone number
  • 06: "Professional details": the user have to enter VAT number (optional) and select an Industry
  • 07: "Add your bank to receive payouts": the user have to enter Currency and Bank details
  • 08: "Add public details for customers": the user have to enter the "Statement descriptor", "Shortened descriptor" and the "Customer support phone number"
  • 09: "Show customers your climate commitment": the user need to select, or skip, a climate contribution
  • 10: "Review and finish up": the user have to review and confirm the data

I would like to only keep steps 1, 2, 3, 5 (without address and phone number), 7 and 10 during the initial onboarding, and remove the other steps, to decrease friction.

I saw other websites using Stripe Connect, and I know for a fact that it is possible.

This is the code I'm using:

Account.create request:

suspend fun stripeCreateNewAccount(
    email: String,
    localID: String,
    productDescription: String,
    onSuccess: suspend (Account?) -> Unit,
) {
    try {
        Stripe.apiKey = Constants.STRIPE_TOKEN_TEST
        val metadata: MutableMap<String, String> = HashMap()
        metadata["id"] = localID
        val createAccountParams = AccountCreateParams.Builder()
            .setType(AccountCreateParams.Type.STANDARD)
            .setEmail(email.lowercase().trim())
            .setMetadata(metadata)
            .setBusinessType(AccountCreateParams.BusinessType.INDIVIDUAL)
            .setBusinessProfile(
                AccountCreateParams.BusinessProfile.builder()
                    .setUrl(url)
                    .setName("Testing Stripe connect")
                    .setProductDescription(productDescription)
                    .build()
            )
            .setCompany(
                AccountCreateParams.Company.Builder()
                    .setName("Test Company Name")
                    .build()
            )
            .setIndividual(
                AccountCreateParams.Individual.Builder()
                    .setFirstName("John")
                    .setLastName("Smith")
                    .setEmail(email.lowercase().trim())
                    .build()
            )
            .setBusinessProfile(
                AccountCreateParams.BusinessProfile.builder()
                    .setUrl("${Constants.BASE_URL}/list/$localID" )
                    .setProductDescription(productDescription)
                    .build()
            )
            .build()
        onSuccess(Account.create(createAccountParams))
    } catch (e: Exception) {
        e.printStackTrace()
        onSuccess(null)
    }
}

and this is the AccountLink.create request:

suspend fun stripeLinkExistingAccount(
    idAccountToLink: String,
    onCompleted: suspend (String?) -> Unit,
) {
    try {
        Stripe.apiKey = Constants.STRIPE_TOKEN_TEST
        val params = AccountLinkCreateParams
            .builder()
            .setAccount(idAccountToLink)
            .setRefreshUrl("${Constants.BASE_URL}/profile")
            .setReturnUrl("${Constants.BASE_URL}/profile")
            .setType(AccountLinkCreateParams.Type.ACCOUNT_ONBOARDING)
            .build()
        AccountLink.create(params)?.let { accountLink ->
            onCompleted(accountLink.url) // The Stripe onboarding url
        } ?: run {
            // Something went wrong
            onCompleted(null)
        }
    } catch (e: Exception) {
        e.printStackTrace()
        onCompleted(null)
    }
}
like image 267
phonebuilder Avatar asked Oct 22 '25 04:10

phonebuilder


1 Answers

Unfortunately, this is not something you can control. You are creating a Standard account which means the person signs up directly with Stripe and opens a "full account" with them. Stripe will need to collect all the bits of information they require for identity verification, but they will also collect additional details they need or want to offer (like the Climate screen). You can't skip this.

One potential alternative would be to switch to Express accounts instead for example where you control more of the onboarding. But it comes with different risks and restrictions as covered in the docs here.

like image 172
koopajah Avatar answered Oct 24 '25 09:10

koopajah