Summary

This the Flutter SDK of Superfine™. You can read more about Superfine™ at https://docs.superfine.org.

Table of contents

Quick start

Sending event

Deep linking

Push token

Superfine Lifecycle


Quick start

Getting started

These are the minimal steps required to integrate the Superfine SDK into your Flutter app.

Add the SDK to your project

You can add Superfine SDK to your Flutter app by adding following to your pubspec.yaml file:

dependencies:
  superfine_sdk: ^0.0.3

Then navigate to your project in the terminal and run:

flutter packages get

Note: If you are using Visual Studio Code to develop your app, upon editing pubspec.yaml, it will automatically run this command, so you don't need to run it manually.

Android Add permissions

Please add the following permissions, which the Superfine SDK needs, if they are not already present in your AndroidManifest.xml file for Android platform:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Integrate the SDK into your app

To start with, we'll set up basic session tracking.

Basic setup

Make sure to initialize Superfine SDK as soon as possible in your Flutter app (upon loading first widget in your app). You can initialize Superfine SDK like described below:

final superfineSettings = SuperfineSdkSettings(appId: "{YOUR_PROJECT_ID}", appSecret: "{YOUR_PROJECT_SECRET}", autoStart: true);
await SuperfineSDK.initialize(superfineSettings);

Replace {YOUR_PROJECT_ID} and {YOUR_PROJECT_SECRET} with your project id and your project secret. You can find these in your dashboard.

Superfine Logging

You can increase or decrease the amount of logs that you see during testing by setting logLevel member on your config instance with one of the following parameters:

superfineSettings.copyWith(logLevel: LogLevel.verbose); // enable all logs
superfineSettings.copyWith(logLevel: LogLevel.debug); // disable verbose logs
superfineSettings.copyWith(logLevel: LogLevel.info); // disable debug logs
superfineSettings.copyWith(logLevel: LogLevel.none); // disable all logs

Sending events

With Superfine, you can send various application events for conversions or other relevant activities on your application. Below are methods for different event types:


Revenue Event


logAdRevenue:

static Future<void> logAdRevenue(String source, double revenue, String currency, {String network = "", Map<String, dynamic>? networkData});

Description: Call this function to send ad revenue.

Parameters
source String: Must not be null. The ID of the purchase.
revenue double: Must not be null. Revenue from ads.
currency String: Must not be null. The currency code (e.g., "USD", "EUR") for the price.
network String: Nullable. The network name (optional).
networkData Map<String, dynamic>: Nullable. The network data (optional).

Example:

await SuperfineSDK.logAdRevenue("source_name", 0.01, "USD", network: "ad_network",
          networkData: {"campaign": "summer_sale", "adGroup": "group1"});

logIAPInitialization:

static Future<void> logIAPInitialization(bool isSuccess);

Description: Call this function to send an in-app purchase initialization event.

Parameters
isSuccess bool: Must not be null. A bool flag indicating whether the initialization of the in-app purchase system was successful.

Example:

await SuperfineSDK.logIAPInitialization(true);

logIAPRestorePurchase:

static Future<void> logIAPRestorePurchase();

Description: Call this function to send an in-app purchase restore purchase event.

| Parameters: None

Example:

await SuperfineSDK.logIAPRestorePurchase();

logIAPResult:

static Future<void> logIAPResult(String pack, double price, int amount, String currency, bool isSuccess);

Description: Call this function to send an in-app purchase result.

Parameters
pack String: Must not be null. The identifier of the in-app purchase package.
price double: Must not be null. The price of the in-app purchase.
amount int: Must not be null. The quantity of the purchased item.
currency String: Must not be null. The currency in which the transaction was made.
isSuccess bool: Must not be null. A boolean flag indicating whether the transaction was successful.

Example:

await SuperfineSDK.logIAPResult("com.example.pack", 9.99, 1, "USD", true);

logIAPReceipt:

static Future<void> logIAPReceiptApple(String receipt);

Description: Call this function to send the receipt data for an in-app purchase made through Apple's App Store.

Parameters
receipt String: Must not be null. The receipt data for the in-app purchase, provided as a string.

Example:

await SuperfineSDK.logIAPReceiptApple("sample_apple_receipt");

static Future<void> logIAPReceiptGoogle(String data, String signature);

Description: Call this function to send the receipt data for an in-app purchase made through Google Play Store.

Parameters
data String: Must not be null. The purchase data string, which contains details about the purchase.
signature String: Must not be null. The signature string, which is used to verify the integrity and authenticity of the purchase data.

Example:

