Using OneSignal's API

How to use OneSignal's API with Postman, a collaboration platform.

OneSignal's Support Engineer, Jon Fishman, goes over how to use OneSignal's API with Postman, a collaboration platform. Jon covers how to create notifications, view notification data, and how to create segments all through OneSignal's API! The transcript of the webinar can be found below.



So I got some questions about the tool we're using. If you just go to your browser and type in "postman", it's usually the first thing that pops up. It looks like this. You can go to the top right corner and start the download. So,, top right corner download.

This will be recorded. So once you need to get started with it, you can just watch this again and just follow along. We'll be following the OneSignal API reference. So, if you have not seen this page yet, this is our OneSignal.

Well, first of all, hi, my name is Jon. I am a Support Engineer here at OneSignal. If you have contacted our support team at either or in our documentation using this little chat bubble here and send us a message, there's a good chance that you've talked to me already or talk to somebody on our team.

We do assist with questions for free and paid customers. Paid accounts get higher priority. But we do try to assist anyone and everyone who has questions with OneSignal. So, feel free to reach out here or just email us at and we'll assist you as soon as possible.

Great. So, what I'd like to go over is basically this page. I'd like to go over how to use our server REST API creating notifications, viewing users, using notifications, and some other fun stuff that will be helpful in your journey with OneSignal.

So, we're going to be going over how to create or how to use these endpoints, go over the documentation and all of this using the Postman tool. This is what it looks like for me on my screen. It's just a really great way to save requests, make requests, and view and get data, send data as well. So, that's what we're going to be going over today.

Getting Started with API Calls

First of all, I'm subscribed to my beautiful website here just so I can send notifications to myself and see how they look. If you're actually wanting to find your device on the website, once you subscribe to the site, you can check up here and see notifications are allowed. You can actually open up the console. Usually, you can right-click and press INSPECT, and it will open up the debugger here. You can actually find your OneSignal player ID by doing await and then type in 'OneSignal.getUserId'. That's your player ID. So, we'll use that in one of the API calls.

And then also, you can do just 'OneSignal.sendSelfNotification'. This will just send yourself a notification, just sending yourself, not everybody, a notification from the console, just so you can test it out. So here's my example of what the notification example looks like. So, great. But yeah, we'll be using this information here. You can do that later when you have your website or your mobile app. Just get your OneSignal player ID.

But the first thing I'd like to go over is the create notification endpoint, probably the most common endpoint used. We send over 6 billion notifications a day, and many, many, many of them are from this endpoint right here. So, the way that it works is that you can create almost any type of notification targeting combinations that you want, but a notification or a request to our API must have at least three things. It must have the OneSignal app ID that you are targeting. It must have the contents of the notification. Or if you're sending a silent notification, you must indicate that as a silent notification. And then the third thing is the targeting parameter.

OneSignal provides three different types of targeting parameters when sending notifications to users. You can target by segments. Segments are actually created within your OneSignal dashboard. Just in your app, go to your AUDIENCE tab, and then these are all segments. So, you can create segments here. Whatever name you give the segment, that will be the name that you use when targeting with this endpoint using the included_segments.


You can actually list all the different segments you want to target. So if I wanted to target basically maybe all my over three sessions or six months, I can target all of these and put them all into my included_segments parameter.

It can also exclude segments. So, I can actually target all my subscribed users, but maybe exclude my seven-day inactive or exclude my 12-hour signup. The way that works using Postman here, they have a really nice gooey for adding JSON and just making your API requests very easy to follow with JSON. You can also use foreign data. Here's put your key in value pairs, but I like going to the raw JSON, but we'll explore both options and other endpoints as well.

So the first thing, once you have a Postman, we're just going to follow this directly. You're going to create a new collection. I named my collection 'Create Notification' post, but you can call it whatever you want. So, 'Create Notification'. You can put a description if you want, but it's up to you. Click CREATE. Once that's here, you can actually click Add Request. Once you do that, you can name the request. And I called this one 'included_segments'. That's basically the targeting parameter I'm going to use in this request. And then there you go. You start off with a blank slate and you can just get started.

