diff --git a/packages/loot-core/src/server/budget/goaltemplates.js b/packages/loot-core/src/server/budget/goaltemplates.js
index 90ce80aa1283dff2e516262548a1025cd868e5aa..8d490e87792b4a6ae3f93cb3d05da8e4bce91b99 100644
--- a/packages/loot-core/src/server/budget/goaltemplates.js
+++ b/packages/loot-core/src/server/budget/goaltemplates.js
@@ -54,16 +54,17 @@ async function processTemplate(month, force) {
               ].join('\n'),
             ),
         );
-        let to_budget = await applyCategoryTemplate(
-          category,
-          template,
-          month,
-          force,
-        );
+        let { amount: to_budget, errors: applyErrors } =
+          await applyCategoryTemplate(category, template, month, force);
         if (to_budget != null) {
           num_applied++;
           await setBudget({ category: category.id, month, amount: to_budget });
         }
+        if (applyErrors != null) {
+          errors = errors.concat(
+            applyErrors.map(error => `${category.name}: ${error}`),
+          );
+        }
       }
     }
   }
@@ -129,6 +130,7 @@ async function getCategoryTemplates() {
 
 async function applyCategoryTemplate(category, template_lines, month, force) {
   let current_month = new Date(`${month}-01`);
+  let errors = [];
 
   // remove lines for past dates, calculate repeating dates
   template_lines = template_lines.filter(template => {
@@ -156,12 +158,8 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
           num_months = differenceInCalendarMonths(target_month, current_month);
         }
         if (num_months < 0) {
-          console.log(
-            `${category.name}: ${`${template.month} is in the past:`} ${
-              template.line
-            }`,
-          );
-          return null;
+          errors.push(`${template.month} is in the past.`);
+          return false;
         }
         template.month = format(target_month, 'yyyy-MM');
         if (spend_from) {
@@ -170,7 +168,7 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
         break;
       default:
     }
-    return template;
+    return true;
   });
 
   if (template_lines.length > 1) {
@@ -200,10 +198,8 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
         // simple has 'monthly' and/or 'limit' params
         if (template.limit != null) {
           if (limit != null) {
-            console.log(
-              `${category.name}: More than one “up to” limit found. ${template.line}`,
-            );
-            return null;
+            errors.push(`More than one “up to” limit found.`);
+            return { errors };
           } else {
             limit = amountToInteger(template.limit);
           }
@@ -244,10 +240,8 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
         let weeks = template.weeks != null ? Math.round(template.weeks) : 1;
         if (template.limit != null) {
           if (limit != null) {
-            console.log(
-              `${category.name}: More than one “up to” limit found. ${template.line}`,
-            );
-            return null;
+            errors.push(`More than one “up to” limit found.`);
+            return { errors };
           } else {
             limit = amountToInteger(template.limit);
           }
@@ -299,12 +293,8 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
         let num_months = differenceInCalendarMonths(to_month, current_month);
         let target = amountToInteger(template.amount);
         if (num_months < 0) {
-          console.log(
-            `${category.name}: ${`${template.to} is in the past:`} ${
-              template.line
-            }`,
-          );
-          return null;
+          errors.push(`${template.month} is in the past.`);
+          return { errors };
         } else if (num_months === 0) {
           to_budget = target - already_budgeted;
         } else {
@@ -331,7 +321,7 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
         break;
       }
       case 'error':
-        return null;
+        return { errors };
       default:
     }
   }
@@ -347,7 +337,7 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
       to_budget === 0) &&
     !force
   ) {
-    return null;
+    return { errors };
   } else if (category.budgeted === to_budget && force) {
     return null;
   } else {
@@ -359,6 +349,6 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
       integerToAmount(last_month_balance + to_budget);
     str += ' ' + template_lines.map(x => x.line).join('\n');
     console.log(str);
-    return to_budget;
+    return { amount: to_budget };
   }
 }
diff --git a/upcoming-release-notes/895.md b/upcoming-release-notes/895.md
new file mode 100644
index 0000000000000000000000000000000000000000..c807b4c03ba63a24fd5de879988a2f9c6981f679
--- /dev/null
+++ b/upcoming-release-notes/895.md
@@ -0,0 +1,6 @@
+---
+category: Enhancements
+authors: [shall0pass]
+---
+
+Improve error reporting for goal templates