await SuperfineSDK.logIAPReceiptGoogle("sample_google_data", "sample_signature")

static Future<void> logIAPReceiptAmazon(String userId, String receiptId);

Description: Call this function to send the receipt data for an in-app purchase made through Amazon's App Store.

Parameters
userId String: Must not be null. The user ID associated with the Amazon account that made the purchase.
receiptId String: Must not be null. The receipt ID for the in-app purchase.

Example:

await SuperfineSDK.logIAPReceiptAmazon("sample_user_id", "sample_receipt_id")

static Future<void> logIAPReceiptRoku(String transactionId);

Description: Call this function to send the receipt data for an in-app purchase made through Roku's platform.

Parameters
transactionId String: Must not be null. The transaction ID for the in-app purchase.

Example:

await SuperfineSDK.logIAPReceiptRoku("sample_transaction_id");

static Future<void> logIAPReceiptWindows(String receipt);

Description: Call this function to send the receipt data for an in-app purchase made through the Windows Store.

Parameters
receipt String: Must not be null. The receipt data for the in-app purchase, provided as a string.

Example:

await SuperfineSDK.logIAPReceiptWindows("sample_windows_receipt");

static Future<void> logIAPReceiptFacebook(String receipt);

Description: Call this function to send the receipt data for an in-app purchase made through Facebook's platform.

Parameters
receipt String: Must not be null. The receipt data for the in-app purchase, provided as a string.

Example:

await SuperfineSDK.logIAPReceiptFacebook("sample_facebook_receipt");

static Future<void> logIAPReceiptUnity(String receipt);

Description: Call this function to send the receipt data for an in-app purchase made through Unity's platform.

Parameters
receipt String: Must not be null. The receipt data for the in-app purchase, provided as a string.

Example:

await SuperfineSDK.logIAPReceiptUnity("sample_unity_receipt");

static Future<void> logIAPReceiptAppStoreServer(String transactionId);

Description: Call this function to send the receipt data for an in-app purchase verified through Apple's App Store server.

Parameters
transactionId String: Must not be null. The transaction ID for the in-app purchase.

Example:

await SuperfineSDK.logIAPReceiptAppStoreServer("sample_transaction_id_app_store");

static Future<void> logIAPReceiptGooglePlayProduct(String productId, String token);

Description: Call this function to send the receipt data for an in-app purchase made through Google Play.

Parameters
productId String: Must not be null. The product ID of the purchased item.
token String: Must not be null. The purchase token, provided by Google Play after a successful purchase.

Example:

await SuperfineSDK.logIAPReceiptGooglePlayProduct("product_id", "token");

static Future<void> logIAPReceiptGooglePlaySubscription(String subscriptionId, String token); static Future<void> logIAPReceiptGooglePlaySubscriptionV2(String token);

Description: Call these functions to send the receipt data for a subscription purchase made through Google Play.

Parameters
productId String: Must not be null. The product ID of the purchased item.
token String: Must not be null. The purchase token, provided by Google Play after a successful purchase.

Example:

await SuperfineSDK.logIAPReceiptGooglePlaySubscription("subscription_id", "token");
// or
await SuperfineSDK.logIAPReceiptGooglePlaySubscriptionV2("subscription_token");

logCryptoPayment:

static Future<void> logCryptoPayment(String pack, double price, int amount, {String currency = "ETH", String chain = "ethereum"});

Description: Call this function to send your custom events.

Parameters
pack String: Must not be null. The identifier of the package or item being purchased..
price double: Must not be null. The price of the item or package in terms of the specified cryptocurrency.
amount int: Must not be null. The quantity of the purchased item.
currency String: Default is ETH. The type of cryptocurrency used for the transaction (optional).
chain String: Default is ethereum. The blockchain network used for the transaction (optional).

Example:

await SuperfineSDK.logCryptoPayment("crypto_pack", 0.05, 1, currency: "ETH", chain: "ethereum");

Linking Event


static Future<void> logAccountLink(String id, String type, {String? scopeId, String? scopeType});

Description: Call this function when you want to link the user with another identity.

Parameters
id String: Must not be null. This is your user ID.
type String: Must not be null. Type of identity. Supports "google", "facebook", "twitter", etc.
scopeId String: Nullable. Identifier for the scope. Examples: Google Play Game Service Project ID, Google Play Developer Account ID, etc.
scopeType String: Nullable. Type of the scope. Examples: "game", "developer", etc.

Example:

await SuperfineSDK.logAccountLink("8e46122c-3cbd-4da4-8a37-b7f8c8e46687", "superfine");

