diff --git a/admin/src/app/(dashboard)/notification-prefs/page.tsx b/admin/src/app/(dashboard)/notification-prefs/page.tsx
index aacf365..92fb22b 100644
--- a/admin/src/app/(dashboard)/notification-prefs/page.tsx
+++ b/admin/src/app/(dashboard)/notification-prefs/page.tsx
@@ -193,6 +193,15 @@ export default function NotificationPrefsPage() {
/>
),
},
+ {
+ accessorKey: 'timezone',
+ header: 'Timezone',
+ cell: ({ row }) => (
+
+ {row.original.timezone || -}
+
+ ),
+ },
{
id: 'notification_times',
header: () => (
diff --git a/admin/src/app/(dashboard)/users/[id]/client.tsx b/admin/src/app/(dashboard)/users/[id]/client.tsx
index f0045e6..d1fd55b 100644
--- a/admin/src/app/(dashboard)/users/[id]/client.tsx
+++ b/admin/src/app/(dashboard)/users/[id]/client.tsx
@@ -239,6 +239,12 @@ export function UserDetailClient() {
{new Date(user.date_joined).toLocaleDateString()}
+
+
+ Timezone
+
+
{user.timezone || '-'}
+
diff --git a/admin/src/lib/api.ts b/admin/src/lib/api.ts
index 11a2bec..b272371 100644
--- a/admin/src/lib/api.ts
+++ b/admin/src/lib/api.ts
@@ -652,6 +652,8 @@ export interface NotificationPreference {
task_overdue_hour: number | null;
warranty_expiring_hour: number | null;
daily_digest_hour: number | null;
+ // User timezone (IANA name, auto-captured from X-Timezone header)
+ timezone: string | null;
created_at: string;
updated_at: string;
}
diff --git a/admin/src/types/models.ts b/admin/src/types/models.ts
index 62007a9..5ae7945 100644
--- a/admin/src/types/models.ts
+++ b/admin/src/types/models.ts
@@ -28,6 +28,7 @@ export interface User {
export interface UserDetail extends User {
residences?: ResidenceSummary[];
devices?: DeviceSummary[];
+ timezone?: string; // IANA timezone (auto-captured from mobile app)
}
export interface ResidenceSummary {