Loading...
Loading...
Loading...
Loading...
Loading...
The event is used for individual tracking of ad revenue on user devices. The method is used if there are CPI data available on the client device (they can be obtained from the ad network SDK).
Do not apply this method if you use ad networks that utilize the server-server protocol for sending ad revenue data (ironSource, AppLovin MAX, and Fyber networks) and you already set up this method of data collection because if you use both data sources, your revenue data may be duplicated.
Parameter | Type | Restrictions | Description |
---|---|---|---|
Parameter | Type | Restrictions | Description |
---|---|---|---|
Parameter | Type | Restrictions | Description |
---|---|---|---|
The event is used to track connections to social media channels.
Use the following constants to specify a social network:
.facebook, .vkontakte , .twitter, .googleplus, .whatsapp, .viber, .evernote, .googlemail, .linkedin, .pinterest, .qzone, .reddit, .renren, .tumblr
Or create an object with the desired social media name.
Use the following constants to specify a social network:
.facebook, .vkontakte , .twitter, .googleplus, .whatsapp, .viber, .evernote, .googlemail, .linkedin, .pinterest, .qzone, .reddit, .renren, .tumblr
Or create an object with the desired social media name.
Use the following constants to specify a social network:
DTDSocialNetwork.facebook, DTDSocialNetwork.vkontakte , DTDSocialNetwork.twitter, DTDSocialNetwork.googleplus, DTDSocialNetwork.whatsapp, DTDSocialNetwork.viber, DTDSocialNetwork.evernote, DTDSocialNetwork.googlemail, DTDSocialNetwork.linkedin, DTDSocialNetwork.pinterest, DTDSocialNetwork.qzone, DTDSocialNetwork.reddit, DTDSocialNetwork.renren, DTDSocialNetwork.tumblr
Or create an object with the desired social media name.
Use the following constants to specify a social network:
DTDSocialNetwork.Companion.getFacebook(), DTDSocialNetwork.Companion.getVkontakte(), DTDSocialNetwork.Companion.getTwitter(), DTDSocialNetwork.Companion.getGoogleplus(), DTDSocialNetwork.Companion.Whatsapp(), DTDSocialNetwork.Companion.getViber(), DTDSocialNetwork.Companion.getEvernote(), DTDSocialNetwork.Companion.getGooglemail(), DTDSocialNetwork.Companion.getLinkedin(), DTDSocialNetwork.Companion.getPinterest(), DTDSocialNetwork.Companion.getQzone(), DTDSocialNetwork.Companion.getReddit(), DTDSocialNetwork.Companion.getRenren(), DTDSocialNetwork.Companion.getTumblr()
Or create an object with the desired social media name.
Use the following constants to specify a social network:
DTDSocialNetwork.facebook, DTDSocialNetwork.vkontakte , DTDSocialNetwork.twitter, DTDSocialNetwork.googleplus, DTDSocialNetwork.whatsapp, DTDSocialNetwork.viber, DTDSocialNetwork.evernote, DTDSocialNetwork.googlemail, DTDSocialNetwork.linkedin, DTDSocialNetwork.pinterest, DTDSocialNetwork.qzone, DTDSocialNetwork.reddit, DTDSocialNetwork.renren, DTDSocialNetwork.tumblr
Or create an object with the desired social media name:
Use the following constants to specify a social network:
DTDSocialNetwork.facebook, DTDSocialNetwork.vkontakte , DTDSocialNetwork.twitter, DTDSocialNetwork.googleplus, DTDSocialNetwork.whatsapp, DTDSocialNetwork.viber, DTDSocialNetwork.evernote, DTDSocialNetwork.googlemail, DTDSocialNetwork.linkedin, DTDSocialNetwork.pinterest, DTDSocialNetwork.qzone, DTDSocialNetwork.reddit, DTDSocialNetwork.renren, DTDSocialNetwork.tumblr
Or create an object with the desired social media name:
Or use special method for custom social network:
Use the following constants to specify a social network:
.facebook, .vkontakte , .twitter, .googleplus, .whatsapp, .viber, .evernote, .googlemail, .linkedin, .pinterest, .qzone, .reddit, .renren, .tumblr
Or create an object with the desired social media name.
Track social media posts and analyze their effectiveness and virality. Pass the event after the post has been approved by social media.
If you have referral information, you can pass it using the following method:
To send an event packet before it is full (10 events, by default) or before the end of the period of its formation (2 minutes, by default), you can use immediate dispatch.
We don’t recommend using this method unless absolutely necessary! When the Real payment event is created, the forced dispatch of the packet occurs automatically.
When working with getters you should take into account that the new devtodev SDK is completely asynchronous. The execution result must be processed within the completionHandler
.
All set and get methods need to be called only after the initialization of the SDK.
It is also worth remembering that the SDK will call the callback in background queues, so we recommend that you transfer the processing of return values to the queue you need.
For example:
This method denies/allows tracking of user data and also implements the right to be forgotten in accordance with the requirements of the GDPR.
When this method is called with the 'false' value, the SDK sends a command to the server to delete all personal user data that was collected by devtodev in this application, blocking further user data collection.
The user will remain in the devtodev system only as an impersonal unit in the previously aggregated metrics.
If it is set to ‘true', tracking can be enabled again. In this case, the user will be considered new.
To enable/disable user tracking by the devtodev system. Bool type.
Get device ID. String type.
Get the version of the integrated devtodev SDK. String type.
Retrieving the saved state of the user tracking permission by the devtodev system. See “Setting User Tracking Status”. Bool type.
devtodev ID is the primary numeric identifier for the device/user account in the devtodev database. Using devtodev ID, you are sure to find the user in devtodev.
The identifier will be received from the server some time after the initialization of the SDK.
If you have set counting by users, a separate devtodev id will be issued for each device user.
To obtain the devtodev ID, you need to pass the listener to DTDAnalytics
:
The delegate must implement the func didReceiveDevtodevId(with devtodevId: Int)
The didReceiveDevtodevId
method will be called with every ID change on the server side.
To obtain the devtodev ID, you need to pass the listener to DTDAnalytics
:
The delegate must implement the (void)didReceiveDevtodevIdWith:(NSInteger)devtodevId;
The didReceiveDevtodevId
method will be called with every ID change on the server side.
To obtain the devtodev ID, you need to pass the DTDIdentifiersListener
listener to DTDAnalytics
:
The didReceiveDevtodevId
method will be called with every ID change on the server side.
To obtain the devtodev ID, you need to pass the DTDIdentifiersListener
listener to DTDAnalytics
:
The didReceiveDevtodevId
method will be called with every ID change on the server side.
To obtain the devtodev ID, you need to pass the DTDIdentifiersListener
listener delegate to DTDAnalytics
:
The delegate
method will be called with every ID change on the server side.
To obtain the devtodev ID, you need to pass the DTDIdentifiersListener
listener delegate to DTDAnalytics
:
The delegate
method will be called with every ID change on the server side.
To obtain the devtodev ID, you need to pass the Callable
to DTDAnalytics
:
The didReceiveDevtodevId
method will be called with every ID change on the server side.
To receive a callback when the SDK initialization is complete, you can use a method that will implement the initialization callback. When the SDK completes the initialization, the callback will be called on the main application thread.
We recommend implementing a callback before calling initialization.
Parameter | Type | Restrictions | Description |
---|---|---|---|
Parameter | Type | Restrictions | Description |
---|---|---|---|
Parameter | Type | Restrictions | Description |
---|---|---|---|
Parameter | Type | Restrictions | Description |
---|---|---|---|
network
String
from 1 to 100 symbols
Name of the ad network responsible for the impression
revenue
Double
from 0,0 to Double.max
Reward for banner display in USD
placement
String?
from 1 to 100 symbols, optional
Banner placement
unit
String?
from 1 to 100 symbols, optional
Banner name
network
NSString
from 1 to 100 symbols
Name of the ad network responsible for the impression
revenue
double
from 0,0 to Double.max
Reward for banner display in USD
placement
NSString _Nullable
from 1 to 100 symbols, optional
Banner placement
unit
NSString _Nullable
from 1 to 100 symbols, optional
Banner name
network
String
from 1 to 100 symbols
Name of the ad network responsible for the impression
revenue
Double
from 0,0 to Double.max
Reward for banner display in USD
placement
String?
from 1 to 100 symbols, optional
Banner placement
unit
String?
from 1 to 100 symbols, optional
Banner name
network
String
from 1 to 100 symbols
Name of the ad network responsible for the impression
revenue
Double
from 0,0 to Double.max
Reward for banner display in USD
placement
String?
from 1 to 100 symbols, optional
Banner placement
unit
String?
from 1 to 100 symbols, optional
Banner name
network
String
from 1 to 100 symbols
Name of the ad network responsible for the impression
revenue
Double
from 0,0 to Double.max
Reward for banner display in USD
placement
String?
from 1 to 100 symbols, optional
Banner placement
unit
String?
from 1 to 100 symbols, optional
Banner name
network
String
from 1 to 100 symbols
Name of the ad network responsible for the impression
revenue
Double
from 0,0 to Double.max
Reward for banner display in USD
placement
String?
from 1 to 100 symbols, optional
Banner placement
unit
String?
from 1 to 100 symbols, optional
Banner name
Parameter
Type
Restrictions
Description
socialNetwork
FString
from 1 to 100 symbols
The name of the ad network that delivered the impression.
revenue
float
form 0.0 to float.MaxValue
Reward for displaying a banner in USD.
placement
FString
from 1 to 100 symbols
Placement of the banner.
unit
FString
from 1 to 100 symbols
Banner title.
network
String
from 1 to 100 symbols
Name of the ad network responsible for the impression
revenue
Float
from 0,0 to Double.max
Reward for banner display in USD
placement
String
from 1 to 100 symbols, optional
Banner placement
unit
String
from 1 to 100 symbols, optional
Banner name
Argument
Type
Description
socialNetwork
EDTDSocialNetwork
Predefined social network.
Argument
Type
Description
socialNetwork
FString
Custom social network.
Argument
Type
Description
socialNetwork
EDTDSocialNetwork
Predefined social network.
Argument
Type
Description
socialNetwork
FString
Custom social network.
Argument
Type
Description
utmData
TMap<EDTDReferralProperty, FString>
UTM data.
Argument
Type
Description
onResult
FAnalyticsDynamicGetterStringDelegate
FDTDGetterStringDelegate
Callback.
Argument
Type
Description
onResult
FAnalyticsDynamicGetterStringDelegate
FDTDGetterStringDelegate
Callback.
Argument
Type
Description
onResult
FAnalyticsDynamicGetterStringDelegate
FDTDGetterStringDelegate
Callback.
Argument
Type
Description
onResult
FAnalyticsDynamicGetterBoolDelegate
FDTDGetterBoolDelegate
Callback.
Argument
Type
Description
listener
FAnalyticsDynamicGetterLongDelegate
FDTDGetterLongDelegate
devtodev ID Listener.
Session Measurement and Tracking in Mobile and Web Applications
Session measurement is an important metric for product analysis as it allows us to determine how frequently and for how long users interact with our website or application. However, it is important to note that session tracking methods on mobile and web applications have their own peculiarities. When a user starts a session in the application, the SDK recognizes that the application is active, indicating that it has gained focus (when the app is brought into the foreground). If the last recorded activity was more than 10 minutes ago, a Session Start event is sent.
Application activity refers to the period of time when the application is in focus, meaning the application or web page is open and the device screen is active. The focus is lost if the application goes into the background or if another website is opened in the current tab.
We measure the duration of application activity using a technical event called User Engagement (UE). It starts counting the time as soon as the application receives focus and sends the activity counter data to the server.
If, for any reason, the information about the duration of the activity couldn't be sent, it will be sent the next time the application is initialized and has internet access. However, the activity will only be included in devtodev reports if it has been less than 7 days since the session, as events from a previous period more than 7 days ago are ignored.
Thus, we have information about "Session start" and the duration of activity, but there is no specific "Session end" event. All events performed by the user are marked with the session start date in which they occurred (sessionid field in SQL tables)
For mobile applications, it is difficult to determine the beginning and end of a session because users often switch between screens of different applications. If an application on a mobile device receives focus and the last active time (in focus) was more than 10 minutes ago, a new session will be started and an event will be sent to devtodev.
For example, the user opens the application, spends a minute in it, and then puts the application in the background, a Session Start event will be sent to devtodev in the first second. After a minute, when the application goes into the background or is closed, an event with information about the duration of activity (UE) will be sent to the server as the focus is lost.
For web projects, it is not possible to detect when the user closes the page. Therefore, the UE event (duration of activity) is sent to the server every 2 minutes. To minimize the loss of information about the session duration to no more than two minutes in case of session termination, the SDK additionally saves the duration every 5 seconds and will send the information about the last duration upon the next activity. If there is no next session, the information about the last two minutes may be lost.
Let's consider an example where a user opens a webpage, spends 1.5 minutes on it, then opens another page on the site and spends another 1.5 minutes there. In devtodev, a Session Start event will be sent in the first second, and every 5 seconds, information about the activity will be saved. After 2 minutes from the start of the session, a UE event with 2 minutes of activity will be sent to the server, and after the third minute, the activity of 1 minute will be recorded in the Local Storage. Information about this activity will be sent during the next user session. The metric Average session length is calculated from the data obtained from session starts and user activity time during those sessions. It is defined as the sum of the length of all sessions divided by the number of sessions within a given period
In Basic Metrics, Engagement-> Sessions, and other reports, we encounter the following metrics:
Session duration: Shows the average session time of one user. It is calculated as (Total Sessions Length / Number of sessions) averaged by users Number of sessions: Shows the average number of sessions per user. It is calculated as the Number of sessions divided by the Number of users Total daily time spent: Represents the average total time per day spent in the user application. It is calculated as Total Sessions Length divided by the number of Active Users Sessions: Sessions by user shows the average number of sessions made by one user during the period Sessions by user: It shows the average number of sessions made by one user during the period
For the calculation of the necessary metrics:
In the SQL wizard, there is a parameter called session.Duration, which is tracked by the UE event. The session.Duration parameter represents the duration of the activity, i.e., the time the application is in focus, and it is not equal to the session duration.
sessions.Count is the number of Session Start received from the user
Table .sessions has two types of eventtype field in SQL: ss: represents the Session Start event received from the user ue: represents the time that the application was in focus (active), providing information about time parameters and activity duration.
From this data, you can calculate the average session length by dividing the sum of activity lengths from all rows for the desired period by the sum of all session starts for the same period. We recommend using extended time periods to obtain a more reliable result.
Get response about a completed transaction from the payment system.
Either send data about the received transaction for verification by calling devtodev anti-cheat methods or use your own tools for transaction verification.
If the transaction has successfully passed verification, perform the Payment event.
If the transaction hasn’t passed verification, do not perform the Payment event and mark the user as a cheater.
The devtodev service allows you to validate transactions to prevent fraud from influencing your statistics. For this, you need to integrate DTDAntiCheat
module.
We strongly discourage you from using verification results for deciding on allowing or denying users to receive their purchases! Employ this method exclusively for preventing fraud transaction data from being sent to devtodev!
To validate the transaction you can use the verifyPayment(completionHandler: @escaping (DTDVerifyResponse) -> Void)
method immediately during the transaction processing, e.g.:
DTDVerifyResponse
The DTDVerifyResponse object returned while validating the transaction has two properties:
DTDReceiptStatus
The enum type returned as a result of validation can receive the following values:
We recommend calling the Real Currency Payment method in all cases except when you receive receiptNotValid
or receiptSandbox
as a result of the validation.
To validate the transaction you can use the (void)verifyPaymentCompletion:( void (^ _Nonnull)(DTDVerifyResponse * _Nonnull))completionHandler;
method immediately during the transaction processing, e.g.:
DTDVerifyResponse
The DTDVerifyResponse object returned while validating the transaction has two properties:
DTDReceiptStatus
The enum type returned as a result of validation can receive the following values:
We recommend calling the Real Currency Payment method in all cases except when you receive receiptNotValid
or receiptSandbox
as a result of the validation.
When GooglePlay sends the transaction back to your onActivityResult
, validate it by calling the following method: verifyPayment(receipt: String, signature: String, publicKey: String, completionHandler:(DTDVerifyResponse) -> Unit)
immediately during the transaction processing, e.g.:
DTDVerifyResponse
The DTDVerifyResponse object returned while validating the transaction has two properties:
DTDReceiptStatus
The enum type returned as a result of validation can receive the following values:
We recommend calling the Real Currency Payment method in all cases except when you receive receiptNotValid
as a result of the validation.
When GooglePlay sends the transaction back to your onActivityResult
, validate it by calling the following method: verifyPayment(receipt: String, signature: String, publicKey: String, completionHandler:(DTDVerifyResponse) -> Unit)
immediately during the transaction processing, e.g.:
DTDVerifyResponse
The DTDVerifyResponse object returned while validating the transaction has two properties:
DTDReceiptStatus
The enum type returned as a result of validation can receive the following values:
We recommend calling the Real Currency Payment method in all cases except when you receive receiptNotValid
as a result of the validation.
devtodev sends a request for transaction verification to the payment platform and then forwards the answer to the app.
To validate the transaction you can use theTask<DTDReceiptStatus> VerifyPayment(string: receipt)
method. As an argument pass the PurchaseResults.ReceiptXml
property. More information about it here.
Example of verification:
DTDVerifyResponse
The DTDVerifyResponse object returned while validating the transaction has two properties:
DTDReceiptStatus
The enum type returned as a result of validation can receive the following values:
We recommend calling the Real Currency Payment method in all cases except when you receive Invalid
as a result of the validation.
If you use Unity IAP for payment validation, call the following method: void VerifyPayment(string publicKey, string receipt, Action completionHandler)
Example:
To validate data received from Google play, use void VerifyPayment(string publicKey, string receipt, string signature,Action<DTDVerifyResponse> completionHandler)
when handling the transaction.
Here's how to find your app's public key for licensing (for Google Play platform only, for other platforms the publicKey is not used):
Go to the Google Play Console and sign in. Make sure that you sign in to the account from which the app you are licensing is published (or will be published).
In the app details page, locate the Services & APIs link and click it.
In the Services & APIs page, locate the Licensing & In-App Billing section. Your public key for licensing is given in the Your License Key For This Application field.
If you use Unity IAP for payment validation, call the following method: void VerifyPayment(string receipt, Action completionHandler)
If you use Unity IAP for payment validation, call the following method: void VerifyPayment(string receipt, Action completionHandler)
N.B. You can pass a native XML recipe to the receipt argument.
DTDVerifyResponse
The DTDVerifyResponse object returned while validating the transaction has two properties:
DTDReceiptStatus
The enum type returned as a result of validation can receive the following values:
We recommend calling the Real Currency Payment method in all cases except when you receive receiptNotValid
or receiptSandbox
as a result of the validation.
This method is used to initialize the user in applications where you have set calculation by user ID specified by the developer, applications that are part of a cross-platform project.
You can also use this method when calculating by device ID (by default) to pass in the user ID used on your servers so that you can easily find the user on devtodev.
We recommend that you pass this parameter in the initialization configuration (userId
property of an instance of theDTDAnalyticsConfiguration
class).
Do not pass an empty string ("") to the setUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the setUserId
method.
To get the current value of the user ID, use the asynchronous method
getDeviceId(_ completionHandler: @escaping (String) -> Void)
We recommend that you pass this parameter in the initialization configuration (userId
property of an instance of theDTDAnalyticsConfiguration
class).
Do not pass an empty string ("") to the setUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the setUserId
method.
To get the current value of the user ID, use the asynchronous method
(void)deviceIdHandler:( void (^ _Nonnull)(NSString * _Nonnull))completion-Handler;
We recommend that you pass this parameter in the initialization configuration (userId
property of an instance of theDTDAnalyticsConfiguration
class).
Do not pass an empty string ("") to the setUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the setUserId
method.
To get the current value of the user ID, use the asynchronous method
getDeviceId(block: (String) -> Unit)
We recommend that you pass this parameter in the initialization configuration (userId
property of an instance of theDTDAnalyticsConfiguration
class).
Do not pass an empty string ("") to the setUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the setUserId
method.
To get the current value of the user ID, use the asynchronous method
getDeviceId(block: (String) -> Unit)
We recommend that you pass this parameter in the initialization configuration (userId
property of an instance of theDTDAnalyticsConfiguration
class).
Do not pass an empty string ("") to the SetUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the SetUserId
method.
To get the current value of the user ID, use the asynchronous method:
We recommend that you pass this parameter in the initialization configuration (userId
property of an instance of theDTDAnalyticsConfiguration
class).
Do not pass an empty string ("") to the SetUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the SetUserId
method.
To get the current value of the user ID, use the asynchronous method:
We recommend that you pass this parameter in the initialization configuration (userId
property in config object).
Do not pass an empty string ("") to the setUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the setUserId
method.
To get the current value of the user ID, use the getUserId
method
We recommend that you pass this parameter in the initialization configuration (UserId
property of an instance of the FDTDAnalyticsConfiguration
class).
Do not pass an empty string ("") to the SetUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use method:
To get the current value of the user ID, use the asynchronous method:
We recommend that you pass this parameter in the initialization configuration (userId
property of an instance of the GDDTDAnalyticsConfiguration class).
Do not pass an empty string ("") to the setUserID
method as the user ID. Assigning an empty string is a command to assign a default value to the user ID (it is equal to the current device ID). In applications with calculation by user ID, this can lead to unnecessary registrations.
To set a new value as the user ID, use the SetUserId
method.
To get the current value of the user ID, use the asynchronous method
DTDAnalytics.GetUserId(
onResult: Callable)
This method is used in very rare cases. It is applicable in the case when the calculation of users in the project is carried out by the user ID specified by the developer. In this case, the application can change this identifier. For example, calculation in the application is carried out by user emails and in the application, it is possible to change this email to another one. At the time of replacement, you need to call this method, specifying the user's previous email and the one with which it was replaced.
Arguments | Type | Description |
---|---|---|
Do not use this method to re-login as a different user! The setUserId method is used for relogging.
This method is used in cross-platform and data synchronized applications. The method is required to update user level data.
To set the current value to the user level, use setCurrentLevel(currentLevel: Int)
method:
We recommend that you use the setCurrentLevel
method immediately after using the setUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the DTDAnalyticsConfiguration
).
Do not use the setCurrentLevel
method when the user reaches a new level. In this case, you must use the levelUp
method.
To get the user-level value stored by the SDK, use getCurrentLevel(completionHandler: @escaping (Int) -> Void)
method
To set the current value to the user level, use (void)currentLevel:(NSInteger)currentLevel;
method:
We recommend that you use the setCurrentLevel
method immediately after using the setUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the DTDAnalyticsConfiguration
).
Do not use the setCurrentLevel
method when the user reaches a new level. In this case, you must use the levelUp
method.
To get the user-level value stored by the SDK, use (void)currentLevelHandler:( void (^ _Nonnull)(NSInteger))completionHandler;
method
To set the current value to the user level, use method:
We recommend that you use the setCurrentLevel
method immediately after using the setUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the DTDAnalyticsConfiguration
).
Do not use the setCurrentLevel
method when the user reaches a new level. In this case, you must use the levelUp
method.
To get the user-level value stored by the SDK, use getCurrentLevel(completionHandler: @escaping (Int) -> Void)
method
To set the current value to the user level, use method:
We recommend that you use the setCurrentLevel
method immediately after using the setUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the DTDAnalyticsConfiguration
).
Do not use the setCurrentLevel
method when the user reaches a new level. In this case, you must use the levelUp
method.
To get the user-level value stored by the SDK, use getCurrentLevel(completionHandler: @escaping (Int) -> Void)
method
To set the current value to the user level, use method:
We recommend that you use the SetCurrentLevel
method immediately after using the SetUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the DTDAnalyticsConfiguration
).
Do not use the SetCurrentLevel
method when the user reaches a new level. In this case, you must use the LevelUp
method.
To get the user-level value stored by the SDK, use GetCurrentLevel
method:
To set the current value to the user level, use method:
We recommend that you use the SetCurrentLevel
method immediately after using the SetUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the DTDAnalyticsConfiguration
).
Do not use the SetCurrentLevel
method when the user reaches a new level. In this case, you must use the LevelUp
method.
To get the user-level value stored by the SDK, use GetCurrentLevel
method:
To set the current value to the user level, use method:
We recommend that you use the setCurrentLevel
method immediately after using the setUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the DTDAnalyticsConfiguration
).
Do not use the setCurrentLevel
method when the user reaches a new level. In this case, you must use the levelUp
method.
To get the user-level value stored by the SDK, use getCurrentLevel
method.
To set the current value to the user level, use method:
We recommend that you use the SetCurrentLevel
method immediately after using the SetUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the EDTDAnalyticsConfiguration
).
Do not use the SetCurrentLevel
method when the user reaches a new level. In this case, you must use the LevelUp
method.
To get the user-level value stored by the SDK, use method:
To set the current value to the user level, use SetCurrentLevel(level: int)
method:
We recommend that you use the SetCurrentLevel
method immediately after using the SetUserID
method or specify the current user level in the initialization configuration (the level property of an instance of the GDDTDAnalyticsConfiguration
).
Do not use the SetCurrentLevel
method when the user reaches a new level. In this case, you must use the LevelUp
method.
To get the user-level value stored by the SDK, use GetCurrentLevel(onResult: Callable)
method
If you have your own methods for detecting cheaters in the application, you can tag such users. Actions taken by these users will not be counted in statistics.
Attention! These properties have been removed since the devtodev SDK versions: iOS & macOS 2.4.0, Android 2.5.0, Unity SDK 3.8.0, Godot 1.0.0.
We strongly recommend not to use these properties because they refer to personal data.
Attention! We strongly discourage the storage of personal user data! If you plan to pass this data, be sure to indicate this in the ‘Nutrition label’ when submitting the application to the App Store review.
Attention! We strongly discourage the storage of personal user data! If you plan to pass this data, be sure to indicate this in the ‘Nutrition label’ when submitting the application to the App Store review.
Attention! We strongly discourage the storage of personal user data! If you plan to pass this data, be sure to indicate this in the ‘Nutrition label’ when submitting the application to the App Store review.
Attention! We strongly discourage the storage of personal user data! If you plan to pass this data, be sure to indicate this in the ‘Nutrition label’ when submitting the application to the App Store review.
Example:
Each devtodev project can have up to 30 custom user properties. User custom property values can be a number, a string (up to 500 symbols), or a boolean value.
Attention! We strongly recommend that you do not use these properties to transfer and store data that fits the definition of personal data!
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use the method:
getValue(key: String, _completionHandler: @escaping (Any) -> Void)
When using the getValue
method, note that the Any
return type will need to be cast to the data type you want.
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use the method:
(void)getValueWithKey:(NSString * _Nonnull)key :(void (^ _Nonnull)(id _Nullable))completionHandler;
When using the getValue
method, note that the Any
return type will need to be cast to the data type you want.
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use the method:
getValue(key: String, handler: (Any?) -> Unit)
When using the getValue
method, note that the Any
return type will need to be cast to the data type you want.
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use the method:
getValue(key: String, handler: (Any?) -> Unit)
When using the getValue
method, note that the Any
return type will need to be cast to the data type you want.
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use the method:
When using the Get
method, note that the object
return type will need to be cast to the data type you want.
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use the method:
When using the Get
method, note that the object
return type will need to be cast to the data type you want.
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use the method:
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current value stored in the user profile on the SDK, you need to use methods:
This is how you can set properties on the current user profile:
It is important to remember that the key for custom user properties has a length limit. If the limit is exceeded (from 1 to 64 characters), the key will be truncated to the maximum allowed length
To get the current values stored in the user profile on the SDK, you need to use the methods:
TryGetBool(key: String, callback: Callable)
TryGetFloat(key: String, callback: Callable)
TryGetInt(key: String, callback: Callable)
TryGetString(key: String, callback: Callable
The isValid parameter is responsible for the presence of the requested key in the user card.
It removes a property or a list of properties and their values from the current user profile.
To remove all properties from the user card, use:
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the setCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the setCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the setCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the setCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the SetCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the SetCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the setCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the SetCheater
method.
Keep in mind that the cheater mark is not cleared from the user card; you can only uncheck the mark manually using the setCheater
method.
Please take a look at our before integrating the events.
To track payments in a real currency, dispatch this event right after the system validates that the payment went through successfully. The event is fundamental and mandatory for all the app metrics related to monetization.
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
How to find the transaction ID in GooglePlay transaction?
Find the INAPP_PURCHASE_DATA object In the JSON fields that are returned in the response data for a purchase order. A unique transaction identifier is the value of orderId property in INAPP_PURCHASE_DATA object. If the order is a test purchase made via the In-app Billing Sandbox, orderId property will be empty.
How to find the transaction ID in GooglePlay transaction?
Find the INAPP_PURCHASE_DATA object In the JSON fields that are returned in the response data for a purchase order. A unique transaction identifier is the value of orderId property in INAPP_PURCHASE_DATA object. If the order is a test purchase made via the In-app Billing Sandbox, orderId property will be empty.
By default (easy to change in the app’s settings) devtodev server invalidates transactions with previously-used identifiers. Besides, the server performs identifier checks by its outer appearance in order to avoid obvious fraud.
If you want to exclude fraud payments from your reports altogether, before creating ‘Real Currency Payment’ event, use devtodev anti-cheat feature.
If you want to track non-basic events, you can create custom events of your own. How you are going to apply them, depends solely on you.
Attention! We strongly recommend that you do not use custom event properties to transfer and store data that fits the definition of !
If you want to pass custom parameters, use DTDCustomEventParameters
class instance.
Parameter | Type | Restrictions | Description |
---|
The following data types can be passed using the DTDCustomEventParameters
object:
Type | Restrictions |
---|
If you want to pass custom parameters, use DTDCustomEventParameters
class instance.
Parameter | Type | Restrictions | Description |
---|
The following data types can be passed using the DTDCustomEventParameters
object:
Type | Restrictions |
---|
If you want to pass custom parameters, use DTDCustomEventParameters
class instance.
The following data types can be passed using the DTDCustomEventParameters
object:
If you want to pass custom parameters, use DTDCustomEventParameters
class instance.
The following data types can be passed using the DTDCustomEventParameters
object:
If you want to pass custom parameters, use DTDCustomEventParameters
class instance.
The following data types can be passed using the DTDCustomEventParameters
object:
If you want to pass custom parameters, use DTDCustomEventParameters
class instance.
The following data types can be passed using the DTDCustomEventParameters
object:
If you want to pass custom parameters, use an object with parameters.
The following data types can be passed using parameters object:
If you want to pass custom parameters, use:
The following data types can be passed using the DTDCustomEventParameters object:
If you want to pass custom parameters, use GDDTDCustomEventParameters
class instance.
The following data types can be passed using the GDDTDCustomEventParameters
object:
devtodev supports no more than 300 custom event names in a single project. Events that exceed the limit of custom event names will be discarded. Try to integrate the tracked actions by type to the event name level, and move the characteristic tags in the parameters.
For example, if you need to track purchasing “Paper” and “Pen” items, then you don’t need to create two events with the names “Paper Purchase” and “Pen Purchase”. Create a “Purchase” event and add an “Item” parameter to it with the appropriate “Paper” or “Pen” value. This way, you can use just one event to track many items.
For a string parameter, you can use no more than 50,000 unique values for the entire history of events. If the number of unique values exceeds the limit, the parameter gets locked by the system and gets discarded from the received data. Therefore, we don’t recommend using highly variable parameters like user IDs or time as string values (moreover, they are automatically added to the event).
We strongly recommend that you do not change the data type passed in the same parameter. If you change the data type in a parameter, it will be duplicated with the same name, which may cause issues while processing reports.
The described method is available beginning with version 2.1.0!
Tracking of subscriptions is now available for Apple App Store and Google Play only.
Please note that in order to track subscriptions, you need to do the following:
Call the subscriptionPayment
method (described below)
To track your income from subscriptions, you need to call the following method at the moment of the subscription purchase even if the user signed up for a trial subscription: func subscriptionPayment(transaction: SKPaymentTransaction, product: SKProduct).
For example:
Further user actions - renewal, unsubscription, etc. are tracked by using the data received from AppStore in the server-server format. You will need the corresponding setting for it.
Also, if you want to track changes in the status of the subscriptions purchased before devtodev SDK 2.0 integration, you need to transfer your history of previously purchased subscriptions to devtodev.
The SDK monitors the need for historical data to avoid sending out excessive queries to App Store. Use the DTDAnalytics.isRestoreTransactionHistoryRequired
method to check whether or not there is a need in sending out the information about the previously purchased subscriptions to devtodev. The method returns BOOL value.
An example of a purchase history query with verification of the need for it:
Use the DTDAnalytics.subscriptionHistory
method to transfer the list of previously purchased subscriptions received from App Store.
If your project accounts users by user ID (not by device ID) and the device is used by more than one user, you need to filter the transaction history so that it will contain only those transactions that belong to the active user. Otherwise, subscriptions of all device users will be attributed to the user who was the first to launch the app after the integration of subscription tracking.
To recover the purchase history, the user should be logged in with his Apple ID. Be mindful of this before starting the recovering process.
Please note that in order to track subscriptions, you need to do the following:
Call the subscriptionPayment
method (described below)
To track your income from subscriptions, you need to call the following method at the moment of the subscription purchase even if the user signed up for a trial subscription: func subscriptionPayment(transaction: Transaction, product: Product).
For example:
Fork with Transaction.updates:
Further user actions - renewal, unsubscription, etc. are tracked by using the data received from AppStore in the server-server format. You will need the corresponding setting for it.
Also, if you want to track changes in the status of the subscriptions purchased before devtodev SDK 2.0 integration, you need to transfer your history of previously purchased subscriptions to devtodev.
The SDK monitors the need for historical data to avoid sending out excessive queries to App Store. Use the DTDAnalytics.isRestoreTransactionHistoryRequired
method to check whether or not there is a need in sending out the information about the previously purchased subscriptions to devtodev. The method returns BOOL value.
An example of a purchase history query with verification of the need for it:
Use the DTDAnalytics.subscriptionHistory
method to transfer the list of previously purchased subscriptions received from App Store.
If your project accounts users by user ID (not by device ID) and the device is used by more than one user, you need to filter the transaction history so that it will contain only those transactions that belong to the active user. Otherwise, subscriptions of all device users will be attributed to the user who was the first to launch the app after the integration of subscription tracking.
To recover the purchase history, the user should be logged in with his Apple ID. Be mindful of this before starting the recovering process.
Please note that in order to track subscriptions, you need to do the following:
Call the subscriptionPayment
method (described below)
To track your income from subscriptions, you need to call the following method at the moment of the subscription purchase even if the user signed up for a trial subscription:
(void)subscriptionPaymentWithTransaction:(SKPaymentTransaction * _Nonnull)transaction product:(SKProduct * _Nonnull)product;
For example:
Further user actions - renewal, unsubscription, etc. are tracked by using the data received from AppStore in the server-server format. You will need the corresponding setting for it.
Also, if you want to track changes in the status of the subscriptions purchased before devtodev SDK 2.0 integration, you need to transfer your history of previously purchased subscriptions to devtodev.
The SDK monitors the need for historical data to avoid sending out excessive queries to App Store. Use the (void)isRestoreTransactionHistoryRequiredWithCompletionHandler:( void (^ _Nonnull)(BOOL))completionHandler;
method to check whether or not there is a need in sending out the information about the previously purchased subscriptions to devtodev. The method returns BOOL value.
An example of a purchase history query with verification of the need for it:
Use the (void)subscriptionHistoryWithTransactions:(NSArray<SKPaymentTransaction *> * _Nonnull)transactions;
method to transfer the list of previously purchased subscriptions received from App Store.
If your project accounts users by user ID (not by device ID) and the device is used by more than one user, you need to filter the transaction history so that it will contain only those transactions that belong to the active user. Otherwise, subscriptions of all device users will be attributed to the user who was the first to launch the app after the integration of subscription tracking.
To recover the purchase history, the user should be logged in with his Apple ID. Be mindful of this before starting the recovering process.
Please note that in order to track subscriptions, you need to do the following:
Call the subscriptionPayment
method (described below)
Before sending a request for subscription from your app, during the creation of BillingFlowParams
, to the setObfuscatedAccountId
function of the BillingFlowParams.newBuilder()
object insert obfuscatedAccountId
obtained from DTDAnalytics.getObfuscatedAccountId
.
Attention! The obfuscated identifier is returned asynchronously, outside of the calling thread!
Example:
To track your subscriptions, add this event immediately after the platform confirms that the subscription was approved by the user.
How to find the transaction ID in GooglePlay transaction?
Find the INAPP_PURCHASE_DATA object In the JSON fields that are returned in the response data for a purchase order. A unique transaction identifier is the value of orderId property in INAPP_PURCHASE_DATA object. If the order is a test purchase made via the In-app Billing Sandbox, orderId property will be empty.
Further user actions - renewal, unsubscription, etc. are tracked by using the data received from Google Play in the server-server format. You will need the corresponding setting for it.
The subscriptionHistory
method is used for matching users with subscribers who purchased their subscriptions before the SDK 2.0 integration. Otherwise, it will be impossible to establish the affiliation when it gets renewed or cancelled.
To get a list of active subscriptions call billingClient.queryPurchasesAsync
. After successfully receiving a response from Google Play Services, pass it to DTDAnalytics.subscriptionHistory(purchaseList: List<String>).
purchaseList: List<String> purchaseList
- a string containing list of json objects is passed to the DTDAnalytics.subscriptionHistory
method. For the event to run, the json object must contain the following keys:
orderID
- a unique transaction identifier
productID
- a unique product identifier
The SDK monitors the need for historical data to avoid sending out excessive queries. Use the DTDAnalytics.isRestoreTransactionHistoryRequired
method to check whether or not there is a need in sending out the information about the previously purchased subscriptions to devtodev. The method returns a Boolean value.
Attention! DTDAnalytics.isRestoreTransactionHistoryRequired
is returned asynchronously, outside of the calling thread!
Example:
If your project accounts users by user ID (not by device ID) and the device is used by more than one user, you need to filter the transaction history so that it will contain only those transactions that belong to the active user. Otherwise, subscriptions of all device users will be attributed to the user who was the first to launch the app after the integration of subscription tracking.
Please note that in order to track subscriptions, you need to do the following:
Call the subscriptionPayment
method (described below)
Before sending a request for subscription from your app, during the creation of BillingFlowParams
, to the setObfuscatedAccountId
function of the BillingFlowParams.newBuilder()
object insert obfuscatedAccountId
obtained from DTDAnalytics.INSTANCE.getObfuscatedAccountId.
Attention! The obfuscated identifier is returned asynchronously, outside of the calling thread!
Example:
To track your subscriptions, add this event immediately after the platform confirms that the subscription was approved by the user.
How to find the transaction ID in GooglePlay transaction?
Find the INAPP_PURCHASE_DATA object In the JSON fields that are returned in the response data for a purchase order. A unique transaction identifier is the value of orderId property in INAPP_PURCHASE_DATA object. If the order is a test purchase made via the In-app Billing Sandbox, orderId property will be empty.
Further user actions - renewal, unsubscription, etc. are tracked by using the data received from Google Play in the server-server format. You will need the corresponding setting for it.
The subscriptionHistory
method is used for matching users with subscribers who purchased their subscriptions before the SDK 2.0 integration. Otherwise, it will be impossible to establish the affiliation when it gets renewed or cancelled.
To get a list of active subscriptions call billingClient.queryPurchasesAsync
. After successfully receiving a response from Google Play Services, pass it to DTDAnalytics.subscriptionHistory(purchaseList: List<String>).
purchaseList: List<String> purchaseList
- a string containing list of json objects is passed to the DTDAnalytics.INSTANCE.subscriptionHistory
method. For the event to run, the json object must contain the following keys:
orderID
- a unique transaction identifier
productID
- a unique product identifier
The SDK monitors the need for historical data to avoid sending out excessive queries. Use the DTDAnalytics.INSTANCE.isRestoreTransactionHistoryRequired
method to check whether or not there is a need in sending out the information about the previously purchased subscriptions to devtodev. The method returns a Boolean value.
Attention! DTDAnalytics.INSTANCE.isRestoreTransactionHistoryRequired
is returned asynchronously, outside of the calling thread!
Example:
If your project accounts users by user ID (not by device ID) and the device is used by more than one user, you need to filter the transaction history so that it will contain only those transactions that belong to the active user. Otherwise, subscriptions of all device users will be attributed to the user who was the first to launch the app after the integration of subscription tracking.
In order to work with Unity subscriptions, you need to integrate the subscription module to your project. You can do it by manually importing the unitypackage.
Import DTDAnalytics.unitypackage to your project
Import DTDSubscriptions.unitypackage to your project.
For the DTDSubscriptions
module to function you need the DTDAnalytics
and Unity IAP modules.
You also need to create an AppleTangle
file. Open the Unity editor menu and choose Window → Unity IAP → Receipt Validation Obfuscator (pic. 1).
In case you don’t use the IAP receipt validation, clear the input field under “2. Paste the key here:” and click Obfuscate Google Play Licence Key (pic. 2).
Restore purchase history in order for the module to function correctly.
If you use Google Play, after successful IAP initialization call the DTDSubscriptions.History()
method.
To avoid excessive restoring of subscription history, use the DTDSubscriptions.IsRestoreTransactionHistoryRequired(Action<bool> resultCallback)
method. If the resultCallback returns true, call the DTDSubscriptions.History()
method.
Example:
Example:
Add a DTDSubscriptions.Payment(Product product)
call to the ProcessPurchase
method.
Below you can see an example of the entire script:
The event allows you to track tutorial completion and identify the stages where you lose new users.
We recommend tracking the starting point (value -1) before beginning the first tutorial stage, then passing the counting number of every completed stage after its completion (integers larger than 0), and at the end, marking the moment of the last tutorial stage completion (value -2).
If your app has an option of skipping the tutorial and the user has used it, then it’s necessary to send a refusal value (value 0) only.
The method takes on the step value with an integer type.
The method takes on the step value with an integer type.
The method takes on the step value with an integer type.
The method takes on the step value with an integer type.
The method takes on the step value with an integer type.
The method takes on the step value with an int base type.
The method takes on the step value with an integer type.
The method takes on the step value with an int32 base type.
The method takes on the step value with an integer type.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
You can send and track the following data along with the level values: an average amount of the in-game currency by the end of the level, user spendings on the level, and amounts of purchased or earned in-game currency/resources. Unfortunately, Web SDK doesn’t allow to automatically calculate spending and receiving of the in-game currency/resources while users are passing the level (data accumulation on the Web might be inaccurate as users might utilize multiple browsers and devices, as well as erase local browser data).
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
The event should be dispatched right after the level-up. The number of the level reached is passed to the level
parameter.
To monitor the average account balance of in-game currency by the end of each level, dispatch in-game currencies (resources) names and their amounts to the method signature:
Attention! The number of tracked in-game currencies or resources (their unique names) should not exceed 30 at all times.
To track the average balance of in-game currency disregarding the level up event, pass the list of in-game currency (resource) names and their amount to the method signature:
You need to dispatch the event after every game account balance refill if you want to track the average in-game currency amount acquired or earned by the players for a certain timeframe or during a level playthrough.
acrualType
can receive one of the following values:
acrualType
can receive one of the following values:
accrualType
can receive one of the following values:
accrualType
can receive one of the following values:
AccrualType
can receive one of the following values:
AccrualType
can receive one of the following values:
Example:
acrualType
can receive one of the following values:
Pass this event after every purchase if you want to track in-game currency spends and items’ popularity. You can apply this event to both games and any apps with virtual currency.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names (FString) and amounts of the currencies/resources (int32) .
In case the item is sold for more than one currency/resource, you need to build a dictionary with all the names and amounts of the currencies/resources.
First of all, the progression event is used in games with short (within one game session) areas/game levels, e.g. match 3 games. You can use the event to collect data on how well or how fast users complete levels, how difficult it is for them, how many resources they gained or spent, and other parameters.
There are two methods in working with progression event:
startProgressionEvent
finishProgressionEvent
When a player spawns at a location, the following method is called:
DTDStartProgressionEventParameters
:
Once the player completes the location successfully, the following method is called:
DTDFinishProgressionEventParameters
:
There are two methods in working with progression event:
startProgressionEvent
finishProgressionEvent
When a player spawns at a location, the following method is called:
DTDStartProgressionEventParameters
:
Once the player completes the location successfully, the following method is called:
DTDFinishProgressionEventParameters
:
There are two methods in working with progression event:
startProgressionEvent
finishProgressionEvent
When a player spawns at a location, the following method is called:
DTDStartProgressionEventParameters
:
Once the player completes the location successfully, the following method is called:
DTDFinishProgressionEventParameters
:
There are two methods in working with progression event:
startProgressionEvent
finishProgressionEvent
When a player spawns at a location, the following method is called:
DTDStartProgressionEventParameters
:
Once the player completes the location successfully, the following method is called:
DTDFinishProgressionEventParameters
:
There are two methods in working with progression event:
StartProgressionEvent
FinishProgressionEvent
When a player spawns at a location, the following method is called:
DTDStartProgressionEventParameters
:
Once the player completes the location successfully, the following method is called:
DTDFinishProgressionEventParameters
:
There are two methods in working with progression event:
StartProgressionEvent
FinishProgressionEvent
When a player spawns at a location, the following method is called:
DTDStartProgressionEventParameters
:
Once the player completes the location successfully, the following method is called:
DTDFinishProgressionEventParameters
:
There are two methods in working with progression event:
startProgressionEvent
finishProgressionEvent
When a player spawns at a location, the following method is called:
startProgressionEvent
event parameters:
Example:
Once the player completes the location (instead of successfully or not), the following method is called:
startProgressionEvent
event parameters:
Example:
There are two methods in working with progression event:
startProgressionEvent
finishProgressionEvent
When a player spawns at a location, the following method is called (one of them):
Start progression event with parameters:
FDTDStartProgressionEventParams:
Example:
Once the player completes the location (instead of successfully or not), the following method is called (one of them):
Finish progression event with parameters:
FDTDFinishProgressionEventParameters:TMap<FString, int64>
Example:
There are two methods in working with progression event:
StartProgressionEvent
FinishProgressionEvent
When a player spawns at a location, the following method is called:
GDDTDStartProgressionEventParameters
:
Once the player completes the location successfully, the following method is called:
GDDTDFinishProgressionEventParameters
:
The user can only be in one area at a time. When moving to another area (including nested ones), the previous location must be completed. Information about events that have not been completed by calling the finishProgressionEvent
method during a game session (the finishProgressionEvent
method call is not integrated, or the user uses the cached app, or the app has crashed) is not included in the statistics.
If you want to use this event to track actions that take more than one game session, you can prepare the required data and call both methods when the action is completed (successfully or unsuccessfully). For example, you can use this event to track the main questline.
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Property | Setter | Getter |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Arguments | Type | Description |
---|---|---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Type | Restrictions |
---|
Parameter | Type | Restrictions | Description |
---|
Type | Restrictions |
---|
Parameter | Type | Restrictions | Description |
---|
Type | Restrictions |
---|
Parameter | Type | Restrictions | Description |
---|
Type | Restrictions |
---|
Parameter | Type | Restrictions | Description |
---|
Type | Restrictions |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Type | Restrictions |
---|
Parameter | Type | Restrictions | Description |
---|
Type | Restrictions |
---|
Download the latest version of devtodev package from the repository:
Initialize the DTDAnalytics
module (see our ).
Add DTDSubscriptions.Initialize(IStoreController controller)
to the method.
If you use AppleStore, first set the DTDSubscriptions.IsRestoring
property to true (this will filter out unwanted transactions). After , call the DTDSubscriptions.History()
method. After that, set the DTDSubscriptions.IsRestoring propert
y to false.
Value | Meaning |
---|
Value | Meaning |
---|
Value | Meaning |
---|
Value | Meaning |
---|
Value | Meaning |
---|
Value | Meaning |
---|
Value | Meaning |
---|
Parameter | Type | Restrictions | Description |
---|
Value | Meaning |
---|
Value | Meaning |
---|
This event is for games only. It is worthwhile to integrate this event into a game type project, as specified in the . In projects with the “app” type, game events will not be tracked and displayed in the interface, even if they are integrated. You can verify and change the project type in Settings → .
The event allows you to analyze the distribution of players over different game levels, monitor the in-game currency balance by levels. You can find more information about the right moment to use LevelUp
event .
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
This event is for games only. It is worthwhile to integrate this event into a game type project, as specified in the . In projects with the “app” type, game events will not be tracked and displayed in the interface, even if they are integrated. You can verify and change the project type in Settings → .
Parameter | Type | Restrictions | Description |
---|
This event is for games only. It is worthwhile to integrate this event into a game type project, as specified in the . In projects with the “app” type, game events will not be tracked and displayed in the interface, even if they are integrated. You can verify and change the project type in Settings → .
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
This event is for games only. It is worthwhile to integrate this event into a game type project, as specified in the . In projects with the “app” type, game events will not be tracked and displayed in the interface, even if they are integrated. You can verify and change the project type in Settings → .
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Restrictions |
---|
Parameter | Type | Restrictions | Description |
---|
This event is for games only. It is worthwhile to integrate this event into a game type project, as specified in the . In projects with the “app” type, game events will not be tracked and displayed in the interface, even if they are integrated. You can verify and change the project type in Settings → .
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
Parameter | Type | Restrictions | Description |
---|
userId
FString
User ID.
onResult
FAnalyticsDynamicGetterStringDelegate
FDTDGetterStringDelegate
Callback
level
int32
Current level.
onResult
FAnalyticsDynamicGetterIntDelegate
FDTDGetterIntDelegate
Callback
cheater
bool
Cheater flag
tester
bool
Tester flag
Property
Getter
Setter
Name
setName(name: String)
getName(completionHandler: @escaping (String?) -> Void)
setEmail(email: String)
getEmail(completionHandler: @escaping (String?) -> Void)
Phone
setPhone(phone: String)
getPhone(completionHandler: @escaping (String?) -> Void)
Photo
setPhoto(photo: String)
getPhoto(completionHandler: @escaping (String?) -> Void)
Gender
setGender(gender: DTDGender)
getGender(completionHandler: @escaping (DTDGender) -> Void)
Age
setAge(age: Int)
getAge(completionHandler: @escaping (Int) -> Void
Property
Setter
Getter
Age
[DTDUserCard setAge:(NSInteger)];
[DTDUserCard getAgeHandler:^(NSInteger age) { }]
[DTDUserCard setEmail:(NSString * _Nonnull)];
[DTDUserCard getEmailHandler:^(NSString * email) { }];
Gender
[DTDUserCard setGender:(enum Gender)];
[DTDUserCard getGenderHandler:^(enum Gender gender) { }];
Name
[DTDUserCard setName:(NSString * _Nonnull)];
[DTDUserCard getNameHandler:^(NSString * name) { }];
Phone
[DTDUserCard setPhone:(NSString * _Nonnull)];
[DTDUserCard getPhoneHandler:^(NSString * phone) { }];
Photo
[DTDUserCard setPhoto:(NSString * _Nonnull)];
[DTDUserCard getPhotoHandler:^(NSString * photo) { }];
Property
Getter
Setter
Name
setName(name: String)
getName(handler: (String) -> Unit)
setEmail(email: String)
getEmail(handler: (String) -> Unit)
Phone
setPhone(phone: String)
getPhone(handler: (String) -> Unit)
Photo
setPhoto(photo: String)
getPhoto(handler: (String) -> Unit)
Gender
setGender(gender: DTDGender)
getGender(handler: (DTDGender) -> Void)
Age
setAge(age: Int)
getAge(handler: (String) -> Unit)
Property
Getter
Setter
Name
setName(name: String)
getName(handler: (String) -> Unit)
setEmail(email: String)
getEmail(handler: (String) -> Unit)
Phone
setPhone(phone: String)
getPhone(handler: (String) -> Unit)
Photo
setPhoto(photo: String)
getPhoto(handler: (String) -> Unit)
Gender
setGender(gender: DTDGender)
getGender(handler: (DTDGender) -> Void)
Age
setAge(age: Int)
getAge(handler: (String) -> Unit)
Property
Getter
Setter
Name
SetName(name: string)
Task<string> GetName();
SetEmail(email: string)
Task<string> GetEmail()
Phone
SetPhone(phone: string)
Task<string> GetPhone()
Photo
SetPhoto(photo: string)
Task<string> GetPhoto()
Gender
SetGender(gender: DTDGender)
Task<DTDGender> GetGender()
Age
SetAge(age: long)
Task<long> GetAge()
Property
Getter
Setter
Name
SetName(name: string)
GetName(Action<string> onGetName)
SetEmail(email: string)
GetEmail(Action<string> onGetEmail)
Phone
SetPhone(phone: string)
GetPhone(Action<string> onGetPhone)
Photo
SetPhoto(photo: string)
GetPhoto(Action<string> onGetPhoto)
Gender
SetGender(gender: DTDGender)
GetGender(Action<DTDGender> onGetGender)
Age
SetAge(age: long)
GetAge(Action<string> onGetAge)
Property
Getter
Setter
Type
Name
getName()
setName("John Doe")
String
getEmail()
setEmail("email@me.com")
String
Phone
getPhone()
setPhone("+15555555555")
String
Photo
getPhoto()
setPhoto("https://domain.com/photo.jpg")
String
Gender
getGender()
setGender(gender)
Age
getAge()
setAge(age)
Int
Name
SetName(name: FString)
GetName(delegate: FUserCardDynamicGetterStringDelegate)
GetName(delegate: FDTDGetterStringDelegate)
Email
SetEmail(email: FString)
GetEmail(delegate: FUserCardDynamicGetterStringDelegate)
GetEmail(delegate: FDTDGetterStringDelegate)
Phone
SetPhone(phone: FString)
GetPhone(delegate: FUserCardDynamicGetterStringDelegate)
GetPhone(delegate: FDTDGetterStringDelegate)
Photo
SetPhoto(photo: FString)
GetPhoto(delegate: FUserCardDynamicGetterStringDelegate)
GetPhoto(delegate: FDTDGetterStringDelegate)
Gender
SetGender(gender: EDTDGender)
GetGender(delegate: FUserCardDynamicGetterGenderDelegate)
GetGender(delegate: FDTDGetterGenderDelegate)
Age
SetAge(age: int64)
GetAge(delegate: FUserCardDynamicGetterLongDelegate)
GetAge(delegate: FDTDGetterLongDelegate)
key
FString
Parameter key.
value
bool
Parameter value.
key
FString
Parameter key.
value
float
Parameter value.
key
FString
Parameter key.
value
int64
Parameter value.
key
FString
Parameter key.
value
FString
Parameter value.
key
FString
Parameter key.
onResult
FUserCardDynamicGetterOptionalBoolDelegate
FDTDGetterOptionalBoolWithKeyDelegate
Callback.
key
FString
Parameter key.
onResult
FUserCardDynamicGetterOptionalFloatDelegate
FDTDGetterOptionalFloatWithKeyDelegate
Callback.
key
FString
Parameter key.
onResult
FUserCardDynamicGetterOptionalLongDelegate
FDTDGetterOptionalLongWithKeyDelegate
Callback.
key
FString
Parameter key.
onResult
FUserCardDynamicGetterOptionalStringDelegate
FDTDGetterOptionalStringWithKeyDelegate
Callback.
key
FString
Parameter key.
keys
TArray<FString>
Parameter keys.
Property
Description
receiptStatus
Enum type DTDReceiptStatus
that represents the result of the transaction validation.
verificationResult
Additional information from the validation server.
Value
Description
receiptValid
The payment is valid, the transaction is genuine.
receiptNotValid
The payment is invalid, the transaction may be a duplicate or fraud.
receiptServerError
Server error when validating the payment.
receiptSandbox
Test payment.
receiptInternalError
Internal SDK error.
Property
Description
receiptStatus
Enum type DTDReceiptStatus
that represents the result of the transaction validation.
verificationResult
Additional information from the validation server.
Value
Description
receiptValid
The payment is valid, the transaction is genuine.
receiptNotValid
The payment is invalid, the transaction may be a duplicate or fraud.
receiptServerError
Server error when validating the payment.
receiptSandbox
Test payment.
receiptInternalError
Internal SDK error.
Property
Description
receiptStatus
Enum type DTDReceiptStatus
that represents the result of the transaction validation.
verificationResult
Additional information from the validation server.
Value
Description
receiptValid
The payment is valid, the transaction is genuine.
receiptNotValid
The payment is invalid, the transaction may be a duplicate or fraud.
receiptServerError
Server error when validating the payment.
receiptInternalError
Internal SDK error.
Property
Description
receiptStatus
Enum type DTDReceiptStatus
that represents the result of the transaction validation.
verificationResult
Additional information from the validation server.
Value
Description
receiptValid
The payment is valid, the transaction is genuine.
receiptNotValid
The payment is invalid, the transaction may be a duplicate or fraud.
receiptServerError
Server error when validating the payment.
receiptInternalError
Internal SDK error.
Property
Description
ReceiptStatus
Enum type DTDReceiptStatus
that represents the result of the transaction validation.
VerificationResult
Additional information from the validation server.
Value
Description
Valid = 0L
The payment is valid, the transaction went through successfully
Invalid = 1L
The payment is invalid, the transaction may be a duplicate or fraud
ServerError = 2L
Server error when validating the payment
InternalError = 4L
Internal SDK error
Property
Description
receiptStatus
Enum type DTDReceiptStatus
that represents the result of the transaction validation.
verificationResult
Additional information from the validation server.
Value
Description
receiptValid
The payment is valid, the transaction is genuine.
receiptNotValid
The payment is invalid, the transaction may be a duplicate or fraud.
receiptServerError
Server error when validating the payment.
receiptSandbox
Test payment.
receiptInternalError
Internal SDK error.
| string | from 1 to 72 symbols | Custom event name. |
| DTDCustomEventParameters | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from Long.min to Long.max |
| from 1 to 255 symbols |
| true/false |
| from Double.min to Double.max |
| string | from 1 to 72 symbols | Custom event name. |
| DTDCustomEventParameters | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from Long.min to Long.max |
| from 1 to 255 symbols |
| true/false |
| from Double.min to Double.max |
| string | from 1 to 72 symbols | Custom event name. |
| DTDCustomEventParameters | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from long.MinValue to long.MaxValue |
| from 1 to 255 symbols |
| true/false |
| from double.MinValue to double.MaxValue |
| string | from 1 to 72 symbols | Custom event name. |
| DTDCustomEventParameters | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from Int64.MinValue to Int64.MaxValue |
| from 1 to 255 symbols |
| true/false |
| from Double.MinValue to Double.MaxValue |
| string | from 1 to 72 symbols | Custom event name. |
| object | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from Number.MIN_SAFE_INTEGER to Number.MAX_SAFE_INTEGER |
| from 1 to 255 symbols |
| true/false |
| from Number.MIN_VALUE to Number.MAX_VALUE |
| FString | from 1 to 72 symbols | Custom event name. |
| FString | from 1 to 72 symbols | Custom event name. |
| FDTDCustomEventParams |
key - from 1 to 32 symbols value - see below | Custom event parameters. Warning: avoid duplicate keys in all dictionaries. Because dictionaries are combined into a generic dictionary [string: any] in native code. |
int64 | from int64.MinValue to int64.MaxValue |
FString | from 1 to 255 symbols |
bool | true/false |
float | from float.MinValue to float.MaxValue |
| string | from 1 to 72 symbols | Custom event name. |
| GDDTDCustomEventParams | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from Int64.min to Int64.max |
| from 1 to 255 symbols |
| true/false |
| from Float.min to Float.max |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| int32 | From 1 to int32.MaxValue - 1 | Tutorial step |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| The user skipped the tutorial |
| The value defines the beginning of the tutorial |
| Counting number of completed tutorial stage |
| The value defines the completion of the tutorial |
| int | From 1 to Int32.max - 1 | Level reached |
| [String:Int] | String - from 1 to 24 symbols Int - from Int64.min to int64.max | Resources’ names and number at the time of level up |
| NSInteger | From 1 to Int32.max - 1 | Level reached |
| NSDictionary<NSString *,NSNumber *> | String - from 1 to 24 symbols Int - from Int64.min to int64.max | Resources’ names and number at the time of level up |
| int | From 1 to Int.max - 1 | Level reached |
| Map<String,Long> | String - from 1 to 24 symbols Long - from Long.min to Long.max | Resources’ names and number at the time of level up |
| int | From 1 to Int.max - 1 | Level reached |
| Map<String,Long> | String - from 1 to 24 symbols Long - from Long.min to Long.max | Resources’ names and number at the time of level up |
| int | From 1 to int.MaxValue - 1 | Level reached |
| [string: long] | String - from 1 to 24 symbols Long - from long.MinValue to long.MaxValue | Resources’ names and number at the time of level up |
| int | From 1 to int32.MaxValue - 1 | Level reached |
| [string: long] | String - from 1 to 24 symbols Long - from long64.MinValue to long64.MaxValue | Resources’ names and number at the time of level up |
| int | From 1 to int.MaxValue - 1 | Level reached |
| [string: long] | String - from 1 to 24 symbols Long - from long.MinValue to long.MaxValue | Resources’ names and number at the time of level up |
| [string: long] | String - from 1 to 24 symbols Long - from 0 to Number.MAX_SAFE_INTEGER | Game currency amount spent during the level. Optional. |
| [string: long] | String - from 1 to 24 symbols Long - from 0 to Number.MAX_SAFE_INTEGER | Game currency earned during the level. Optional. |
| [string: long] | String - from 1 to 24 symbols Long - from 0 to Number.MAX_SAFE_INTEGER | Game currency amount bought during the level. Optional. |
| int32 | From 1 to int32.MaxValue - 1 | Level reached |
| int32 | From 1 to int32.MaxValue - 1 | Level reached |
| TMap<FString, int64> | FString - from 1 to 24 symbols int64 - from int64.MinValue to int64.MaxValue | Resources’ names and number at the time of level up |
| int | From 1 to Int32.max - 1 | Level reached |
| GDDTDInt64Resources | String - from 1 to 24 symbols Int - from Int64.min to int64.max | Resources’ names and number at the time of level up |
| TMap<FString, int64> | FString - from 1 to 24 symbols int64 - from int64.MinValue to int64.MaxValue | Resources’ names and number |
| string | from 1 to 24 symbols | In-game currency/resource name |
| int | from 1 to Int32.max | Amount of currency in circulation |
| string | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| DTDAccrualType (enum) | The currency/resource source type. The player can either gain resources during the game ( |
| NSString | from 1 to 24 symbols | In-game currency/resource name |
| NSInteger | from 1 to Int32.max | Amount of currency in circulation |
| NSString | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| DTDAccrualType (enum) | The currency/resource source type. The player can either gain resources during the game ( |
| string | from 1 to 24 symbols | In-game currency/resource name |
| int | from 1 to Int.max | Amount of currency in circulation |
| string | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| DTDAccrualType (enum) | The currency/resource source type. The player can either gain resources during the game ( |
| string | from 1 to 24 symbols | In-game currency/resource name |
| int | from 1 to Int.max | Amount of currency in circulation |
| string | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| DTDAccrualType (enum) | The currency/resource source type. The player can either gain resources during the game ( |
| string | from 1 to 24 symbols | In-game currency/resource name |
| int | from 1 to Int.MaxValue | Amount of currency in circulation |
| string | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| DTDAccrualType (enum) | The currency/resource source type. The player can either gain resources during the game ( |
| string | from 1 to 24 symbols | In-game currency/resource name |
| int | from 1 to Int32.MaxValue | Amount of currency in circulation |
| string | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| DTDAccrualType (enum) | The currency/resource source type. The player can either gain resources during the game ( |
| string | from 1 to 24 symbols | In-game currency/resource name |
| int | from 1 to Int.max | Amount of currency in circulation |
| string | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| int | The currency/resource source type. The player can either gain resources during the game ( |
| FString | from 1 to 24 symbols | In-game currency/resource name |
| int32 | from 1 to Int32.MaxValue | Amount of currency in circulation |
| FString | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| EDTDAccrualType | The currency/resource source type. The player can either gain resources during the game ( |
| String | from 1 to 24 symbols | In-game currency/resource name |
| int | from 1 to Int32.max | Amount of currency in circulation |
| String | from 1 to 23 symbols | The sources of currency/resources. It can be used for breaking down income by its sources. For example, a city builder game may have some: “Rent” for the profit received from rental property, or “Bank” if the player has purchased some currency. |
| GDDTDAccrualType (enum) | The currency/resource source type. The player can either gain resources during the game ( |
| string | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| string | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int | from 1 to Int32.max | The number of units of goods purchased. |
| string | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int | from 1 to Int32.max | The price of the purchased item in the specified in-game currency. |
| NSString | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| NSString | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| NSInteger | from 1 to Int32.max | The number of units of goods purchased. |
| NSString | from 1 to 24 symbols | The name of a currency used for the purchase. |
| NSInteger | from 1 to Int32.max | The price of the purchased item in the specified in-game currency. |
purchaseId | string | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| string | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int | from 1 to Int.max | The number of units of goods purchased. |
| string | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int | from 1 to Int.max | The price of the purchased item in the specified in-game currency. |
purchaseId | string | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| string | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int | from 1 to Int.max | The number of units of goods purchased. |
| string | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int | from 1 to Int.max | The price of the purchased item in the specified in-game currency. |
| string | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| string | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int | from 1 to int.MaxValue | The number of units of goods purchased. |
| string | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int | from 1 to int.MaxValue | The price of the purchased item in the specified in-game currency. |
| string | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| string | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int | from 1 to Int32.MaxValue | The number of units of goods purchased. |
| string | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int | from 1 to Int32.MaxValue | The price of the purchased item in the specified in-game currency. |
| string | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| string | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int | from 1 to Number.MAX_SAFE_INTEGER | The number of units of goods purchased. |
| string | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int | from 1 to Number.MAX_SAFE_INTEGER | The price of the purchased item in the specified in-game currency. |
| FString | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| FString | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int32 | from 1 to Int32.MaxValue | The number of units of goods purchased. |
| FString | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int32 | from 1 to Int32.MaxValue | The price of the purchased item in the specified in-game currency. |
| FString | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| FString | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int32 | from 1 to int32.MaxValue | The number of units of goods purchased. |
| TMap<FString, int32> | FString - from 1 to 24 symbols int32 - from 1 to int32.MaxValue | Map with resources. |
| String | from 1 to 32 symbols | A unique purchase name or ID. Make sure that the names are always in the same language otherwise they will be listed as different items. |
| String | from 1 to 96 symbols | The name of a resource group. For example, for “Wood” it can be “Construction materials”. |
| int | from 1 to Int32.max | The number of units of goods purchased. |
| String | from 1 to 24 symbols | The name of a currency used for the purchase. |
| int | from 1 to Int32.max | The price of the purchased item in the specified in-game currency. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| string | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int | from 0 to Int32.max | An optional difficulty value which is set using the value: |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| bool | true/false | The completion event result. ‘True’ if successful, ‘false’ if unsuccessful/lost. |
| int | from 0 to Int64.max | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| [String: Int] | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources consumed during an area completion. |
| [String: Int] | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources earned during an area completion. |
| NSString | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| NSString | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| NSInteger | from 0 to Int32.max | An optional difficulty value which is set using the value: |
| NSString | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| BOOL | true/false | The completion event result. ‘True’ if successful, ‘false’ if unsuccessful/lost. |
| NSInteger | from 0 to Int64.max | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| NSDictionary<NSString *,NSNumber *> | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources consumed during an area completion. |
| NSDictionary<NSString *,NSNumber *> | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources earned during an area completion. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| string | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int | from 0 to Int32.max | An optional difficulty value which is set using the value: |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| bool | true/false | The completion event result. ‘True’ if successful, ‘false’ if unsuccessful/lost. |
| int | from 0 to Int64.max | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| Map<String, Long> | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources consumed during an area completion. |
| Map<String, Long> | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources earned during an area completion. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| string | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int | from 0 to Int32.max | An optional difficulty value which is set using the value: |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| bool | true/false | The completion event result. ‘True’ if successful, ‘false’ if unsuccessful/lost. |
| int | from 0 to Int64.max | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| Map<String, Long> | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources consumed during an area completion. |
| Map<String, Long> | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources earned during an area completion. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| string | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int | from 0 to int.MaxValue | An optional difficulty value. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| bool | true/false | The completion event result. ‘ |
| int | from 0 to int.MaxValue | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| [String: Int] | key - from 1 to 24 symbols value - From 1 to int.MaxValue | Resources consumed during an area completion. |
| [String: Int] | key - from 1 to 24 symbols value - From 1 to int.MaxValue | Resources earned during an area completion. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| string | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int | from 0 to Int32.MaxValue | An optional difficulty value. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| bool | true/false | The completion event result. ‘ |
| int | from 0 to Int64.MaxValue | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| [String: Int] | key - from 1 to 24 symbols value - From 1 to Int64.MaxValue | Resources consumed during an area completion. |
| [String: Int] | key - from 1 to 24 symbols value - From 1 to Int64.MaxValue | Resources earned during an area completion. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| object | see below | Location event parameters. |
| string | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int | from 0 to Number.MAX_SAFE_INTEGER | An optional difficulty value. |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| object | see below | Location event parameters. |
| bool | true/false | The completion event result. ‘True’ if successful, ‘false’ if unsuccessful/lost. |
| int | from 0 to Number.MAX_SAFE_INTEGER | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| [String: Int] | key - from 1 to 24 symbols value - from 1 to Number.MAX_SAFE_INTEGER | Resources consumed during an area completion. |
| [String: Int] | key - from 1 to 24 symbols value - from 1 to Number.MAX_SAFE_INTEGER | Resources earned during an area completion. |
| FString | from 1 to 72 symbols | Progression event name. |
| FString | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| FDTDStartProgressionEventParams | see below | Start progression event parameters. |
| FString | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int32 | from 0 to int32.MaxValue | An optional difficulty value. |
| FString | from 1 to 72 symbols | Progression event name. |
| FString | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| FDTDFinishProgressionEventParams | see below | Finish progression event parameters. |
| bool | true/false | The completion event result. ‘True’ if successful, ‘false’ if unsuccessful/lost. |
| int32 | from 0 to int32.MaxValue | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| TMap<FString, int64> | key - from 1 to 24 symbols value - from 0 to int64.MaxValue | Resources consumed during an area completion. |
| TMap<FString, int64> | key - from 1 to 24 symbols value - from 0 to int64.MaxValue | Resources earned during an area completion. |
| String | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. |
| String | from 1 to 40 symbols | The name of the previous event used for connecting events together. E.g. a previous area visited by the player. |
| int | from 0 to Int32.max | An optional difficulty value which is set using the value: |
| string | from 1 to 40 symbols | The name of the event. It is usually the number or the name of the area. It’s important to use the name that was specified at the area’s opening. |
| bool | true/false | The completion event result. ‘True’ if successful, ‘false’ if unsuccessful/lost. |
| int | from 0 to Int64.max | Time in seconds taken to complete the area. If not specified, it is automatically calculated as the difference between |
| GDDTDInt64Resources | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources consumed during an area completion. |
| GDDTDInt64Resources | key - from 1 to 24 symbols value - from 1 to Int64.max | Resources earned during an area completion. |
| string | from 1 to 65 symbols | A unique transaction ID. Use |
| string | precisely 3 symbols |
| double | from Double.min to Double.max | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| NSString | from 1 to 65 symbols | A unique transaction ID. Use |
| NSString | precisely 3 symbols |
| double | from Double.min to Double.max | The item price in the transaction currency. |
| NSString | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| string | from 1 to 65 symbols | A unique transaction ID. |
| string | precisely 3 symbols |
| double | from Double.min to Double.max | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| string | from 1 to 72 symbols | Custom event name. |
| DTDCustomEventParameters | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from Int64.min to Int64.max |
| from 1 to 255 symbols |
| true/false |
| from Double.min to Double.max |
| NSString | from 1 to 72 symbols | Custom event name. |
| DTDCustomEventParameters | key - from 1 to 32 symbols value - see below | Custom event parameters. |
| from Int64.min to Int64.max |
| from 1 to 255 symbols |
| true/false |
| from Double.min to Double.max |
| string | from 1 to 65 symbols | A unique transaction ID. |
| string | precisely 3 symbols |
| double | from Double.min to Double.max | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| string | from 1 to 65 symbols | A unique transaction ID. |
| string | precisely 3 symbols |
| double | from double.MinValue to double.MaxValue | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| string | from 1 to 65 symbols | A unique transaction ID. |
| string | precisely 3 symbols |
| double | from Double.MinValue to Double.MaxValue | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| string | from 1 to 65 symbols | A unique transaction ID. |
| string | precisely 3 symbols |
| double | from Number.MIN_VALUE to Number.MAX_VALUE | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| FString | from 1 to 65 symbols | A unique transaction ID. |
| FString | precisely 3 symbols |
| float | from float.MinValue to float.MaxValue | The item price in the transaction currency. |
| FString | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
| String | from 1 to 65 symbols | A unique transaction ID. |
| String | precisely 3 symbols |
| Float | from Double.min to Double.max | The item price in the transaction currency. |
| String | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
Parameter | Type | Restrictions | Description |
| string | from 1 to 65 symbols | A unique transaction identifier. |
| string | precisely 3 symbols |
| double | from Double.min to Double.max | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
Parameter | Type | Restrictions | Description |
| string | from 1 to 65 symbols | A unique transaction identifier. |
| string | precisely 3 symbols |
| double | from Double.min to Double.max | The item price in the transaction currency. |
| string | from 1 to 255 symbols | Item name. We recommend using a bundle or names in the same language. |
fromUserId
FString
From user ID
toUserId
FString
To user ID
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.
Transaction currency () e.g. USD, EUR etc.