diff --git a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx
index cb33597e0ffa58b365d69f2ff3c9030c64682913..b4b1e6b5d0cb0def828bd806b033dd9a63bd0797 100644
--- a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx
+++ b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx
@@ -394,6 +394,10 @@ export function BudgetSummary({
                         name: 'set-3-avg',
                         text: 'Set budgets to 3 month avg',
                       },
+                      isGoalTemplatesEnabled && {
+                        name: 'check-templates',
+                        text: 'Check templates',
+                      },
                       isGoalTemplatesEnabled && {
                         name: 'apply-goal-template',
                         text: 'Apply budget template',
diff --git a/packages/loot-core/src/client/actions/queries.ts b/packages/loot-core/src/client/actions/queries.ts
index 3308684a27e6aa7b590da5f1269757dc19fb935f..3dc59dc5ea385a101fc20163484904d04a382b3f 100644
--- a/packages/loot-core/src/client/actions/queries.ts
+++ b/packages/loot-core/src/client/actions/queries.ts
@@ -25,6 +25,9 @@ export function applyBudgetAction(month, type, args) {
       case 'set-3-avg':
         await send('budget/set-3month-avg', { month });
         break;
+      case 'check-templates':
+        dispatch(addNotification(await send('budget/check-templates')));
+        break;
       case 'apply-goal-template':
         dispatch(
           addNotification(await send('budget/apply-goal-template', { month })),
diff --git a/packages/loot-core/src/server/budget/app.ts b/packages/loot-core/src/server/budget/app.ts
index a501281eed0b2f8bd196fa360a85184a17300f2e..6360e2a6d0bfc6c4f8e9373765aa39c27bd36f5e 100644
--- a/packages/loot-core/src/server/budget/app.ts
+++ b/packages/loot-core/src/server/budget/app.ts
@@ -15,6 +15,10 @@ app.method(
 );
 app.method('budget/set-zero', mutator(undoable(actions.setZero)));
 app.method('budget/set-3month-avg', mutator(undoable(actions.set3MonthAvg)));
+app.method(
+  'budget/check-templates',
+  mutator(undoable(goalActions.runCheckTemplates)),
+);
 app.method(
   'budget/apply-goal-template',
   mutator(undoable(goalActions.applyTemplate)),
diff --git a/packages/loot-core/src/server/budget/goaltemplates.ts b/packages/loot-core/src/server/budget/goaltemplates.ts
index 94a1e4b1a4739eec5bc6dc04f25ab47bdcdc4aaa..e1eb10cd518320ae77338effc7dc160505c0761d 100644
--- a/packages/loot-core/src/server/budget/goaltemplates.ts
+++ b/packages/loot-core/src/server/budget/goaltemplates.ts
@@ -26,6 +26,10 @@ export function overwriteTemplate({ month }) {
   return processTemplate(month, true);
 }
 
+export function runCheckTemplates() {
+  return checkTemplates();
+}
+
 function checkScheduleTemplates(template) {
   let lowPriority = template[0].priority;
   let errorNotice = false;
@@ -211,9 +215,7 @@ async function processTemplate(month, force) {
       return { type: 'message', message: 'All categories were up to date.' };
     }
   } else {
-    let applied = `Successfully applied templates to ${num_applied} ${
-      num_applied === 1 ? 'category' : 'categories'
-    }.`;
+    let applied = `Successfully applied ${num_applied} templates.`;
     if (errors.length) {
       return {
         sticky: true,
@@ -617,3 +619,38 @@ async function applyCategoryTemplate(
     return { amount: to_budget, errors };
   }
 }
+
+async function checkTemplates() {
+  let category_templates = await getCategoryTemplates();
+  let errors = [];
+
+  let categories = await db.all(
+    'SELECT * FROM v_categories WHERE tombstone = 0',
+  );
+
+  // run through each line and see if its an error
+  for (let c = 0; c < categories.length; c++) {
+    let category = categories[c];
+    let template = category_templates[category.id];
+    if (template) {
+      for (let l = 0; l < template.length; l++) {
+        if (template[l].type === 'error') {
+          //return { type: 'message', message: "found a bad one",};
+          errors.push(category.name + ': ' + template[l].line);
+        }
+      }
+    }
+  }
+  if (errors.length) {
+    return {
+      sticky: true,
+      message: `There were errors interpreting some templates:`,
+      pre: errors.join('\n\n'),
+    };
+  } else {
+    return {
+      type: 'message',
+      message: 'All templates passed! 🎉',
+    };
+  }
+}
diff --git a/packages/loot-core/src/server/budget/types/handlers.d.ts b/packages/loot-core/src/server/budget/types/handlers.d.ts
index eb251efbd897e65c10916535eb5535c8d2247dd6..bca907c64b07f9f47e361870b0b6522b83ce1923 100644
--- a/packages/loot-core/src/server/budget/types/handlers.d.ts
+++ b/packages/loot-core/src/server/budget/types/handlers.d.ts
@@ -7,6 +7,8 @@ export interface BudgetHandlers {
 
   'budget/set-3month-avg': (...args: unknown[]) => Promise<unknown>;
 
+  'budget/check-templates': (...args: unknown[]) => Promise<unknown>;
+
   'budget/apply-goal-template': (...args: unknown[]) => Promise<unknown>;
 
   'budget/overwrite-goal-template': (...args: unknown[]) => Promise<unknown>;
diff --git a/upcoming-release-notes/1108.md b/upcoming-release-notes/1108.md
new file mode 100644
index 0000000000000000000000000000000000000000..6c27745698bef06dd9e40ffc63782b64381e0e50
--- /dev/null
+++ b/upcoming-release-notes/1108.md
@@ -0,0 +1,6 @@
+---
+category: Enhancements
+authors: [youncw]
+---
+
+Add action in month drop down to check template lines for proper formatting