Connect
Clone customers across accounts

Clone customers across accounts

With Connect, you can clone your customers' payment information across multiple connected accounts for reuse.

For some business models, it’s helpful to reuse your customers’ payment information across connected accounts. For example, a customer who makes a purchase from one of your connected sellers shouldn’t need to re-enter their credit card or bank account details to purchase from another seller.

With Connect, you can accomplish this by following three steps:

  1. Storing customers, with a payment method, on the platform account
  2. Making tokens to clone the payment method when it’s time to charge the customer on behalf of a connected account
  3. Creating charges using the new tokens

Step 1: Storing customers

When not cloning payment methods, you save the Stripe Customer objects on each individual connected Stripe account. When cloning payment methods, you instead save them on the platform Stripe account.

This is an API call but be sure to use your own secret and publishable keys instead of the connect account’s.

curl https://api.stripe.com/v1/customers \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d email="paying.user@example.com" \ -d source=tok_mastercard
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' customer = Stripe::Customer.create({ email: 'paying.user@example.com', source: 'tok_mastercard', })
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' customer = stripe.Customer.create( email='paying.user@example.com', source='tok_mastercard', )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $customer = \Stripe\Customer::create([ 'email' => 'paying.user@example.com', 'source' => 'tok_mastercard', ]);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; CustomerCreateParams params = CustomerCreateParams.builder() .setEmail("paying.user@example.com") .setSource("tok_mastercard") .build(); Customer customer = Customer.create(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const customer = await stripe.customers.create({ email: 'paying.user@example.com', source: 'tok_mastercard', });
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.CustomerParams{ Email: "paying.user@example.com", } params.SetSource("tok_mastercard") cus, _ := customer.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new CustomerCreateOptions { Email = "paying.user@example.com", Source = "tok_mastercard", }; var service = new CustomerService(); var customer = service.Create(options);

Step 2: Making tokens

When you’re ready to create a charge on a connected account using a customer saved on your platform account, create a new token for that purpose. You’ll need:

  • The Stripe account ID—something like acct_7XR3A3YGeq7iJIGL—of the connected account for whom you’re making the charge
  • The customer ID—something like cus_hFJLMMluEldQuL—of the customer (in your platform account) being charged
  • The card or bank account ID for that customer, if you want to charge a specific card or bank account rather than the default
curl https://api.stripe.com/v1/tokens \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d customer="{{CUSTOMER_ID}}" \ -H "Stripe-Account: {{CONNECTED_STRIPE_ACCOUNT_ID}}"
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' token = Stripe::Token.create({ customer: 'cus_fNeRsaPVMSc8s0', }, { stripe_account: '{{CONNECTED_STRIPE_ACCOUNT_ID}}', })
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' token = stripe.Token.create( customer='cus_sttjweJ5dRc8aS', stripe_account='{{CONNECTED_STRIPE_ACCOUNT_ID}}', )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $token = \Stripe\Token::create([ 'customer' => 'cus_HXu6eF8ITwgvmD' ], [ 'stripe_account' => '{{CONNECTED_STRIPE_ACCOUNT_ID}}', ]);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; TokenCreateParams params = TokenCreateParams.builder() .setCustomer("cus_BvU4kBCyZIzwJi") .build(); RequestOptions requestOptions = RequestOptions.builder() .setStripeAccount("{{CONNECTED_STRIPE_ACCOUNT_ID}}") .build(); Token token = Token.create(params, requestOptions);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const token = await stripe.tokens.create({ customer: 'cus_YGGG4Kcl9D5BJ3', }, { stripeAccount: '{{CONNECTED_STRIPE_ACCOUNT_ID}}', });
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.TokenParams{ Customer: stripe.String("cus_fp9PkBltsPMC0P"), } params.SetStripeAccount("{{CONNECTED_STRIPE_ACCOUNT_ID}}") t, _ := token.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new TokenCreateOptions { Customer = "cus_fp9PkBltsPMC0P", }; var requestOptions = new RequestOptions { StripeAccount = "{{CONNECTED_STRIPE_ACCOUNT_ID}}", }; var service = new TokenService(); var token = service.Create(options, requestOptions);

Step 3: Creating charges

With the token generated in the previous step, attach this token to a customer on the connected account.

