From 3e5cb59c693ec7dba86796c4efd41b6b4ee2e0bc Mon Sep 17 00:00:00 2001 From: Steven Tey Date: Wed, 3 Sep 2025 11:30:36 -0700 Subject: [PATCH] Add executeWorkflows to a few spots that were missed earlier --- .../webhook/checkout-session-completed.ts | 20 ++++++++++++++----- .../integration/webhook/invoice-paid.ts | 16 +++++++-------- .../lib/actions/partners/create-commission.ts | 14 +++++++++++++ .../lib/integrations/shopify/create-sale.ts | 10 ++++++++++ .../lib/partners/create-partner-commission.ts | 6 +++++- 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/apps/web/app/(ee)/api/stripe/integration/webhook/checkout-session-completed.ts b/apps/web/app/(ee)/api/stripe/integration/webhook/checkout-session-completed.ts index ed78d877a1d..2e1569e65ed 100644 --- a/apps/web/app/(ee)/api/stripe/integration/webhook/checkout-session-completed.ts +++ b/apps/web/app/(ee)/api/stripe/integration/webhook/checkout-session-completed.ts @@ -341,7 +341,7 @@ export async function checkoutSessionCompleted(event: Stripe.Event) { livemode: event.livemode, }); - const commission = await createPartnerCommission({ + await createPartnerCommission({ event: "sale", programId: link.programId, partnerId: link.partnerId, @@ -362,15 +362,25 @@ export async function checkoutSessionCompleted(event: Stripe.Event) { }, }); - if (commission) { - waitUntil( + waitUntil( + Promise.allSettled([ executeWorkflows({ trigger: WorkflowTrigger.saleRecorded, programId: link.programId, partnerId: link.partnerId, }), - ); - } + // same logic as lead.created webhook below: + // if the clickEvent variable exists and there was no existing customer before, + // we need to trigger the leadRecorded workflow + clickEvent && + !existingCustomer && + executeWorkflows({ + trigger: WorkflowTrigger.leadRecorded, + programId: link.programId, + partnerId: link.partnerId, + }), + ]), + ); } waitUntil( diff --git a/apps/web/app/(ee)/api/stripe/integration/webhook/invoice-paid.ts b/apps/web/app/(ee)/api/stripe/integration/webhook/invoice-paid.ts index c7c06784777..a9c388e049b 100644 --- a/apps/web/app/(ee)/api/stripe/integration/webhook/invoice-paid.ts +++ b/apps/web/app/(ee)/api/stripe/integration/webhook/invoice-paid.ts @@ -209,15 +209,13 @@ export async function invoicePaid(event: Stripe.Event) { }, }); - if (commission) { - waitUntil( - executeWorkflows({ - trigger: WorkflowTrigger.saleRecorded, - programId: link.programId, - partnerId: link.partnerId, - }), - ); - } + waitUntil( + executeWorkflows({ + trigger: WorkflowTrigger.saleRecorded, + programId: link.programId, + partnerId: link.partnerId, + }), + ); } // send workspace webhook diff --git a/apps/web/lib/actions/partners/create-commission.ts b/apps/web/lib/actions/partners/create-commission.ts index f1b1ef1180d..018e3a1007a 100644 --- a/apps/web/lib/actions/partners/create-commission.ts +++ b/apps/web/lib/actions/partners/create-commission.ts @@ -3,6 +3,7 @@ import { isFirstConversion } from "@/lib/analytics/is-first-conversion"; import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw"; import { getProgramEnrollmentOrThrow } from "@/lib/api/programs/get-program-enrollment-or-throw"; +import { executeWorkflows } from "@/lib/api/workflows/execute-workflows"; import { createPartnerCommission } from "@/lib/partners/create-partner-commission"; import { getLeadEvent } from "@/lib/tinybird"; import { recordClick } from "@/lib/tinybird/record-click"; @@ -15,6 +16,7 @@ import { leadEventSchemaTB } from "@/lib/zod/schemas/leads"; import { prisma } from "@dub/prisma"; import { nanoid } from "@dub/utils"; import { COUNTRIES_TO_CONTINENTS } from "@dub/utils/src"; +import { WorkflowTrigger } from "@prisma/client"; import { waitUntil } from "@vercel/functions"; import { authActionClient } from "../safe-action"; @@ -200,6 +202,12 @@ export const createCommissionAction = authActionClient }, }, }), + + executeWorkflows({ + trigger: WorkflowTrigger.leadRecorded, + programId, + partnerId, + }), ]); } @@ -238,6 +246,12 @@ export const createCommissionAction = authActionClient }, }, }), + + executeWorkflows({ + trigger: WorkflowTrigger.saleRecorded, + programId, + partnerId, + }), ]); } diff --git a/apps/web/lib/integrations/shopify/create-sale.ts b/apps/web/lib/integrations/shopify/create-sale.ts index 0a7128a92ec..4ca5e107117 100644 --- a/apps/web/lib/integrations/shopify/create-sale.ts +++ b/apps/web/lib/integrations/shopify/create-sale.ts @@ -1,5 +1,6 @@ import { isFirstConversion } from "@/lib/analytics/is-first-conversion"; import { includeTags } from "@/lib/api/links/include-tags"; +import { executeWorkflows } from "@/lib/api/workflows/execute-workflows"; import { createPartnerCommission } from "@/lib/partners/create-partner-commission"; import { recordSale } from "@/lib/tinybird"; import { LeadEventTB } from "@/lib/types"; @@ -8,6 +9,7 @@ import { sendWorkspaceWebhook } from "@/lib/webhook/publish"; import { transformSaleEventData } from "@/lib/webhook/transform"; import { prisma } from "@dub/prisma"; import { nanoid } from "@dub/utils"; +import { WorkflowTrigger } from "@prisma/client"; import { waitUntil } from "@vercel/functions"; import { orderSchema } from "./schema"; @@ -154,5 +156,13 @@ export async function createShopifySale({ }, }, }); + + waitUntil( + executeWorkflows({ + trigger: WorkflowTrigger.saleRecorded, + programId: link.programId, + partnerId: link.partnerId, + }), + ); } } diff --git a/apps/web/lib/partners/create-partner-commission.ts b/apps/web/lib/partners/create-partner-commission.ts index 9c420167012..c06af0c35fa 100644 --- a/apps/web/lib/partners/create-partner-commission.ts +++ b/apps/web/lib/partners/create-partner-commission.ts @@ -5,7 +5,7 @@ import { EventType, WorkflowTrigger, } from "@dub/prisma/client"; -import { log } from "@dub/utils"; +import { currencyFormatter, log } from "@dub/utils"; import { waitUntil } from "@vercel/functions"; import { differenceInMonths } from "date-fns"; import { recordAuditLog } from "../api/audit-logs/record-audit-log"; @@ -238,6 +238,10 @@ export const createPartnerCommission = async ({ }, }); + console.log( + `Created a ${event} commission ${commission.id} (${currencyFormatter(commission.earnings)}) for ${partnerId}: ${JSON.stringify(commission)}`, + ); + waitUntil( (async () => { const program = await prisma.program.findUniqueOrThrow({