diff --git a/src/hub.js b/src/hub.js
index 384564031ed4237f6ebdb54e8e43d0c99d54a283..84a0e496f188b4976c439147fa7397f210f0297d 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -500,7 +500,10 @@ document.addEventListener("DOMContentLoaded", async () => {
   retPhxChannel
     .join()
     .receive("ok", async data => subscriptions.setVapidPublicKey(data.vapid_public_key))
-    .receive("error", res => console.error(res));
+    .receive("error", res => {
+      subscriptions.setVapidPublicKey(null);
+      console.error(res);
+    });
 
   linkChannel.setSocket(socket);
 });
diff --git a/src/subscriptions.js b/src/subscriptions.js
index bdf5765ef13c9ee6096eb0812798283a22176af5..a5d9fc8afab5ad7b81fdeaf54fc9ecd90bab17f2 100644
--- a/src/subscriptions.js
+++ b/src/subscriptions.js
@@ -50,6 +50,10 @@ export default class Subscriptions {
     // registration becomes null if failed, non null if registered
     while (this.registration === undefined) await nextTick();
     if (!this.registration || !this.registration.pushManager) return null;
+
+    while (this.vapidPublicKey === undefined) await nextTick();
+    if (this.vapidPublicKey === null) return null;
+
     try {
       const convertedVapidKey = urlBase64ToUint8Array(this.vapidPublicKey);