We also support various functions:

  • static Future<void> logFacebookLink(String userId);

  • static Future<void> logInstagramLink(String userId);

  • static Future<void> logAppleLink(String userId);

  • static Future<void> logAppleGameCenterLink(String gamePlayerId);

  • static Future<void> logAppleGameCenterTeamLink(String teamPlayerId);

  • static Future<void> logGoogleLink(String userId);

  • static Future<void> logGooglePlayGameServicesLink(String gamePlayerId);

  • static Future<void> logGooglePlayGameServicesDeveloperLink(String developerPlayerKey);

  • static Future<void> logLinkedInLink(String personId);

  • static Future<void> logMeetupLink(String userId);

  • static Future<void> logGitHubLink(String userId);

  • static Future<void> logDiscordLink(String userId);

  • static Future<void> logTwitterLink(String userId);

  • static Future<void> logSpotifyLink(String userId);

  • static Future<void> logMicrosoftLink(String userId);

  • static Future<void> logLINELink(String userId);

  • static Future<void> logVKLink(String userId);

  • static Future<void> logQQLink(String openId);

  • static Future<void> logQQUnionLink(String unionId);

  • static Future<void> logWeChatLink(String openId);

  • static Future<void> logWeChatUnionLink(String unionId);

  • static Future<void> logTikTokLink(String openId);

  • static Future<void> logTikTokUnionLink(String unionId);

  • static Future<void> logWeiboLink(String userId);


static Future<void> logAccountUnlink(String type);

Description: Call this function when you want to unlink the user with external identity.

Parameters
type String: Must not be null. Type of identity. Supports "google", "facebook", "twitter", etc.

Example:

await SuperfineSDK.logAccountUnlink("superfine");

We also support various functions:

  • static Future<void> logFacebookUnlink();

  • static Future<void> logInstagramUnlink();

  • static Future<void> logAppleUnlink();

  • static Future<void> logAppleGameCenterUnlink();

  • static Future<void> logGoogleUnlink();

  • static Future<void> logGooglePlayGameServicesUnlink();

  • static Future<void> logLinkedInUnlink();

  • static Future<void> logMeetupUnlink();

  • static Future<void> logGitHubUnlink();

  • static Future<void> logDiscordUnlink();

  • static Future<void> logTwitterUnlink();

  • static Future<void> logSpotifyUnlink();

  • static Future<void> logMicrosoftUnlink();

  • static Future<void> logLINEUnlink();

  • static Future<void> logVKUnlink();

  • static Future<void> logQQUnlink();

  • static Future<void> logWeChatUnlink();

  • static Future<void> logTikTokUnlink();

  • static Future<void> logWeiboUnlink();

linkWallet:

static Future<void> logWalletLink(String wallet, {String type = "ethereum"});

Description: Call this function when you want to link the user's wallet address.

Parameters
wallet String: Must not be null. The wallet address you want to log the linking event for.
type String: Default is Ethereum. Type of the wallet (optional).

Example:

await SuperfineSDK.logWalletLink("0x50460c4cd74094cd591455cad457e99c4ab8be0", type: "eth");

unlinkWallet:

static Future<void> logWalletUnlink(String wallet, {String type = "ethereum"});

Parameters
wallet String: Must not be null. The wallet address you want to log the linking event for.
type String: Default is Ethereum. Type of the wallet (optional).

Example:

await SuperfineSDK.logWalletUnlink("0x50460c4cd74094cd591455cad457e99c4ab8be0", type: "eth");

Custom Event

static Future<void> log(String eventName, {dynamic data, EventFlag eventFlag = EventFlag.none});

Description: Call this function to send your custom events.

Parameters
eventName String: Must not be null. The name of your event.
eventFlag EventFlag: Default is EventFlag.none. Flag of the event.
data dynamic: Must not be null. Value of the event. Supported types: int, String, Map.

Example:

await SuperfineSDK.log("sample_event_string", data: "Event data string");
await SuperfineSDK.log("sample_event_int", data: 123);
await SuperfineSDK.log("sample_event_map", data: {"key": "value"});

static Future<void> logCustomEvent(SuperfineSDKEvent event);

Description: Call this function to send your custom events.

Parameters
event SuperfineSDKEvent: Must not be null. Represents your custom event object.

Example:

SuperfineSDKEvent customEvent = SuperfineSDKEvent(
    eventName: "custom_event_name",
    revenue: 0.01,
    currency: "USD",
    value: "something",
    eventFlag: EventFlag.none);
await SuperfineSDK.logCustomEvent(customEvent);

static Future<void> logCache(SuperfineSDKEvent event);

