diff --git a/src/extension.ts b/src/extension.ts
index ee64e53c31..167e77e3f5 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -61,7 +61,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
   }
 
   const manifest = context.extension.packageJSON;
-  reporter = new TelemetryReporter(context.extension.id, manifest.version, manifest.appInsightsKey);
+  reporter = new TelemetryReporter(manifest.appInsightsKey);
   context.subscriptions.push(reporter);
 
   // always register commands needed to control terraform-ls
@@ -102,7 +102,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
     initializationFailedHandler: (error: ResponseError<InitializeError> | Error) => {
       initializationError = error;
 
-      reporter.sendTelemetryException(error);
+      reporter.sendTelemetryErrorEvent('initializationError', {
+        message: error.message,
+        stack: error.stack,
+        code: error instanceof ResponseError ? error.code.toString() : undefined,
+      });
 
       let msg = 'Failure to start terraform-ls. Please check your configuration settings and reload this window';
 
@@ -235,12 +239,17 @@ export async function deactivate(): Promise<void> {
   } catch (error) {
     if (error instanceof Error) {
       outputChannel.appendLine(error.message);
-      reporter.sendTelemetryException(error);
+      reporter.sendTelemetryErrorEvent('deactivate', {
+        message: error.message,
+        stack: error.stack,
+      });
       vscode.window.showErrorMessage(error.message);
       lsStatus.setLanguageServerState(error.message, false, vscode.LanguageStatusSeverity.Error);
     } else if (typeof error === 'string') {
       outputChannel.appendLine(error);
-      reporter.sendTelemetryException(new Error(error));
+      reporter.sendTelemetryErrorEvent('deactivate', {
+        message: error,
+      });
       vscode.window.showErrorMessage(error);
       lsStatus.setLanguageServerState(error, false, vscode.LanguageStatusSeverity.Error);
     }
diff --git a/src/features/telemetry.ts b/src/features/telemetry.ts
index 02197a42cd..57f44892e4 100644
--- a/src/features/telemetry.ts
+++ b/src/features/telemetry.ts
@@ -52,7 +52,11 @@ export class TelemetryFeature implements StaticFeature {
           return;
         }
 
-        this.reporter.sendRawTelemetryEvent(event.name, event.properties);
+        const thing: Record<string, string> = {};
+        for (const [key, value] of Object.entries(event.properties)) {
+          thing[key] = String(value);
+        }
+        this.reporter.sendRawTelemetryEvent(event.name, thing);
       }),
     );
   }
diff --git a/src/providers/tfc/applyProvider.ts b/src/providers/tfc/applyProvider.ts
index 8d5a7019dd..8d54729d1f 100644
--- a/src/providers/tfc/applyProvider.ts
+++ b/src/providers/tfc/applyProvider.ts
@@ -164,7 +164,10 @@ export class ApplyTreeDataProvider implements vscode.TreeDataProvider<vscode.Tre
       if (error instanceof Error) {
         message += error.message;
         vscode.window.showErrorMessage(message);
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('applyLogError', {
+          message: message,
+          stack: error.stack,
+        });
         return;
       }
 
diff --git a/src/providers/tfc/authenticationProvider.ts b/src/providers/tfc/authenticationProvider.ts
index a17b24e274..eeaaef1e11 100644
--- a/src/providers/tfc/authenticationProvider.ts
+++ b/src/providers/tfc/authenticationProvider.ts
@@ -93,10 +93,16 @@ class TerraformCloudSessionHandler {
         if ((error.response.status as number) === 401) {
           throw new InvalidToken();
         }
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('storeSession', {
+          message: error.message,
+          stack: error.stack,
+        });
         throw new Error(`Failed to login: ${apiErrorsToString(error.response.data.errors)}`);
       } else if (error instanceof Error) {
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('storeSession', {
+          message: error.message,
+          stack: error.stack,
+        });
       }
 
       throw error;
@@ -243,11 +249,16 @@ export class TerraformCloudAuthenticationProvider implements vscode.Authenticati
         return this.createSession(_scopes);
       } else if (error instanceof Error) {
         vscode.window.showErrorMessage(error.message);
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('invalidHCPToken', {
+          message: error.message,
+          stack: error.stack,
+        });
         this.logger.error(error.message);
       } else if (typeof error === 'string') {
         vscode.window.showErrorMessage(error);
-        this.reporter.sendTelemetryException(new Error(error));
+        this.reporter.sendTelemetryErrorEvent('invalidHCPToken', {
+          message: error,
+        });
         this.logger.error(error);
       }
 
diff --git a/src/providers/tfc/organizationPicker.ts b/src/providers/tfc/organizationPicker.ts
index 6785a5d1c8..c4d332f06c 100644
--- a/src/providers/tfc/organizationPicker.ts
+++ b/src/providers/tfc/organizationPicker.ts
@@ -100,10 +100,16 @@ export class OrganizationAPIResource implements APIResource {
         return picks;
       } else if (isErrorFromAlias(apiClient.api, 'listOrganizations', error)) {
         message += apiErrorsToString(error.response.data.errors);
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('orgranizationFetchError', {
+          message: message,
+          stack: error.stack,
+        });
       } else if (error instanceof Error) {
         message += error.message;
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('orgranizationFetchError', {
+          message: message,
+          stack: error.stack,
+        });
       } else if (typeof error === 'string') {
         message += error;
       }
