CustomerGlu Developer Documentation
  • 🔧Getting started
  • 🔧Quickstart Guide for React Web Apps
  • 📱Quickstart Guide for React Native Apps
  • 📱Quickstart Guide for Flutter Apps
  • Integrating with SDKs
    • Web SDK
    • Mobile SDKs
      • How to Test Integration?
    • Cordova SDK
    • Shopify
  • Integrating with APIs
    • Register User/Device
    • Load Campaigns
    • Binding Webview to Native App Functions
    • 🔍Using __GLU_NUDGE_CLICK for Widget Visibility
    • 🎯API-based Segmentation Quickstart Guide
  • 🔌Third-Party Integrations
    • Source
      • Sending Events directly from Server
      • Segment
      • Moengage
      • Amplitude
      • Clevertap
      • Webengage
    • Destination
      • Analytics Webhook
      • Customer.io
      • Talon.One
      • Segment
      • MoEngage
      • Amplitude
      • Clevertap
      • WebEngage
      • Google Sheets
    • Cohort
      • Mixpanel
  • Miscellaneous Topics
    • Direct Campaign/Wallet URLs
    • Configuring Webhooks
      • Rewards Webhook
      • Nudge Webhook
    • Notifications
      • FCM
      • APNs
      • CustomerGlu Notification
      • Testing Nudges
    • Referral Campaigns
      • Firebase
      • Branch
    • Handling Non Logged-in Users
    • Testing Campaigns with User Logs
    • Using the Editor
      • How to edit Buttons in Campaigns
    • How to Create and Manage Segments in CustomerGlu
  • SCHEMA REPOSITORY
    • Webhook Schema
      • Reward Webhook Schema
      • Nudge Webhook Schema
      • Raw Event Webhook Schema
    • Webview Callback Schema
      • Analytics Event Schema
    • Analytics schema V4
      • Page Events
      • Track Events (UI)
      • Track Events (SDK)
      • State-Change Events
      • System Events
    • 🗝️FAQ
      • API Key
      • How to find and add Screen Names for Entrypoints
  • Demo Apps
    • Demo Apps
Powered by GitBook
On this page
  • Using webview
  • Using Native In-app Layouts
  • CustomerGlu Notification Object
  • Handling CustomerGlu Notifications
  • In-App Nudges Samples

Was this helpful?

  1. Miscellaneous Topics
  2. Notifications

CustomerGlu Notification

PreviousNotificationsNextTesting Nudges

Last updated 2 years ago

Was this helpful?

CustomerGlu sends notification as firebase data messages in the following formats

Using webview

If you would like to use the layouts from CG, you can extract the nudge url from data messages and load it in a webview

{
  name: 'CustomerGlu',
  data: {
    "type": "CustomerGlu",
    "glu_message_type":"in-app",
    "title": "Attended live class X time(s)",
    "body": "You are doing great! Just x more times to go and win your reward",
    "image": "",
    "nudge_url": "https://staging.d283eczxp8leqk.amplifyapp.com/program-nudge/streak-progress/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIyMzk3OTMiLCJjbGllbnQiOiI0ZjdmNjE5OC0yNGNmLTRkZDYtODcxOS04MjdkM2RlNzYwNGYiLCJpYXQiOjE2MTcwMTU3MDEsImV4cCI6MTY0ODU1MTcwMX0.sAoqC8TGw3SSFl3W7PvJJilLivD7tL3Y-n23iBWHXAU&campaignId=44941f5f-a84f-46c0-9901-6e80e445a257"
  }
}

Using Native In-app Layouts

If In-app layout already exists in the app, You can build the in-app notifications using he data messages we send. sample below

{
  name: 'CustomerGlu',
  notification: {
    title: "Congrats!!",
    body: "You're now 7 steps away from getting 10000 Bonus points! Click here to complete rest of the activities to earn $100"
  },
  data: {
    data: "JSON NOTIFICATION OBJECT"
  },
  token: 'tempsdajhsadvvjhsdv'
}

CustomerGlu Notification Object

{
      "type": "CustomerGlu",
      "glu_message_source": "",
      "glu_user_id": "",
      "glu_campaign_id": "",
      "glu_message_type": "in-app",
      "glu_push_message_content": {
        "title": "Your friend just signed up",
        "body": "Get all of your friends on here",
        "image": "/assets/multi-step/mini-icons/7.png",
        "cta_button_text": "Go To Challenge",
        "cta_button_link": "/tasks?event=customerGlu&deepLink=",
        "deeplink": "/tasks?event=customerGlu&deepLink="
      },
      "glu_inapp_message_content": {
        "page_name": "",
        "page_type": "middle-default",
        "page_accent": "default",
        "page_details": {
          "title": "Your friend just signed up",
          "body": "Get all of your friends on here",
          "image": "/assets/multi-step/mini-icons/7.png",
          "cta_button_text": "Go To Challenge",
          "cta_button_link": "/tasks?event=customerGlu&deepLink="
        }
      }
    }
  }

Handling CustomerGlu Notifications

