Pro/business

This commit is contained in:
Timo Knuth
2026-07-06 00:18:06 +02:00
parent 0b9c8d2a8f
commit 91bd940edc
10 changed files with 384 additions and 40 deletions

View File

@@ -293,6 +293,32 @@ export async function GET(request: NextRequest) {
},
});
const recentBillingLogs = await db.userLifecycleLog.findMany({
where: {
reason: {
startsWith: 'subscription_',
},
},
orderBy: {
createdAt: 'desc',
},
take: 10,
select: {
fromStage: true,
toStage: true,
reason: true,
createdAt: true,
user: {
select: {
id: true,
name: true,
email: true,
plan: true,
},
},
},
});
const users: HydratedUser[] = rawUsers.map((user) => {
const metrics = getMetricSnapshot(user.qrCodes);
@@ -371,6 +397,17 @@ export async function GET(request: NextRequest) {
.sort((a, b) => b.leadScore - a.leadScore)
.slice(0, 25);
const recentBillingActivity = recentBillingLogs.map((log) => ({
userId: log.user.id,
name: log.user.name,
email: log.user.email,
plan: log.user.plan,
reason: log.reason,
fromStage: log.fromStage,
toStage: log.toStage,
createdAt: log.createdAt.toISOString(),
}));
const filterOptions = {
stages: ['cold', 'activated', 'warm', 'hot', 'upgrade_candidate', 'paid'],
sources: Array.from(new Set(users.map((user) => user.signupSource).filter((value): value is string => Boolean(value)))),
@@ -389,6 +426,7 @@ export async function GET(request: NextRequest) {
mismatchCount,
activatedUsers: funnel.activated,
paidUsers: lifecycleSummary.paid,
recentBillingEvents: recentBillingActivity.length,
},
acquisition: {
bySource: acquisitionBySource,
@@ -403,6 +441,7 @@ export async function GET(request: NextRequest) {
byTeamSize: buildGroupedRows(users, 'teamSizeBucket').map((row) => ({ ...row, label: getTeamSizeLabel(row.key) })),
},
lifecycleSummary,
recentBillingActivity,
campaignSourceQuality: acquisitionBySource,
upgradeCandidates,
filterOptions,