diff --git a/addon/webextension/background/main.js b/addon/webextension/background/main.js
index a54a1d1e0c..07e996271f 100644
--- a/addon/webextension/background/main.js
+++ b/addon/webextension/background/main.js
@@ -11,11 +11,9 @@ this.main = (function() {
   const manifest = browser.runtime.getManifest();
   let backend;
 
-  let hasSeenOnboarding;
-
-  browser.storage.local.get(["hasSeenOnboarding"]).then((result) => {
-    hasSeenOnboarding = !!result.hasSeenOnboarding;
-    if (!hasSeenOnboarding) {
+  let hasSeenOnboarding = browser.storage.local.get(["hasSeenOnboarding"]).then((result) => {
+    const onboarded = !!result.hasSeenOnboarding;
+    if (!onboarded) {
       setIconActive(false, null);
       // Note that the branded name 'Firefox Screenshots' is not localized:
       startBackground.photonPageActionPort.postMessage({
@@ -23,6 +21,8 @@ this.main = (function() {
         title: "Firefox Screenshots"
       });
     }
+    hasSeenOnboarding = Promise.resolve(onboarded);
+    return hasSeenOnboarding;
   }).catch((error) => {
     log.error("Error getting hasSeenOnboarding:", error);
   });
@@ -93,34 +93,36 @@ this.main = (function() {
 
   // This is called by startBackground.js, directly in response to clicks on the Photon page action
   exports.onClicked = catcher.watchFunction((tab) => {
-    if (shouldOpenMyShots(tab.url)) {
-      if (!hasSeenOnboarding) {
+    catcher.watchPromise(hasSeenOnboarding.then(onboarded => {
+      if (shouldOpenMyShots(tab.url)) {
+        if (!onboarded) {
+          catcher.watchPromise(analytics.refreshTelemetryPref().then(() => {
+            sendEvent("goto-onboarding", "selection-button", {incognito: tab.incognito});
+            return forceOnboarding();
+          }));
+          return;
+        }
         catcher.watchPromise(analytics.refreshTelemetryPref().then(() => {
-          sendEvent("goto-onboarding", "selection-button", {incognito: tab.incognito});
-          return forceOnboarding();
+          sendEvent("goto-myshots", "about-newtab", {incognito: tab.incognito});
         }));
-        return;
+        catcher.watchPromise(
+          auth.authHeaders()
+          .then(() => browser.tabs.update({url: backend + "/shots"})));
+      } else {
+        catcher.watchPromise(
+          toggleSelector(tab)
+            .then(active => {
+              const event = active ? "start-shot" : "cancel-shot";
+              sendEvent(event, "toolbar-button", {incognito: tab.incognito});
+            }, (error) => {
+              if ((!onboarded) && error.popupMessage === "UNSHOOTABLE_PAGE") {
+                sendEvent("goto-onboarding", "selection-button", {incognito: tab.incognito});
+                return forceOnboarding();
+              }
+              throw error;
+            }));
       }
-      catcher.watchPromise(analytics.refreshTelemetryPref().then(() => {
-        sendEvent("goto-myshots", "about-newtab", {incognito: tab.incognito});
-      }));
-      catcher.watchPromise(
-        auth.authHeaders()
-        .then(() => browser.tabs.update({url: backend + "/shots"})));
-    } else {
-      catcher.watchPromise(
-        toggleSelector(tab)
-          .then(active => {
-            const event = active ? "start-shot" : "cancel-shot";
-            sendEvent(event, "toolbar-button", {incognito: tab.incognito});
-          }, (error) => {
-            if ((!hasSeenOnboarding) && error.popupMessage === "UNSHOOTABLE_PAGE") {
-              sendEvent("goto-onboarding", "selection-button", {incognito: tab.incognito});
-              return forceOnboarding();
-            }
-            throw error;
-          }));
-    }
+    }));
   });
 
   function forceOnboarding() {
@@ -273,8 +275,8 @@ this.main = (function() {
   });
 
   communication.register("hasSeenOnboarding", () => {
-    hasSeenOnboarding = true;
-    catcher.watchPromise(browser.storage.local.set({hasSeenOnboarding}));
+    hasSeenOnboarding = Promise.resolve(true);
+    catcher.watchPromise(browser.storage.local.set({hasSeenOnboarding: true}));
     setIconActive(false, null);
     startBackground.photonPageActionPort.postMessage({
       type: "setProperties",
diff --git a/addon/webextension/background/selectorLoader.js b/addon/webextension/background/selectorLoader.js
index 6978b4ad19..49faf97826 100644
--- a/addon/webextension/background/selectorLoader.js
+++ b/addon/webextension/background/selectorLoader.js
@@ -66,24 +66,26 @@ this.selectorLoader = (function() {
   const loadingTabs = new Set();
 
   exports.loadModules = function(tabId, hasSeenOnboarding) {
-    loadingTabs.add(tabId);
-    let promise = downloadOnlyCheck(tabId);
-    if (hasSeenOnboarding) {
-      promise = promise.then(() => {
-        return executeModules(tabId, standardScripts.concat(selectorScripts));
-      });
-    } else {
-      promise = promise.then(() => {
-        return executeModules(tabId, standardScripts.concat(onboardingScripts).concat(selectorScripts));
+    catcher.watchPromise(hasSeenOnboarding.then(onboarded => {
+      loadingTabs.add(tabId);
+      let promise = downloadOnlyCheck(tabId);
+      if (onboarded) {
+        promise = promise.then(() => {
+          return executeModules(tabId, standardScripts.concat(selectorScripts));
+        });
+      } else {
+        promise = promise.then(() => {
+          return executeModules(tabId, standardScripts.concat(onboardingScripts).concat(selectorScripts));
+        });
+      }
+      return promise.then((result) => {
+        loadingTabs.delete(tabId);
+        return result;
+      }, (error) => {
+        loadingTabs.delete(tabId);
+        throw error;
       });
-    }
-    return promise.then((result) => {
-      loadingTabs.delete(tabId);
-      return result;
-    }, (error) => {
-      loadingTabs.delete(tabId);
-      throw error;
-    });
+    }));
   };
 
   // TODO: since bootstrap communication is now required, would this function