@RequiresApi(api = Build.VERSION_CODES.M)
public static void displayCustomerGluNotification(Context context,JSONObject json,int icon) {
    JSONObject data = null;
    try {
        data = new JSONObject(String.valueOf(json));
        System.out.println(data);
        String type = data.getString("type");
        String in_app="";
        String in_app_type="";

        if(type.equalsIgnoreCase("CustomerGlu")) {
            String url = data.getString("nudge_url");
            String body = data.getString("body");
            String title = data.getString("title");
            String glu_message_type = data.getString("glu_message_type");
            String image = data.getString("image");
            if(data.has("inapp")) {
                 in_app = data.getString("inapp");
                JSONObject in_app_object = new JSONObject(in_app);
                 in_app_type = in_app_object.getString("type");
            }

            if (glu_message_type.equalsIgnoreCase("in-app")) {
                CustomerGlu.handleDataMessage(context,url,in_app_type);
            }
            else {
                if(image.equalsIgnoreCase(""))
                {
                    displayNotification(context, title, body, url,icon);

                }
                else {
                    displayExpandedNotification(context, title, body, url, image,icon);
                }
            }
        }
        else
        {
            return;
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


}
 public static void handleDataMessage(Context context,String url,String type) {

            System.out.println(type);
            if(type.equalsIgnoreCase("bottom-slider"))
            {
                Intent intent = new Intent(context, BottomSheet.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
           else if(type.equalsIgnoreCase("bottom-default"))
            {
                Intent intent = new Intent(context, BottomDialog.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
         else   if(type.equalsIgnoreCase("middle-default"))
            {
                Intent intent = new Intent(context, MiddleDialog.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }

else            {
                Intent intent = new Intent(context, NotificationWeb.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }

    }


    @RequiresApi(api = Build.VERSION_CODES.M)
    public static void displayExpandedNotification(Context context, String title, String message, String url,String image,int icon) {
        System.out.println("sdadsad");
        System.out.println(url);
        Intent intent = new Intent(context, NotificationWeb.class);
        intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("nudge_url",url);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        Bitmap bmp = null;
        try {
            InputStream in = new URL(image).openStream();
            bmp = BitmapFactory.decodeStream(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "234")
                .setSmallIcon(icon)
                .setContentTitle(Html.fromHtml(title))
                .setContentText(Html.fromHtml(message))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setPriority(PRIORITY_MAX)
                .setLargeIcon(bmp)
                .setStyle(new NotificationCompat.BigPictureStyle()
                        .bigPicture(bmp)
                        .bigLargeIcon(null))
                .setDefaults(DEFAULT_ALL);
        NotificationManager manager = context.getSystemService(NotificationManager.class);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            @SuppressLint("WrongConstant") NotificationChannel notificationChannel = new NotificationChannel("234", "CustomerGlu", NotificationManager.IMPORTANCE_MAX);

            manager.createNotificationChannel(notificationChannel);
        }
        manager.notify(Integer.parseInt(("234")), builder.build());




    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public static void displayNotification(Context context, String title, String message, String url,int icon) {
        System.out.println("sdadsad");
        System.out.println(url);
        Intent intent = new Intent(context, NotificationWeb.class);
        intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("nudge_url",url);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "234")
                .setSmallIcon(icon)
                .setContentTitle(Html.fromHtml(title))
                .setContentText(Html.fromHtml(message))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setPriority(PRIORITY_MAX)
                .setDefaults(DEFAULT_ALL);
        NotificationManager manager = context.getSystemService(NotificationManager.class);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            @SuppressLint("WrongConstant") NotificationChannel notificationChannel = new NotificationChannel("234", "CustomerGlu", NotificationManager.IMPORTANCE_MAX);

            manager.createNotificationChannel(notificationChannel);
        }
        manager.notify(Integer.parseInt(("234")), builder.build());




    }
@RequiresApi(api = Build.VERSION_CODES.M)
public static void displayCustomerGluNotification(Context context,JSONObject json,int icon) {
    JSONObject data = null;
    try {
        data = new JSONObject(String.valueOf(json));
        System.out.println(data);
        String type = data.getString("type");
        String in_app="";
        String in_app_type="";

        if(type.equalsIgnoreCase("CustomerGlu")) {
            String url = data.getString("nudge_url");
            String body = data.getString("body");
            String title = data.getString("title");
            String glu_message_type = data.getString("glu_message_type");
            String image = data.getString("image");
            if(data.has("inapp")) {
                 in_app = data.getString("inapp");
                JSONObject in_app_object = new JSONObject(in_app);
                 in_app_type = in_app_object.getString("type");
            }

            if (glu_message_type.equalsIgnoreCase("in-app")) {
                CustomerGlu.handleDataMessage(context,url,in_app_type);
            }
            else {
                if(image.equalsIgnoreCase(""))
                {
                    displayNotification(context, title, body, url,icon);

                }
                else {
                    displayExpandedNotification(context, title, body, url, image,icon);
                }
            }
        }
        else
        {
            return;
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


}
 public static void handleDataMessage(Context context,String url,String type) {

            System.out.println(type);
            if(type.equalsIgnoreCase("bottom-slider"))
            {
                Intent intent = new Intent(context, BottomSheet.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
           else if(type.equalsIgnoreCase("bottom-default"))
            {
                Intent intent = new Intent(context, BottomDialog.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
         else   if(type.equalsIgnoreCase("middle-default"))
            {
                Intent intent = new Intent(context, MiddleDialog.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }

else            {
                Intent intent = new Intent(context, NotificationWeb.class);
                intent.putExtra("nudge_url", url);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }

    }


    @RequiresApi(api = Build.VERSION_CODES.M)
    public static void displayExpandedNotification(Context context, String title, String message, String url,String image,int icon) {
        System.out.println("sdadsad");
        System.out.println(url);
        Intent intent = new Intent(context, NotificationWeb.class);
        intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("nudge_url",url);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        Bitmap bmp = null;
        try {
            InputStream in = new URL(image).openStream();
            bmp = BitmapFactory.decodeStream(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "234")
                .setSmallIcon(icon)
                .setContentTitle(Html.fromHtml(title))
                .setContentText(Html.fromHtml(message))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setPriority(PRIORITY_MAX)
                .setLargeIcon(bmp)
                .setStyle(new NotificationCompat.BigPictureStyle()
                        .bigPicture(bmp)
                        .bigLargeIcon(null))
                .setDefaults(DEFAULT_ALL);
        NotificationManager manager = context.getSystemService(NotificationManager.class);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            @SuppressLint("WrongConstant") NotificationChannel notificationChannel = new NotificationChannel("234", "CustomerGlu", NotificationManager.IMPORTANCE_MAX);

            manager.createNotificationChannel(notificationChannel);
        }
        manager.notify(Integer.parseInt(("234")), builder.build());




    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public static void displayNotification(Context context, String title, String message, String url,int icon) {
        System.out.println("sdadsad");
        System.out.println(url);
        Intent intent = new Intent(context, NotificationWeb.class);
        intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("nudge_url",url);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "234")
                .setSmallIcon(icon)
                .setContentTitle(Html.fromHtml(title))
                .setContentText(Html.fromHtml(message))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setPriority(PRIORITY_MAX)
                .setDefaults(DEFAULT_ALL);
        NotificationManager manager = context.getSystemService(NotificationManager.class);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            @SuppressLint("WrongConstant") NotificationChannel notificationChannel = new NotificationChannel("234", "CustomerGlu", NotificationManager.IMPORTANCE_MAX);

            manager.createNotificationChannel(notificationChannel);
        }
        manager.notify(Integer.parseInt(("234")), builder.build());




    }

To handle the notifications configured via CustomerGlu Dashboard (Push/In-app), use the given method:

Configure Notification Type -

CustomerGlu.getInstance.isFcmApn(fcmApn:"fcm") //or "apn"

Function Parameter:

fcmApn- It accepts string "fcm" or "apn" depending on the notfication service being used by the app.

Set FCM/APNS Token -

Add following code in didFinishLaunchingWithOptions()

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

          
        UNUserNotificationCenter.current().delegate = self
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {_, _ in })
        application.registerForRemoteNotifications()

        //Only For FCM
        FirebaseApp.configure()
        Messaging.messaging().delegate = self

        return true
    }

Add the following extension in AppDelegate:

extension AppDelegate: UNUserNotificationCenterDelegate {
    
    // Receive displayed notifications for iOS 10 devices.
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // Change this to your preferred presentation option
        CustomerGlu.getInstance.cgUserNotificationCenter(center, willPresent: notification, withCompletionHandler: completionHandler)
    }
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { //apn
        let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
        print("Device token: \(tokenString)")
        CustomerGlu.getInstance.apnToken = tokenString
        
        // Not required for FCM
        let userData = [String: AnyHashable]()
        CustomerGlu.getInstance.updateProfile(userdata: userData) { success, _ in
            if success {
            } else {
            }
        }
        
        //Only required for FCM
        Messaging.messaging().apnsToken = deviceToken
        print("APNs token retrieved: \(deviceToken)")
    }
    
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        print(userInfo)
        CustomerGlu.getInstance.displayBackgroundNotification(remoteMessage: userInfo as? [String: AnyHashable] ?? ["glu_message_type": "glu"])
        completionHandler()
    }
    
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print(userInfo)
        CustomerGlu.getInstance.cgapplication(application, didReceiveRemoteNotification: userInfo, backgroundAlpha: 0.5, fetchCompletionHandler: completionHandler)
     }
    
    func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
        print(fcmToken)
    }
}

// MARK: FCM Notification delegate
extension AppDelegate: MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("Firebase registration token: \(String(describing: fcmToken))")
        CustomerGlu.getInstance.fcmToken = fcmToken ?? ""
        let userData = [String: AnyHashable]()
        CustomerGlu.getInstance.updateProfile(userdata: userData) { success, _ in
            if success {
            } else {
            }
        }
    }
}

In-App Nudges Samples

Fullscreen nudge