Advanced guide
1. Set user IDs
By default, the SDK instance uses a random number as each user's default distinct ID, which serves as the user's identifier while the user is not logged in. Note that the distinct ID changes when the user reinstalls the app or switches devices.
1.1 Set the distinct ID
In general, you don't need to customize the distinct ID. Make sure you understand the user identification rules before you set a distinct ID.
If you need to replace the distinct ID, call the method immediately after the SDK is initialized. Do not call it multiple times, to avoid creating useless accounts.
If your game has its own distinct ID management system for each user, you can call setDistinctId to set the distinct ID:
-- Set the distinct ID to Thinker
TDAnalytics.setDistinctId("Thinker");
To get the current distinct ID, call getDistinctId:
--Return the distinct ID
TDAnalytics.getDistinctId( function (ret)
print( "distinctId = " .. ret )
end )
1.2 Set the account ID
When a user logs in, you can call login to set the user's account ID. The AE platform uses the account ID as the identifier, and the account ID you set is kept until logout is called. Calling login multiple times overwrites the previous account ID.
--The unique login identifier of the user, which corresponds to #account_id in the reported data. In this case, the value of #account_id is TA
TDAnalytics.login("TA");
This method does not upload a login event
1.3 Clear the account ID
After a user logs out, you can call logout to clear the account ID. Until login is called again, the distinct ID is used as the identifier.
TDAnalytics.logout();
We recommend calling logout only on explicit logout events, for example when the user deletes their account, rather than when the app is closed.
This method does not upload a logout event
2. Send events
After the SDK is initialized, you can start tracking data to collect user behavior. In most cases, regular events meet business needs. You can also use first events, updatable events, and other event types based on your actual business scenarios.
2.1 Regular events
You can call track to upload events. We recommend setting event properties and the conditions for sending events according to the document you prepared earlier. The following example tracks a user purchasing a product:
local properties = {
product_name = "Product Name"
}
TDAnalytics.track("product_buy", properties)
2.2 First events
A first event is an event that is recorded only once for a given device or an ID of another dimension. For example, in some scenarios you may want to record the activation event on a device; you can report this data as a first event.
-- Example: report a device first event, assuming the event name is device_activation
TDAnalytics.trackFirst("device_activation", {
test_string="first_string"
})
If you want to determine whether an event is the first one based on a dimension other than the device, you can customize first_check_id for the first event:
-- Set the user ID as the first_check_id of the first event to track first-time user activation
TDAnalytics.trackFirst("account_activation", {
test_string="first_string"
} , "TA")
Note: Because the first-event check is performed on the server, first events are stored with a 1-hour delay by default.
2.3 Updatable events
You can use updatable events to modify event data in specific scenarios. An updatable event requires an ID that identifies the event, which you pass in when you create the updatable event object. The AE backend determines which data to update based on the event name and event ID.
-- Example: report an updatable event, assuming the event name is UPDATABLE_EVENT
-- After reporting, the event property status is 3 and price is 100
TDAnalytics.trackUpdate("UPDATABLE_EVENT", {
status = 3,
price = 100
}, "Update_EventId")
-- After reporting, the event property status is updated to 5, and price stays unchanged
TDAnalytics.trackUpdate("UPDATABLE_EVENT", {
status = 5
}, "Update_EventId")
2.4 Overwritable events
Overwritable events are similar to updatable events, except that an overwritable event completely overwrites historical data with the latest data. In effect, the previous record is deleted and the latest data is ingested. The AE backend determines which data to update based on the event name and event ID.
-- Example: report an overwritable event, assuming the event name is OVERWRITABLE_EVENT
TDAnalytics.trackOverwrite("OVERWRITABLE_EVENT", {
status = 3,
price = 100
}, "Overwrite_EventId")
-- After reporting, the event property status is updated to 5, and the price property is deleted
TDAnalytics.trackOverwrite("OVERWRITABLE_EVENT", {
status = 5
}, "Overwrite_EventId")
2.5 Super properties
Super properties are properties that are uploaded with every event. Based on how often they are updated, super properties are divided into static super properties and dynamic super properties. You can choose different ways to set super properties based on your business scenarios; we recommend setting super properties before sending events. For the same event, when a super property, a custom event property, and a preset property have the same key, values are assigned in the following order of priority: custom properties > dynamic super properties > static super properties > preset properties.
2.5.1 Static super properties
Static super properties are properties that change infrequently and are carried by every event, such as a user's membership level. After you set static super properties through setSuperProperties, the SDK adds them to each event as event properties when the event is collected.
-- Set super properties
TDAnalytics.setSuperProperties({
vip_level = 2
})
Static super properties are saved in the cache, so you don't need to call this every time the app starts. If a property already exists, the new value overwrites the existing value; if the property did not exist before, it is created. Besides setting properties, we also provide other APIs for working with static super properties to meet day-to-day business needs.
-- Clear the super property named trip
TDAnalytics.unsetSuperProperties("trip")
-- Clear all super properties
TDAnalytics.clearSuperProperties()
-- Get all super properties
TDAnalytics.getSuperProperties( function (ret)
local superProperties = ret
print( "current superProperties = " .. superProperties )
end )
2.6 Track event duration
To record how long an event lasts, call timeEvent to start timing. Specify the name of the event you want to time; when you upload that event, the #duration property is automatically added to its event properties to indicate the recorded duration in seconds. Note that only one timing task can run for the same event name at a time.
--The following example measures how long a user stays on a product page
-- The user enters the product page and timing starts
TDAnalytics.timeEvent("stay_shop")
-- do some thing...
-- The user leaves the product page and timing ends. The "stay_shop" event will carry the #duration property that indicates the event duration
TDAnalytics.track("stay_shop")
3. User properties
The user property APIs supported by the AE platform are userSet, userSetOnce, userAdd, userAppend, userUnset, and userDelete.
3.1 userSet
For general user properties, you can call userSet to set them. Properties uploaded through this API overwrite the existing property values. If the user property did not exist before, it is created with the same type as the value passed in. The following example sets the user name
-- username is now TA
TDAnalytics.userSet({
user_name = "TA"
})
-- username is now AE
TDAnalytics.userSet({
user_name = "TE"
})
3.2 userSetOnce
If a user property only needs to be set once, you can call userSetOnce to set it. If the property already has a value, this call is ignored. The following example sets the first payment time:
--first_payment_time is 2018-01-01 01:23:45.678
TDAnalytics.userSetOnce({
first_payment_time = "2018-01-01 01:23:45.678"
})
-- first_payment_time is still 2018-01-01 01:23:45.678
TDAnalytics.userSetOnce({
first_payment_time = "2018-12-31 01:23:45.678"
})
3.3 userAdd
When you upload a numeric property, you can call userAdd to accumulate its value. If the property has not been set yet, it is assigned 0 before the calculation. You can pass a negative value, which is equivalent to subtraction. The following example accumulates the total payment amount:
-- total_revenue is now 30
TDAnalytics.userAdd({
total_revenue = 30
})
-- total_revenue is now 678
TDAnalytics.userAdd({
total_revenue = 648
})
The property key is a string, and the Value can only be a number.
3.4 userAppend
You can call userAppend to append elements to a user property of the Array type:
-- Append to a list-type user property
TDAnalytics.userAppend({
weapon = {"m41", "bulldog"}
})
3.5 userUnset
If you need to reset a property of a user, you can call userUnset to clear the value of the specified user property. This API accepts a string as the parameter:
-- Clear the specified user property
TDAnalytics.userUnset("age")
The value passed in is the Key of the property to clear.
3.6 userDelete
To delete a user, you can call userDelete. After that, you can no longer query this user's user properties, but the events generated by the user can still be queried.
-- Delete the user
TDAnalytics.userDelete()
4. Other features
4.1 Get the device ID
After the SDK is initialized, it automatically generates a device ID and stores it in the local cache. For the same app or game, the device ID of a device doesn't change. You can call getDeviceId to get the device ID:
-- Get the device ID
TDAnalytics.getDeviceId( function (ret)
print( "deviceId = " .. ret )
end )

