Documentation Index
Fetch the complete documentation index at: https://docs.sezzle.com/llms.txt
Use this file to discover all available pages before exploring further.
This guide walks you through integrating the Sezzle Android SDK into your app. By the end, your app will display Sezzle promotional messaging on product pages and launch Sezzle checkout.
Prerequisites
- Android 6.0+ (API 23), compileSdk 36
- Kotlin or Java
- A Sezzle merchant account with your Public API Key
- A backend server to capture payments after checkout
A working example app is included in the SDK repo at example/. It demonstrates all widget variants and both checkout modes.
1. Installation
Gradle (Kotlin DSL)
Gradle (Groovy)
Add to your app module’s build.gradle.kts:dependencies {
implementation("com.sezzle:sezzle-merchant-sdk:1.1.0")
}
Add to your app module’s build.gradle:dependencies {
implementation 'com.sezzle:sezzle-merchant-sdk:1.1.0'
}
The SDK is published on Maven Central. No additional repository configuration is needed.
Requirements: Android 6.0+ (API 23), compileSdk 36
2. Configuration
Initialize the SDK once at app startup in your Application class:
import com.sezzle.sdk.SezzleSDK
import com.sezzle.sdk.SezzleEnvironment
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
SezzleSDK.configure(
publicKey = "sz_pub_your_key_here",
environment = SezzleEnvironment.PRODUCTION // use SANDBOX for testing
)
}
}
| Parameter | Type | Default | Description |
|---|
publicKey | String | Required | Your Sezzle public API key |
environment | SezzleEnvironment | PRODUCTION | SANDBOX for testing, PRODUCTION for live |
Never include your private API key in the app. The SDK only uses the public key. Use your private key server-side to capture payments.
Add a SezzlePromotionalView to your product screen to display installment pricing:
import com.sezzle.sdk.SezzlePromotionalView
val promoView = SezzlePromotionalView(
context = this,
amountInCents = 9999 // $99.99
)
promoView.setPresenter(this) // Activity for modal presentation
container.addView(promoView)
The widget automatically shows the correct message based on the price and updates when you call:
promoView.update(amountInCents = 14999) // price changed to $149.99
All Parameters
SezzlePromotionalView(
context: Context,
amountInCents: Int,
currency: String = "USD",
style: SezzlePromotionalStyle = SezzlePromotionalStyle.LIGHT,
widgetConfig: SezzleWidgetConfig = SezzleWidgetConfig.DEFAULT
)
| Parameter | Type | Default | Description |
|---|
amountInCents | Int | Required | Product price in cents (e.g., 4999 = $49.99) |
currency | String | "USD" | ISO 4217 currency code (e.g., "USD", "CAD") |
style | SezzlePromotionalStyle | LIGHT | LIGHT for light backgrounds, DARK for dark |
widgetConfig | SezzleWidgetConfig | DEFAULT | Controls pricing thresholds and Pay-in-5 |
The widget auto-detects dark mode and switches styles automatically. If you want to force a specific style, pass SezzlePromotionalStyle.LIGHT or SezzlePromotionalStyle.DARK explicitly.
All config parameters are optional — the widget works out of the box with sensible defaults:
| Parameter | Default | Description |
|---|
minPriceInCents | 3500 ($35) | Minimum price to show the widget |
maxPriceInCents | 250000 ($2,500) | Maximum price for short-term (PI4/PI5) |
enablePayIn5 | true | Show “5 payments” for prices at or above the PI5 threshold |
pi5MinPriceInCents | 5000 ($50) | Price threshold for Pay-in-5 |
longTermConfig | null (disabled) | Enable long-term monthly payments — set to a SezzleLongTermConfig to activate |
To customize, pass only the values you want to override:
val config = SezzleWidgetConfig(
longTermConfig = SezzleLongTermConfig(
minPriceInCents = 25_000 // $250+ shows monthly payments
)
)
val promoView = SezzlePromotionalView(
context = this,
amountInCents = 79900,
widgetConfig = config
)
Custom Promotional Text
If you need full control over the UI, use SezzlePromoDataHandler to get a styled SpannableString with the Sezzle logo inline:
SezzlePromoDataHandler.getMessage(
context = this,
amountInCents = 9999
) { spannableString ->
myTextView.text = spannableString
}
4. Checkout
Build the Checkout Object
val checkout = SezzleCheckout(
customer = SezzleCustomer(
email = "customer@example.com",
firstName = "Jane",
lastName = "Doe",
phone = "+15551234567",
billingAddress = SezzleAddress(
street = "123 Main St",
city = "Minneapolis",
state = "MN",
postalCode = "55401",
countryCode = "US"
)
),
order = SezzleOrder(
referenceId = "order-12345",
description = "Wireless Earbuds",
amount = SezzleAmount(amountInCents = 4599, currency = "USD"),
items = listOf(
SezzleItem(
name = "Wireless Earbuds",
sku = "WE-001",
quantity = 1,
price = SezzleAmount(amountInCents = 3999, currency = "USD")
)
),
taxAmount = SezzleAmount(amountInCents = 350, currency = "USD"),
shippingAmount = SezzleAmount(amountInCents = 250, currency = "USD")
)
)
Customer Fields
| Field | Required | Description |
|---|
email | Yes | Customer email address |
firstName | No | Customer first name |
lastName | No | Customer last name |
phone | No | Customer phone number |
dob | No | Date of birth ("YYYY-MM-DD") |
billingAddress | No | Billing address (SezzleAddress) |
shippingAddress | No | Shipping address (SezzleAddress) |
tokenize | No | Tokenize customer for future orders |
Order Fields
| Field | Required | Description |
|---|
referenceId | Yes | Your internal order/reference ID |
description | No | Order description (defaults to “Mobile SDK Order”) |
amount | Yes | Total order amount in cents + currency |
intent | No | AUTH (default, capture later from your backend) or CAPTURE (auto-capture at checkout completion) |
items | No | Line item details |
discounts | No | Discount line items (List<SezzleDiscount>) |
taxAmount | No | Tax amount breakdown |
shippingAmount | No | Shipping amount breakdown |
metadata | No | Custom key-value pairs. The SDK automatically includes _sdk_platform, _sdk_version, _device_model, and _os_version — avoid using keys prefixed with _. |
locale | No | Checkout locale (EN_US, EN_CA, FR_CA) |
checkoutFinancingOptions | No | Restrict to specific plans: FOUR_PAY_BIWEEKLY, FOUR_PAY_MONTHLY, SIX_PAY_MONTHLY. Optional — omit to let Sezzle show all eligible plans. |
Address Fields (SezzleAddress)
| Field | Description |
|---|
name | Full name |
street | Street address line 1 |
street2 | Street address line 2 |
city | City |
state | State or province |
postalCode | Postal/ZIP code |
countryCode | ISO country code (e.g., "US") |
phone | Phone number |
Start Checkout
SezzleSDK.startCheckout(
checkout = checkout,
activity = this, // ComponentActivity
listener = checkoutListener, // SezzleCheckoutListener
mode = SezzleCheckoutMode.SYSTEM_BROWSER // or WEB_VIEW
)
The activity parameter must be a ComponentActivity (e.g., AppCompatActivity). The SDK uses the Activity Result API internally.
Handle the Result
Implement SezzleCheckoutListener:
private val checkoutListener = object : SezzleCheckoutListener {
override fun onCheckoutComplete(orderUUID: String) {
// Send orderUUID to your backend to capture payment
// POST /v2/order/{orderUUID}/capture
Log.d("Sezzle", "Order completed: $orderUUID")
}
override fun onCheckoutCancel() {
// Customer closed checkout without completing
Log.d("Sezzle", "Checkout cancelled")
}
override fun onCheckoutError(error: SezzleError) {
// Handle the error
when (error) {
is SezzleError.NetworkError ->
Log.e("Sezzle", "Network error: ${error.underlying}")
is SezzleError.ApiError ->
Log.e("Sezzle", "API error ${error.statusCode}: ${error.apiMessage}")
is SezzleError.BrowserDismissed ->
Log.d("Sezzle", "Browser dismissed")
is SezzleError.NotConfigured ->
Log.e("Sezzle", "SDK not configured")
is SezzleError.InvalidResponse ->
Log.e("Sezzle", "Invalid response")
}
}
}
After onCheckoutComplete, send the orderUUID to your backend server. Your server should call POST /v2/order/{orderUUID}/capture using your private API key to capture the payment. See the Orders API for details.
5. WebView Mode
By default, checkout opens in the system browser (Chrome Custom Tab, or Auth Tab on Chrome 137+). To keep the user inside your app, use WebView mode:
SezzleSDK.startCheckout(
checkout = checkout,
activity = this,
listener = checkoutListener,
mode = SezzleCheckoutMode.WEB_VIEW
)
System Browser (Default)
WebView
| Mode | Pros | Cons |
|---|
SYSTEM_BROWSER | Secure, shares Chrome cookies, recommended | Brief context switch |
WEB_VIEW | Stays in-app | No cookie sharing, user logs in every time |
Chrome Custom Tab vs Auth Tab
The SDK automatically selects the best browser experience:
- Chrome 137+: Uses Auth Tab, a lightweight browser overlay optimized for authentication flows
- Older Chrome / other browsers: Falls back to Chrome Custom Tab
- Detection is automatic via
PackageManager — no configuration needed
6. Dark Mode
The SDK automatically adapts to the device’s appearance setting. The promotional widget, installment modal, and checkout modal all support dark mode.
If you need to force a specific style:
val promoView = SezzlePromotionalView(
context = this,
amountInCents = 9999,
style = SezzlePromotionalStyle.DARK // force dark style
)
7. Error Handling
All errors are delivered via SezzleCheckoutListener.onCheckoutError(error):
| Error | When | Suggested Action |
|---|
NotConfigured | SezzleSDK.configure() was not called | Call configure() in your Application class |
NetworkError | No internet, timeout, DNS failure | Show retry option |
ApiError(statusCode, apiMessage) | Sezzle API returned an error | Check status code and message |
BrowserDismissed | User closed the browser/WebView | Return to product page |
InvalidResponse | Unexpected response format | Contact Sezzle support |
8. Testing
Use the sandbox environment for testing:
SezzleSDK.configure(
publicKey = "sz_pub_your_sandbox_key",
environment = SezzleEnvironment.SANDBOX
)
Use the test data to complete test checkouts in sandbox.
Switch to SezzleEnvironment.PRODUCTION and your live public key before releasing to the Play Store.