Since I already have this created, I'm just going to go back up here. Go to my included_segments here. The first thing you want to do is set this as a post, because in the documentation, it shows up here that the Create Notification is a post method. And so we set a post and then you copy the endpoint here. This is the OneSignal API REST endpoint that you use. Copy-paste it right here. Very simple.

Using Segments with the OneSignal REST API

As you can see, when we're going through this is that we're going to start with Segments, and the Segments requires your OneSignal REST API key to use it. Under my headers, I'm going to add a content type of application/json, pretty standard. And then the Authorization, it always starts with basic lowercase and then a space, and then your REST API key. You can find your REST API key in your app, under settings, and then Keys & IDs. And then here is your REST API key.

Make sure to keep this private, this should not be public. This should not be published anywhere, especially GitHub, or just accidentally published on your site somewhere. This REST API key should be kept private because this is what's used to target all your users with push notifications.

Your app ID can be public. This is fine to keep public. You'll see it on OneSignal or in your app. This is fine to have public, but the REST API key should not be public. Hope that is stressed enough.

So, I copied the REST API key and I put it after Basic, and that's basically all I need from my Headers. Then I go into the body and I start creating my notification. And so when targeting segments, I use the includes_segments parameter, which I have here. You can copy this here, put your just standard JSON, you put your opening curly brackets. And then as a string, you put included_segments. And then this takes an array of string data.

So, here's the beginning of my array. And then I'm just targeting all here. But I could literally just target all whatever segments I want. So, I want to target my Subscribed User segment. make sure you don't have a space at the end because that's also included here. So, if you're trying to send to Segments and you have a space like before or after the segment, that space is included. So, you'll want to just make sure that you copy the actual name. And if there is a space like Subscribed Space users, that's fine. Just keep it there. If there's a space before or after, you'll have to add that in here as well, but there shouldn't be. And then you can add additional segments by just putting a comma with a string, just like an array of strings. And yeah, just doing it like that.


Now, my Subscribed User segment contains every single user in it. That's why when you look at it, there's no data filters turned on. So, segments right now only contains subscribed users. So, that's why this is just all subscribed users. So, when I add another segment like this, it's not going to duplicate notifications. So, these 49 devices in this segment, they are also a part of this segment here. And so if I target these two segments, OneSignal will automatically deduplicate the users. So the user will only get the notification one time. If I were to target these two segments, for example, and this 49 and this 1 were different, then all 50 would get the notification. I hope that's clear and somewhat obvious.

If I then wanted to exclude a segment, maybe I don't want my 7 Days inactive users to get the notification. I can then use this excluded_segments parameter. This also takes an array of strings, and I just put that there. And so now, all my users that are in this segment, these two segments, will get the notification, but if they're also in this segment, then they will not get the notification. Hopefully, that's obvious.

So, excluded_segments is not required, but one of the targeting parameters is. And so I'm using this targeting parameter. I want to make clear that you can't combine targeting parameters. So, I can't target segments and I can't combine that with filters and I can't combine that with sending to specific devices like player ID or external user ID. You'll have to use just one of those three types of targeting parameters. And so in this case, I'm using included_segments. You must have an app ID, and we saw that earlier in your OneSignal dashboard. You'll get that in the settings, Keys & IDs, or just in the URL after apps. This is your OneSignal app ID. So, you could find it there. But that just goes here and that's just a string.

And then the last required parameter for sending a push is the contents. So, contents, it takes a JSON object. First, we're going over the targeting parameters, but when we scroll down a little bit, there's a lot of parameters. We can get into the Content & Language, and the first thing is contents. And so it's not necessarily required or it is required unless you're using a template or a content available for like silent notifications.

Setting up Templates via the API

