All Posts
Using OneSignal to Boost Activation, Engagement, and Retention
September 15, 2025
9 min read
by Sergey Haikov

Learn how we use OneSignal in Voicetree and how its powerful features help us improve our metrics and help our customers understand our product better.

To quote one of my favorite articles on this topic:

Marketers believe onboarding emails are a powerful tool for driving engagement. Everyone else thinks they’re annoying and ineffective. The truth, as always, is a little more complicated.

There’s a lot of truth to it. In our case, when building an onboarding journey for Voicetree, we wanted to make it useful and personalized so that it would actually deliver value to our users. Some of the most important things we wanted to achieve:

  • Help our users understand the product better by creating a personalized onboarding journey, explaining how Voicetree can fit into their workflow and showcase the best ways to get started.
  • Improve activation for those users who signed up but didn’t start using the app by showing them the most powerful capabilities.
  • Collect feedback from users who churn or abandon the product to understand what’s missing in the app and use it to shape our roadmap.
  • Reduce churn by providing personalized discounts at different stages of the user journey.

OneSignal is a multi-channel communications toolkit, which made it a perfect fit for our cases. Having a single tool for both email and in-app communications unlocks a lot of powerful automations and the ability to connect OneSignal with services such as RevenueCat makes building personalized journeys even easier.

In this post, we’d like to share our experience integrating OneSignal into Voicetree. Share how we did it and what were the results.

Setting up

Voicetree is a React Native (Expo) app with a NodeJS backend. In the current iteration, we rely solely on the client-side OneSignal SDK with minimal Backend changes. Setting up OneSignal is fairly straightforward and well documented in the official docs.

After getting the SDK installed, initializing it takes a few lines:

function useConfigureOneSignal() {
  useEffect(() => {
    OneSignal.initialize(process.env.EXPO_PUBLIC_ONESIGNAL_APP_ID);
  }, []);
}

It is also possible to request push notification permissions using OneSignal.Notifications.requestPermission() method right away, but we decided to use the In-App push permission prompt. We show the modal after the user matches certain conditions (e.g. having more than 3 sessions).

Prompt requesting push notification permissions

Some extra things you can do on the application’s side to get more from OneSignal integration:

  • After the user completes login or signup, set the external id by calling OneSignal.login(userId). This will allow it to enrich user data from other sources, such as own backend, always operating with this external user id.
  • When a user subscribes for email notifications and gives consent, you can create a new email subscription by calling OneSignal.User.addEmail(). When a user opt-outs from emails, calling removeEmail allows them to remove the subscription.
  • In Voicetree, we ask a few questions during the onboarding, such as the main reason why users downloaded the app, what are the primary features they’re interested in and so on. Since we want to adjust OneSignal journeys based on the answers, we assign custom tags using OneSignal.addTags method.
  • Creating a new note is the primary user action in Voicetree. And we want to be able to adjust our journeys based on when the last note creation happened. To do that, we set a custom timestamp tag last_note_created_at each time the note is created.

RevenueCat Integration

RevenuCat integration helps to keep the subscription status of your users with OneSignal and enables you to create segments based on user subscription status. Integration is straightforward and just requires a few steps (refer to the official documentation for more details):

  1. Create a new API key in your OneSignal account (can be done from the project settings). Make sure to grab your app id from there as well.
  2. Configure OneSignal integration in RevenuCat by adding app id and api key from the previous step. Using default events should be sufficient.

Make sure you set the $onesignalUserId attribute from the client-side RevenueCat SDK; otherwise, RC won’t send any events to OneSignal. The best way to do this is by subscribing to the user change event from the OneSignal SDK and setting an attribute when it changes, which can be done at the same time the SDK is initialized:

useEffect(() => {
  const listener = (user: UserChangedState) => {
    if (user.current.externalId && user.current.externalId === userId) {
      Purchases.setOnesignalID(user.current.externalId);
    }
  };

  OneSignal.User.addEventListener("change", listener);

  return () => {
    OneSignal.User.removeEventListener("change", listener);
  };
}, [userId]);

