diff --git a/src/core/core.cpp b/src/core/core.cpp
index 7106151bd8c3f81535c13ab824faca18547fa3ed..9f9356f53db306956b521e6f1f22ae053a829352 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -144,7 +144,6 @@ struct System::Impl {
     ResultStatus Load(System& system, Frontend::EmuWindow& emu_window,
                       const std::string& filepath) {
         app_loader = Loader::GetLoader(GetGameFileFromPath(virtual_filesystem, filepath));
-
         if (!app_loader) {
             LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
             return ResultStatus::ErrorGetLoader;
@@ -167,6 +166,7 @@ struct System::Impl {
             return init_result;
         }
 
+        telemetry_session->AddInitialInfo(*app_loader);
         auto main_process = Kernel::Process::Create(system, "main");
         const auto [load_result, load_parameters] = app_loader->Load(*main_process);
         if (load_result != Loader::ResultStatus::Success) {
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 4b17bada5d4353d926603b36c7db01eb7bab9adf..4f8aff8161a14139414b9b004cd392be3b489504 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -12,7 +12,6 @@
 #include "common/file_util.h"
 #include "common/logging/log.h"
 
-#include "core/core.h"
 #include "core/file_sys/control_metadata.h"
 #include "core/file_sys/patch_manager.h"
 #include "core/loader/loader.h"
@@ -101,7 +100,31 @@ bool VerifyLogin(const std::string& username, const std::string& token) {
 #endif
 }
 
-TelemetrySession::TelemetrySession() {
+TelemetrySession::TelemetrySession() = default;
+
+TelemetrySession::~TelemetrySession() {
+    // Log one-time session end information
+    const s64 shutdown_time{std::chrono::duration_cast<std::chrono::milliseconds>(
+                                std::chrono::system_clock::now().time_since_epoch())
+                                .count()};
+    AddField(Telemetry::FieldType::Session, "Shutdown_Time", shutdown_time);
+
+#ifdef ENABLE_WEB_SERVICE
+    auto backend = std::make_unique<WebService::TelemetryJson>(
+        Settings::values.web_api_url, Settings::values.yuzu_username, Settings::values.yuzu_token);
+#else
+    auto backend = std::make_unique<Telemetry::NullVisitor>();
+#endif
+
+    // Complete the session, submitting to web service if necessary
+    field_collection.Accept(*backend);
+    if (Settings::values.enable_telemetry) {
+        backend->Complete();
+    }
+    backend = nullptr;
+}
+
+void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) {
     // Log one-time top-level information
     AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId());
 
@@ -112,26 +135,28 @@ TelemetrySession::TelemetrySession() {
     AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
 
     u64 program_id{};
-    const Loader::ResultStatus res{System::GetInstance().GetAppLoader().ReadProgramId(program_id)};
+    const Loader::ResultStatus res{app_loader.ReadProgramId(program_id)};
     if (res == Loader::ResultStatus::Success) {
         const std::string formatted_program_id{fmt::format("{:016X}", program_id)};
         AddField(Telemetry::FieldType::Session, "ProgramId", formatted_program_id);
 
         std::string name;
-        System::GetInstance().GetAppLoader().ReadTitle(name);
+        app_loader.ReadTitle(name);
 
         if (name.empty()) {
             auto [nacp, icon_file] = FileSys::PatchManager(program_id).GetControlMetadata();
-            if (nacp != nullptr)
+            if (nacp != nullptr) {
                 name = nacp->GetApplicationName();
+            }
         }
 
-        if (!name.empty())
+        if (!name.empty()) {
             AddField(Telemetry::FieldType::Session, "ProgramName", name);
+        }
     }
 
     AddField(Telemetry::FieldType::Session, "ProgramFormat",
-             static_cast<u8>(System::GetInstance().GetAppLoader().GetFileType()));
+             static_cast<u8>(app_loader.GetFileType()));
 
     // Log application information
     Telemetry::AppendBuildInfo(field_collection);
@@ -162,27 +187,6 @@ TelemetrySession::TelemetrySession() {
              Settings::values.use_docked_mode);
 }
 
-TelemetrySession::~TelemetrySession() {
-    // Log one-time session end information
-    const s64 shutdown_time{std::chrono::duration_cast<std::chrono::milliseconds>(
-                                std::chrono::system_clock::now().time_since_epoch())
-                                .count()};
-    AddField(Telemetry::FieldType::Session, "Shutdown_Time", shutdown_time);
-
-#ifdef ENABLE_WEB_SERVICE
-    auto backend = std::make_unique<WebService::TelemetryJson>(
-        Settings::values.web_api_url, Settings::values.yuzu_username, Settings::values.yuzu_token);
-#else
-    auto backend = std::make_unique<Telemetry::NullVisitor>();
-#endif
-
-    // Complete the session, submitting to web service if necessary
-    field_collection.Accept(*backend);
-    if (Settings::values.enable_telemetry)
-        backend->Complete();
-    backend = nullptr;
-}
-
 bool TelemetrySession::SubmitTestcase() {
 #ifdef ENABLE_WEB_SERVICE
     auto backend = std::make_unique<WebService::TelemetryJson>(
diff --git a/src/core/telemetry_session.h b/src/core/telemetry_session.h
index 7d0c8d41312ef50156225f2c9dd63222cabdd8f3..17ac223777803c9fe7bb3f6ce65c81f452a286b3 100644
--- a/src/core/telemetry_session.h
+++ b/src/core/telemetry_session.h
@@ -7,6 +7,10 @@
 #include <string>
 #include "common/telemetry.h"
 
+namespace Loader {
+class AppLoader;
+}
+
 namespace Core {
 
 /**
@@ -16,7 +20,7 @@ namespace Core {
  */
 class TelemetrySession {
 public:
-    TelemetrySession();
+    explicit TelemetrySession();
     ~TelemetrySession();
 
     TelemetrySession(const TelemetrySession&) = delete;
@@ -25,6 +29,22 @@ public:
     TelemetrySession(TelemetrySession&&) = delete;
     TelemetrySession& operator=(TelemetrySession&&) = delete;
 
+    /**
+     * Adds the initial telemetry info necessary when starting up a title.
+     *
+     * This includes information such as:
+     *   - Telemetry ID
+     *   - Initialization time
+     *   - Title ID
+     *   - Title name
+     *   - Title file format
+     *   - Miscellaneous settings values.
+     *
+     * @param app_loader The application loader to use to retrieve
+     *                   title-specific information.
+     */
+    void AddInitialInfo(Loader::AppLoader& app_loader);
+
     /**
      * Wrapper around the Telemetry::FieldCollection::AddField method.
      * @param type Type of the field to add.