curl https://api.stripe.com/v1/customers \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d source=tok_mastercard \ -H "Stripe-Account: {{CONNECTED_STRIPE_ACCOUNT_ID}}"
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' customer = Stripe::Customer.create({ source: token.id, }, { stripe_account: '{{CONNECTED_STRIPE_ACCOUNT_ID}}', })
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' customer = stripe.Customer.create( source=token.id, stripe_account='{{CONNECTED_STRIPE_ACCOUNT_ID}}', )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $customer = \Stripe\Customer::create([ 'source' => $token->id, ], [ 'stripe_account' => '{{CONNECTED_STRIPE_ACCOUNT_ID}}', ]);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; CustomerCreateParams params = CustomerCreateParams.builder() .setSource(token.getId()) .build(); RequestOptions requestOptions = RequestOptions.builder() .setStripeAccount("{{CONNECTED_STRIPE_ACCOUNT_ID}}") .build(); Customer customer = Customer.create(params, requestOptions);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const customer = await stripe.customers.create({ source: token.id, }, { stripeAccount: '{{CONNECTED_STRIPE_ACCOUNT_ID}}', });
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.CustomerParams{} params.SetSource(token.id) params.SetStripeAccount("{{CONNECTED_STRIPE_ACCOUNT_ID}}") cus, _ := customer.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new CustomerCreateOptions { Source = token.Id, }; var requestOptions = new RequestOptions { StripeAccount = "{{CONNECTED_STRIPE_ACCOUNT_ID}}", }; var service = new CustomerService(); var customer = service.Create(options, requestOptions);

Then, use the customer ID (e.g., cus_cMaSelQWm48WMm) and the payment method ID (e.g., card_6JrChS0L3jalEG) returned by the customers.create call to charge the customer.

curl https://api.stripe.com/v1/payment_intents \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d amount=999 \ -d currency=usd \ -d "payment_method_types[]"=card \ -d payment_method="{{PAYMENT_METHOD_ID}}" \ -d customer="{{CUSTOMER_ID}}" \ -H "Stripe-Account: {{CONNECTED_STRIPE_ACCOUNT_ID}}"
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' intent = Stripe::PaymentIntent.create({ amount: 999, currency: 'usd', payment_method_types: ['card'], payment_method: '{{PAYMENT_METHOD_ID}}', customer: '{{CUSTOMER_ID}}', }, { stripe_account: '{{CONNECTED_STRIPE_ACCOUNT_ID}}', })
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' stripe.PaymentIntent.create( amount=999, currency='usd', payment_method_types=['card'], payment_method='{{PAYMENT_METHOD_ID}}', customer='{{CUSTOMER_ID}}', stripe_account='{{CONNECTED_STRIPE_ACCOUNT_ID}}', )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\PaymentIntent::create([ 'amount' => 999, 'currency' => 'usd', 'payment_method_types' => ['card'], 'payment_method' => '{{PAYMENT_METHOD_ID}}', 'customer' => '{{CUSTOMER_ID}}', ], [ 'stripe_account' => '{{CONNECTED_STRIPE_ACCOUNT_ID}}', ]);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; PaymentIntentCreateParams params = PaymentIntentCreateParams.builder() .setAmount(1099L) .setCurrency("usd") .addPaymentMethodType("card") .setPaymentMethod("{{PAYMENT_METHOD_ID}}") .setCustomer("{{CUSTOMER_ID}}") .build(); RequestOptions requestOptions = RequestOptions.builder() .setStripeAccount("{{CONNECTED_STRIPE_ACCOUNT_ID}}") .build(); PaymentIntent paymentIntent = PaymentIntent.create(params, requestOptions);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const paymentIntent = await stripe.paymentIntents.create({ amount: 999, currency: 'usd', payment_method_types: ['card'], payment_method: '{{PAYMENT_METHOD_ID}}', customer: '{{CUSTOMER_ID}}', }, { stripeAccount: '{{CONNECTED_STRIPE_ACCOUNT_ID}}', });
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.PaymentIntentParams{ Amount: stripe.Int64(1099), Currency: stripe.String(string(stripe.CurrencyUSD)), PaymentMethodTypes: stripe.StringSlice([]string{ "card", }), PaymentMethod: stripe.String("{{PAYMENT_METHOD_ID}}"), Customer: stripe.String("{{CUSTOMER_ID}}"), } params.SetStripeAccount("{{CONNECTED_STRIPE_ACCOUNT_ID}}") pi, _ := paymentintent.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new PaymentIntentCreateOptions { Amount = 1099, Currency = "usd", PaymentMethodTypes = new List<string> { "card" }, PaymentMethod = "{{PAYMENT_METHOD_ID}}", Customer = "{{CUSTOMER_ID}}", }; var requestOptions = new RequestOptions { StripeAccount = "{{CONNECTED_STRIPE_ACCOUNT_ID}}", }; var service = new PaymentIntentService(); var paymentIntent = service.Create(options, requestOptions);

Further reading

Discover what other Connect functionality is available!

Was this page helpful?
Questions? Contact us.
Developer tutorials on YouTube.