diff --git a/buildstream/_frontend/app.py b/buildstream/_frontend/app.py
index 5c13bf0bfce6e178969222df96257950dcab5fdb..1550fbcb3199c249f41e80270d5f4eb73cd48271 100644
--- a/buildstream/_frontend/app.py
+++ b/buildstream/_frontend/app.py
@@ -269,6 +269,9 @@ class App():
                 else:
                     self._message(MessageType.FAIL, session_name, elapsed=elapsed)
 
+                    # Notify session failure
+                    self._notify("{} failed".format(session_name), "{}".format(e))
+
                 if self._started:
                     self._print_summary()
 
@@ -286,6 +289,9 @@ class App():
                 if self._started:
                     self._print_summary()
 
+                # Notify session success
+                self._notify("{} succeeded".format(session_name), "")
+
     # init_project()
     #
     # Initialize a new BuildStream project, either with the explicitly passed options,
@@ -419,6 +425,12 @@ class App():
     #                      Local Functions                     #
     ############################################################
 
+    # Local function for calling the notify() virtual method
+    #
+    def _notify(self, title, text):
+        if self.interactive:
+            self.notify(title, text)
+
     # Local message propagator
     #
     def _message(self, message_type, message, **kwargs):
@@ -571,8 +583,8 @@ class App():
             while choice not in ['continue', 'quit', 'terminate', 'retry']:
                 click.echo(summary, err=True)
 
-                self.notify("BuildStream failure", "{} on element {}"
-                            .format(failure.action_name, element.name))
+                self._notify("BuildStream failure", "{} on element {}"
+                             .format(failure.action_name, element.name))
 
                 try:
                     choice = click.prompt("Choice:", default='continue', err=True,