Sign in
An image of the Stripe logo
Create account
Sign in
Home
Payments
Business operations
Financial services
Developer tools
Security
All products
Home
Payments
Business operations
Home
Payments
Business operations
Financial services
Developer tools
Support
Overview
Overview
What is Terminal
Design an integration
Example applications
Quickstart
Accept an in-person payment
Set up your reader
Set up your integration
Connect to a reader
Collect payments
Regional considerations
Terminal payments features
Multiparty payments with Connect
Collect tips
Save cards for future use
Refund transactions
Provide receipts
Cart display
Incremental authorizations
Extended authorizations
Operate offline
Deploy at scale
Order hardware
Manage locations
Configure readers
References
API references
Bluetooth readers
Smart readers
SDK migration guide
Testing
Deployment checklist
Stripe Terminal reader product sheets
Testing
No-code options
terminal
·
HomePaymentsIn-person payments

Regional considerations

Learn about regional considerations for integrating Terminal in different countries.

​​For the most part, you’ll be able to use a single Terminal integration in all supported countries. However, due to local payment methods or regulations there are some country-specific requirements. After going through the sample integration, use this guide to learn about country-specific requirements for Terminal.

Country

Availability

Refer to the following table to understand which readers and SDK platforms you can use in each country.

CountryAndroid**iOS**JavaScript
Canada
WisePad 3
Bluetooth
WisePOS E
Smart
WisePad 3
Bluetooth
WisePOS E
Smart
WisePOS E
Smart
**Compatibility for this mobile SDK also applies when used with React Native.

Integrate Terminal in Canada

Stripe supports Visa, Mastercard, American Express, and Interac payments in Canada. All transactions must be made in Canadian dollars (CAD). To accept Terminal charges in Canada, either your platform account or connected account must be in Canada.

Use locations

Create Locations for your business with addresses in Canada and associate your readers to them. This will ensure that they automatically download the configuration needed to properly process charges in Canada.

A valid address for a Location in Canada must contain the line1, city, state, postal_code, and country properties.

Terminal
curl https://api.stripe.com/v1/terminal/locations \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
: \ -d "display_name"="HQ" \ -d "address[line1]"="3040 Bur Oak Ave" \ -d "address[city]"="Markham" \ -d "address[state]"="ON" \ -d "address[country]"="CA" \ -d "address[postal_code]"="L6B 0R1" \

Reader software version

Verifone P400 readers operating in Canada must use the reader software version 3.0.1.15 or later. Read about Verifone P400 software updates for details.

Similarly, BBPOS WisePad 3 readers must use the reader software version or later. Read about BBPOS WisePad 3 software updates for details.

Translation

Language regulations require that services, including point-of-sale services, be provided in French unless English has been agreed upon by the cardholder and their card issuer. Terminal is built to help you comply with these requirements if they apply to your business.

Default reader language

The Verifone P400 interface displays text in French in addition to English if it is registered to a location with an address in Canada.

The BBPOS WisePOS E supports changing reader language in the Settings panel. Swipe right across the screen to access the Settings panel, and select your language.

The BBPOS WisePad 3 supports changing reader language directly in the reader interface. After you have registered your reader to a Location with an address in Canada, the reader installs a language pack relevant for your region if one isn’t already in place. To view available language options and to select a language, click the Power / Settings button and scroll down using the arrow keys until you reach the language selection menu. Highlight your desired language and press the green Enter key.

Transaction language

After the cardholder has presented their card, the reader determines the cardholder’s preferred language. Each screen after that point is translated according to the cardholder’s preferences.

Other translations

If you’re required to provide services in or would like to translate text into French in addition to English, ensure that any of your custom reader screens and receipts display the appropriate translations.

Interac payments

Interac is the interbank network that handles routing of debit payments in Canada. Consumer debit cards in Canada are branded with an Interac logo and may also be co-branded with another payment network’s logo. Even if the card is co-branded, however, all Interac debit transactions must be routed through Interac. To maximize card acceptance, you should build Interac support into your integration.

Create a PaymentIntent

SDK Reference

  • createPaymentIntent (iOS)
  • createPaymentIntent (Android)

To accept Interac transactions in addition to Visa, Mastercard, and American Express, you need to create your payments using the interac_present payment method type, in addition to card_present.

Learn more about the card_present PaymentIntent flow here.

Client-side