Description: Call this function to send your custom events before initialize SDK

Parameters
event SuperfineSDKEvent: Must not be null. Represents your custom event object.

Example:

SuperfineSDKEvent cacheEvent = SuperfineSDKEvent(
    eventName: "cache_event_name",
    revenue: 0.01,
    currency: "USD",
    value: "something",
    eventFlag: EventFlag.cache);
await SuperfineSDK.logCache(cacheEvent);

User Information


static Future<void> addUserPhoneNumber(int countryCode, String number);

Description: Call this function to add user phone number.

Parameters
countryCode int: Must not be null and must be greater than 0. The country code.
number String: Must not be null or empty. The phone number.

Example:

await SuperfineSDK.addUserPhoneNumber(1, "555-1234");

static Future<void> removeUserPhoneNumber(int countryCode, String number);

Description: Call this function to remove user phone number.

Parameters
countryCode int: Must not be null and must be greater than 0. The country code.
number String: Must not be null or empty. The phone number.

Example:

await SuperfineSDK.removeUserPhoneNumber(1, "555-1234");

static Future<void> addUserEmail(String email);

Description: Call this function to add the user's email address.

Parameters
email String: Must not be null. The email address of the user.

Example:

await SuperfineSDK.addUserEmail("user@example.com");

static Future<void> removeUserEmail(String email);

Description: Call this function to remove the user's email address.

Parameters
email String: Must not be null. The email address of the user.

Example:

await SuperfineSDK.removeUserEmail("user@example.com");

static Future<void> setUserName({String? firstName, String? lastName});

Description: Call this function to set the user's name.

Parameters
firstName String: Must not be null. The user's first name.
lastName String: Must not be null. The user's last name.

Example:

await SuperfineSDK.setUserName(firstName: "John", lastName: "Doe");

static Future<void> setUserCity(String city);

Description: Call this function to set the user's city.

Parameters
city String: Must not be null. City of the user.

Example:

await SuperfineSDK.setUserCity("San Francisco");

static Future<void> setUserState(String state);

Description: Call this function to set the user's state.

Parameters
state String: String not be null. State of the user.

Example:

await SuperfineSDK.setUserState("California");

static Future<void> setUserCountry(String country);

Description: Call this function to set the user's country.

Parameters
country String: Must not be null. Country of the user.

Example:

await SuperfineSDK.setUserCountry("United States");

static Future<void> setUserZipCode(String zipCode);

Description: Call this function to set the user's zip code.

Parameters
zipCode String: Must not be null. Zip code of the user.

Example:

await SuperfineSDK.setUserZipCode("94103");

static Future<void> setUserDateOfBirth({int? day, int? month, int? year});

Description: Call this function to set the user's date of birth.

Parameters
day int: Nullable. User's day of birth.
month int: Nullable. User's month of birth.
year int: Nullable. User's year of birth.

Example:

await SuperfineSDK.setUserDateOfBirth(day: 1, month: 1, year: 2000);

static Future<void> setUserGender(UserGender gender);

Description: Call this function to set the user's gender.

Parameters
gender UserGender: Must not be null. The gender of the user, including UserGender.male and UserGender.female.

Example:

await SuperfineSDK.setUserGender(UserGender.male);

Callback

The Superfine SDK provides the mechanism you need to determine whether an event was sent:

SuperfineSDK.registerSendEventListener((jsonEvent) {
        print("[Superfine SDK] On sent event: $jsonEvent");
      });

Deep Linking

Callback

The Superfine SDK offers you the mechanism you need to obtain information about the deep link content:

SuperfineSDK.registerDeepLinkingListener((url) {
        print("[Superfine SDK] Received deeplink: $url");
      });

Push Token

Callback

The Superfine SDK offers you the mechanism you need to obtain information about when the device token is set:

SuperfineSDK.registerPushTokenListener((token) {
        print("[Superfine SDK] Received token: $token");
      });

Superfine Lifecycle

Callback

The Superfine SDK offers the necessary mechanisms to obtain information about Superfine's lifecycle.

class SuperfineSDKLifecycleListenerImplementation
    extends SuperfineSdkLifeCycleListener {
  @override
  void onPause() {
    print("[Superfine SDK] onPause");
  }

  @override
  void onResume() {
    print("[Superfine SDK] onResume");
  }

  @override
  void onStart() {
    print("[Superfine SDK] onStart");
  }

  @override
  void onStop() {
    print("[Superfine SDK] onStop");
  }
}
SuperfineSDK.registerSuperfineSDKLifecycleListener(
          SuperfineSDKLifecycleListenerImplementation());