+ {__("Consent records will appear here once visitors interact with your cookie banner.")}
+
+
+
+ )}
+
+
+ );
+}
diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/CookieBannerConsentRecordsPageLoader.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/CookieBannerConsentRecordsPageLoader.tsx
new file mode 100644
index 000000000..3d93ba6bb
--- /dev/null
+++ b/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/CookieBannerConsentRecordsPageLoader.tsx
@@ -0,0 +1,47 @@
+// Copyright (c) 2026 Probo Inc .
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+import { Suspense, useEffect } from "react";
+import { useQueryLoader } from "react-relay";
+import { useParams } from "react-router";
+
+import type { CookieBannerConsentRecordsPageQuery } from "#/__generated__/core/CookieBannerConsentRecordsPageQuery.graphql";
+
+import CookieBannerConsentRecordsPage, { cookieBannerConsentRecordsPageQuery } from "./CookieBannerConsentRecordsPage";
+import { CookieBannerConsentRecordsPageSkeleton } from "./CookieBannerConsentRecordsPageSkeleton";
+
+export default function CookieBannerConsentRecordsPageLoader() {
+ const { cookieBannerId } = useParams<{ cookieBannerId: string }>();
+ if (typeof cookieBannerId !== "string") {
+ throw new Error("Missing cookieBannerId parameter");
+ }
+
+ const [queryRef, loadQuery] = useQueryLoader(
+ cookieBannerConsentRecordsPageQuery,
+ );
+
+ useEffect(() => {
+ loadQuery({ cookieBannerId });
+ }, [loadQuery, cookieBannerId]);
+
+ if (!queryRef) {
+ return ;
+ }
+
+ return (
+ }>
+
+
+ );
+}
diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/CookieBannerConsentRecordsPageSkeleton.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/CookieBannerConsentRecordsPageSkeleton.tsx
new file mode 100644
index 000000000..5e8929a3b
--- /dev/null
+++ b/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/CookieBannerConsentRecordsPageSkeleton.tsx
@@ -0,0 +1,31 @@
+// Copyright (c) 2026 Probo Inc .
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+export function CookieBannerConsentRecordsPageSkeleton() {
+ return (
+
+ );
+}
diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/_components/ConsentRecordRow.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/_components/ConsentRecordRow.tsx
new file mode 100644
index 000000000..118758246
--- /dev/null
+++ b/apps/console/src/pages/organizations/cookie-banners/configuration/consent-records/_components/ConsentRecordRow.tsx
@@ -0,0 +1,113 @@
+// Copyright (c) 2026 Probo Inc .
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+import { formatDate } from "@probo/helpers";
+import { useTranslate } from "@probo/i18n";
+import { Badge, Td, Tr } from "@probo/ui";
+import { graphql, useFragment } from "react-relay";
+
+import type { ConsentRecordRowFragment$key } from "#/__generated__/core/ConsentRecordRowFragment.graphql";
+
+const consentRecordFragment = graphql`
+ fragment ConsentRecordRowFragment on CookieConsentRecord {
+ visitorId
+ action
+ cookieBannerVersion {
+ id
+ version
+ }
+ ipAddress
+ sdkVersion
+ consentData
+ createdAt
+ }
+`;
+
+function getActionLabel(action: string, __: (s: string) => string): string {
+ switch (action) {
+ case "ACCEPT_ALL":
+ return __("Accept All");
+ case "REJECT_ALL":
+ return __("Reject All");
+ case "CUSTOMIZE":
+ return __("Customize");
+ case "GPC":
+ return __("GPC");
+ default:
+ return action;
+ }
+}
+
+function getActionVariant(action: string): "success" | "danger" | "warning" | "neutral" {
+ switch (action) {
+ case "ACCEPT_ALL":
+ return "success";
+ case "REJECT_ALL":
+ return "danger";
+ case "CUSTOMIZE":
+ return "warning";
+ case "GPC":
+ return "neutral";
+ default:
+ return "neutral";
+ }
+}
+
+interface ConsentRecordRowProps {
+ recordKey: ConsentRecordRowFragment$key;
+}
+
+export function ConsentRecordRow({ recordKey }: ConsentRecordRowProps) {
+ const { __ } = useTranslate();
+ const record = useFragment(consentRecordFragment, recordKey);
+
+ return (
+