Create a PaymentIntent from your client using the iOS or Android SDK:

Client-side PaymentIntent creation is possible with the iOS or Android SDKs. If you’re using the JavaScript SDK for Stripe Terminal, create a PaymentIntent server-side.

Server-side

The JavaScript SDK requires you to create the PaymentIntent on your server. For iOS or Android, you can create the PaymentIntent on your server if the information required to start a payment isn’t readily available in your app.

curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
: \ -d amount=999 \ -d currency=cad \ -d "payment_method_types[]"=card_present \ -d "payment_method_types[]"=interac_present \ -d capture_method=manual

Collect and process a payment

SDK Reference

  • collectPaymentMethod (JavaScript)
  • collectPaymentMethod (iOS)
  • collectPaymentMethod (Android)

After you process the payment, the reader determines whether to route the payment across Interac rails based on the profile of the card presented.

In cases where the Interac card is co-branded, the payment_method_details.card.brand field on a PaymentIntent’s returned charge reports the co-brand. The type field on the payment_method for an Interac transaction is always interac_present.

There are further Interac requirements that Stripe handles automatically for you, without additional integration work on your side:

  • processPayment (JavaScript)
  • processPayment (iOS)
  • processPayment (Android)
  • Before a card is presented, on-screen prompts are in the default reader language. After the card information has been collected, the localization is based on the language preference specified by the presented card.
  • The reader automatically prompts for PIN in cases where it is required.
  • Interac Flash (contactless) payments are limited to 100 CAD and generally up to three consecutive transactions. Transactions higher than 100 CAD or the fourth contactless transaction in a row require the customer to insert their Interac card and enter their PIN.

Capture and reconcile

Unlike Visa, Mastercard, and American Express transactions, Interac transactions are authorized and automatically captured in a single step. Your application shouldn’t continue to capture the PaymentIntent – if you attempt to capture an interac_present payment, the Stripe API returns an error. Be careful to prevent unintended and duplicate payments in your integration; if failures or declines occur while processing Interac, you can attempt to re-use the same PaymentIntent from the original transaction to safeguard against double-charging.

Refund an Interac payment

In-person refunds are mandatory for Interac transactions in Canada. You can’t create refunds in the API or in the Dashboard for these payments. In this flow, the reader prompts the cardholder to present the card used in the original charge. After the card details are read successfully, your application processes the refund. Similar to online refunds, you can perform partial refunds by passing in an amount less than the transaction value.

The currency and the card used for refund processing must be the same used for the original charge, otherwise the request fails with an error.

As a fallback, you can offer refunds to different payment methods such as store credit or cash.

JavaScript
return this.terminal.collectRefundPaymentMethod( "ch_xxxxxxxxxx", 2000, "cad" ).then( function(collectRefundPaymentMethodResult) { if (collectRefundPaymentMethodResult.error) { // Placeholder for handling collectRefundPaymentMethodResult.error } else { return this.terminal.processRefund(); } } ).then( function(processRefundResult) { if (processRefundResult.error) { // Placeholder for handling processRefundResult.error } else { console.log("Charge fully refunded!"); return processRefundResult; } } );
Was this page helpful?
Questions? Contact us.
View developer tutorials on YouTube.
Check out our product changelog.
Powered by Markdoc
You can unsubscribe at any time. Read our privacy policy.
Stripe Shell
Test mode
▗▄ ▄▟█ █▀▀ ▗▟████▙▖ ██████ ███▗▟█ ███ ███▗▟██▙▖ ▗▟█████▙▖ ███▖ ▀▀ ███ ███▀▀▀ ███ ███▀ ███ ███ ███ ▝▜████▙▖ ███ ███ ███ ███ ███ █████████ ▄▄ ▝███ ███ ▄ ███ ███ ███▄ ███ ███ ▄▄ ▝▜████▛▘ ▝▜███▛ ███ ███ ███▝▜██▛▘ ▝▜█████▛▘ ███ ▀▘
Welcome to the Stripe Shell! Stripe Shell is a browser-based shell with the Stripe CLI pre-installed. Login to Stripe docs and press Control + Backtick on your keyboard to start managing your Stripe resources in test mode. - View supported commands: - Find webhook events: - Listen for webhook events: - Call Stripe APIs: stripe [api resource] [operation] (e.g. )
The Stripe Shell is best experienced on desktop.
$