And so we're not going to really get into this guide, but a template ID, just to highlight that real quick, you can actually set up templates in the Messages Templates here. And so if you wanted to actually create a push template, you can actually just add all of your data here and save it. And then the actual template ID, just for example here, this is your template ID up here. So, here's my app ID, here's my templates directory, and then here is the actual template ID. So, I could actually use template ID, copy-paste this into my request as well, and I'll just send this notification.

Cool. So, contents, according to the documentation here, it takes an object, and I can put basically a map of the language of the device. So, if you put English and then put whatever message you want in English, English is the default. So, if you don't want to send a notification in English, that's totally fine. However, you must have this parameter here and then you can basically put whatever you want here. This could be your message in Russian or Spanish or anything like that.

But if you do want to add multiple languages to the notification, you basically can just put the language code for all those different messages and then add your translation for each message. And then based on the device's message settings, my browser settings, or my device settings, whatever I have for the language, it will map to whatever is set. In this example here, I have English and then this is the main message and is required.


And then we just go through all the other parameters. Headings, this is the title of the notification. It's required for web. This would be the title up here for web, and then this would be the message or the contents here.

Data, this is just some custom data. It doesn't show up in the notification, but it's just something that you can add to the notification to actually capture that information within the event handlers that once again provides on the SDK.

Web_url, this will actually be the URL the user goes to when they click the notification on web. You can actually set this to be basically any URL you want. It doesn't have to be your site. It could be whatever site you want. But when the user clicks it, they will go to this site.

App_url, this is if you want to do deep linking within your mobile app, you can actually use this instead.

Chrome_web_image, this is the actual image, the large image. So, Chrome stopped supporting the large image on Mac, which is what I'm using. So, this actually won't show up if you're having a Mac. But if you have Windows, it will show up and it will be a nice, big image.

Big_picture, this is for Android. It's the same thing as the big picture on the notification.

Ios_attachments, the same thing for iOS mobile apps.

Buttons, these are the action buttons that the notification can have for mobile. Make sure that you set each parameter. The ID, it just can be whatever you want. The text is what actually shows. And then if the operating system version supports the icon, you can actually add the icon as well.

For web, it's the same thing. Instead of the ID and then handling the ID in the notification click handler, you actually set the URL that you want the user to go to. So, you'll still need an ID, just name it something different for each button. But the URL itself, when they click the button, that's where they'll go to.

And then android_channel_id, this is a really common one for setting up Android channels

Chrome_web_icon, this is the icon here. You can actually set that. And then you can actually set that for each browser individually - Firefox. Not Safari, Safari is a static icon that you set in the dashboard. But for Firefox and then for basically any other like Edge, you can actually set those and they'll use the defaults here.

Cool. So, let's take this for a spin. I mean, that's it. Once this is all set up, you're good to go. And so I can click SEND here. We give you the response. The ID is the ID of the notification. Recipients is how many it was sent to, so these many users minus this many. And then external ID, we didn't talk about that. The external ID is actually a UUID that can be used, so that way, if I send a notification and it has the same external ID as another notification sent within the past 30 days, it will not send the current one.

So, just as an example here real quick, and it has to be a UUID in this format. I'll just copy this here. So, I send it. So, that's my external ID I sent here. So, you have 16 recipients.

Just so everybody can see it. Here's the notification. Here is the headings. This is the title and required for web. This is the title required for web. Contents, this is the main message of the push and is required. I changed the icon here. So, that's the chrome_web_icon. That's what I set here.

It's hard to demo the actual buttons here. And then the launch URL, the web URL, I went to OneSignal. But when you actually view the notification, we actually get it on the screen, not here in the notification center for web, there will actually be a dropdown menu that you can click and then it will allow you to set the extra buttons.


Cool. And so now that I set this external ID, I'm going to send this again with the same external ID. I did not get the notification because the external ID is the same. But yeah, that's the idea behind using Postman and adding JSON and creating notifications. I can now save this information. It is available to come back in here and send later or come back in here and update later as I go along.