Once configured, this integration is responsible for syncing the value of subscription_status tag for OneSignal users based on the subscription status.

RevenueCat subscription status attributes

OneSignal Audiences

The way you create Journeys in OneSignal is by segmenting customers based on user parameters and custom tags into Audiences and then use Audiences to trigger journeys, create branches inside journeys and so on.

In Voicetree, we’re using the following Audiences:

Audience NameConfiguration & Usage
English LanguageAll the users with app language set to English. We use this audience as a trigger for our English-language onboarding.
Japanese LanguageAll the users with app language set to Japanese. We use this audience as a trigger for our Japanese-language onboarding.
Created NoteAll users who have a custom last_note_created_at tag set. We’re using this to activate users who signed-up but never went to use the app.
[RC] Active TrialUsers enter this segments when subscription_status is set to trial
[RC] Cancelled TrialUsers enter this segment when subscription_status is set to cancelled_trial. We use this as a trigger for feedback collection email after the user cancels the trial.
[RC] Active SubscriptionUsers enter this segment when subscription_status is set to active or intro.
[RC] Expired SubscriptionUsers enter this segment when subscription_status is set to expired. We use this as a trigger for feedback collection email after the user cancels the subscription and it expires.

Onboarding, Activation and Recovery Journey

This is how our current OneSignal journey looks like. It covers most of the requirements we outlined initially and includes onboarding emails for all users, activation messages for those users who signed up but didn’t start using Voiceteree as well as feedback collection emails for churned users.

VoiceTree main OneSignal journey

See full-size image here

Here’s how the user moves through the journey:

  1. The user enters this Journey once they enter the “English Language” Audience (same logic applies for Journeys targeting other languages with the only difference being the content of the emails we send).
  2. We wait 10 minutes and send the first onboarding email where we share main tips and tricks about using Voicetree: how to create a new note, import file, use AI features and more.
  3. Then, Journey pauses and waits for one of the following events, based on customer Audiences and enters one of 3 branches:
    1. Start a free Trial when the user enters [RC] Active Trial segment and in this branch, we’re doing the following:
      1. In case the user cancels the trial, after some wait we send an email asking for feedback. Email includes a link to our feedback collection form that upon submissions provides a user with an extended paid trial ($5 for the first month)
      2. After sending a feedback email we wait a week and in case if the user doesn’t have active subscription (we’re checking this by looking if the user is included in [RC] Active Subscription audience) we send an email with an extended trial offer.
    2. Start Subscription when the user enters [RC] Active Subscription segment
      1. This branch starts waiting until the user cancels a subscription and upon cancellation we’re sending an email asking for feedback. Email includes a link to our feedback collection form that upon submissions provides a user with a discounted offer for the next year.
    3. None of the above after 5 days
      1. First, we’re checking if the user created their first note. And if they didn’t do that, we’re sending an email with suggestions and advice on how to get started to help onboard the user.
      2. And after some extra time, we send an email with an offer to try Voicetree for just $5 for the first month.

In-App Promotions

Another powerful OneSignal feature is InApp messages which allow to present in-app messages based on the same triggers as email journeys we described above.

The main use-case in Voicetree is activating users who either cancelled free trial or didn’t start subscription yet. We have 2 in-app messages that we show to users based on the status of the subscription:

  1. If the user cancelled a free trial, we’re presenting our offer for a reduced month to help the user try Voicetree for longer at a reduced price.
  2. For churned users who had a subscription earlier, we show an offer for a discounted annual plan.

Screenshot of special offer

Bottom line

OneSignal is a perfect tool if you’re looking for a powerful multi-channel communication platform. The integration is simple and straightforward, and the platform provides tons of powerful capabilities.

In the next post, we’ll be sharing metrics, results, and iterations of our integration, so make sure to subscribe to our newsletter to ensure you don’t miss it!

Voicetree is an AI-powered note taker used by professionals and students to record and transcribe meetings, lectures, calls and other types of audio content. Powerful AI integrations help to turn unstructured audio-recordings into perfect notes.

Subscribe to our newsletter

No spam, only updates about new blog posts. Unsubscribe anytime.