Statement Descriptors with Connect

    Learn how statement descriptors work for charges and payouts made using Connect.

    When using Connect, platforms can dictate the information shown on the customer’s card and bank statements when:

    • Customers make payments
    • Sending payouts to connected Express and Custom accounts

    Setting accurate statement descriptors is important because it explains to customers what a charge is for, which can reduce the risk of chargebacks and disputes.

    Statement descriptor requirements

    Statement descriptors:

    • Are limited to between 5 and 22 characters.
    • Must contain at least 5 characters (one of which must be a letter), and cannot use the special characters <, >, \, ', ", or *.
    • Need to reflect your doing business as (DBA) name.
    • Consist of more than a common term or website URL.

    Payment statement descriptors

    The statement descriptor that’s displayed on a customer’s bank or card statement depends on:

    • How you create charges.
    • Whether the settlement merchant is set with the on_behalf_of attribute.

    When using destination charges or separate charges and transfers, the on_behalf_of attribute dictates the settlement merchant (which includes whose statement descriptor is displayed). When on_behalf_of is set to the connected account, the connected account’s statement descriptor is used. When on_behalf_of is not provided, the platform’s descriptor is used.

    When charging directly on the connected account, the connected account is the settlement merchant and their descriptor is used. Charging directly on a connected account is only supported for connected accounts with the card_payments capability.

    You can set a Custom account’s statement descriptor when you create the account using the settings[payments][statement_descriptor] argument on the Account object:

    curl -X POST https://api.stripe.com/v1/accounts \
      -u {PLATFORM_SECRET_KEY}: \
      -d type=custom \
      -d country=US \
      -d business_type=company \
      -d requested_capabilities[]=card_payments \
      -d settings[payments][statement_descriptor]="ROCKET RIDES"

    If a connected account doesn’t have a statement_descriptor set, the account’s business or legal name is used instead.

    Dynamic statement descriptors

    Additionally, you can set the statement descriptor dynamically on every charge request with the statement_descriptor argument on the Charge object:

    curl https://api.stripe.com/v1/charges \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d amount=1000 \
      -d currency=usd \
      -d source=tok_visa \
      -d statement_descriptor="Custom descriptor" \
      -H "Stripe-Account: {CONNECTED_STRIPE_ACCOUNT_ID}"
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    charge = Stripe::Charge.create({
      amount: 1000,
      currency: "usd",
      source: "tok_visa",
      statement_descriptor: "Custom descriptor",
    }, stripe_account: "{CONNECTED_STRIPE_ACCOUNT_ID}")
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    charge = stripe.Charge.create(
      amount=1000,
      currency="usd",
      source="tok_visa",
      statement_descriptor="Custom descriptor",
      stripe_account="{CONNECTED_STRIPE_ACCOUNT_ID}",
    )
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    $charge = \Stripe\Charge::create([
      "amount" => 1000,
      "currency" => "usd",
      "source" => "tok_visa",
      "statement_descriptor" => "Custom descriptor",
    ], ["stripe_account" => "{CONNECTED_STRIPE_ACCOUNT_ID}"]);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("amount", 1000);
    params.put("currency", "usd");
    params.put("source", "tok_visa");
    params.put("statement_descriptor", "Custom descriptor");
    
    RequestOptions requestOptions = RequestOptions.builder().setStripeAccount({CONNECTED_STRIPE_ACCOUNT_ID}).build();
    Charge charge = Charge.create(params, requestOptions);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.charges.create({
      amount: 1000,
      currency: "usd",
      source: "tok_visa",
      statement_descriptor: "Custom descriptor",
    }, {
      stripe_account: "{CONNECTED_STRIPE_ACCOUNT_ID}",
    }).then(function(charge) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    params := &stripe.ChargeParams{
      Amount: stripe.Int64(1000),
      Currency: stripe.String(string(stripe.CurrencyUSD)),
      StatementDescriptor: stripe.String("Custom descriptor"),
    }
    params.SetStripeAccount("{CONNECTED_STRIPE_ACCOUNT_ID}")
    params.SetSource("tok_visa")
    
    charge, err := charge.New(params)
    

    When setting the statement descriptor dynamically on credit and debit card charges, the dynamic portion is appended to the settlement merchant’s statement descriptor (separated by an * and an empty space). For example, a statement descriptor for a business, named Rocket Rides, that includes the day and time rides are taken might look like ROCKET RIDES* WED 1PM.

    The * and empty space count towards the 22 character limit and Stripe automatically allots 10 characters for the dynamic statement descriptor. This means that the settlement merchant’s descriptor might be truncated if it’s longer than 10 characters (assuming the dynamic statement descriptor is also greater than 10 characters). If the dynamic statement descriptor is also greater than 10 characters, both descriptors are truncated at 10 characters.

    If you’re having issues with the character limits, you can pass a statement_descriptor_prefix or set a shortened descriptor in the Stripe Dashboard to shorten the settlement merchant’s descriptor. This allows more room for the dynamic statement descriptor. The statement_descriptor_prefix:

    • Replaces the settlement merchant’s statement descriptor when using dynamic descriptors.
    • Can be between 2 and 10 characters.

    If you’re not sure what your full dynamic statement descriptors look like when they’re combined, you can check them in the the Stripe Dashboard.

    Additional statement information

    In addition to the statement descriptor, a business address and phone number can also be displayed on customers’ statements. The information that’s displayed depends on the way you create charges.

    Direct charges

    • Address: The connected account’s business address. For Express and Custom accounts, if no business address is provided, the platform’s address is shown on the customer’s statement.

    • Phone number: The connected account’s phone number. For Express and Custom accounts, the platform’s phone number is used if one is not listed on the connected account.

    Charging through the platform

    When using destination charges or separate charges and transfers, the on_behalf_of attribute dictates which address and phone number are displayed. If on_behalf_of is set, the connected account’s information is displayed. If on_behalf_of is not provided, the platform’s address and phone number are displayed.

    Express and Custom payouts

    Payouts to Express and Custom accounts use STRIPE as the statement descriptor. However, if you configured the Statement descriptor field in the Dashboard or configured the statement_descriptor setting on a connected account, then that value is used instead. When creating a manual payout, this can be customized on a per-payout basis also using the statement_descriptor parameter, as shown below. Standard accounts manage their own payouts.

    curl https://api.stripe.com/v1/payouts \
      -u {PLATFORM_SECRET_KEY}: \
      -H "Stripe-Account: {CONNECTED_STRIPE_ACCOUNT_ID}" \
      -d amount=1000 \
      -d currency=usd \
      -d statement_descriptor="Custom descriptor"
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    payout = Stripe::Payout.create({
      amount: 1000,
      currency: 'usd',
      statement_descriptor: 'Custom descriptor',
    }, {stripe_account: CONNECTED_STRIPE_ACCOUNT_ID})
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    payout = stripe.Payout.create(
      amount=1000,
      currency='usd',
      statement_descriptor='Custom descriptor',
      stripe_account=CONNECTED_STRIPE_ACCOUNT_ID,
    )
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    $payout = \Stripe\Payout::create([
        'amount' => 1000,
        'currency' => 'usd',
      'statement_descriptor' => 'Custom descriptor',
    ], ['stripe_account' => CONNECTED_STRIPE_ACCOUNT_ID]);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    RequestOptions requestOptions = RequestOptions.builder().setStripeAccount(CONNECTED_STRIPE_ACCOUNT_ID).build();
    
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("amount", 1000);
    params.put("currency", "usd");
    params.put("statement_descriptor", "Custom descriptor");
    Payout payout = Payout.create(params, requestOptions);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.payouts.create({
      amount: 1000,
      currency: 'usd',
      statement_descriptor: 'Custom descriptor',
    }, {
      stripe_account: '{CONNECTED_STRIPE_ACCOUNT_ID}',
    }).then(function(payout) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    params := &stripe.PayoutParams{
      Amount: stripe.Int64(1000),
      Currency: stripe.String(string(stripe.CurrencyUSD)),
      StatementDescriptor: stripe.String("Custom descriptor"),
    }
    params.SetStripeAccount("{CONNECTED_STRIPE_ACCOUNT_ID}")
    
    po, err := payout.New(params)
    

    Banks typically display the statement descriptor in one of these ways:

    • Originator name
    • Transfer reference
    • Raw description

    Note that although we enforce a maximum of 22 characters, most banks truncate this information or display it inconsistently. Some banks may not display any descriptor information at all.

    Questions?

    We're always happy to help with code or other questions you might have. Search our documentation, contact support, or connect with our sales team. You can also chat live with other developers in #stripe on freenode.

    Was this page helpful? Yes No

    Send

    Thank you for helping improve Stripe's documentation. If you need help or have any questions, please consider contacting support.

    On this page