Introduction
The Partnerize Android Mobile SDK enables your app to capture in-app referrals and accurately attribute subsequent sales. It simplifies tracking across web-to-app and app-to-app flows, providing seamless integration for recording conversions.
Minimum Requirements
- Android API level 26 (Oreo)
- Gradle 8.7
- Android Studio 2022.3 (or compatible with Gradle 8.7)
- Java 17 or above / Kotlin 1.8
Installation
Add the Partnerize SDK
You can integrate the SDK using Maven (recommended) or manual
.aar installation.
Maven (Recommended)
Add the dependency to your app-level build.gradle file.
Groovy
dependencies {
implementation 'com.partnerize.android:tracking:3.0.1'
}
Kotlin
dependencies {
implementation("com.partnerize.android:tracking:3.0.1")
}
Manual Installation (.aar)
Use this method if you're provided with the SDK as a .aar file.
Step 1: Add the file
Place the tracking-3.0.1.aar file in:
app/libs
Step 2: Update your Gradle configuration
// groovy DSL
repositories {
flatDir {
dirs "libs"
}
}
dependencies {
implementation(name: "tracking-3.0.1", ext: "aar")
}
// kotlin DSL
dependencies {
implementation(files("libs/tracking-3.0.1.aar"))
}
Step 3: Resync the gradle project
Quick Start
Initialise the SDK
Create an instance per platform you need. You can keep both if you support both Partnerize and Ascend.
val sdkPartnerize = PartnerizeTracking.partnerize(applicationContext)
val sdkAscend = PartnerizeTracking.ascend(applicationContext, "your_ascend_api_key")
Handle Inbound Clicks
Process incoming tracking URLs and optionally persist the click reference for later conversions.
val attribution = sdkPartnerize.captureAttribution(
url = inboundUri,
persist = true // default; set false to avoid storing
)
If the URL is invalid or missing required parameters, a PartnerizeException is thrown.
Returns:
- Partnerize SDK:
PartnerizeAttribution(clickref: String?) - Ascend SDK:
AscendAttribution(clickId: String?,gClickId: String?) — if provided,clickIdmust be an integer;gClickIdcan be used on its own.
Attribution examples (what gets stored)
Example inbound URLs (replace host/path with your deep link handler):
- Partnerize:
https://example.com/deeplink?clickref=abc123 - Ascend:
myapp://open?click_id=42&gclick_id=g-1ormyapp://open?gclick_id=g-2
Partnerize (overwrites)
val sdkPartnerize = PartnerizeTracking.partnerize(applicationContext)
val uriWithClickRef = Uri.parse("https://example.com/deeplink?clickref=abc123")
sdkPartnerize.captureAttribution(uriWithClickRef, persist = true)
sdkPartnerize.getStoredAttribution().clickRef // "abc123"
// later inbound URL contains clickref=xyz999
val nextUri = Uri.parse("https://example.com/deeplink?clickref=xyz999")
sdkPartnerize.captureAttribution(nextUri, persist = true)
sdkPartnerize.getStoredAttribution().clickRef // "xyz999" (previous overwritten)
Ascend (appends)
val sdkAscend = PartnerizeTracking.ascend(applicationContext)
// inbound URL contains click_id=42&gclick_id=g-1
val uriA = Uri.parse("myapp://open?click_id=42&gclick_id=g-1")
sdkAscend.captureAttribution(uriA, persist = true)
sdkAscend.getStoredAttribution().clickIds // [42]
sdkAscend.getStoredAttribution().gClickIds // ["g-1"]
// later inbound URL contains only gclick_id=g-2 (no click_id)
val uriB = Uri.parse("myapp://open?gclick_id=g-2")
sdkAscend.captureAttribution(uriB, persist = true)
sdkAscend.getStoredAttribution().clickIds // [42] (unchanged)
sdkAscend.getStoredAttribution().gClickIds // ["g-1", "g-2"] (appended)
Post Conversions
Create a platform-specific conversion object, then call completeConversion from a coroutine. Stored attribution is injected automatically; you can override it via alternateStoredAttribution.
lifecycleScope.launch {
val result = sdkPartnerize.completeConversion(conversion)
// result is PartnerizeConversionResult or AscendConversionResult depending on the SDK instance
}
Signature:
suspend fun completeConversion(
conversion: Conversion,
alternateStoredAttribution: StoredAttribution? = null,
): ConversionResult
Stored Attribution Utilities
getStoredAttribution(): returns the currently stored attribution (platform-specific type).clearStoredAttribution(): removes any stored attribution.
Use these to inspect or reset attribution state between user sessions or logout flows. Storage behavior differs by platform (see platform sections below for overwrite vs append details).
Logging
Enable built-in logging or provide your own logger:
sdk.loggingEnabled = true
class MyLogger : PartnerizeLogger {
override fun log(message: String) {
println(message)
}
}
sdk.logger = MyLogger()
Partnerize Platform
Initialise with:
val sdkPartnerize = PartnerizeTracking.partnerize(applicationContext)
Attribution
PartnerizeAttribution— returned bycaptureAttribution; fields:clickref: String?PartnerizeStoredAttribution— returned bygetStoredAttribution; fields:clickRef: String?- Storage behavior: calling
captureAttributionwithpersist = trueoverwrites the storedclickRefwith the newest valid inbound URL.
Build a Conversion
Use PartnerizeConversion.Builder() to configure a conversion. The SDK injects the stored clickRef automatically during completeConversion (or you can supply an alternate stored attribution).
val conversion = PartnerizeConversion.Builder()
.setConversionRef("conv_001")
.setCurrency("GBP")
.setCountry("GB")
.setCustomerType(CustomerType.NEW)
.addMetadata("channel", "app")
.addConversionItem(
PartnerizeConversionItem.Builder("9.99", "Tops")
.setQuantity(2)
.setSku("SKU123")
.build()
)
.build()
lifecycleScope.launch {
val result: PartnerizeConversionResult = sdkPartnerize.completeConversion(conversion)
val conversionId = result.conversionId
}
Builder
Start with PartnerizeConversion.Builder(), then chain:
setConversionRef(String?)setPublisherRef(String?)setAdvertiserRef(String?)setCustomerRef(String?)setCurrency(String?)setCountry(String?)setVoucher(String?)setTrafficSource(String?)setCustomerType(CustomerType?)setConversionMetric(String?)setFulfilmentDate(Date?)setFulfilmentStartDate(Date?)addMetadata(String, String)removeMetadata(String)setConversionItems(List<PartnerizeConversionItem>)addConversionItem(PartnerizeConversionItem)removeConversionItem(PartnerizeConversionItem)build()buildUpon()
Call build() when you are done configuring to produce the conversion. Use buildUpon() to clone an existing conversion and adjust fields without starting from scratch.
PartnerizeConversionItem
val item = PartnerizeConversionItem.Builder(value = "9.99", category = "Tops")
.setQuantity(2)
.setSku("SKU123")
.addMetadata("color", "red")
.build()
Required: value: String, category: String
Optional: quantity: Int, sku: String?, metadata
ConversionResult
Returns PartnerizeConversionResult with:
conversionId: String
Ascend Platform
Initialise with following (replace with your actual Ascend API key):
val sdkAscend = PartnerizeTracking.ascend(applicationContext, "your_ascend_api_key")
Your Ascend API key can be found https://www.ascendpartner.com/merchant/api/ dashboard under "API Keys" section. If no API key is available, SDK will throw an error when you try to initialise.
Attribution
AscendAttribution— returned bycaptureAttribution; fields:clickId: String?,gClickId: String?AscendStoredAttribution— returned bygetStoredAttribution; fields:clickIds: List<Int>,gClickIds: List<String>- Storage behavior: calling
captureAttributionwithpersist = trueappends new click IDs (if valid); multiple IDs are kept until you clear them viaclearStoredAttribution()method. clickIdis optional, but when present it must be an integer;gClickIdalone is accepted and stored.
Build a Conversion
Use AscendConversion.Builder(...) with the required constructor arguments shown below. Stored click IDs are injected by the SDK when posting the conversion.
val items = listOf(
AscendConversionItem.Builder(
id = "item_001",
amount = 49.99,
quantity = 1
).setCategory("Tops").build()
)
val conversion = AscendConversion.Builder(
orderId = "order_001",
items = items,
created = "2024-01-01T12:00:00Z",
currency = "GBP"
)
.setPublisherId(1234)
.setType(TransactionType.SALE)
.setNewToFile(true)
.setCoupons(listOf("WELCOME10"))
.setSegment("vip")
.build()
lifecycleScope.launch {
val result: AscendConversionResult = sdkAscend.completeConversion(conversion)
val message = result.message
}
Builder
Create the builder with required arguments:
orderId: Stringitems: List<AscendConversionItem>created: Stringcurrency: String
Then chain builder methods:
setPublisherId(Int)setType(TransactionType)setNewToFile(Boolean)setCoupons(List<String>)setSegment(String)build()
Call build() when you are done configuring to produce the conversion.
AscendConversionItem
val item = AscendConversionItem.Builder(
id = "item_001",
amount = 49.99,
quantity = 1
).setCategory("Tops").build()
Required: id: String, amount: Double, quantity: Int
Optional: category: String?
ConversionResult
Returns AscendConversionResult with:
message: String?(API response message)
License
Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0
Support
If you encounter any issues, email:
support@partnerize.com
Include:
- Steps to reproduce
- URLs used
- Logger output
- SDK version
Release Notes
Release notes can be found here