# Customize text and policies Customize the text that your customers see, and the policies Checkout displays. # Stripe-hosted page > This is a Stripe-hosted page for when payment-ui is stripe-hosted. View the original doc at https://docs.stripe.com/payments/checkout/customization/policies?payment-ui=stripe-hosted. ## Add custom text You can present additional text to customers when they pay with Stripe Checkout, such as shipping and processing times. You’re prohibited from using this feature to create custom text that violates or creates ambiguity with the Stripe generated text on Checkout, obligations under your Stripe agreement, Stripe’s policies, and applicable laws. ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Checkout.SessionCreateOptions { LineItems = new List { new Stripe.Checkout.SessionLineItemOptions { Price = "<>", Quantity = 1 }, }, Mode = "payment", ShippingAddressCollection = new Stripe.Checkout.SessionShippingAddressCollectionOptions { AllowedCountries = new List { "US" }, }, CustomText = new Stripe.Checkout.SessionCustomTextOptions { ShippingAddress = new Stripe.Checkout.SessionCustomTextShippingAddressOptions { Message = "Please note that we can't guarantee 2-day delivery for PO boxes at this time.", }, Submit = new Stripe.Checkout.SessionCustomTextSubmitOptions { Message = "We'll email you instructions on how to get started.", }, AfterSubmit = new Stripe.Checkout.SessionCustomTextAfterSubmitOptions { Message = "Learn more about **your purchase** on our [product page](https://www.stripe.com/).", }, }, SuccessUrl = "https://example.com/success", CancelUrl = "https://example.com/cancel", }; var service = new Stripe.Checkout.SessionService(); Stripe.Checkout.Session session = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.CheckoutSessionParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{ &stripe.CheckoutSessionLineItemParams{ Price: stripe.String("<>"), Quantity: stripe.Int64(1), }, }, Mode: stripe.String(string(stripe.CheckoutSessionModePayment)), ShippingAddressCollection: &stripe.CheckoutSessionShippingAddressCollectionParams{ AllowedCountries: []*string{stripe.String("US")}, }, CustomText: &stripe.CheckoutSessionCustomTextParams{ ShippingAddress: &stripe.CheckoutSessionCustomTextShippingAddressParams{ Message: stripe.String("Please note that we can't guarantee 2-day delivery for PO boxes at this time."), }, Submit: &stripe.CheckoutSessionCustomTextSubmitParams{ Message: stripe.String("We'll email you instructions on how to get started."), }, AfterSubmit: &stripe.CheckoutSessionCustomTextAfterSubmitParams{ Message: stripe.String("Learn more about **your purchase** on our [product page](https://www.stripe.com/)."), }, }, SuccessURL: stripe.String("https://example.com/success"), CancelURL: stripe.String("https://example.com/cancel"), }; result, err := session.New(params); ``` ```java Stripe.apiKey = "<>"; SessionCreateParams params = SessionCreateParams.builder() .addLineItem( SessionCreateParams.LineItem.builder().setPrice("<>").setQuantity(1L).build() ) .setMode(SessionCreateParams.Mode.PAYMENT) .setShippingAddressCollection( SessionCreateParams.ShippingAddressCollection.builder() .addAllowedCountry(SessionCreateParams.ShippingAddressCollection.AllowedCountry.US) .build() ) .setCustomText( SessionCreateParams.CustomText.builder() .setShippingAddress( SessionCreateParams.CustomText.ShippingAddress.builder() .setMessage( "Please note that we can't guarantee 2-day delivery for PO boxes at this time." ) .build() ) .setSubmit( SessionCreateParams.CustomText.Submit.builder() .setMessage("We'll email you instructions on how to get started.") .build() ) .setAfterSubmit( SessionCreateParams.CustomText.AfterSubmit.builder() .setMessage( "Learn more about **your purchase** on our [product page](https://www.stripe.com/)." ) .build() ) .build() ) .setSuccessUrl("https://example.com/success") .setCancelUrl("https://example.com/cancel") .build(); Session session = Session.create(params); ``` ```node const stripe = require('stripe')('<>'); const session = await stripe.checkout.sessions.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'payment', shipping_address_collection: { allowed_countries: ['US'], }, custom_text: { shipping_address: { message: 'Please note that we can\'t guarantee 2-day delivery for PO boxes at this time.', }, submit: { message: 'We\'ll email you instructions on how to get started.', }, after_submit: { message: 'Learn more about **your purchase** on our [product page](https://www.stripe.com/).', }, }, success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', }); ``` ```python import stripe stripe.api_key = "<>" session = stripe.checkout.Session.create( line_items=[{"price": "<>", "quantity": 1}], mode="payment", shipping_address_collection={"allowed_countries": ["US"]}, custom_text={ "shipping_address": { "message": "Please note that we can't guarantee 2-day delivery for PO boxes at this time.", }, "submit": {"message": "We'll email you instructions on how to get started."}, "after_submit": { "message": "Learn more about **your purchase** on our [product page](https://www.stripe.com/).", }, }, success_url="https://example.com/success", cancel_url="https://example.com/cancel", ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $session = $stripe->checkout->sessions->create([ 'line_items' => [ [ 'price' => '<>', 'quantity' => 1, ], ], 'mode' => 'payment', 'shipping_address_collection' => ['allowed_countries' => ['US']], 'custom_text' => [ 'shipping_address' => [ 'message' => 'Please note that we can\'t guarantee 2-day delivery for PO boxes at this time.', ], 'submit' => ['message' => 'We\'ll email you instructions on how to get started.'], 'after_submit' => [ 'message' => 'Learn more about **your purchase** on our [product page](https://www.stripe.com/).', ], ], 'success_url' => 'https://example.com/success', 'cancel_url' => 'https://example.com/cancel', ]); ``` ```ruby Stripe.api_key = '<>' session = Stripe::Checkout::Session.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'payment', shipping_address_collection: {allowed_countries: ['US']}, custom_text: { shipping_address: { message: 'Please note that we can\'t guarantee 2-day delivery for PO boxes at this time.', }, submit: {message: 'We\'ll email you instructions on how to get started.'}, after_submit: { message: 'Learn more about **your purchase** on our [product page](https://www.stripe.com/).', }, }, success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', }) ``` ![Custom text near shipping address collection](images/checkout/custom-text/shipping-address-custom-text.png) Custom text near the shipping address collection fields ![Custom text above the pay button](images/checkout/custom-text/submit-custom-text.png) Custom text above the **Pay** button ![Custom text below the pay button](images/checkout/custom-text/custom-text-after-submit.png) Custom text after the **Pay** button Your custom text can be up to 1200 characters in length. However, Stripe Checkout is optimized for conversion, and adding extra information might affect your conversion rate. You can bold text or insert a link using [Markdown syntax](https://www.markdownguide.org/cheat-sheet/). ## Customize policies and contact information You can display your return, refund, and legal policies, and your support contact information to your customers on Checkout. Go to [Checkout Settings](https://dashboard.stripe.com/settings/checkout) to configure the information you want to display, including: - Details about your return and refund policies - Your support phone number, email, and website - Links to your terms of service and privacy policy Presenting this information can increase buyer confidence and minimize cart abandonment. ### Configure support and legal policies From [Checkout Settings](https://dashboard.stripe.com/settings/checkout), add support contact information to your sessions by enabling **Contact information**. Similarly, add links to your **Terms of service** and **Privacy policy** to your sessions by enabling **Legal policies**. If you require customers to implicitly consent to your legal policies when they complete their checkout, select the **Display agreement to legal terms** checkbox. You must add your support contact information and legal policy links in your [Public Detail Settings](https://dashboard.stripe.com/settings/public). The following previews show how Checkout displays a dialog with the support contact information, links to the store legal policies, and information about the payment terms. ![A checkout page with contact information.](images/checkout/policies/contact-modal.png) Preview of contact information on Checkout. ![A checkout page with legal policies.](images/checkout/policies/legal-modal.png) Preview of legal policies on Checkout. ### Configure return and refund policies Display your return, refund, or exchange policies, by enabling **Return and Refund policies**. Although businesses that sell physical goods use return policies, businesses that sell digital goods or customized physical goods typically use refund policies. Because they’re not mutually exclusive, you can select both options if your business sells both categories of goods. You can edit your return and refund details, including: - Whether you accept returns, refunds, or exchanges - Whether returns, refunds, or exchanges are free or if they’re subject to a fee - How many days after a purchase you’ll accept returns, refunds, or exchanges - How customers can return items shipped to them - Whether you accept in-store returns - A link to the full return and refund policy - A custom message If you accept free returns, refunds, or exchanges, Checkout highlights the policy for customers. The following previews show how Checkout displays a return policy. In this example, it’s for purchases that can be returned by shipping them or in-store for a full refund (or exchange) for up to 60 days. You can display similar information for refunds. ![Preview of return policies on Checkout](images/checkout/policies/return-policy-modal.png) Preview of return policies on Checkout. ![Preview of a policy highlight on Checkout](images/checkout/policies/policy-highlight.png) Preview of a policy highlight on Checkout. ### Collect a terms of service agreement Businesses often require their customers to agree to their terms of service before they can pay. This might depend on the type of product or subscription. Checkout helps you collect the necessary agreement by requiring a customer to accept your terms before paying. ![Collect terms of service agreement](images/checkout/terms-of-service-consent-collection.png) Collect terms of service agreement You can collect a terms of service agreement with Stripe Checkout when you create a Session: ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Checkout.SessionCreateOptions { LineItems = new List { new Stripe.Checkout.SessionLineItemOptions { Price = "<>", Quantity = 2 }, }, Mode = "payment", SuccessUrl = "https://example.com/success", CancelUrl = "https://example.com/cancel", ConsentCollection = new Stripe.Checkout.SessionConsentCollectionOptions { TermsOfService = "required", }, CustomText = new Stripe.Checkout.SessionCustomTextOptions { TermsOfServiceAcceptance = new Stripe.Checkout.SessionCustomTextTermsOfServiceAcceptanceOptions { Message = "I agree to the [Terms of Service](https://example.com/terms)", }, }, }; var service = new Stripe.Checkout.SessionService(); Stripe.Checkout.Session session = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.CheckoutSessionParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{ &stripe.CheckoutSessionLineItemParams{ Price: stripe.String("<>"), Quantity: stripe.Int64(2), }, }, Mode: stripe.String(string(stripe.CheckoutSessionModePayment)), SuccessURL: stripe.String("https://example.com/success"), CancelURL: stripe.String("https://example.com/cancel"), ConsentCollection: &stripe.CheckoutSessionConsentCollectionParams{ TermsOfService: stripe.String(string(stripe.CheckoutSessionConsentCollectionTermsOfServiceRequired)), }, CustomText: &stripe.CheckoutSessionCustomTextParams{ TermsOfServiceAcceptance: &stripe.CheckoutSessionCustomTextTermsOfServiceAcceptanceParams{ Message: stripe.String("I agree to the [Terms of Service](https://example.com/terms)"), }, }, }; result, err := session.New(params); ``` ```java Stripe.apiKey = "<>"; SessionCreateParams params = SessionCreateParams.builder() .addLineItem( SessionCreateParams.LineItem.builder().setPrice("<>").setQuantity(2L).build() ) .setMode(SessionCreateParams.Mode.PAYMENT) .setSuccessUrl("https://example.com/success") .setCancelUrl("https://example.com/cancel") .setConsentCollection( SessionCreateParams.ConsentCollection.builder() .setTermsOfService(SessionCreateParams.ConsentCollection.TermsOfService.REQUIRED) .build() ) .setCustomText( SessionCreateParams.CustomText.builder() .setTermsOfServiceAcceptance( SessionCreateParams.CustomText.TermsOfServiceAcceptance.builder() .setMessage("I agree to the [Terms of Service](https://example.com/terms)") .build() ) .build() ) .build(); Session session = Session.create(params); ``` ```node const stripe = require('stripe')('<>'); const session = await stripe.checkout.sessions.create({ line_items: [ { price: '<>', quantity: 2, }, ], mode: 'payment', success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', consent_collection: { terms_of_service: 'required', }, custom_text: { terms_of_service_acceptance: { message: 'I agree to the [Terms of Service](https://example.com/terms)', }, }, }); ``` ```python import stripe stripe.api_key = "<>" session = stripe.checkout.Session.create( line_items=[{"price": "<>", "quantity": 2}], mode="payment", success_url="https://example.com/success", cancel_url="https://example.com/cancel", consent_collection={"terms_of_service": "required"}, custom_text={ "terms_of_service_acceptance": { "message": "I agree to the [Terms of Service](https://example.com/terms)", }, }, ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $session = $stripe->checkout->sessions->create([ 'line_items' => [ [ 'price' => '<>', 'quantity' => 2, ], ], 'mode' => 'payment', 'success_url' => 'https://example.com/success', 'cancel_url' => 'https://example.com/cancel', 'consent_collection' => ['terms_of_service' => 'required'], 'custom_text' => [ 'terms_of_service_acceptance' => [ 'message' => 'I agree to the [Terms of Service](https://example.com/terms)', ], ], ]); ``` ```ruby Stripe.api_key = '<>' session = Stripe::Checkout::Session.create({ line_items: [ { price: '<>', quantity: 2, }, ], mode: 'payment', success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', consent_collection: {terms_of_service: 'required'}, custom_text: { terms_of_service_acceptance: { message: 'I agree to the [Terms of Service](https://example.com/terms)', }, }, }) ``` When `consent_collection.terms_of_service='required'`, Checkout dynamically displays a checkbox for collecting the customer’s terms of service agreement. If `consent_collection.terms_of_service='none'`, Checkout won’t display the checkbox and won’t require customers to accept the terms of service. Before requiring agreement to your terms, set your terms of service URL in your [public details](https://dashboard.stripe.com/settings/public) of your business. Setting a privacy policy URL is optional—Checkout also links to your privacy policy when a URL to your Privacy policy is set in your [public details](https://dashboard.stripe.com/settings/public). After a customer completes checkout, you can verify that the customer accepted your terms of service by looking at the Session object in the `checkout.session.completed` webhook, or by retrieving the Session using the API. When the terms are accepted, the Session’s [consent.terms_of_service](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-consent) field is set to `accepted`. You can customize the text that appears next to the checkbox by using `custom_text.terms_of_service_acceptance`. You need to set `consent_collection.terms_of_service='required'`. To use your own terms, insert a Markdown link. For example: `I agree to the [Terms of Service](https://example.com/terms)` Consult your legal and compliance advisors before making any changes to this text. You can’t use this feature to display custom text that violates or creates ambiguity with the Stripe-generated text on Checkout, obligations under your Stripe agreement, Stripe policies, and applicable laws. ### Collect consent for promotional emails You can send promotional emails to inform customers of new products and to share coupons and discounts. Before doing so, you must [collect their consent](https://docs.stripe.com/payments/checkout/promotional-emails-consent.md) to receive promotional emails. ## Customize payment method reuse agreement When a session is in either `setup` or `subscription` mode, or is in `payment` mode with `setup_future_usage` set, Checkout displays a message about reusing the customer’s payment method. The message can include information specific to the selected payment method. You can hide or customize the default text, but not the payment method-specific text. ![Default payment method reuse agreement display in subscription mode](images/checkout/default-subscription-mode-payment-method-reuse-agreement.png) Default payment method reuse agreement in subscription mode By customizing this text, you’re responsible for maintaining compliance, which includes updating this text as card network rules and local regulations change. Don’t use this feature without consulting with your legal team or setting custom text that includes information regarding the reuse of the payment method. Make sure that your customized text covers all modes you plan to support. To hide the payment method reuse agreement text, set `consent_collection.payment_method_reuse_agreement.position='hidden'`. Checkout won’t display its default language governing the reuse of the payment method. To set your own text in place of Stripe’s default language, set `custom_text.after_submit.message`. You can also use `custom_text.submit` or `custom_text.terms_of_service_acceptance` to display your own version of this language. ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Checkout.SessionCreateOptions { LineItems = new List { new Stripe.Checkout.SessionLineItemOptions { Price = "<>", Quantity = 1 }, }, Mode = "subscription", SuccessUrl = "https://example.com/success", CancelUrl = "https://example.com/cancel", ConsentCollection = new Stripe.Checkout.SessionConsentCollectionOptions { PaymentMethodReuseAgreement = new Stripe.Checkout.SessionConsentCollectionPaymentMethodReuseAgreementOptions { Position = "hidden", }, }, CustomText = new Stripe.Checkout.SessionCustomTextOptions { AfterSubmit = new Stripe.Checkout.SessionCustomTextAfterSubmitOptions { Message = "You can cancel your subscription at any time by [logging into your account](https://www.example.com/)", }, }, }; var service = new Stripe.Checkout.SessionService(); Stripe.Checkout.Session session = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.CheckoutSessionParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{ &stripe.CheckoutSessionLineItemParams{ Price: stripe.String("<>"), Quantity: stripe.Int64(1), }, }, Mode: stripe.String(string(stripe.CheckoutSessionModeSubscription)), SuccessURL: stripe.String("https://example.com/success"), CancelURL: stripe.String("https://example.com/cancel"), ConsentCollection: &stripe.CheckoutSessionConsentCollectionParams{ PaymentMethodReuseAgreement: &stripe.CheckoutSessionConsentCollectionPaymentMethodReuseAgreementParams{ Position: stripe.String(string(stripe.CheckoutSessionConsentCollectionPaymentMethodReuseAgreementPositionHidden)), }, }, CustomText: &stripe.CheckoutSessionCustomTextParams{ AfterSubmit: &stripe.CheckoutSessionCustomTextAfterSubmitParams{ Message: stripe.String("You can cancel your subscription at any time by [logging into your account](https://www.example.com/)"), }, }, }; result, err := session.New(params); ``` ```java Stripe.apiKey = "<>"; SessionCreateParams params = SessionCreateParams.builder() .addLineItem( SessionCreateParams.LineItem.builder().setPrice("<>").setQuantity(1L).build() ) .setMode(SessionCreateParams.Mode.SUBSCRIPTION) .setSuccessUrl("https://example.com/success") .setCancelUrl("https://example.com/cancel") .setConsentCollection( SessionCreateParams.ConsentCollection.builder() .setPaymentMethodReuseAgreement( SessionCreateParams.ConsentCollection.PaymentMethodReuseAgreement.builder() .setPosition( SessionCreateParams.ConsentCollection.PaymentMethodReuseAgreement.Position.HIDDEN ) .build() ) .build() ) .setCustomText( SessionCreateParams.CustomText.builder() .setAfterSubmit( SessionCreateParams.CustomText.AfterSubmit.builder() .setMessage( "You can cancel your subscription at any time by [logging into your account](https://www.example.com/)" ) .build() ) .build() ) .build(); Session session = Session.create(params); ``` ```node const stripe = require('stripe')('<>'); const session = await stripe.checkout.sessions.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'subscription', success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', consent_collection: { payment_method_reuse_agreement: { position: 'hidden', }, }, custom_text: { after_submit: { message: 'You can cancel your subscription at any time by [logging into your account](https://www.example.com/)', }, }, }); ``` ```python import stripe stripe.api_key = "<>" session = stripe.checkout.Session.create( line_items=[{"price": "<>", "quantity": 1}], mode="subscription", success_url="https://example.com/success", cancel_url="https://example.com/cancel", consent_collection={"payment_method_reuse_agreement": {"position": "hidden"}}, custom_text={ "after_submit": { "message": "You can cancel your subscription at any time by [logging into your account](https://www.example.com/)", }, }, ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $session = $stripe->checkout->sessions->create([ 'line_items' => [ [ 'price' => '<>', 'quantity' => 1, ], ], 'mode' => 'subscription', 'success_url' => 'https://example.com/success', 'cancel_url' => 'https://example.com/cancel', 'consent_collection' => ['payment_method_reuse_agreement' => ['position' => 'hidden']], 'custom_text' => [ 'after_submit' => [ 'message' => 'You can cancel your subscription at any time by [logging into your account](https://www.example.com/)', ], ], ]); ``` ```ruby Stripe.api_key = '<>' session = Stripe::Checkout::Session.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'subscription', success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', consent_collection: {payment_method_reuse_agreement: {position: 'hidden'}}, custom_text: { after_submit: { message: 'You can cancel your subscription at any time by [logging into your account](https://www.example.com/)', }, }, }) ``` # Embedded form > This is a Embedded form for when payment-ui is embedded-form. View the original doc at https://docs.stripe.com/payments/checkout/customization/policies?payment-ui=embedded-form. ## Add custom text When customers pay with Checkout, you can present additional text, such as shipping and processing times. You’re prohibited from using this feature to create custom text that violates or creates ambiguity with the Stripe generated text on Checkout, obligations under your Stripe agreement, Stripe’s policies, and applicable laws. ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Checkout.SessionCreateOptions { LineItems = new List { new Stripe.Checkout.SessionLineItemOptions { Price = "<>", Quantity = 1 }, }, Mode = "payment", ShippingAddressCollection = new Stripe.Checkout.SessionShippingAddressCollectionOptions { AllowedCountries = new List { "US" }, }, CustomText = new Stripe.Checkout.SessionCustomTextOptions { ShippingAddress = new Stripe.Checkout.SessionCustomTextShippingAddressOptions { Message = "Please note that we can't guarantee 2-day delivery for PO boxes at this time.", }, Submit = new Stripe.Checkout.SessionCustomTextSubmitOptions { Message = "We'll email you instructions on how to get started.", }, AfterSubmit = new Stripe.Checkout.SessionCustomTextAfterSubmitOptions { Message = "Learn more about **your purchase** on our [product page](https://www.stripe.com/).", }, }, UiMode = "embedded", ReturnUrl = "https://example.com/return", }; var service = new Stripe.Checkout.SessionService(); Stripe.Checkout.Session session = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.CheckoutSessionParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{ &stripe.CheckoutSessionLineItemParams{ Price: stripe.String("<>"), Quantity: stripe.Int64(1), }, }, Mode: stripe.String(string(stripe.CheckoutSessionModePayment)), ShippingAddressCollection: &stripe.CheckoutSessionShippingAddressCollectionParams{ AllowedCountries: []*string{stripe.String("US")}, }, CustomText: &stripe.CheckoutSessionCustomTextParams{ ShippingAddress: &stripe.CheckoutSessionCustomTextShippingAddressParams{ Message: stripe.String("Please note that we can't guarantee 2-day delivery for PO boxes at this time."), }, Submit: &stripe.CheckoutSessionCustomTextSubmitParams{ Message: stripe.String("We'll email you instructions on how to get started."), }, AfterSubmit: &stripe.CheckoutSessionCustomTextAfterSubmitParams{ Message: stripe.String("Learn more about **your purchase** on our [product page](https://www.stripe.com/)."), }, }, UIMode: stripe.String(string(stripe.CheckoutSessionUIModeEmbedded)), ReturnURL: stripe.String("https://example.com/return"), }; result, err := session.New(params); ``` ```java Stripe.apiKey = "<>"; SessionCreateParams params = SessionCreateParams.builder() .addLineItem( SessionCreateParams.LineItem.builder().setPrice("<>").setQuantity(1L).build() ) .setMode(SessionCreateParams.Mode.PAYMENT) .setShippingAddressCollection( SessionCreateParams.ShippingAddressCollection.builder() .addAllowedCountry(SessionCreateParams.ShippingAddressCollection.AllowedCountry.US) .build() ) .setCustomText( SessionCreateParams.CustomText.builder() .setShippingAddress( SessionCreateParams.CustomText.ShippingAddress.builder() .setMessage( "Please note that we can't guarantee 2-day delivery for PO boxes at this time." ) .build() ) .setSubmit( SessionCreateParams.CustomText.Submit.builder() .setMessage("We'll email you instructions on how to get started.") .build() ) .setAfterSubmit( SessionCreateParams.CustomText.AfterSubmit.builder() .setMessage( "Learn more about **your purchase** on our [product page](https://www.stripe.com/)." ) .build() ) .build() ) .setUiMode(SessionCreateParams.UiMode.EMBEDDED) .setReturnUrl("https://example.com/return") .build(); Session session = Session.create(params); ``` ```node const stripe = require('stripe')('<>'); const session = await stripe.checkout.sessions.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'payment', shipping_address_collection: { allowed_countries: ['US'], }, custom_text: { shipping_address: { message: 'Please note that we can\'t guarantee 2-day delivery for PO boxes at this time.', }, submit: { message: 'We\'ll email you instructions on how to get started.', }, after_submit: { message: 'Learn more about **your purchase** on our [product page](https://www.stripe.com/).', }, }, ui_mode: 'embedded', return_url: 'https://example.com/return', }); ``` ```python import stripe stripe.api_key = "<>" session = stripe.checkout.Session.create( line_items=[{"price": "<>", "quantity": 1}], mode="payment", shipping_address_collection={"allowed_countries": ["US"]}, custom_text={ "shipping_address": { "message": "Please note that we can't guarantee 2-day delivery for PO boxes at this time.", }, "submit": {"message": "We'll email you instructions on how to get started."}, "after_submit": { "message": "Learn more about **your purchase** on our [product page](https://www.stripe.com/).", }, }, ui_mode="embedded", return_url="https://example.com/return", ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $session = $stripe->checkout->sessions->create([ 'line_items' => [ [ 'price' => '<>', 'quantity' => 1, ], ], 'mode' => 'payment', 'shipping_address_collection' => ['allowed_countries' => ['US']], 'custom_text' => [ 'shipping_address' => [ 'message' => 'Please note that we can\'t guarantee 2-day delivery for PO boxes at this time.', ], 'submit' => ['message' => 'We\'ll email you instructions on how to get started.'], 'after_submit' => [ 'message' => 'Learn more about **your purchase** on our [product page](https://www.stripe.com/).', ], ], 'ui_mode' => 'embedded', 'return_url' => 'https://example.com/return', ]); ``` ```ruby Stripe.api_key = '<>' session = Stripe::Checkout::Session.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'payment', shipping_address_collection: {allowed_countries: ['US']}, custom_text: { shipping_address: { message: 'Please note that we can\'t guarantee 2-day delivery for PO boxes at this time.', }, submit: {message: 'We\'ll email you instructions on how to get started.'}, after_submit: { message: 'Learn more about **your purchase** on our [product page](https://www.stripe.com/).', }, }, ui_mode: 'embedded', return_url: 'https://example.com/return', }) ``` ![Custom text near shipping address collection](images/checkout/custom-text/shipping-address-custom-text.png) Custom text near the shipping address collection fields ![Custom text above the pay button](images/checkout/custom-text/submit-custom-text.png) Custom text above the **Pay** button ![Custom text below the pay button](images/checkout/custom-text/custom-text-after-submit.png) Custom text after the **Pay** button Your custom text can be up to 1200 characters in length. However, Stripe Checkout is optimized for conversion, and adding extra information might affect your conversion rate. You can bold text or insert a link using [Markdown syntax](https://www.markdownguide.org/cheat-sheet/). ## Customize policies and contact information You can display your return, refund, and legal policies, and your support contact information to your customers on Checkout. Go to [Checkout Settings](https://dashboard.stripe.com/settings/checkout) to configure the information you want to display, including: - Details about your return and refund policies - Your support phone number, email, and website - Links to your terms of service and privacy policy Presenting this information can increase buyer confidence and minimize cart abandonment. ### Configure support and legal policies From [Checkout Settings](https://dashboard.stripe.com/settings/checkout), add support contact information to your sessions by enabling **Contact information**. Similarly, add links to your **Terms of service** and **Privacy policy** to your sessions by enabling **Legal policies**. If you require customers to implicitly consent to your legal policies when they complete their checkout, select the **Display agreement to legal terms** checkbox. You must add your support contact information and legal policy links in your [Public Detail Settings](https://dashboard.stripe.com/settings/public). The following previews show how Checkout displays a dialog with the support contact information, links to the store legal policies, and information about the payment terms. ![A checkout page with contact information.](images/checkout/policies/contact-modal.png) Preview of contact information on Checkout. ![A checkout page with legal policies.](images/checkout/policies/legal-modal.png) Preview of legal policies on Checkout. ### Configure return and refund policies Display your return, refund, or exchange policies, by enabling **Return and Refund policies**. Although businesses that sell physical goods use return policies, businesses that sell digital goods or customized physical goods typically use refund policies. Because they’re not mutually exclusive, you can select both options if your business sells both categories of goods. You can edit your return and refund details, including: - Whether you accept returns, refunds, or exchanges - Whether returns, refunds, or exchanges are free or if they’re subject to a fee - How many days after a purchase you’ll accept returns, refunds, or exchanges - How customers can return items shipped to them - Whether you accept in-store returns - A link to the full return and refund policy - A custom message If you accept free returns, refunds, or exchanges, Checkout highlights the policy for customers. The following previews show how Checkout displays a return policy. In this example, it’s for purchases that can be returned by shipping them or in-store for a full refund (or exchange) for up to 60 days. You can display similar information for refunds. ![Preview of return policies on Checkout](images/checkout/policies/return-policy-modal.png) Preview of return policies on Checkout. ![Preview of a policy highlight on Checkout](images/checkout/policies/policy-highlight.png) Preview of a policy highlight on Checkout. ### Collect a terms of service agreement Businesses often require their customers to agree to their terms of service before they can pay. This might depend on the type of product or subscription. Checkout helps you collect the necessary agreement by requiring a customer to accept your terms before paying. ![Collect terms of service agreement](images/checkout/terms-of-service-consent-collection.png) Collect terms of service agreement You can collect a terms of service agreement with Stripe Checkout when you create a Session: ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Checkout.SessionCreateOptions { LineItems = new List { new Stripe.Checkout.SessionLineItemOptions { Price = "<>", Quantity = 2 }, }, Mode = "payment", ConsentCollection = new Stripe.Checkout.SessionConsentCollectionOptions { TermsOfService = "required", }, CustomText = new Stripe.Checkout.SessionCustomTextOptions { TermsOfServiceAcceptance = new Stripe.Checkout.SessionCustomTextTermsOfServiceAcceptanceOptions { Message = "I agree to the [Terms of Service](https://example.com/terms)", }, }, UiMode = "embedded", ReturnUrl = "https://example.com/return", }; var service = new Stripe.Checkout.SessionService(); Stripe.Checkout.Session session = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.CheckoutSessionParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{ &stripe.CheckoutSessionLineItemParams{ Price: stripe.String("<>"), Quantity: stripe.Int64(2), }, }, Mode: stripe.String(string(stripe.CheckoutSessionModePayment)), ConsentCollection: &stripe.CheckoutSessionConsentCollectionParams{ TermsOfService: stripe.String(string(stripe.CheckoutSessionConsentCollectionTermsOfServiceRequired)), }, CustomText: &stripe.CheckoutSessionCustomTextParams{ TermsOfServiceAcceptance: &stripe.CheckoutSessionCustomTextTermsOfServiceAcceptanceParams{ Message: stripe.String("I agree to the [Terms of Service](https://example.com/terms)"), }, }, UIMode: stripe.String(string(stripe.CheckoutSessionUIModeEmbedded)), ReturnURL: stripe.String("https://example.com/return"), }; result, err := session.New(params); ``` ```java Stripe.apiKey = "<>"; SessionCreateParams params = SessionCreateParams.builder() .addLineItem( SessionCreateParams.LineItem.builder().setPrice("<>").setQuantity(2L).build() ) .setMode(SessionCreateParams.Mode.PAYMENT) .setConsentCollection( SessionCreateParams.ConsentCollection.builder() .setTermsOfService(SessionCreateParams.ConsentCollection.TermsOfService.REQUIRED) .build() ) .setCustomText( SessionCreateParams.CustomText.builder() .setTermsOfServiceAcceptance( SessionCreateParams.CustomText.TermsOfServiceAcceptance.builder() .setMessage("I agree to the [Terms of Service](https://example.com/terms)") .build() ) .build() ) .setUiMode(SessionCreateParams.UiMode.EMBEDDED) .setReturnUrl("https://example.com/return") .build(); Session session = Session.create(params); ``` ```node const stripe = require('stripe')('<>'); const session = await stripe.checkout.sessions.create({ line_items: [ { price: '<>', quantity: 2, }, ], mode: 'payment', consent_collection: { terms_of_service: 'required', }, custom_text: { terms_of_service_acceptance: { message: 'I agree to the [Terms of Service](https://example.com/terms)', }, }, ui_mode: 'embedded', return_url: 'https://example.com/return', }); ``` ```python import stripe stripe.api_key = "<>" session = stripe.checkout.Session.create( line_items=[{"price": "<>", "quantity": 2}], mode="payment", consent_collection={"terms_of_service": "required"}, custom_text={ "terms_of_service_acceptance": { "message": "I agree to the [Terms of Service](https://example.com/terms)", }, }, ui_mode="embedded", return_url="https://example.com/return", ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $session = $stripe->checkout->sessions->create([ 'line_items' => [ [ 'price' => '<>', 'quantity' => 2, ], ], 'mode' => 'payment', 'consent_collection' => ['terms_of_service' => 'required'], 'custom_text' => [ 'terms_of_service_acceptance' => [ 'message' => 'I agree to the [Terms of Service](https://example.com/terms)', ], ], 'ui_mode' => 'embedded', 'return_url' => 'https://example.com/return', ]); ``` ```ruby Stripe.api_key = '<>' session = Stripe::Checkout::Session.create({ line_items: [ { price: '<>', quantity: 2, }, ], mode: 'payment', consent_collection: {terms_of_service: 'required'}, custom_text: { terms_of_service_acceptance: { message: 'I agree to the [Terms of Service](https://example.com/terms)', }, }, ui_mode: 'embedded', return_url: 'https://example.com/return', }) ``` When `consent_collection.terms_of_service='required'`, Checkout dynamically displays a checkbox for collecting the customer’s terms of service agreement. If `consent_collection.terms_of_service='none'`, Checkout won’t display the checkbox and won’t require customers to accept the terms of service. Before requiring agreement to your terms, set your terms of service URL in your [public details](https://dashboard.stripe.com/settings/public) of your business. Setting a privacy policy URL is optional—Checkout also links to your privacy policy when a URL to your Privacy policy is set in your [public details](https://dashboard.stripe.com/settings/public). After a customer completes checkout, you can verify that the customer accepted your terms of service by looking at the Session object in the `checkout.session.completed` webhook, or by retrieving the Session using the API. When the terms are accepted, the Session’s [consent.terms_of_service](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-consent) field is set to `accepted`. You can customize the text that appears next to the checkbox by using `custom_text.terms_of_service_acceptance`. You need to set `consent_collection.terms_of_service='required'`. To use your own terms, insert a Markdown link. For example: `I agree to the [Terms of Service](https://example.com/terms)` Consult your legal and compliance advisors before making any changes to this text. You can’t use this feature to display custom text that violates or creates ambiguity with the Stripe-generated text on Checkout, obligations under your Stripe agreement, Stripe policies, and applicable laws. ### Collect consent for promotional emails You can send promotional emails to inform customers of new products and to share coupons and discounts. Before doing so, you must [collect their consent](https://docs.stripe.com/payments/checkout/promotional-emails-consent.md) to receive promotional emails. ## Customize payment method reuse agreement When a session is in either `setup` or `subscription` mode, or is in `payment` mode with `setup_future_usage` set, Checkout displays a message about reusing the customer’s payment method. The message can include information specific to the selected payment method. You can hide or customize the default text, but not the payment method-specific text. ![Default payment method reuse agreement display in subscription mode](images/checkout/default-subscription-mode-payment-method-reuse-agreement.png) Default payment method reuse agreement in subscription mode By customizing this text, you’re responsible for maintaining compliance, which includes updating this text as card network rules and local regulations change. Don’t use this feature without consulting with your legal team or setting custom text that includes information regarding the reuse of the payment method. Make sure that your customized text covers all modes you plan to support. To hide the payment method reuse agreement text, set `consent_collection.payment_method_reuse_agreement.position='hidden'`. Checkout won’t display its default language governing the reuse of the payment method. To set your own text in place of Stripe’s default language, set `custom_text.after_submit.message`. You can also use `custom_text.submit` or `custom_text.terms_of_service_acceptance` to display your own version of this language. ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Checkout.SessionCreateOptions { LineItems = new List { new Stripe.Checkout.SessionLineItemOptions { Price = "<>", Quantity = 1 }, }, Mode = "subscription", UiMode = "embedded", ReturnUrl = "https://example.com/return", ConsentCollection = new Stripe.Checkout.SessionConsentCollectionOptions { PaymentMethodReuseAgreement = new Stripe.Checkout.SessionConsentCollectionPaymentMethodReuseAgreementOptions { Position = "hidden", }, }, CustomText = new Stripe.Checkout.SessionCustomTextOptions { AfterSubmit = new Stripe.Checkout.SessionCustomTextAfterSubmitOptions { Message = "You can cancel your subscription at any time by [logging into your account](https://www.example.com/)", }, }, }; var service = new Stripe.Checkout.SessionService(); Stripe.Checkout.Session session = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.CheckoutSessionParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{ &stripe.CheckoutSessionLineItemParams{ Price: stripe.String("<>"), Quantity: stripe.Int64(1), }, }, Mode: stripe.String(string(stripe.CheckoutSessionModeSubscription)), UIMode: stripe.String(string(stripe.CheckoutSessionUIModeEmbedded)), ReturnURL: stripe.String("https://example.com/return"), ConsentCollection: &stripe.CheckoutSessionConsentCollectionParams{ PaymentMethodReuseAgreement: &stripe.CheckoutSessionConsentCollectionPaymentMethodReuseAgreementParams{ Position: stripe.String(string(stripe.CheckoutSessionConsentCollectionPaymentMethodReuseAgreementPositionHidden)), }, }, CustomText: &stripe.CheckoutSessionCustomTextParams{ AfterSubmit: &stripe.CheckoutSessionCustomTextAfterSubmitParams{ Message: stripe.String("You can cancel your subscription at any time by [logging into your account](https://www.example.com/)"), }, }, }; result, err := session.New(params); ``` ```java Stripe.apiKey = "<>"; SessionCreateParams params = SessionCreateParams.builder() .addLineItem( SessionCreateParams.LineItem.builder().setPrice("<>").setQuantity(1L).build() ) .setMode(SessionCreateParams.Mode.SUBSCRIPTION) .setUiMode(SessionCreateParams.UiMode.EMBEDDED) .setReturnUrl("https://example.com/return") .setConsentCollection( SessionCreateParams.ConsentCollection.builder() .setPaymentMethodReuseAgreement( SessionCreateParams.ConsentCollection.PaymentMethodReuseAgreement.builder() .setPosition( SessionCreateParams.ConsentCollection.PaymentMethodReuseAgreement.Position.HIDDEN ) .build() ) .build() ) .setCustomText( SessionCreateParams.CustomText.builder() .setAfterSubmit( SessionCreateParams.CustomText.AfterSubmit.builder() .setMessage( "You can cancel your subscription at any time by [logging into your account](https://www.example.com/)" ) .build() ) .build() ) .build(); Session session = Session.create(params); ``` ```node const stripe = require('stripe')('<>'); const session = await stripe.checkout.sessions.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'subscription', ui_mode: 'embedded', return_url: 'https://example.com/return', consent_collection: { payment_method_reuse_agreement: { position: 'hidden', }, }, custom_text: { after_submit: { message: 'You can cancel your subscription at any time by [logging into your account](https://www.example.com/)', }, }, }); ``` ```python import stripe stripe.api_key = "<>" session = stripe.checkout.Session.create( line_items=[{"price": "<>", "quantity": 1}], mode="subscription", ui_mode="embedded", return_url="https://example.com/return", consent_collection={"payment_method_reuse_agreement": {"position": "hidden"}}, custom_text={ "after_submit": { "message": "You can cancel your subscription at any time by [logging into your account](https://www.example.com/)", }, }, ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $session = $stripe->checkout->sessions->create([ 'line_items' => [ [ 'price' => '<>', 'quantity' => 1, ], ], 'mode' => 'subscription', 'ui_mode' => 'embedded', 'return_url' => 'https://example.com/return', 'consent_collection' => ['payment_method_reuse_agreement' => ['position' => 'hidden']], 'custom_text' => [ 'after_submit' => [ 'message' => 'You can cancel your subscription at any time by [logging into your account](https://www.example.com/)', ], ], ]); ``` ```ruby Stripe.api_key = '<>' session = Stripe::Checkout::Session.create({ line_items: [ { price: '<>', quantity: 1, }, ], mode: 'subscription', ui_mode: 'embedded', return_url: 'https://example.com/return', consent_collection: {payment_method_reuse_agreement: {position: 'hidden'}}, custom_text: { after_submit: { message: 'You can cancel your subscription at any time by [logging into your account](https://www.example.com/)', }, }, }) ``` # Embedded components > This is a Embedded components for when payment-ui is embedded-components. View the original doc at https://docs.stripe.com/payments/checkout/customization/policies?payment-ui=embedded-components. Elements are embedded within your own page, so you can customize whatever you want around the Elements including adding additional terms and policies either above or below the Elements.