diff --git a/src/providers/tfc/planProvider.ts b/src/providers/tfc/planProvider.ts
index 506906bf37..33e145c511 100644
--- a/src/providers/tfc/planProvider.ts
+++ b/src/providers/tfc/planProvider.ts
@@ -186,7 +186,10 @@ export class PlanTreeDataProvider implements vscode.TreeDataProvider<vscode.Tree
       if (error instanceof Error) {
         message += error.message;
         vscode.window.showErrorMessage(message);
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('planLogError', {
+          message: message,
+          stack: error.stack,
+        });
         return;
       }
 
diff --git a/src/providers/tfc/runProvider.ts b/src/providers/tfc/runProvider.ts
index 9ab3148e7f..5e92456220 100644
--- a/src/providers/tfc/runProvider.ts
+++ b/src/providers/tfc/runProvider.ts
@@ -187,7 +187,10 @@ export class RunTreeDataProvider implements vscode.TreeDataProvider<TFCRunTreeIt
         if (isErrorFromAlias(apiClient.api, 'listRuns', error)) {
           message += apiErrorsToString(error.response.data.errors);
           vscode.window.showErrorMessage(message);
-          this.reporter.sendTelemetryException(error);
+          this.reporter.sendTelemetryErrorEvent('runProviderError', {
+            message: message,
+            stack: error.stack,
+          });
           return [];
         }
       }
@@ -195,7 +198,10 @@ export class RunTreeDataProvider implements vscode.TreeDataProvider<TFCRunTreeIt
       if (error instanceof Error) {
         message += error.message;
         vscode.window.showErrorMessage(message);
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('runProviderError', {
+          message: message,
+          stack: error.stack,
+        });
         return [];
       }
 
diff --git a/src/providers/tfc/uiHelpers.ts b/src/providers/tfc/uiHelpers.ts
index 16c9997b1a..4034774cbb 100644
--- a/src/providers/tfc/uiHelpers.ts
+++ b/src/providers/tfc/uiHelpers.ts
@@ -82,7 +82,10 @@ export async function handleZodiosError(
   outputChannel: vscode.OutputChannel,
   reporter: TelemetryReporter,
 ) {
-  reporter.sendTelemetryException(error);
+  reporter.sendTelemetryErrorEvent('zodiosError', {
+    message: error.message,
+    stack: error.stack,
+  });
   outputChannel.append(JSON.stringify({ cause: error.cause }, undefined, 2));
   const chosenItem = await vscode.window.showErrorMessage(
     `${msgPrefix} Response validation failed. Please report this as a bug.`,
diff --git a/src/providers/tfc/workspaceFilters.ts b/src/providers/tfc/workspaceFilters.ts
index 2b3ea5a6e9..2ef4a22837 100644
--- a/src/providers/tfc/workspaceFilters.ts
+++ b/src/providers/tfc/workspaceFilters.ts
@@ -80,10 +80,16 @@ export class ProjectsAPIResource implements APIResource {
         return picks;
       } else if (isErrorFromAlias(apiClient.api, 'listProjects', error)) {
         message += apiErrorsToString(error.response.data.errors);
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('projectWorkspaceFetchError', {
+          message: message,
+          stack: error.stack,
+        });
       } else if (error instanceof Error) {
         message += error.message;
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('projectWorkspaceFetchError', {
+          message: message,
+          stack: error.stack,
+        });
       } else if (typeof error === 'string') {
         message += error;
       }
diff --git a/src/providers/tfc/workspaceProvider.ts b/src/providers/tfc/workspaceProvider.ts
index 35b339804e..69fc955452 100644
--- a/src/providers/tfc/workspaceProvider.ts
+++ b/src/providers/tfc/workspaceProvider.ts
@@ -258,7 +258,10 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider<vscode
         ) {
           message += apiErrorsToString(error.response.data.errors);
           vscode.window.showErrorMessage(message);
-          this.reporter.sendTelemetryException(error);
+          this.reporter.sendTelemetryErrorEvent('workspaceProviderError', {
+            message: message,
+            stack: error.stack,
+          });
           return [];
         }
       }
@@ -266,7 +269,10 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider<vscode
       if (error instanceof Error) {
         message += error.message;
         vscode.window.showErrorMessage(message);
-        this.reporter.sendTelemetryException(error);
+        this.reporter.sendTelemetryErrorEvent('workspaceProviderError', {
+          message: message,
+          stack: error.stack,
+        });
         return [];
       }
 
diff --git a/src/utils/vscode.ts b/src/utils/vscode.ts
index 4b82f8d73c..ec2705176d 100644
--- a/src/utils/vscode.ts
+++ b/src/utils/vscode.ts
@@ -83,10 +83,15 @@ export async function handleLanguageClientStartError(
     return;
   } else if (error instanceof Error) {
     message = error.message;
-    reporter.sendTelemetryException(error);
+    reporter.sendTelemetryErrorEvent('extensionStartError', {
+      message: message,
+      stack: error.stack,
+    });
   } else if (typeof error === 'string') {
     message = error;
-    reporter.sendTelemetryException(new Error(error));
+    reporter.sendTelemetryErrorEvent('extensionStartError', {
+      message: error,
+    });
   }
 
   if (message === 'INVALID_URI_WSL') {
diff --git a/src/web/extension.ts b/src/web/extension.ts
index 5e2659c61b..ca72cf3459 100644
--- a/src/web/extension.ts
+++ b/src/web/extension.ts
@@ -12,7 +12,7 @@ let reporter: TelemetryReporter;
 
 export function activate(context: vscode.ExtensionContext) {
   const manifest = context.extension.packageJSON;
-  reporter = new TelemetryReporter(context.extension.id, manifest.version, manifest.appInsightsKey);
+  reporter = new TelemetryReporter(manifest.appInsightsKey);
   context.subscriptions.push(reporter);
   context.subscriptions.push(outputChannel);