diff --git a/web/app/(app)/dashboard/(components)/past-due-billing-alert.tsx b/web/app/(app)/dashboard/(components)/past-due-billing-alert.tsx
new file mode 100644
index 0000000..d946124
--- /dev/null
+++ b/web/app/(app)/dashboard/(components)/past-due-billing-alert.tsx
@@ -0,0 +1,71 @@
+'use client'
+
+import { Alert, AlertDescription } from '@/components/ui/alert'
+import { Button } from '@/components/ui/button'
+import { ApiEndpoints } from '@/config/api'
+import httpBrowserClient from '@/lib/httpBrowserClient'
+import { polarCustomerPortalRequestUrl } from '@/config/external-links'
+import { useQuery } from '@tanstack/react-query'
+import { CreditCard, AlertTriangle } from 'lucide-react'
+import Link from 'next/link'
+
+export default function PastDueBillingAlert() {
+ const { data: currentSubscription, isLoading: subLoading } = useQuery({
+ queryKey: ['currentSubscription'],
+ queryFn: () =>
+ httpBrowserClient
+ .get(ApiEndpoints.billing.currentSubscription())
+ .then((res) => res.data),
+ })
+
+ const { data: currentUser, isLoading: userLoading } = useQuery({
+ queryKey: ['currentUser'],
+ queryFn: () =>
+ httpBrowserClient
+ .get(ApiEndpoints.auth.whoAmI())
+ .then((res) => res.data?.data),
+ })
+
+ if (subLoading || userLoading || !currentSubscription || !currentUser) {
+ return null
+ }
+
+ const status = currentSubscription.status as string | undefined
+ const planName = (currentSubscription.plan as { name?: string } | undefined)
+ ?.name
+ const isPaid =
+ planName &&
+ planName.toLowerCase() !== 'free' &&
+ (currentSubscription.amount ?? 0) > 0
+
+ if (status !== 'past_due' || !isPaid) {
+ return null
+ }
+
+ const portalUrl = polarCustomerPortalRequestUrl(currentUser.email)
+
+ return (
+