feat(donate): add PostHog analytics events
Build and Push Image / build-frontend (push) Successful in 5m19s
Build and Push Image / build-backend (push) Successful in 3m46s
Build and Push Image / push (push) Successful in 1m20s

Track donation lifecycle across form, widget, admin, and backend:
- Form: donation_completed, donation_*_failed, donation_slip_conflict, donation_artifact_conflict
- Widget: donation_widget_displayed, donation_widget_tts_failed, donation_widget_animation_end, donation_widget_connected, donation_widget_heartbeat_failure
- Admin: donation_admin_test_popup, donation_admin_widget_reload, donation_admin_resend
- Backend: donation_widget_state_playing, donation_widget_state_shown, donation_resent
This commit is contained in:
2026-06-08 20:51:07 +00:00 Unverified
parent 995d5c1614
commit 5edd92a97f
6 changed files with 58 additions and 14 deletions
+2
View File
@@ -4,6 +4,7 @@ import { sse } from "@/lib/db/sse-endpoints";
import { fileToDataUrl } from "@/lib/utils";
import { and, asc, not, sql } from "drizzle-orm";
import { NextRequest } from "next/server";
import { getPostHogClient } from "@/lib/posthog-server";
export async function PATCH(req: NextRequest) {
const tag = Number(req.nextUrl.searchParams.get("tag") ?? "abc");
@@ -23,6 +24,7 @@ export async function PATCH(req: NextRequest) {
.limit(1)
.orderBy(asc(donations.id));
if (!havent) return;
getPostHogClient().capture({ distinctId: String(havent.id), event: "donation_resent", properties: { donation_id: havent.id, amount: havent.amount } });
sse.donate.pub("ping", {
...havent,
message: havent.message ?? "",