Developer Advocate @ Courier
Senior Engineer @ Courier
This workshop is designed for developers looking to learn how to automate push notifications in web and mobile applications in three steps:
By the end of the workshop, attendees will have a solid understanding of sending and automation notifications from Node.js apps and be able to implement their newfound skills in their own applications.
Shreya:
Oh, my God. We made it. Yeah. Hey, Mike. How's it going?
Mike:
Going well. How are you?
Shreya:
I'm great. I'm. My heart is racing. I've been so excited about this event and also nervous and all the feelings in the world. And it actually just started. And we have Ben and Micah joining us from LinkedIn, I think. Thank you so much for your comments, guys. I'm sure I'm a developer advocate at Carrier and I'm going to be hosting this weekly livestream series called Decode.
Shreya:
And it is really just a place for us to come together with awesome engineers like Mike, who's joining us today, and both cool projects and kind of talk a little bit about how notifications fit into the world of mobile and web applications. So Mike, do you want to maybe like give us tell us a little bit about yourself?
Shreya:
Who are you? What do you do? What's your Social Security number? I just went all out today.
Mike:
I don't know about the last part, but I'll give you a give you a little bit. My name is Mike Miller. I'm the lead mobile SDK engineer here at Courier. I love making super awesome mobile experiences and to make super awesome mobile experiences. A good part of that is understanding how to set up notifications properly. So we've built a really, really cool mobile SDK that we think a lot of you will really like and we're happy to show it off to you.
Shreya:
Yeah, I'm really looking forward to it. I want to clarify, when we say we've built a really cool mobile SDK, this guy right here, I think if I point this way, is the one who's built that. Before we start even talking about the project, you want to kind of tell us a little bit about what the mobile SDK is, how it fits into the whole like sphere of Courier itself, and then we can dive into what we're building.
Mike:
Yeah, so Courier is kind of the brain for your notification system and there's a lot of really cool features that have been built out that make it much easier for mobile engineers to get push notifications on their devices as well as other things. So the Courier Mobile SDK does basically as much automation for you as a mobile engineer as we can, So that's managing your current user and making sure they receive the proper notifications that they should receive.
Mike:
So like, you know, when you sign out of your Uber app, you don't still receive notifications for driver updates that you don't need. We do that for you automatically. We manage push notification tokens for you automatically so you don't have to work with a back end engineer to build out this extra infrastructure that most apps that have push notifications use.
Mike:
And we've also added a bunch of proper formatting for messages to just make it so much easier and more reliable to receive the notifications on the device.
Shreya:
Awesome. I do want to say a little hi Tejas who commented a little wave. Fine. How are you doing? Thanks for joining and supporting the stream. I think we have nine people watching live, which is more than I was expecting. So thank you guys. Let us know who you are, where you're watching from, and if you have any expectations for this live stream for the project that we're building out, let us know in the comments and we'll try to address that.
Shreya:
So, yeah, let's let's get to it. What exactly is this? When we're talking about automating push notifications, what does that mean? What are we building?
Mike:
Oh, yeah. So we're going to build three parts today. We're going to show how to set up the Courier mobile SDK to send and receive Firebase notifications. So Firebase is most popular push notification service for mobile engineers. We're going to show you how we do that. We're going to show you how to do that in a flutter app so you can see the Iowa side and the Android side.
Shreya:
Then we're going to show you how to set up a super simple Node.js app, how to send those messages out. So Node.JS is very popular, very common for engineers out there. And then the third thing we're going to show is how to set up a simple automation inside of Courier to send a message every now and then, maybe something similar to like how Be Real sends out a notification to their users daily.
Shreya:
So yeah.
Shreya:
Awesome. All right, let's just dive right into the project then. I'm going to share the GitHub repo and this on top of the screen and the chat in the meantime. Mike, do you mind pulling up your screen and we can just dive into into the code itself?
Mike:
Yeah, absolutely. I'll show a little demo here of what we have set up and then we'll, we'll build the whole thing from scratch.
Shreya
Tejas just commented his not so favorite notifications. Guess, guess which app he might have referred to?
Mike:
But looking at the messages there, I think.
Mike:
He said DoorDash.
Shreya:
Definitely. Is that DoorDash? Yeah. All right, let's get to it.
Mike:
Cool. Yeah. So this is a super simple flutter app over here. This is my actual iPhone. And what we can do is I can just click this button in the bottom right hand corner, and it sends a little message to me. And all of that was done without having to work with any backend engineer. That's usually something that takes a very long time for a mobile engineer, a product manager and a back engineer to kind of work together.
Mike:
All of this with courier can just be done with one mobile engineer. So that's one thing that we're going to show off. And the next thing is how to send a message from the Node SDK. So this is a super simple, no doubt we'll go over this later. And what I can do is I can just send a message right there, message sent, and if I switch back over to my iPhone, you can see that I have a message right here from the Node.js app and then we'll dig into the automation piece for like setting that up and Courier a bit later that's a little bit more intrusive at this point.
Mike:
So those are the big things and let's dive into it here.
Shreya:
Let's go. I'm excited.
Mike:
So, so the first thing I'm going to do is I'm just going to create a new flutter project. I'm going to move this over to a new workspace here and we'll call it Decode Live.
Shreya:
Also, I’m kind of sad. Yesterday, when we were doing the dry run, you had like a million of those little desktops open and you put them all away. I wanted the world to see.
Mike:
Yeah.** **I had like 15 empty desktops.
Mike:
Yeah. So we're going to build this, this flutter app just for Android and iOS. As mentioned before, this is done in Flutter just so that we can show you the iOS and Android side of things that engineers have to go through. So I'm going to make this full screen here and the first thing we need to do and museum is just a little bit more on the code.
Mike:
The first thing we need to do is actually just set up Firebase. So we're going to do this with a Firebase project I've already created and we're just going to add another app here and we're going to add a flutter app. Firebase makes this super easy. I already have the first part set up, so I'm going to skip down to the second part and just install Firebase via the client and I can just run that command and that's going to go there.
Mike:
Next thing we're going to do is copy this next one really quick.
Shreya:
While you're doing that. If someone hasn't used Firebase before, do they just need to sign up for an account and then they'll get access to those keys?
Mike:
Yes. Yep. All you need to get started with Firebase is a Google account, and then you can make a Firebase Console account to to get started with Flutter and Android and iOS, you need a few different programs. Shreya has all the tools you'll need, but basically you need Xcode to get started for iOS. You need Android Studio to get started for Android, and then you need the Flutter SDK to get started for Flutter.
Shreya:
Awesome. We do have we have a few more people that have trickled into the live stream, so thank you guys for joining. Hi, how are you? If you want to build out this project we do currently have a hackathon going on and you can build this out and submit it to one of the prizes and you are likely going to win a prize.
Shreya:
So if you want to build it out together, let us know if you have any questions. Otherwise, we've shared the link to the repository with all of the code and you can use that to kind of, you know, forget build your own project, build on top of that as well afterwards. All right, Mike, I'll stop distracting you.
Mike:
All good. So I have the flutter or my flutter project configured to my Firebase project. The next thing I need to do is just install the code for Firebase into my Flutter project. So I just run this command. This is just following Firebase Docs to set this up. So pretty straightforward. And the next thing we need is we need Firebase Messaging and to show you where these live.
Mike:
For people who may not be familiar with flutter projects, it's very similar to like a package that JSON in a web project. We just add the dependencies right into hubs spec GL, so that is good to go here. Now we just need to do the last part, which is initialize the app and we'll put this right inside of main.
Mike:
Main is the first function that runs in a flutter project and we'll add these dependencies. And I need one more thing. Don't remember the exact way this snippet is written. Let's see here. I need this one right here and we're going to scroll to this and I need that right there. And now we'll switch back over.
Mike:
All right. So now the project is set up with Firebase. It's all linked to our Flutter app, and I'm just going to run this in seconds.
Shreya:
Awesome while it's waiting, could you explain what you just added? The ensure initialized function?
Mike:
Yes. So basically what this does is Flutter wants to make sure that the widgets are ready to go before it starts to show anything else. Flutter is built with a bunch of widgets, similarly to how iOS apps and Android apps are built with views. So for our use case here, we're not going to do a lot of UI, but this just makes it to where the project will compile and start nicely so that we can get into the rest of our demo.
Shreya:
Takes a sip. I love your mug by the way. I like that you had your coffee next to you.
Mike:
Leaves on it right?
Shreya:
Awesome. While it is installing and launching, do you want to kind of tell us a little bit about your experience building the mobile SDK? Because I imagine that it's been a really long term project for you and I kind of want to know what it's like being the engineer behind such a big project.
Mike:
Yeah, so I've been I kind of got to go a little further back. I've been making apps for about ten years and you can imagine making many different apps over ten years. A lot of times I would come across setting up push notifications and there's a lot of things with push notifications that are pretty challenging when it comes to the developer experience.
Mike:
So when I was looking around for a new role, I was like, Wow, Courier is actually building all of the things to make that much easier. And I have all this experience of building this stuff out from scratch so that, you know, you can send notifications to your users or users can click that your app does something. And I was like, You know what?
Mike:
I think I can totally consolidate this down to way, way, way fewer steps. And yeah, that's the mentality I take when I'm building this mobile SDK and, and yeah, we'll, we'll show you the really cool stuff here shortly.
Shreya:
Awesome.
Mike:
So we have the project running and that's it. It's not very exciting, but we're going to go there. The step number one is done. We have Firebase ready to go with our Flutter project. So next thing I'm going to do and I'll just go back to the console here I am going to go to the Courier Flutter SDK.
Mike:
So we have several SDKs. There's an iOS SDK, Android SDK, React Native and Flutter one. Here is a little overview of what is inside of the SDK and we'll touch on most of these things today. Some information about what's required, but this is the snippet we need here, so I'm going to copy this snippet and this will add the Courier Flutter SDK to our Flutter project.
Shreya:
Cool.
Mike:
Now what we've done with all of our SDK is, is we've set them up in a way that's like kind of a step by step guide to really go from nothing to everything. Now there's a video here, but I'm going to skip it and I'm just going to follow these steps right here and show you how to configure this.
Mike:
So Flutter app has platforms. Basically for our case, we have iOS and Android, but you can also make Windows Apps and Mac of US apps and so on. What we're going to do here is we are going to open the iOS folder, we're going to click on, we're going to double click on Runner Workspace, and this opens just the iOS side of our Flutter project.
Mike:
We're going to go into our runner target. So this is like the main app bundle that your iOS app runs out and we're going to change this to minimum deployment of iOS 13. That gets us the latest iOS APIs for push notifications, and it kind of points towards where things are going in the future. So it's kind of a future proofed API.
Shreya:
Awesome. Before you continue as a complete mobile app noob, could you explain what a target is and what a bundle is and how all of that fits together?
Mike:
Yeah, so in a simple way, your runner target is really just the bundle of all of your app code and the target like the project really contains like all of your different targets. And the iOS system will manage these targets in specific ways. So Runner in our case is the app. It may or may not run in the background when you swipe it away, the target kind of goes away.
Mike:
Maybe you're familiar with that gesture to close out your recent apps, but other targets don't do that. Some targets may run in the background at all times. And as we go through our tutorial here, you'll see a different target that we add that does run in the background. And there's some special usability stuff that comes out of that.
Shreya:
Gotcha.
Mike:
So so from there I've changed the minimum target and what we're going to do is back in our Flutter app, I'm going to change the directory to the iOS directory that points to this. This is inside of terminal and I'm going to do pod update and run this. So pods, cocoa pods are it's kind of like NPM for iOS apps.
Mike:
So this will pull in all of the native level code that we've written for our iOS SDK into just the iOS side of your Flutter app. So you don't have to write any of this stuff. So that's good. We have all of our IOS side code now. The next thing we're going to do is we are going to change our app delegate to extend Courier, Flutter delegate, and then we'll add a simple import.
Mike:
And what this does is it will automatically sync API US tokens. So push notification tokens to courier so you don't have to write any of that code. And then it also makes it easier for us to handle message delivery and click events. And maybe at this point it's worth sharing a bit about push notification tokens for those who aren't familiar, a push notification token is a unique identifier.
Mike:
I don't know if you can see my face, but a unique identifier for your app that is kind of like a phone number that can receive push notifications. Maybe that's a way to think of it. And just like every device has probably one unique phone number, you'll probably have one unique push notification token for your app as well.
So that's that's what we send the pushes to from Apple or Google so that your users can see those notifications. But unlike phone numbers, they can expire. So after a certain amount of time, your app may get a new push notification token and that means that you have to update that token somewhere else so that you know you have the latest token to send messages to.
Mike:
And this is why Courier is super powerful because we just take all of that stuff that people would normally have to write and test and troubleshoot. And we just do all of that for you. And the way that you set that up on the IOS side is super simple.
Shreya:
Really quickly, before you set that up, what like what type of issues can you run into if you have tokens that expire and you don't aren't able to kind of fix that quickly?
Mike:
So if you have an expired token and you're trying to send a message to that not only with your users, not receive the message, that's probably the biggest thing. But you have tokens that you don't need anymore in your backend and you have to associate them with like a state. Like, is this expired, is this valid? And it's really just maintaining a list of all of these tokens in a database and it's just more overhead that engineers have to keep in mind if they're building systems like this from scratch.
But Courier is here to help.
Shreya:
Yeah.
Mike:
So what we're going to do now is we're going to change Flutter app delegate here to Courier. Flutter Delegate. And we're going to add this import right here suite and that's it. Now, we don't have to ever manage the Apple push notification tokens on our IOS side. There's a couple of things we'll have to do on the flutter side, but get to those on the firebase side.
We'll get to those in a little bit. And next, we need to enable push notifications for our iOS project. And to do this, I just go back to the run our target signing capability, click on capability, and it's like push notifications. Sweet. And I'm actually going to change my team over here to our Courier team, and I'm just going to change this out to use a Courier suite.
So that's good to go there. At this point you could send with it with a couple more lines of code. You could test this out. We're going to follow a few more steps just to make sure that we have everything addressed here. But at that point, push notifications are ready to go in your iOS project. So the next thing here is we're going to add a notification service extension.
So what this does is it allows the Courier mobile SDK to detect when a push notification is delivered, when your user's app is completely killed and not running at all. And that way you can track the delivery status of notifications regardless of the state your user's app is in. And we've made this super easy to set up.
So again, there's a video here if you'd like to follow that, but we're going to do this all right here. So I'm going to click on the zip link here. That gives me a zip. I'm going to unzip that and bring this over to my desktop. Then I'm going to right click open this in a new terminal, and we're going to type sh make_template.sh, and we see a cute little bird here, our pigeon.
Shreya:
That is s o freaking adorable adorable. Sorry, I know I stop you here every single time, but that picture just makes me so happy, but also kind of kind of scary that massive AI is kind of staring deeply into your soul. But I guess.
Mike:
Yeah. Yeah.
You really look in you down here. But what this does is it saves you a tremendous amount of time having to configure this extension from scratch. So now we have everything on our computer ready to go. We just have to add the new notification service extension, target lots of words into our I+ project. So we will switch back over here and we will go to this is our Xcode project for our iOS side of our Flutter app.
Lots of things. And then we will go file new target and we will filter the iOS tab by Courier. And you can see we now have a Courier service. We'll click next, we'll give it a name and I'll say Courier service and just make sure you have the same team as the one that your iOS project is being signed with.
So in my case, it's our Try Courier. And the next thing.
Shreya:
A quick note before you continue. I don't know if you've explained this, but what is what like what does the team have to do with this project?
Yes. So every iOS app must have a team associated with it. If you are going to build it on an actual device or you are going to release it to the App Store. So you can test in the simulator, which I have a simulator right here, but testing push notifications is challenging. In the simulator, some versions of iOS do work, but most of them do not.
So you do need a physical device to test push notifications as if push notifications already weren't complicated enough. Right?
Shreya:
Yeah.
Awesome. Thanks for explaining that.
Mike:
Yep.
Cool. So I've added the target to our iOS project. This now allows us to monitor when notifications are received. When your user has the app that you're working on. Completely closed. So pretend you're using Uber, you close Uber, you're not using it at all and they send you a push notification. This allows us to track the delivery of that notification, even if your user is not using the app at all.
There's a little bit of configuration we have to do for the service. So what I'm going to do is I'm going to switch over to the general tab and I'm going to change this to match iOS 13. So now our runner target is on iOS 13 and our service is on iOS 13. So everything's good there. The next thing we need to do is we need to add this snippet of code here to our pod file.
So the pod file, again, this is similar to like NPM, and we just want to add this code at the bottom here which says that new notification service extension we added, just make sure that you can add the courier iOS code to it. So we're good there. And from here we'll switch back to our Flutter project and we need to run pod install.
So this will install the pod to that notification service extension. And you can see Xcode is like, Hey, something's going on here. And what we're going to do is we're going to read the code that's on disk, read the code that's on the computer, and we're good. No additional other than these four lines of code, no additional code needed.
And now we can monitor when notifications are received in the background. So I'm just going to close out our iOS project and we're good to go. I'm going to give it a new run here just to make sure that everything is good. You stop and do a restart and then in the meantime I'm going to scroll down to the Android side of things and we can start on integrating the Courier mobile SDK into Android.
Shreya:
Awesome. And we would need a physical device to test this out, right?
Mike:
That is true. So I'm testing on all physical devices here. It might be a little bit difficult to see some of these things and I clear some of these notifications away.
On my on my Android.
Device. But yes, testing on a physical Android device and a physical iOS device.
Shreya:
Gotcha.
Mike:
So while that's building on our iOS app over here, I am going to open our Android folder for the Android side of our Flutter project and I'm going to bring this down over to Android studio and open that up. And again, just to reiterate on this, all things are loading the iOS integration is of the iOs side of your flutter project is very, very similar to how you do this.
If you were working on just an iOS app the Android integration side is very similar to what you would do if you were integrating the Courier SDK into just your Android project.
Shreya:
Gotcha.
Mike:
Cool. So from here we have our Android project opened up. I'm going to close a couple of things out here and we need to make just a couple of changes to configure the Courier mobile SDK on Android. So if we hop back over to the documentation, the first thing we need to do is we need to add support for Jetpack to our Android, build Gradle and Jitpack.
Just to let you guys know what that does. It allows us to pull packages from Jitpack IO, which is where our package is currently hosted at some point in time we will host it via MAVEN Central, but to move quickly, we're not doing that at this point in time, so we're going to open our Android build Gradle, which is this right here, and we're going to go to All Project's repositories and we're going to add this line right there.
Now I can sync right now. Not a huge deal, not really much to sync, but that is good to go at this point.
Shreya:
What does the sync do?
Mike:
The sync pulls in the packages from the external sources. So just like NPM or NPM install will install packages hosted via NPM and hub get will pull packages from hub dot dev for flutter projects sinking in gradle will pull the packages in for android projects.
Shreya:
Awesome.
And similarly to how we did pod install talking to every package manager ever right now.
Shreya:
Yeah.
Mike:
Yeah. So now we will go into our app build Gradle which is this file right here and we are going to change a couple of things in this. So the first thing we're going to do is we're going to change our minimum Android flutter version to 21. So for those of you pointing to something lower our SDK, it does require 21.
21 is fairly old now, so it shouldn't be too big of a deal. The next thing is we need to change our compilation SDK version to 33 and that number is right here and that is good to go. And the reason we go to 33, by the way, is because the latest Android SDK supports push notification permissions. So that is a new thing that we want to make sure that we cover because we're trying to make the greatest push notification SDK ever.
And in order to do that, we've got to make sure that we're targeting version 33. So we will think this now. Everything's good there and now we're on to a little bit of code. And just like with the Iowa side, we just need to change our main activity, which is the first thing that gets run on the Android side of your projects to extend Courier flutter activity.
And I'm going to option return, which will automatically import that file here. And then I'm just going to delete these lines of code right there just to clean it up a little bit. And just like that, we don't have to deal with a good chunk of how to handle when a user clicks on a notification, you don't have to write a bunch of lines of code.
We simplify as much as possible down into that one step. There. The next thing we're going to do is we're going to copy all of this code and we're going to create a notification service. This is pretty similar to the iOS notification service extension, but Android is just a little bit different. So what we're going to do here is we're going to call this, let's say like decode notification service.
This is our file name and let's paste all this code down here, swap out some names and that's it. Super simple. So this right here is actually what gets presented to your users when they receive a notification on Android. And there's a a call out here about how to customize this. This is the spot that you will customize the actual way the notification looks when it's presented to your users.
There's like an icon and stuff, but you can do whatever you want here and there's a link to. The actual Android documentation, if you want to do something more special.
Shreya:
And if you don't, that's just going to have like a default view, right?
Correct. All this is going to do is just show a really simple notification with this like information icon. I would recommend if this were me building this into my app, I would I would probably customize this a little bit more. This is just kind of for testing purposes. Your use case would be slightly different. Next is we need to just add the notification service into our application.
And to do this, we scroll down here and we will copy this code right here and I'm just going to make a couple of lines and put this at the bottom and then change this to the Code Notification Service. And then I'm also going to do option command L to just do a little bit of formatting on the code here and that's it.
And you can see that this notification service uses the Firebase messaging events. So we were extending the Firebase code and really just simplifying things down even more for you. And that's it. That's as easy as it is to integrate the iOS and Android side of the Courier Mobile SDK. If you're curious about any of the steps, you can check them out in each repo.
So here's the flutter repo, but there's also iOS, Android and React Native. Cool. So the next thing here is I'm going to run this project just to make sure that we don't have any build issues. Things seem to be pretty good so far, so we'll stop this a second and we will start it again. And as that builds up on iOS, I am going to go through the Firebase side of setting up Firebase Cloud messaging, and this is where I need you to turn off my screen share so people do not see any of my things.
Shreya:
Awesome.
While you're doing that, let's talk a little bit about like all of the different types of projects maybe that you've built or that you can build with the mobile SDK outside of the one that we're building right now. Like what are the superpowers of the mobile SDK?
Yeah, So in its current form it's really just dramatically simplifying receiving push notifications. So common things that people build push notifications for or add push notifications into their apps for are to really retarget users. So every time you receive a follow on Instagram or, you know, an update on your DoorDash order, they're really trying to reengage you to see what's going on in the app so that they can, you know, keep you using it and hopefully provide a great user experience doing so.
Shreya:
Awesome, yeah, it's like this idea that as an engineer you're building on an application, you want people to use it. You don't want to just like have it kind of laying in the background and then people forgetting about it, which unfortunately happens a lot more than anyone want it. So notifications are a great way to just sort of remind people like, Hey, the way this really awesome app that we built exists.
Mike:
Yeah.
Exactly. All right. Safe to say if this.
Mike:
Cool. All right. So what we're going to do here is we have to link up our apple Push notification key to Firebase, and then we'll link our Firebase Project to Courier. So here's how we do that. We have a step right here, and you can jump into our documentation, but I'm just going to show you straight up how to do this.
So first, in our Apple developer account, and this is similar to what we talked about with being a part of a team in iOS and my iOS project. What I'm going to do here is I'm going to create a new key. So I'm under certificates, identifiers and profiles. Profiles, and I'm going to go to keys and I'm going to add a new key and we're going to make an Apple Push notification service key, and we're just going to call this Decode Live and click continue.
And then we're going to click register. And now we have a push notification service key registered. And I'm just going to download this key right now. So now Apple is like, okay, you are on a team, you pay the membership and you can create push notification. You can create push notifications and we will send them out. So that's what we've configured at this point.
Next is I'm going to go into my Firebase project and I'm going to go into and I'll go all the way from the very beginning here. I'm going to go into like the main dashboard area, click on this gear icon, go to project settings, go to cloud messaging, and then I'm going to scroll down to our project here.
We only need to configure this Apple side on the iOS side of our project. Android is done kind of out of the box. So I'm going to click on the projects that we're working with here, which is com.example.Decodelive. We may get some issues here. I'm going to have to switch some things here, I think, but we can make this work and I'm going to take this key, drag it into here.
Then I'm going to switch back over to our Apple console and I'm going to change the key. I'm going to take the key ID and put that right there, and then I'm going to get my team ID, which is located right up here and put that into the team ID and then click upload. Cool. So we're all good there.
Our Apple account is linked to our Apple Push Notification Service Key is linked to our Firebase account. Now, just because I see that this bundle ID is com example, is code live, I'm a little bit scared that we're not going to receive push notifications, so I'm going to go into my iOS side of my project and see if I can change the target here.
Okay, that one is Courier DecodeLive. Let's see if we can change this to example a second and hopefully it works. It may not like it. It doesn't like though. So this one is going to have to be we're going to have to do a little bit of a reconfigure or else we won't receive the notifications.
And this is one of those things that is kind of annoying with these projects is you have to have the exact you have to have the exact bundle identifiers. So let's let's just debug that in a little bit here and see how far we can get to we might be able to actually go into our iOS and yeah, this is going to we're going to have to change some things.
Shreya:
Okay.
Mike:
It's unfortunate. Okay. But regardless, we have our Apple key linked to our Firebase account, and the next thing we need to do is we need to add our Firebase account to Courier. And to do this, I go into the project settings service accounts, and I will generate a new private key here. And what I'm going to do is I'm going to just put that key in a tab, copy all the code out of it and go into my Courier account.
So this is a Courier workspace made just for this project here. I'm going to go into channels, go to Firebase, which I've already configured, but I'm going to paste this key into here. I'm good. And then I want to make sure that this is checked as well. Apply recommended mobile SDK formatting. This does some magic formatting for you so that you don't have to juggle with structuring the way your messages are just to receive notifications.
And then I'm going to click Save, but you can turn it off if you had a more custom implementation and didn't want to use this. Sweet!
Shreya:
So quick note: We were able to do this very quickly because we already have a Courier account. If you want the link to sign is in the comments and it's on the screen as well. Courier.com/signup. And then once you signed up exactly what Mike just said, go into channels, go into Firebase and paste your key in there.
Mike:
Exactly. Cool. So we are going to probably have some issues with our iOS side. We'll debug that one in a second. I'm going to actually run this on my Android device here. And while that is fire ing up, what I'm going to do is I am going to go back into the Flutter SDK and start grabbing some snippets of code and going through and actually getting the Courier SDK to do things.
So the first thing here is we have a section about managing your users state. So in most applications you'll probably have a user and that user is the one that's currently using the app and you'll probably need to check things about when they're signed in, when they're signed now, and update your UI to reflect that state. You know, when you go to Instagram and you're not signed in, that's a different state your user is in.
Then when they are signed in and if they are signed in, then they should be able to receive push notifications that might be more personal, right?
Shreya:
Yeah.
Mike:
Cool. So I'm going to take this snippet right here and we'll cover this little section here in a little bit. But I'm going to take this snippet right here and I'm going to sign the user in and see if files are synced. And if I show you on I don't know if you can see from my webcam here, but I have the app running on my Android phone.
So we have our super simple Flutter app and we just have a little button here and I'm going to change what the button function name is to button click and we're going to just remove a couple of things you we're going to put in the Courier sign in function and we need to have an access token and a user ID to get this to work.
So I'm going to create access token and this is a string and then I'm going to create a user ID. So this access token, if we go back over here, what we should do, if you're building this for production, is you're going to want to use a function that we call issue token. This will create a very secure JWT.
This is what you want to do if you're going to really release to the App Store and you want to make sure that your user is managed in the most secure way that you can have for our use case right now, I'm not going to cover this, but if you're curious, you can check out going to production in any one of our mobile repos.
Shreya:
JWT as the token right.
Mike:
JWT is the token. That's correct. So what we can do instead though, is we can use the courier auth key that's located in any courier workspace. And I'm just going to grab this key right here. The production key will paste that key and right there and then we'll just create a user ID and I'll set example user and now we can sign the user in.
And so that should work and pretty straightforward. But now anything that runs after function is called Inside of Courier will use this access token and this user ID so we can automatically sync like push notification tokens, We can send out messages to that user and various other things that happen behind the scenes that you don't have to worry about.
If you use the mobile SDK. The next thing we're going to do here and we call out a couple of things here, but we've already done these steps. The next thing we're going to do here is we are going to manually add our FCM token to Courier, and this is only needed on the fire on the iOS side of things, just because iOS is a little bit finicky.
We're working on making this a little bit easier so you don't have to do the step. But for now we do have to do the step cook.
Shreya:
And this is a is this a firebase specific thing?
Yes, this is a firebase specific thing. This is not a courier specific thing.
Shreya:
Okay.
Mike:
So what we do just just to iterate and I'm going to grab it as long as I'm here, I'm just going to grab this snippet of code right here to Buffer. So what this is saying is, hey, Firebase, get that messaging token that you have. If you have that messaging token, then just set that in courier. Android does this automatically, but iOS requires us to do a manual sync for Firebase and that's okay.
We automatically sync Apple Push notification tokens with the current. I'm sorry if that was confusing. The next thing is we're going to put a little snippet here to request notification permissions. This is going to be interesting how this all plays out here, because I think an invalid bundle ID.
But that's okay.
Shreya:
Next, is that.
Something that you can change afterwards or is that something that it's better to change before?
Mike:
Probably better to change before. So we we should make sure that we do that before it just just so we don't.
See the.
Maximum amount of errors going on. So the next thing here is we're going to give it a notification presentation style for iOS. So this will like when a user receives a notification and they're using your app, it just tells iOS, like, how do you want to show that notification? And you don't have to send anything to it. You can you can leave this empty if you wanted, and then your user would just not see a notification appear.
If they're using the app, they still would receive like a notification in they would receive a notification in the notification tray here if they were not using your apps. So this just gives you some customization about how you want to present that to your user. And we're going to do a couple more lines here, and I'm going to move these lines of code into a slightly different spot.
I'm going to put these inside of state. So this is the first function that runs in a flutter app for a stateful widget. I'm not going to describe stateful things right now as it's not super important right now, but this is where you can handle when your user gets a message delivered to them or when they click a message.
Shreya:
I like how you just predicted that I was going to ask my question.
Mike:
We're getting.
Pretty good at.
This.
The next thing is we're just going to send a message to our user and I'm going to remove a couple of things here and kind of clean some things up. And we are going to use this access token right here. And you can see that it's you shouldn't courier off key in your project. It's only for testing. All good.
We're going to use this snippet right here to put in the user idea and we will just print the message ID. Now I need to fix the error a second, so if you could do a screen share disable and we'll come back and will test the message. That would be great.
Shreya:
We'll come back to it. We're printing the message ID just for our sake to confirm that a message went out.
Mike:
Correct In.
The case that the user isn't.
Us. Okay.
Mike:
Yes, correct. And that gives us a way that we can look at like we can take that message ID and add a little bit of like a at a URL in front of it and we can jump in and look at the actual message that was sent. And I'll show you that once we get a little bit further along here.
Shreya:
Awesome. And what are you doing right now? I'm not we're not screen sharing, but could you just describe it?
Mike:
Yeah. So basically in Firebase, I have wrongly configured the bundle ID of the iOS project, which is my fault, not a whole SDK thing. And I just need to make sure that we have the correct bundle ID so that I actually get the proper notification that appears.
Shreya:
Gotcha. So are you changing this with a you're changing this within Firebase, right?
Mike:
Yes, I am. I'm changing this in my yes, I'm changing. I'm reconfiguring my flutter project to point to take the right, bundle it and put that in my Firebase project in the correct way. Because otherwise it's like trying to send a message to an app that doesn't exist. And we don't want to do that. We want to send a message to the IT we'll get errors otherwise, like we need to send it to the correct the correct place.
Shreya:
We don't we don't want errors. While you're doing that, I just want to do a little shout out of our monthly hackathon. We have courier hacks going on right now. It's the second one of the year and it's called Courier Hacks Integrated Tool. So if you build out this project or any of the projects within that, we build in the Decode series.
So every Thursday we're doing this thing. Next week we're going to do an AI project. The week after we're going to do. I don't remember what the one after that is, but we're going to do some cool stuff. There's one with like Twilio, there's one with automations, so there's a lot of cool stuff going on. Oh, the one after that is segment.
Yes. So data is always fun. Yeah. If you build out these projects, you can always submit them to the hackathon. We're going to send the link for that in the comments and we're going to put it up on the screen as well. And if you happen to win a prize, which you like, we will because we give out a lot of prizes, then we will also make sure to write a blog post about the work that you did, share it out with our community and really hype you up.
So yeah, feel free to try to build out this project if you have any questions, why building it out? Feel free to reach out to us and we'd be happy to kind of help you debug, make sure everything's working out for you before the end of this hackathon.
Mike:
Absolutely.
Shreya: awesome.
Shreya:How how are things going on your end?
Mike: I'm almost there.
Shreya: Take your time. Take your time.
Mike:
Want to make sure this is right here.
Shreya
Awesome. This is fun. Streaming and debugging.
Mike:
Yeah, Yeah.
Shreya:
I do want to say that Mike has documented this entire process really well, both in our Courier SDK documentation as well as the GitHub repo for this project. So if you are building it out, there's a lot of like step by step things that you can just follow. And, and if the video doesn't work out for you, then it's all written down really well, I'm going to put this up again.
Mike:
So I think we're ready to do to go back to screen share too.
Shreya:
Awesome, great, you are back. Yes.
Mike:
Okay. All right. So I wanted to make sure that I had everything configured correctly with the right Bundle idea. Apologies for that. That was my mistake early on renaming something that I shouldn't have renamed, but we're rebuilding the app right now. And here is what's going on on my iOS device and we are getting it all installed Suite.
Shreya:
And we got it. We got a little comment for you from Savage that says plus one for documentation with the little thumbs up. It's really excited about that.
Mike:
Cool! So here's our super simple Flutter app and I'm going to press the button in the corner here and it asks us for push notification permissions and we will click allow and. If all goes well, we receive our push notification here.
Shreya: Oh, my God, look at that. Chirp. Chrip! I like how there's a little typo in there too.
Mike:
Is there? Oh chirp chrip! That was totally meant to be there. Yeah.
Mike: Yeah, we definitely need to fix that there. We'll fix that a second. We'll send another just to this to show that we have it all working here.
Shreya:
Nice.
Mike:
So we've restarted. We'll send a message again to ourselves and you can see there is without the typo this time. So we're all good. And if we look at what's going on here in the console and I'll just fling that back open if I click again, you can see what's happening here. So because, because we're calling sign in again, we're getting some things that may not necessarily need to happen for your use case.
It's just kind of how we have the set up. But the big thing that we want to check here is we want to see that we are receiving the push notification right here and here's all the information that's inside the push. So you can see here's the title and the body, the sound that gets played right now, you probably can't hear the sound that gets played, but that's okay.
And various other things that are added to this message. And now what's really cool is we can look here and take a look at this URL right here. So when I click to send another message, what we do is we do a request to the Courier send API and you can look at this message right here. So if I click this message, this URL, this pulls up the actual message that was sent to the device inside of Courier.
This type of functionality would take you like forever to really build out as a mobile engineer and courier does this for you super quickly and you can see that it tracks the state of the message in a really, really good way as it goes through its whole journey here. So the state of this message right now is delivery confirmed because we know it was confirmed.
You can see the message. The message is right here. Now, if I close these out and I actually close the entire app, there are a few of them there, but I'll close the entire app. And now what I'm going to do is I'm going to show you from the node side of things, I'm going to take this key, go into our node app, change that key out right there, change the user ID out, and I'll explain this stuff in a second here.
Save this and send. You can see I receive the notification here on our device, but I don't have any apps running and this is the magic of what we've done. You can see that the message is still delivered so we can track the state of the notification no matter what your users are doing with your app. So now I can
Shreya: Question.Sorry if you were to click on that push notification in the simulator, would that open up anything or would it just..
Mike:
So this is my actual device here. So I'll just go based on what what is going on in my actual device. Now when I click it, it's probably going to try to open the Flutter app, but it will crash because we have a lost connection to the device and that's just a flutter thing. If you were doing or if you're building a regular iOS project, it would open the full app and everything would be correct.
And if I were running this flutter project in release mode, it would be different yet, but let's just do it anyway so you can see I clicked on it and nothing happened.
Shreya:
Okay.
Mike:
I'm going to run up here again and show you the the other state that we can track here. So actually.
Shreya:
Before you do that quickly, could you go back to the log for the one that we had?
Mike:
Yes.
Shreya:
And I just want to see. Okay, awesome. Never mind. Ignore me. Keep going.
Mike:
Okay. It was there something there?
Shreya: I didn't know. I wanted to see if if it would show that you clicked on the actual notification. But because I guess this the app itself, like you said, isn't going to open up first. I was like that right now. Okay.
Mike:
Yeah. It's so when and this is just a flutter thing. This is not a Courier thing. When you build a flutter app and you run it in Android studio like this or in the code, it, it creates like a virtual version of your app and it doesn't actually like install every piece of code to your app that's so that it can do like fast reloading when you're building things quickly.
If I were building in release mode, though, all of the code would be on on the device and we wouldn't be stuck in that state.
Shreya:
Got it. We have a question from Savage saying that they see that you're building a Flutter. You're using Flutter to build a native app. What about progressive web apps? Are push notifications supported for progressive web apps?
Mike:
Good question. So first of all, I'll say that the Courier, the SDK is don't support the carrier Flutter SDK doesn't support web push yet we know it's real. We know that you can definitely use it. We just don't have the functionality built into that SDK yet. However, to talk about web push. Yes, Web push is definitely a thing and it's supported on Chrome and a few other browsers.
Safari not being one of those yet, and the usage is very similar to how you set up your mobile app. You get a token from the browser, you have to save that token and you can send messages to the browser. So at some point in time we absolutely want to support that also.
Shreya:
Awesome question Savage Thanks for asking. Yeah, go ahead, Mike.
Mike:
Cool. So I'm going to go back into the Node app here. We're going to send another message to our Flutter app. You can see where you see it here. And if we go into the Courier logs to check out our messages, I'm going to give a full refresher. 13 seconds ago, 14 seconds ago. We have a delivery.
If I take a look here and I click on that notification, you can see that we've now told Courier, hey, this is clicked and I can refresh and you can see that the message is clicked here inside of courier. So we can track all these messages really, really accurately based on what your users are doing. So that is a very simple way to set up the whole Flutter SDK, but also the iOS side and the Android side.
And just to show you on the Android side of things that I'm not a crazy person and that this does actually work, I’ll now run this on my Android device. It'll take me just a second here to get things working.
Shreya:
And while that's happening, we'll share a link in the in the comments of our quickstart for Node.js is just like a getting started with Node.js and that has all of the code that you need to build out the Node.js app that Mike just wrote and I believe that that code is also in the actual GitHub project for today's episode.
Mike:
Yes.
Mike:
Absolutely. So I have the Flutter app running on my Android phone. Can you see me nicely in my video?
Shreya:
Okay, let me remove the screen and then we can zoom in to cool.
Yes.
Mike:
All right, sweet. And then I can click the button here and you can see that I receive a push notification on Android as well.
Shreya:
Wait, could you do that again? I might have missed it.
Mike:
That's okay. Yeah.
So I'll do this. I'll do this. I'll send the message from the node project and we send and you hope I might have to pull it down. And here is the message right here.
Shreya: Awesome. Thank you so much. You'll see.
Mike:
So what's really cool about that? If you can pull my screen share back up.
Shreya:
Yes.
Mike:
I'll just show from here on. By the way, I'm just going to show my iOS device. I'm going to close out this and close a couple of these windows here for a second. But it does work on both iOS and Android Central via Firebase and Routed via Courier. And what's really cool about that is we now take all of that push notification token stuff that's really annoying to work with and we can solve date it all down to just one user ID.
So now if you have a user who's like pretend we're building Uber and have a user who's on iOS and a user who's on Android and they're the same user and you know that they use this user ID, you can send them a and courier will do all the magic of handling the push notification tokens just by sending it to one user.
It makes it super simple.
Shreya:
Sweet. Is there any configuration we need to do with this user ID within Courier before we added it in here?
Mike:
Yes. So there's just one thing that needs to happen and we've already done it. So Flutter is very similar in iOS andAndroid and the React Native SDK. You just need to sign in the user and that's it. So this function right here, when we say Courier shared sign in with an access token and a user ID that will create the user for that user ID in Courier and then store push notification tokens for them.
And I can actually show you this in here. And if I just create a simple user with example user and click save and close, I can go into this user and this is just the user inside of Courier. I can go to provider information and here all the push notification tokens that we have sent. So this one is probably the token for my iOS device.
So this phone right here, this Apple token is the same device.
Because we automatically sync that token and it's unknown because we didn't send to APNS we only sent to Firebase. So that's how we know that the Firebase funds are active. And this is my Android device. We don't know the device ID on Android because it's difficult for us to find. It varies based on the manufacturer of the device, but this is how you can see all the push notification tokens for that specific user.
Shreya:
Awesome.
Mike:
Cool. So let's jump into the node side of things and just to describe this out again to people. So pretend we're building stuff out. You got your mobile engineer who built out a very simple integration for push notifications. They've tested it and they're like sweet. Now we want to make sure that our back end is wired up to send out these notifications to our mobile app when some sort of events happen.
You know, somebody like your post, your delivery is a few minutes away, things like that. So what we're using here is the Courier Node SDK. I just have it configured super simply right here and I just have one function called test and I'll dig into these in a little bit and all we do is we just run NPM, run, send and I'm going to actually even switch this over a little bit and move this into here so you can see the message getting received on my device and I'm going to close this out over here.
Cool. Yeah. So you can see that getting sent out right there. We'll send another one just to be safe. And you can see I receive another and I'm receiving them on my Android device, too. But as mentioned, we're not going to we're not going to talk about that on anything.
We're just going.
To focus on. I was.
Cool.
So this is a super simple way to send a message. So this one is just a title and a body and we route it through Firebase FCM, Firebase Cloud Messaging. We're just pointing the message to same user ID. Now, this case is like fairly simple, but a more common use case that you'll probably have is this use. So we have basically the same functionality here, but we want to add some custom data to message so that the user can do something with that when they receive it in your app.
So example being someone liked your post, if you click on that notification, you probably want like if your user clicks on that notification, you probably want them to open that post, right? Like it would be really weird if it's like you posted on Instagram, somebody like your post and you just don't know. You click the notification to go to the post like, Yeah, you want to go to the post?
Yeah. So that's how you can set this up by adding a super simple override with in this case I just said example URL and we point this to docs.Courier, but you can have this as anything you want. You could say like something and you could pass like one, two, three, four. You can pass like true or false, like you can put whatever you want in this.
I'll just keep it as the URL for now and we'll make sure that we have no notifications on my screen and I'll send this out. And you can see I receive it here and probably going to have to rerun the app just to be sure here. Yeah, we're going to have to rerun it. That's okay. Again, this is the Flutter project being like ready for hot reload.
This is not a Courier thing.
Shreya:
Really quick question. What you did in the Node.js app with the URL with the PUT, will push notification automatically just linked to that or do you need to add example URL somewhere?
Mike:
Oh, good question. So basically just to like say it back to make sure I have it understood is how do you handle this in the app, Right.
Shreya:
Yeah.
Mike:
How do I, how do I make my app do something with example URL?
Shreya:
Exactly. Yeah.
Mike:
So I'll show you that. Now, of course, I have the app up and running here again. I will send a push to myself. You see, I receive the push and then if we look in the console here, this is in the Flutter app, people yelling in the hallway.
Shreya:
They just.
Really love the stream.
Mike:
So it's like, good job. We're getting good engagement.
Online and good engagement in person. So you can see the URL example URL is shown right here where the message is delivered. So what I can do from that then and I'm not going to write this all right now, but basically what I would write is something along the lines of push and then example URL and do something like that.
Probably not the proper syntax because it's complaining to me, Yeah, something like this. And then basically like you can do whatever you want from that. I can say like: if url.contains doc.courier.com go to Courier docs screen in my app.Might have to say this is a string. I don't remember the exact syntax, all this stuff, but something like contains like docs. Courier.com.
Then we could like go to the Courier box screen in my app, you know, things.
Like, that.
**Shreya: \ **okay, so that link in the Node.js app doesn't, it's not actually functioning as a link, it's just a variable. And then you can decide what you want to do depending on the value of that. Okay.
Mike:
Exactly. That's exactly right. Super common use case for people building apps. So just wanted to show how we support that. And then the next thing I'll show here and more powerful, cool things that Courier does is I'm going to show a template. So I have a template that I created here in my workspace, just super simple, not very exciting.
And I will now send make sure that everything's good here, send a message out and you can see that I received the template. So if you wanted to bundle these variables up and point them to this template ID, which we can see, this is the template ID right here. You can see this exact message here and to show you like a quick change, like, wow, this is a change, right?
Shreya:
Wow.
Mike:
And we will publish those changes. And now I can go back to my node app and notice I didn't have to change anything here and I can just send it out. And you can see, wow, this is a change.
Shreya:
Awesome. We are kind of like going over this part really quickly. But if you're interested in more about what the designer does and how to build out really fancy templates, we're going to be doing that in next week's stream. So same time next week, Thursday, 10 a.m. But for today we'll just sort of like focus more on the node.js app fired up and getting this automated.
Mike:
Yeah. So now I'm going to just build a quick automation then. So we've covered maybe to reiterate things a second. We've covered how to set up the Courier Mobile SDK to receive Firebase push notifications on your Flutter app, but also how to configure it for iOS and Android. We have a super simple Node.js app that allows you to send messages out to a specific user ID and how to add a variable to it or to use a template and so on.
And now we're going to show you how to set up an automation. I'm just going to use the schedule automation just to do things fairly quickly and we're going to do this with a cron. So I'm going to delete these here. We are going to do a schedule trigger. I believe this should send every minute.
And.
Next we're going to do next step. We're going to do send and let's just do yeah, we can do the template ID, but I think I'm just going to use this right here.
Shreya:
So the automation is basically a replacement of you setting up a whole part of your application that does the cron trigger yourself and just sort of like has a visual way of building that out.
Mike:
Correct. Yeah. So there's a visual way to do it. There are also APIs we have, if you want to try to build some of these automations via, but I'm going to.
Do it here.
Shreya: Depends on your preference.
Mike:
Exactly. I'm just going to do these here and I'm going to move this workspace over. I'm copying over basically the same exact JSON into here and we'll do content and title body.
Hello…Won't do any typos in it this time.
And what's up?
Mike: Will root this now. So we tell it what we want to row and courier routing syntax is fairly straightforward this method being single, just one we want to just send to the one channel.
Shreya:
Yeah. Also Mike is choosing to do this with JSON. He's choosing to sort of build that out in this way, but you could absolutely just use the designer the way it was before and just plug in your template. The reason he is not doing that is because he doesn't want to use a pre created template like design of a notification and he wants to actually write out what that notification is going to look like himself.
Mike:
Correct. Cool. And that's it. So every minute now, we should send out this message to this user ID and I'll go over to invoke and it should be good here, create the test event and we'll click and poke. And I received it already. Actually, I don't know if you can see this. Oh, I have it. So every minute I should see this.
Shreya:
So now we're just going to have to wait for like 60 seconds and see this.
Shreya:
Yeah.
Mike:
So that was quite a bit of information here. Do you think there's anything that I should cover? Did it make sense to you? Do does our audience have any questions about anything so far while we wait for 1121.
Shreya:
While we're waiting for the next 30 seconds? Let us yeah, let us know if you have any questions for now. Did it work? Oh, for now, I have a question, which is this is only working on the iOS app, right? We're not setting up the Android app right now.
Mike:
Actually, it works on the Android app as well. So. Okay, I recieved them over here also.
Shreya:
I actually I almost took the screenshot off, but then I realized we're still waiting for that.
Mike:
Okay. Yeah.
Mike:
Yeah. Not receiving it here. I might have to change my cron trigger here. Let's see if we can do every 2 minutes.
Shreya:
When you're building out an automation, this is just for anyone who is choosing to build on an automation. Invoking that automation basically just sort of brings it to life. Otherwise it's just sitting there. It doesn't mean that the notification is going to go off. That notification will only go off when your trigger is activated, essentially.
Mike:
Yes. Oh, yes. Well, then then we're working properly here.
Yeah.
Shreya:
So? So that was good. I just wanted to clarify because it kind of seemed like invoking it made that first notification come, but it was actually invoking it. And then the cron trigger kind of being like, Oh, I have been called and we got the second one, which is great.
Yep. It seems to be working nicely. If you just let it run for a little bit longer and.
Shreya:
Then for the next half an hour, we're just going to wait and every minute.
That's.
That's so the rest of the streamers, this is awesome.
Mike:
So probably, probably good to close the screen share out and and go through any comments or questions and answers and things, and I'll just let you know how things work here. But that's that's a little overview of how you can get into automating some of these things as well. There's there's a lot more to automations that we can break into and how to build them programmatically and things like that.
Probably a bit more than than we may have a lot of time for. But any questions about that? We're happy to answer those.
Shreya:
Absolutely. Yeah. Let us know if you want to kind of it's like see closer into any of the aspects of the project that we build out today. We don't. We covered quite a lot. We went through like three whole different aspects. We had the whole SDK set up, which took up the bulk of the time. But the good thing about it is now that we don't, we never have to touch that again and we can sort of just like focus on building out the application and I'd say spending an hour to set up something like that.
Is that better than spending like weeks and months trying to rebuild that whole thing from scratch, Right.
Yeah.
Mike:
And that's an hour to set up iOS, Android, Flutter and Node. Like, that's a lot of stuff that normally would take hours and hours and hours, if not days, if not even weeks for most people in their projects. And we've really, really simplified it down and we can even make it more simple. But we've done a lot of steps to reduce the complexity for mobile engineers and back end engineers.
Exactly. I'm going to put up the link to this actual code repo again, and then I'm also going to put up a link for a courier to sign up and just kind of get started with sending notifications. If this is your first time using Courier, please like don't worry about it. We're going to be having these like advances workshops every week and we're going to be focusing on a different aspect of our product every week.
So I guess that next week we're going to dive a little bit into the design element of it. We're going to we have a brand new feature that allows us to kind of create notifications with A.I., which is obviously a hot topic right now. I'm really excited about that. We're going to be bringing Tejas and Rodrigo, who are the engineers that actually built that out, just like we brought out Mike today.
And that's going to be fun. And the week after that, we're going to be talking a little bit about user customer data, user data, setting that up with Segment and how we saw data logs earlier. Mike was showing us how when those push notifications are sent out, courier tracks, right when these are sent and delivered and if they're not delivered, what went wrong?
All of that. And so we have a new feature that allows you to essentially take that data, plug it into a Segment, and then do whatever you want with it outside of courier as well. If you decide to have user event driven things happening in your application. So we've got a lot going on. If you go to Courier.com/event/workshops, we're going to send the link for that in the chat as well.
You can see all of the upcoming events And Mike, thank you much for spending an entire hour and a half building out those projects. You have been insanely helpful for all of us, especially for me. I have no idea what a lot of this is before starting and now I feel like I can build out a mobile application, which is really exciting.
But yeah. Do you have any last words, anything that you want to say?
Mike:
Well, thanks for having me on. I was excited to share what we've been building here. There's there's many more things that we have coming down the pipe. We're going to simplify quite a bit more of kind of the the back end to front end side of things for mobile engineers go even further. Yet there we have mobile inbox pieces in the pipeline.
So there's a lot of a lot more exciting things that we're doing to make making notification experiences much better for mobile engineers.
Shreya:
Absolutely. And we do want to make sure that this entire workshop series is getting out in front of the right people. So if you want to, you can go ahead and tweet about Decode, just tag the hashtag Decode and tryCourier and then we'll make sure to get some swag sent out to you as well. So thank you so much, everyone for joining and were commenting and supporting.
I hope you're able to build out the project and we will see you next week.
Mike:
Bye
Shreya:
bye.
Send up to 10,000 notifications every month, for free.
Get started for free
Send up to 10,000 notifications every month, for free.
Get started for free
© 2024 Courier. All rights reserved.