Using Filters via the OneSignal API

And the next thing I want to do is basically going over the filters. And so, just like what we saw earlier, it's actually the same data, but instead of included_segments, I'm going to use the filters parameter and then going over that here.

Cool. The filters are the exact same thing as creating segments, except we're not creating a reusable segment with a name. We're just basically recreating the segment using just the filters parameters. Going over each of these, it starts with the filters, and then I use an array here. But then I take the different filter objects. And so, like for example, I take the field here, which is, for example, tag. I have the key to the tag, which is what the actual tag key is that I set. You can view all your user data in the dashboard here, Audience, All Users.

And then here's my tag data. So, I can do user_name as the tag key. And then the tag value here in this case, it'd be Jon, or it was updated_key and updated_value. And then I set the relation. The relation can be greater than or less than if I'm using integers for the values. It could be equal to... I can say 'is something'. I could also say 'is not something'. Or if I don't really care what the value is, I just want to know if the tag key exists, I can use exist or does not exist.

Also, a unique feature is the time elapsed operators. So, if you set a tag key, and if you set the value as a UNIX timestamp, then you can actually do time elapsed greater than X amount of seconds since that timestamp was added. There's a lot more details about this in our Time Operators Guide, but it does require a paid plan. It's really great for abandoned cart scenarios or just basically tracking. When those users perform an event, you stamp them with a timestamp of when that event occurred. Now you know and you can actually target users based on how long it's been since that time event occurred.

Cool. And then, I just basically keep adding like this. What's important to note is that filters are AND by default. So this is like the tag key1, value1 AND the last_session is less than 72 AND session_count is greater than 0. So, in these cases, the users must fit all three of these parameters. If I wanted to separate them with an OR, I could do the operator... I believe it's operator OR. Yeah, operator OR here, like that. And then you must have another filter here because if you just do operator OR, it's basically going to just send to everybody. So, make sure you don't do that.

Cool. So, in this case, I'm targeting users that have the tag key1, value1, and they were last active on my app or website less than 72 hours ago, or just all my users that have a session_count greater than 0. So, in this case, it's basically everybody. I want to do maybe 10, so my users that have been to this site more than 10 times. And this is invalid JSON here, so I just delete that. There you go. And then everything else is the same. We got our app-id and contents and all that.

Cool. So, that is filters. If you wanted to do advanced filters, so maybe I wanted to do all my users with session_count greater than 10 and this tag, or session_count greater than 10 and last_session, you have to actually combine those together. First, I would do this or this, this, and then I would do another OR, then I can do whatever other ones. So, yeah, there is some repetition here if you're trying to target advanced users, but basically, you want to group the users, you want to target by the AND's and separate them by the OR's. So, key1, value1, and last_session is greater than 72 or key1, value1, and session_count is greater than 10.


So, that's how you do the more advanced targeting parameters by taking your tags or taking the thing that you want all users that they must have, and adding them, combining them with an AND with the other parameters that you would like, and then do that for each one separated by an OR. And that's gone into some more detail here in the examples. There should be some details in here.

Anyways, we're running low on time. I wanted to keep this one somewhat quick. The other thing I wanted to talk about was the included_player_ids. So, just like a segment, instead of using the segment name, you would just list all the player IDs you want to target. And we recommend having no more than 2000 player IDs within this at a time. So this would be like player_id_1, and then come up player_id_2, and then come up 3, up to 2000. That's not a hard limit. That's just basically a recommended limit because as you add more and more and more, they might not get it. So, if you're looking to send lots of notifications to users by player ID, we recommend adding up to 2000 per request. And then you can send that request. We recommend about 20 requests in parallel.

Same with external_user_id, it's the exact same here. I don't have an example here, but basically, you just take the external user ID or include_external_user_id here whatever your external user IDs are. So in this case, I don't have any. But you get it. It's basically the same thing. We're just targeting the external user ID instead of the player ID.

Cool. So, that's it for the create notification endpoint. Again, there's lots of different parameters to use. So, depending on your use case and what you're trying to do, you can go through the docs and see what you want.

Email is on here as well. I don't know if I have time to get to it. But just like for push notifications, if you have emails set up, you can copy-paste your HTML directly into the email body, and you can actually use your full HTML here for the notification or for the email. So, that's nice.

Highlighting the View Notifications Endpoints

I do want to highlight the View Notifications endpoints. These are great because it's really helpful to find all the information that is sent with the notification. And so, just for example here, I'm going to have this ID. And for the View Notification endpoint, this requires the ID, which is the notification ID, and the app ID, which we all know what that is. And so, what you do is you create another collection or create another request, whatever you like. This is a GET, and then this is the URL. So, you can actually copy-paste this URL into here. And then that's going to automatically set up these keys where the app ID is your OneSignal app ID we went over. And then the ID is the notification ID.

And so, I'm just going to copy the ID from this request that we used previously, paste that here. And then I go into my headers. The headers do require the REST API key for this. So, that's it. Once I click SEND, I will get all the details for that one notification. And there's a lot of details here. You can actually read more about it in our documentation about what all these different parameters mean, but that'd be a good place to start.


So, that's basically all the details about the notification, the common ones being a breakdown here of the platforms that were delivered to. You can see how many were successful (that means how many were delivered to the Firebase and Apple servers), when it was scheduled to be sent, when it was completed sending, and when it was created or queued at here. If you have a paid account, we also provide the received parameter somewhere, which will tell you how many of those devices actually received it.

There's a converted parameter, which is how many clicked it. Converted here, that's how many clicks. And errored was how many actual errors. This is probably an issue with my setup. So, if you see a lot of errors, you might want to take a look at your settings page and there should be more details about those errors there. So, I have three errors because I have these three test devices.

Cool. So, that's it for the View Notification. The View Notification endpoint is very, very similar, except you're not using a notification directly. You're actually setting up the app ID. You're adding a limit, which is how many of the notifications you want to pull with this. There's a max of 50. And so, if you want to do the max, you can actually just not put a limit or you can put 50. And then if I want to get the next 50, we have the offset. So I want to offset by 50. I'll have the first 50 in the first call. I'll have the next 50 in the next call. So, that's 100 total. And then I want to get the next 50. So I do a 100 there. And then you just keep offsetting by 50 each time to keep getting all the notifications.

And there's kind. So, kind means how were these notifications sent. Were they sent from the dashboard? I want messages only sent from the dashboard. Then I put zero. I want notifications from the API, so only the ones that I sent directly from my server or using Postman. I can put 1 here.

And then automated messages, those are the ones you create within the OneSignal dashboard under the Automated Messages tab here. I can do a 3 there for that. But if I want all notifications, regardless of how they were sent, I can just not use that parameter. This one also does take the REST API key. So, make sure you have that as well.

I really wanted to get into the Clicked History endpoint. This is a really cool one. This will give you a list of all the devices that were both sent and both clicked notification. And so, just like the View Notification or View Notifications endpoints, the unique thing about this is that it will only give you the list of specific player IDs that were either clicked or received the push. And then the way that works is you just get the endpoint here, so notification or doing the notification ID. I have my notification_id there. I have my headers, my authorization, my REST API key again.

Here in the body, I'm going to use the form data instead of the raw JSON. I can use form data. And here's my app ID. Here's the email I want to send it to. The email is required. So, if you don't actually want an email, you can just put whatever.

And then event, this is either clicked or sent whichever event you want to track. And then as soon as I do that, I click SEND. It's going to give me a destination URL. And this is the CSV of all the devices that we, in this case, sent the notification. I think this is going to be blank because the notification doesn't have anything in this case. If I want to use a valid notification here, cool, here are all the player IDs that were sent this notification.

Alright. I just want to highlight just one more endpoint because I do want to keep this a little bit shorter and get to the point. It's the CSV Export. Now, the CSV Export endpoint is great, especially once you start having over 100,000 devices. You'll want to use this if you want to get all your user data.


We do have the View Devices and the View Device endpoints. These were very, very similar to the View Notification. The View Notification is almost the exact same thing. You just use the device IDs instead of the actual notification IDs. But in this case, the View Devices will not work once you have over 80,000 total users. So in this case, you'll want to use the CSV Export.

This is also great because it gives you all the data. Anything you want that OneSignal collects, it will be available in this CSV. We have an example code here and everything that you need for it. But really, the way that this works is just like all the other endpoints. You just copy-paste the URL here. It's a post. So, I put my post parameters. It does take the app ID as the query parameters. The header, it does take the REST API key. In this case, I'll just grab that because that does not look like my current REST API key. So again, basic body.

So, what's cool about this is that we don't give you all the data unless you specifically request it. And so we give you the basic data, but then if you want all the extra data like the country, the notification types, the external user IDs, location, rooted, IP address, web auth key and web p256, just put that in there.

Extra fields, it's an array of string data just like what we saw with the other arrays of string data with the included_segments. So, country, notification_types, all that. And that's it.

If you want, you could also export by segment. So, if I only wanted like a certain segment, not all users, but just like a segment, I could do a segment name. This takes a string. So, not an array of strings, but just a string. And I can do my subscribed_users or whatever, subscribed_users here. And now, I'll just get this data for my subscribed users. I clicked SEND. Your REST API key here. Maybe my app ID isn't valid. My app ID isn't valid. That's what's wrong. So, I just got to grab that real quick. Yup, my app ID here. Here is my CSV. I can now copy this.

Now, depending on how large your app is, this may take a while. This gives you the link, but it doesn't necessarily have all the data immediately. You might see a weird XML error or something like that. That's fine. Just give it 5, 10 minutes depending on how big your app is. And then just refresh the page if you see that error. After 5 or 10 minutes, if you're still having that error, just come back in here and click SEND again. Get a new URL, paste it in there, and then it should work.

Here we go. Here's my user data. And there you go. You can put this into your Excel or Google sheets and you'll see it in a much easier-to-read format, but here's all the data. So, if you ever need that, you have it.


Great. So, I'm getting close to time. I think there's a few questions in the Q and A.

"Did you say 'Download Postman'?" Yeah. So, I'm using postman here and this is just for the demo. That's a good question. Actually, I wanted to highlight that. All of our endpoints have example code in it. So, obviously, if you're more technical and you have a server and you don't want to use Postman, that's great. You can actually use the example code we provide. I just really wanted to highlight basically how to read our documentation here, find the endpoints, how to set up API requests to OneSignal, and get you going. But yeah, if you're using a server and it's written in Python or Node.js or Java or anything, just click these examples and you'll get an idea of how to get that setup. So, thanks, Malcolm.


Anonymous: "Good day. I am confused here." Hopefully, this isn't confusing after running through that. If you're still confused, again, you can reach out to OneSignal here. Just click this little button in the documentation. It's also in the dashboard. Click the button and you can reach out to us.

"How do I know that a user is subscribed once he entered my website?" Yeah. So, you'll know in a couple of ways. One, if a user subscribes to your site correctly, all subscribed data is under Audience, and then you can actually have the subscribed users. As long as there's information there, that means those are how many subscribed devices you have. But to get a really granular view of your users, you can do that under Audience, All Users. And then this is basically what we just exported in that CSV Export. You can see if the device is subscribed or not and the last time they were active per session or device, yada, yada yada. And if they're not subscribed, it will have some error.

In this case, I have a Service Worker 404 error. This is a super common error that you might be seeing. This means the device correctly went through the steps to subscribe, but they are not actually subscribed because the Service Worker is not added correctly. In that case, you'll want to go to your settings or browsers and you'll want to just make sure you follow the set up. If you need assistance, contact us here and we'll do our best to assist you as soon as possible.

"I had missed most of the webinars due to a meeting. Did you guys record this?" Yes, this should be recorded and it will be available. All of our webinars are on our YouTube channel, so YouTube, OneSignal. This is the product demo here and that's my amazing voice. But yeah, you can actually go to our OneSignal channel here. All of our videos are available here, previous webinars, other videos, and stuff like that. I'll throw a link into the chat right now.

Cool. I'm going to have to run soon, but I'm going to try to answer a couple more questions in the chat.

"You can use variables in Postman for storing API keys." Yes, you can. That's great. I was going to try to get into that, but yeah, you can actually store variables. You can actually run a collection. It's really cool. You can actually go to this RUN collection and then it will actually run like a CSV. You can import a CSV of some data and run whatever you want. That's a really cool feature that Postman provides that you can look into.

"I'm using Chrome and Safari notification on my website. If I send a notification, the notification is coming so much time later, I don't know why." Feel free, Mario, to reach out to our support team and we can assist. If you're sending a notification through Postman or something like that, or just from your server using our API, you'll see the request data that we saw earlier. It will tell you the notification ID and stuff like that. The notification ID corresponds. Your Delivery tab here, when you click on a notification, this here is the notification ID that we provide. It will tell you how long it took to complete, so less than a second in this case. But if you're using the send after or some kind of scheduling parameter, like intelligent delivery or something like that, then it will definitely be delayed because you're scheduling it for the future. So, just reach out to support, Mario, and we'll take a look and try to help you.

Yup. The webinar, I showed where you can find them in OneSignal. I dropped a link in the chat. Also in our documentation, there's webinar videos here as well.

"I like to use my email lists, but I don't know how to make this." You can't send push notifications to emails. Push notifications require an actual subscription, whereas emails, you could literally just have somebody's email. So, you can't send them push notifications, but you can send emails as long as you have Sendgrid, Mandrill or Mailgun set up. Just go to our documentation and follow our email set up, and we'll explain how email works. But yeah, if you upload emails or send OneSignal emails, you cannot send a push notification to an email address.

"Can I use external user ID for those filters as well?" So, external user ID can only be used with the included_external_user_id parameters. You'll have to use included_external_user_id here and target users that way. You can't combine these targeting parameters, filters, and segments in include_player_id or include_external_user_id. They all have to be unique in that case.


The last question here: "Some users that were already subscribed report that they were prompted to subscribe again, and a dialog box never leaves the screen. Do you know why it's happening?" Yeah. So, that could happen for a couple of reasons. If you're on a website, here's my website here. If a user clears their cookies, in most cases, OneSignal will automatically re-subscribe the user. So, in this case, you'll see I got a new player ID. It used to be something else, now it's this.

So, it's just the way browsers are set up. When you clear your history or clear cookies, that will basically unsubscribe the user. They'll have to re-subscribe again, usually, by returning to the site. That happens in most cases if your site is HTTPS and you added our Service Workers following our basic setup guide.

But if you are seeing the prompt over and over again, that's usually the case when you're in incognito or private browser mode. Push just doesn't work in this case. And so you'll see the prompt over and over and over again, even if I click ALLOW. It's just the way that incognito mode is set up. So, if I create a new incognito mode, I have a delay to view. So, that's why it keeps showing up. It's just going to keep showing up because, in incognito mode, push doesn't work. So I click ALLOW here, but I can't subscribe. So there's no native browser prompt here.

If that's not the case you're seeing, Hogan, please reach out to our support team,, or just through our documentation or website. You can click this button and share the URL and steps to reproduce, and we'll take a look at it as soon as possible.

Alright, everybody, thanks for your time. I hope this was helpful. This will be available on YouTube, hopefully by the end of the day or tomorrow, and take care.