From 9687ed0d831671f468706c0fec7b650899d5e080 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 11 Apr 2026 00:18:23 -0600 Subject: [PATCH] feat: add invoice notification settings and email notifications for payments - Introduced a new feature allowing users to enable or disable invoice email notifications in the billing settings. - Implemented email notifications for successful invoice payments and payment failures, enhancing user communication regarding billing. - Updated the database schema to include a new column for storing user preferences on invoice notifications. - Added corresponding email templates for invoice notifications and payment failure alerts. These changes improve user experience by keeping users informed about their billing status and actions required. --- .../settings/billing/show-billing.tsx | 83 +- .../welcome-stripe/welcome-subscription.tsx | 16 +- .../drizzle/0165_abnormal_greymalkin.sql | 1 + apps/dokploy/drizzle/meta/0165_snapshot.json | 8312 +++++++++++++++++ apps/dokploy/drizzle/meta/_journal.json | 7 + apps/dokploy/pages/api/stripe/webhook.ts | 14 +- apps/dokploy/server/api/routers/stripe.ts | 16 + .../server/utils/stripe-notifications.ts | 119 + packages/server/src/db/schema/user.ts | 3 + .../emails/emails/invoice-notification.tsx | 171 + .../src/emails/emails/payment-failed.tsx | 175 + .../server/src/utils/notifications/utils.ts | 2 + .../verification/send-verification-email.tsx | 3 + 13 files changed, 8911 insertions(+), 11 deletions(-) create mode 100644 apps/dokploy/drizzle/0165_abnormal_greymalkin.sql create mode 100644 apps/dokploy/drizzle/meta/0165_snapshot.json create mode 100644 apps/dokploy/server/utils/stripe-notifications.ts create mode 100644 packages/server/src/emails/emails/invoice-notification.tsx create mode 100644 packages/server/src/emails/emails/payment-failed.tsx diff --git a/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx b/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx index c740f8211..cbc363dcd 100644 --- a/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx +++ b/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx @@ -2,6 +2,7 @@ import { loadStripe } from "@stripe/stripe-js"; import clsx from "clsx"; import { AlertTriangle, + Bell, CheckIcon, CreditCard, FileText, @@ -25,7 +26,17 @@ import { CardTitle, } from "@/components/ui/card"; import { NumberInput } from "@/components/ui/input"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { Label } from "@/components/ui/label"; import { Progress } from "@/components/ui/progress"; +import { Switch } from "@/components/ui/switch"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { cn } from "@/lib/utils"; import { api } from "@/utils/api"; @@ -90,6 +101,8 @@ export const ShowBilling = () => { api.stripe.createCustomerPortalSession.useMutation(); const { mutateAsync: upgradeSubscription, isPending: isUpgrading } = api.stripe.upgradeSubscription.useMutation(); + const { mutateAsync: updateInvoiceNotifications } = + api.stripe.updateInvoiceNotifications.useMutation(); const utils = api.useUtils(); const [hobbyServerQuantity, setHobbyServerQuantity] = useState(1); @@ -151,14 +164,68 @@ export const ShowBilling = () => {
- - - - Billing - - - Manage your subscription and invoices - + +
+ + + Billing + + + Manage your subscription and invoices + +
+ {(admin?.user.stripeSubscriptionId || isEnterpriseCloud) && ( + + + + + + + Notification Settings + + Configure your billing email notifications. + + +
+
+ +

+ Receive email notifications for payments and failed + charges. +

+
+ { + await updateInvoiceNotifications({ + enabled: checked, + }) + .then(() => { + utils.user.get.invalidate(); + toast.success( + checked + ? "Invoice notifications enabled" + : "Invoice notifications disabled", + ); + }) + .catch(() => { + toast.error( + "Failed to update invoice notifications", + ); + }); + }} + /> +
+
+
+ )}