Skip to content
Create account or Sign in
The Stripe Docs logo
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp
OverviewAccept a paymentUpgrade your integration
Online payments
OverviewFind your use case
Use Payment Links
Use a pre-built checkout page
Build a custom integration with Elements
Build an in-app integration
Use Managed PaymentsRecurring payments
In-person payments
Terminal
    Overview
    Accept in-person payments
    Global availability
    Integration design
    Select your reader
    Design an integration
    Quickstart
    Example applications
    Testing
    Terminal setup
    Set up your integration
    Multi-party payments with Connect
    Connect to a reader
    Accepting a payment
    Collect card payments
    Additional payment methods
    Accept offline payments
    Mail order and telephone order payments
      Process MOTO payments
      Save a card with MOTO for future payments
    Regional considerations
    During checkout
    Collect tips
    Collect and save payment details for future use
    Flexible authorisations
    After checkout
    Refund transactions
    Provide receipts
    Customize checkout
    Cart display
    Collect on-screen inputs
    Collect swiped data
    Collect tapped data for NFC instruments
    Apps on devices
    Manage readers
    Order, return, replace readers
    Register readers
    Manage locations and zones
    Configure readers
    Monitor Readers
    References
    API references
    Mobile readers
    Smart readers
    Tap to Pay readers
    SDK migration guide
    Deployment checklist
    Stripe Terminal reader product sheets
Payment Methods
Add payment methods
Manage payment methods
Faster checkout with Link
Payment operations
Analytics
Balances and settlement time
Compliance and security
Currencies
Declines
Disputes
Fraud prevention
Radar fraud protection
Payouts
ReceiptsRefunds and cancellations
Advanced integrations
Custom payment flows
Flexible acquiring
Multiprocessor orchestration
Beyond payments
Incorporate your company
Crypto
Agentic commerce
Financial Connections
Climate
Verify identities
United States
English (United Kingdom)
HomePaymentsTerminalMail order and telephone order payments

Process MOTO payments

Process mail order and telephone order (MOTO) payments using Stripe Terminal.

Requesting access

To begin processing MOTO payments, contact Stripe support for access.

To process MOTO payments, you must:

  1. Create a PaymentIntent.
  2. Collect a PaymentMethod.
  3. Confirm and capture the payment.

Create a PaymentIntent

To begin collecting a MOTO payment, you must create a PaymentIntent with payment_method_types that includes card.

PaymentActivity.kt
Kotlin
Java
No results
val params = PaymentIntentParameters.Builder( listOf(PaymentMethodType.CARD) ) .setAmount(1000) .setCurrency("usd") .build() Terminal.getInstance().createPaymentIntent( params, object : PaymentIntentCallback { override fun onSuccess(paymentIntent: PaymentIntent) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } )

Collect a payment method

Private preview

CVC is mandatory for MOTO transactions. Skipping CVC is in private preview and you can request it for mail orders. Contact Stripe support for access.

After you’ve created a PaymentIntent, you can collect a PaymentMethod with the SDK. To collect a MOTO payment, your app must connect to a reader.

To enable MOTO, set a non-null MotoConfiguration on the CollectPaymentIntentConfiguration.

After the request, the connected reader prompts you for the cardholder’s number, CVC, expiry date and postal code.

Note

If you’re displaying cart details using the setReaderDisplay method, you must reset the reader’s display from a line item interface to the splash screen before collecting a MOTO payment.

PaymentActivity.kt
Kotlin
Java
No results
val config = CollectPaymentIntentConfiguration.Builder() .setMotoConfiguration( MotoConfiguration.Builder() .build() ) .build() Terminal.getInstance().collectPaymentMethod( paymentIntent, config, object : PaymentIntentCallback { override fun onSuccess(paymentIntent: PaymentIntent) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } )

Confirm and capture payment

You can follow the usual procedure to confirm and capture the PaymentIntent.

Testing

Use the simulated reader and simulated test card numbers to test your integration.

Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc