# 📣 Glide Push Notifications (2025 Tutorial)

**URL:** <https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936>\
**Category:** Community Resources\
**Tags:** push-notifications, tutorial\
**Created:** [July 4, 2025, 9:43am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936 "2025-07-04T09:43:43Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Loqode](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/loqode/32/50217_2.png) [@Loqode](https://community.glideapps.com/u/Loqode)\
**Post date:** [July 4, 2025, 9:43am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/1 "2025-07-04T09:43:43Z")

</div>

[![](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/0/1/012c198bcb4a4adcd8fda072e38df6acb3d663a8.jpeg "How To Add Push Notifications To Glide Apps Fast!") ](https://www.youtube.com/watch?v=0UnlDAmOlDM)

**What’s Up Gliders!**

In this video, I walk you through the process of setting up push notifications for your Glide App using OneSignal. We start by creating a free account on Netlify and uploading two essential files to spin up a “mini website”. Then, I guide you through configuring OneSignal, including creating a new app and customising the push prompt. Finally, I demonstrate how to set up the necessary columns in Glide to manage user notifications effectively.

There may be other (possibly better) methods, but this is a bare-bones illustration of how you can enable push notifications without too much hassle.

**Improvements:**  
If you wanted to make this more robust and offer a better UX, you can (for example) modify the code for the mini website so it sends a post request to Glide to automatically mark “Push Notifications/Enabled” as true, thus removing the need for them to click “Done”. There are, of course, many other tweaks you can make to improve this setup (like redirecting back to Glide after successfully enabling notifications, adding links to notifications, etc)… But the goal with this video was to show the underlying structure of how you can enable notifications without getting too far into the weeds!

**If you are on the Glide Free plan (or don’t have access to workflows/call api):**  
The only part of this tutorial that you’ll need a different method for is the triggering of the Push Notifications (Call API) and the “Open Link” workflow (as far as I know).

**There are several work-arounds:**

1. For the 2-step “Open Link” workflow, you can just have them open the link, enable notifications, then close the tab. The only reason we have the work flow is to conditionally change the interface based on their status, but ultimately, as long as they have clicked that button, opened the link, and enabled notifications… You should be good to go.
2. For the Call API workflow that actually triggers the notifications to send, you can try to use the native Glide “Send Email” action to send an email to a specific email address. To test this (it worked) I created an n8n scenario that watched my inbox for emails with a specific subject line, and when it found an email that matched it, it used code node extract the _heading_, _content_ and _emails_ from the email body, then used a HTTP node to send an API call to OneSignal, thus pushing the notification to your users. I’m sure there are other ways, perhaps some others from the community can find some work-arounds too!

Either way, below are the files you need for the mini website.

Enjoy! 🍿

🌐 𝗠𝗶𝗻𝗶 𝗪𝗲𝗯𝘀𝗶𝘁𝗲 𝗙𝗶𝗹𝗲𝘀 🌐

> **[Mini Website - Google Drive](https://drive.google.com/drive/folders/1BQRLZDVS1WzBYz8WfQKzeWPOIDBFRTBX?usp=sharing)**

📜 𝗖𝗼𝗱𝗲 𝗦𝗻𝗶𝗽𝗽𝗲𝘁𝘀 📜

> **[Loqode Masters](https://www.skool.com/loqode-masters/about)**
>
> 💰 Unlock life-changing wealth with low-code, automations & AI.

---

<div class="post-metadata">

**Author:** ![james](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/james/32/71213_2.png) [@james](https://community.glideapps.com/u/james)\
**Post date:** [July 4, 2025, 10:46am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/2 "2025-07-04T10:46:27Z")

</div>

Nice one!

Would this handle deeplinks that open to the relevant screen in the installed app (not in browser)?

---

<div class="post-metadata">

**Author:** ![Loqode](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/loqode/32/50217_2.png) [@Loqode](https://community.glideapps.com/u/Loqode)\
**Post date:** [July 4, 2025, 11:17am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/3 "2025-07-04T11:17:04Z")

</div>

Thank you!

As for deeplinks, I haven’t tested it out… But my gut says it _should_ be possible 🤔

Android is apparently more reliable in this regard, because it recognises that the URL is “owned” by the PWA (Glide App) and therefor routes it to the installed app (if it exists). IOS is a little less reliable (I think)… but it’s still worth testing!

Some related links:

- [Push notification - OneSignal](https://documentation.onesignal.com/reference/push-notification#body-url)
- [URLs, Links, and Deep Links - OneSignal](https://documentation.onesignal.com/docs/links)

---

<div class="post-metadata">

**Author:** ![Laurence\_Schuberth](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/laurence_schuberth/32/65729_2.png) [@Laurence\_Schuberth](https://community.glideapps.com/u/Laurence_Schuberth)\
**Post date:** [July 22, 2025, 8:19am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/4 "2025-07-22T08:19:21Z")

</div>

Thank you Soooooo much for this. I’m a Genuine noob, but Notifications are so important to my MVP, I followed your tute to the letter, and I’ve gone over the code 100 times. But I just cant get this to work. The differences that I have found is… when I click Enable, it brings up the netify site with the enable button, but if I click on my iPhone (latest phone and software) nothing happens, If I do on a desktop it subscribes but I don’t get a “done” or any indication to close the window it just says (see att) Onesignal confirms it has a new user but, I don’t see an indication of my email address. When I then test the push, all works from Glide end, but I don’t see any way in OneSignal to indicate if any data had been received; it just has a new user and that’s about it, it sends no data out again to that user.I know this is needle in a heystack but anything I should look for I might not have done?

 ![Screenshot 2025-07-22 at 6.14.01 pm](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/0/4/043e0712eced225d8aba55f6711b24749a388fb4.png)

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [October 13, 2025, 12:34am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/5 "2025-10-13T00:34:43Z")

</div>

Hey!

If you want to use backend workflows, you won’t be able to use the JavaScript column. Here the changes to make it works without JavaScript:

1. Change the joined list column separator: `”, “`  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/3/b/3becd53fdae622c183d7d296f2956c03ac841a58.png)
2. Instead of the JS column, create a template column and set the template to : `["elements"]` then replace elements with the emails columns:  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/e/6/e6d50162d99c954a71ea3495e6368ead8568887c.png)

Result for more than 1 email:  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/9/0/902d69ddc50bd805fded217b8ec5c7dff587f458.png)

For one email only:

 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/0/7/07b216b8c94b8210d735948699f464e1060b402c.png)

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [October 14, 2025, 3:25pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/6 "2025-10-14T15:25:10Z")

</div>

This is reply for another post that concerns this actual thread.

> [@speech\_balloon Push Notifications — Any reliable workaround since Glide removed native support?](https://community.glideapps.com/t/push-notifications-any-reliable-workaround-since-glide-removed-native-support/84842/7):
>
> Hey, thank you so much, my clients are absolutely desperate for some kind of notifications as most other app builders offer that feature, but I am Glide through and through because I think it’s the best so I’m stuck

@Laurence_Schuberth

Ok, first thing, I found out that by adding “Included\_segments”, the call doesn’t fail anymore.

```json
{
  "app_id": "appid",
  "target_channel": "push",
  "headings": {
    "en": "{{header}}"
  },
  "contents": {
    "en": "{{contents}}"
  },
  "included_segments": ["All"],
  "includes_aliases": {
    "external_id": {{emails}}
  }
}

```

Secondly, OneSignal doesn’t allow you to setup external ID anymore from the client. You need to use the API to do so. But I found a workaround.  
In the index.html file of the netlify app, replace the addAlias line:

```js
//OneSignal.User.addAlias("external_id", externalID);
OneSignal.User.addAlias("user_id", externalID);

```

By doing this, you will still be able to interact with the _[View user](https://documentation.onesignal.com/reference/view-user)_ API route from OneSignal by refering the alias label as user\_id:

```auto
https://api.onesignal.com/apps/{app_id}/users/by/{alias_label}/{alias_id}
Replace {app_id} by the app id of OneSignal
Replace {alias_label} by "user_id"
Replace {alias_id} by the email.

```

And good news, It also works with includes\_aliases! So you can replace the code for the call API with this one:

```json
{
  "app_id": "appid",
  "target_channel": "push",
  "headings": {
    "en": "{{header}}"
  },
  "contents": {
    "en": "{{contents}}"
  },
  "included_segments": ["All"],
  "includes_aliases": {
    "user_id": {{emails}} // <=== "external_id" replaced with "user_id"
  }
}

```

It is now working perfectly fine for me!

Don’t hesitate to ping me if you need further help!

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [October 15, 2025, 2:26am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/7 "2025-10-15T02:26:06Z")

</div>

Update: @Laurence_Schuberth  
I am a bit suprised, but I somehow add external Id on user creation with OneSignal.login(externalID) from the netlify app.

Here is my working index.html:

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script
      src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js"
      defer
    ></script>
    <script>
      window.OneSignalDeferred = window.OneSignalDeferred || [];
      OneSignalDeferred.push(async function (OneSignal) {
        const urlParams = new URLSearchParams(window.location.search);
        const appId = urlParams.get("appId");
        const externalID = urlParams.get("externalID");
        await OneSignal.init({
          appId: appId,
        });

        await OneSignal.login(externalID);
        console.log(OneSignal.User.onesignalId);

        OneSignal.User.PushSubscription.addEventListener("change", (event) => {
          if (event.current.optedIn) {
            if (externalID) {
                document.getElementById("success-display").textContent =
                "Done! You can now close this page.";
              document.getElementById("success-display").style.display =
                "block";

              document.querySelector(
                ".onesignal-customlink-container"
              ).style.display = "none";
            }
          }
        });
      });
    </script>
  </head>
  <body>
    <div class="onesignal-customlink-container"></div>

    <div
      id="success-display"
      style="
        display: none;
        margin-top: 20px;
        padding: 10px;
        background: #e8f5e8;
        border: 1px solid #4caf50;
        border-radius: 4px;
      "
    ></div>
  </body>
</html>

```

By the way, in the OneSignal Site Setup, enable the auto resubscribe.  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/7/d/7d19c3625249eb34dc0a834a4c72ef5d18e9407a.png)

---

<div class="post-metadata">

**Author:** ![Laurence\_Schuberth](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/laurence_schuberth/32/65729_2.png) [@Laurence\_Schuberth](https://community.glideapps.com/u/Laurence_Schuberth)\
**Post date:** [October 15, 2025, 7:26pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/8 "2025-10-15T19:26:28Z")

</div>

@MaximeBaker OMG thank you so much for this. My coding is not my strong point, but I’ll dive in and see how I go, knowing that someone like you now has a working model is fantastic cause you’ve proved it works, so it’s just up to me to get it right. I’ll report back on my efforts. Thank you again so much 🙂

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [October 15, 2025, 7:27pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/9 "2025-10-15T19:27:55Z")

</div>

Wow congrats! Thank you so much!

Ping me anytime!

---

<div class="post-metadata">

**Author:** ![RISHTACORNER](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/rishtacorner/32/56211_2.png) [@RISHTACORNER](https://community.glideapps.com/u/RISHTACORNER)\
**Post date:** [October 27, 2025, 4:48am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/10 "2025-10-27T04:48:34Z")

</div>

Hello mate. I am really struggling with trying to get the link to open to show the subscribte push notification - it seems to just give me a blank screen. Am I missing something? Thanks 🙂

---

<div class="post-metadata">

**Author:** ![Eitan](https://avatars.discourse-cdn.com/v4/letter/e/aca169/32.png) [@Eitan](https://community.glideapps.com/u/Eitan)\
**Post date:** [October 28, 2025, 5:14am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/11 "2025-10-28T05:14:13Z")

</div>

Yep also experiencing a blank screen when I open the link hmm!

---

<div class="post-metadata">

**Author:** ![Eitan](https://avatars.discourse-cdn.com/v4/letter/e/aca169/32.png) [@Eitan](https://community.glideapps.com/u/Eitan)\
**Post date:** [October 28, 2025, 5:37am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/12 "2025-10-28T05:37:27Z")

</div>

Ok actually got that part working just make sure you use this for the template column, I had copy and pasted some weird values before.

`{{url}}?appId={{appId}}&externalID={{externalID}}`

EDIT: Has anyone managed to get this working on iOS without needing to add the netlify app to the Home Screen?

---

<div class="post-metadata">

**Author:** ![MJolley](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/mjolley/32/85220_2.png) [@MJolley](https://community.glideapps.com/u/MJolley)\
**Post date:** [January 14, 2026, 11:56pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/13 "2026-01-14T23:56:42Z")

</div>

I’m trying to recreate what you have here but running into some issue. Could you break down specifically what you put in each piece (the Glide table, the HTML file, etc)?

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [January 15, 2026, 3:48am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/14 "2026-01-15T03:48:15Z")

</div>

Yes sure! What are your issues? Show me what you have so far.

---

<div class="post-metadata">

**Author:** ![MJolley](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/mjolley/32/85220_2.png) [@MJolley](https://community.glideapps.com/u/MJolley)\
**Post date:** [January 15, 2026, 12:31pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/15 "2026-01-15T12:31:32Z")

</div>

I’m using a Webhook on the paid Explorer plan. Here’s the HTML file hosted on Netlify:

```auto
<!DOCTYPE html>

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script
      src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js"
      defer
    ></script>
    <script>
      window.OneSignalDeferred = window.OneSignalDeferred || [];
      OneSignalDeferred.push(async function (OneSignal) {
        const urlParams = new URLSearchParams(window.location.search);
        const appId = urlParams.get("appId");
        const externalID = urlParams.get("externalID");
        await OneSignal.init({
          appId: appId,
        });

    await OneSignal.login(externalID);
    console.log(OneSignal.User.onesignalId);

    OneSignal.User.PushSubscription.addEventListener("change", (event) => {
      if (event.current.optedIn) {
        if (externalID) {
            document.getElementById("success-display").textContent =
            "Done! You can now close this page.";
          document.getElementById("success-display").style.display =
            "block";

          document.querySelector(
            ".onesignal-customlink-container"
          ).style.display = "none";
        }
      }
    });
  });
</script>

</head>
  <body>
    <div class="onesignal-customlink-container"></div>

<div
  id="success-display"
  style="
    display: none;
    margin-top: 20px;
    padding: 10px;
    background: #e8f5e8;
    border: 1px solid #4caf50;
    border-radius: 4px;
  "
></div>

</body>
</html>

```

Here’s the Template text in the Glide table (I got it from OneSignal’s tool to create demo code):

`curl --request POST `  
`–url ‘``https://api.onesignal.com/notifications?c=push``’ `  
`–header ‘Authorization: {{key_id}}’ `  
`–header ‘Content-Type: application/json’ `  
`–data ’`  
`{`  
`“app_id”: “{{app_id}}”,`  
`“target_channel”: “push”,`  
`“headings”: {`  
`“en”: “{{header}}”`  
`},`  
`“contents”: {`  
`“en”: “{{contents}}”`  
`},`  
`“included_segments”: [“All”],`  
`“includes_aliases”: {`  
`“external_id”: {{emails}}`  
`}`  
`}`

Then in the Glide Layout editor, I have a form with a submit button that sends a Webhook to [https://onesignal.com/api/v1/notifications](https://onesignal.com/api/v1/notifications) using the code above as the body text, with a text field that the use can enter an announcement into for the push notification as the {{contents}}.

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [January 15, 2026, 4:16pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/16 "2026-01-15T16:16:04Z")

</div>

You would need to use the **Call API** endpoint for this, since authorization must be configured in the request sent to OneSignal. Unfortunately, the **Explorer** plan does not allow access to the Call API action.

I agree that an **Explorer** plan that doesn’t allow you to fully **explore** the features, albeit with some limitations, is disappointing.

You could consider activating a **Business plan trial** to evaluate whether Glide meets your needs.

---

<div class="post-metadata">

**Author:** ![MJolley](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/mjolley/32/85220_2.png) [@MJolley](https://community.glideapps.com/u/MJolley)\
**Post date:** [January 15, 2026, 4:38pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/17 "2026-01-15T16:38:33Z")

</div>

Ahh that explains it then. I wasn’t sure if there was a way around the issue without having the Business plan.

Would a Zapier integration do the trick?

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [January 16, 2026, 10:54am UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/18 "2026-01-16T10:54:46Z")

</div>

You can try, I am not sure if it is available in the explorer plan.

---

<div class="post-metadata">

**Author:** ![Mikaeldorval](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/mikaeldorval/32/67405_2.png) [@Mikaeldorval](https://community.glideapps.com/u/Mikaeldorval)\
**Post date:** [February 4, 2026, 5:50pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/19 "2026-02-04T17:50:42Z")

</div>

Anyone got this working for iOS?

---

<div class="post-metadata">

**Author:** ![MaximeBaker](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/maximebaker/32/80877_2.png) [@MaximeBaker](https://community.glideapps.com/u/MaximeBaker)\
**Post date:** [February 4, 2026, 11:57pm UTC](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936/20 "2026-02-04T23:57:44Z")

</div>

Yes using the OneSignal Approach.

[Next page](https://community.glideapps.com/t/glide-push-notifications-2025-tutorial/82936.md?page=2)
