Skip to content

Commit 9bdbcfc

Browse files
committed
feat: webhook logging for better debugging
- Disable request logging - Log event type, event id and entity id for better debuggability
1 parent eef33c3 commit 9bdbcfc

File tree

3 files changed

+71
-10
lines changed

3 files changed

+71
-10
lines changed

src/logger.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import pino from 'pino'
2+
3+
export const logger = pino({
4+
formatters: {
5+
level(label) {
6+
return { level: label }
7+
},
8+
},
9+
timestamp: pino.stdTimeFunctions.isoTime,
10+
})

src/routes/webhooks.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { upsertPaymentIntents } from '../lib/payment_intents'
1616
import { upsertSubscriptionSchedules } from '../lib/subscription_schedules'
1717
import { deleteTaxId, upsertTaxIds } from '../lib/tax_ids'
1818
import { upsertCreditNotes } from '../lib/creditNotes'
19+
import { logger } from '../logger'
1920

2021
const config = getConfig()
2122

@@ -41,13 +42,19 @@ export default async function routes(fastify: FastifyInstance) {
4142
case 'charge.succeeded':
4243
case 'charge.updated': {
4344
const charge = event.data.object as Stripe.Charge
45+
46+
logger.info(`Received webhook ${event.id}: ${event.type} for charge ${charge.id}`)
47+
4448
await upsertCharges([charge])
4549
break
4650
}
4751
case 'customer.created':
4852
case 'customer.deleted':
4953
case 'customer.updated': {
5054
const customer = event.data.object as Stripe.Customer
55+
56+
logger.info(`Received webhook ${event.id}: ${event.type} for customer ${customer.id}`)
57+
5158
await upsertCustomers([customer])
5259
break
5360
}
@@ -60,17 +67,28 @@ export default async function routes(fastify: FastifyInstance) {
6067
case 'customer.subscription.resumed':
6168
case 'customer.subscription.updated': {
6269
const subscription = event.data.object as Stripe.Subscription
70+
71+
logger.info(
72+
`Received webhook ${event.id}: ${event.type} for subscription ${subscription.id}`
73+
)
74+
6375
await upsertSubscriptions([subscription])
6476
break
6577
}
6678
case 'customer.tax_id.updated':
6779
case 'customer.tax_id.created': {
6880
const taxId = event.data.object as Stripe.TaxId
81+
82+
logger.info(`Received webhook ${event.id}: ${event.type} for taxId ${taxId.id}`)
83+
6984
await upsertTaxIds([taxId])
7085
break
7186
}
7287
case 'customer.tax_id.deleted': {
7388
const taxId = event.data.object as Stripe.TaxId
89+
90+
logger.info(`Received webhook ${event.id}: ${event.type} for taxId ${taxId.id}`)
91+
7492
await deleteTaxId(taxId.id)
7593
break
7694
}
@@ -88,39 +106,60 @@ export default async function routes(fastify: FastifyInstance) {
88106
case 'invoice.marked_uncollectible':
89107
case 'invoice.updated': {
90108
const invoice = event.data.object as Stripe.Invoice
109+
110+
logger.info(`Received webhook ${event.id}: ${event.type} for invoice ${invoice.id}`)
111+
91112
await upsertInvoices([invoice])
92113
break
93114
}
94115
case 'product.created':
95116
case 'product.updated': {
96117
const product = event.data.object as Stripe.Product
118+
119+
logger.info(`Received webhook ${event.id}: ${event.type} for product ${product.id}`)
120+
97121
await upsertProducts([product])
98122
break
99123
}
100124
case 'product.deleted': {
101125
const product = event.data.object as Stripe.Product
126+
127+
logger.info(`Received webhook ${event.id}: ${event.type} for product ${product.id}`)
128+
102129
await deleteProduct(product.id)
103130
break
104131
}
105132
case 'price.created':
106133
case 'price.updated': {
107134
const price = event.data.object as Stripe.Price
135+
136+
logger.info(`Received webhook ${event.id}: ${event.type} for price ${price.id}`)
137+
108138
await upsertPrices([price])
109139
break
110140
}
111141
case 'price.deleted': {
112142
const price = event.data.object as Stripe.Price
143+
144+
logger.info(`Received webhook ${event.id}: ${event.type} for price ${price.id}`)
145+
113146
await deletePrice(price.id)
114147
break
115148
}
116149
case 'plan.created':
117150
case 'plan.updated': {
118151
const plan = event.data.object as Stripe.Plan
152+
153+
logger.info(`Received webhook ${event.id}: ${event.type} for plan ${plan.id}`)
154+
119155
await upsertPlans([plan])
120156
break
121157
}
122158
case 'plan.deleted': {
123159
const plan = event.data.object as Stripe.Plan
160+
161+
logger.info(`Received webhook ${event.id}: ${event.type} for plan ${plan.id}`)
162+
124163
await deletePlan(plan.id)
125164
break
126165
}
@@ -131,6 +170,10 @@ export default async function routes(fastify: FastifyInstance) {
131170
case 'setup_intent.succeeded': {
132171
const setupIntent = event.data.object as Stripe.SetupIntent
133172

173+
logger.info(
174+
`Received webhook ${event.id}: ${event.type} for setupIntent ${setupIntent.id}`
175+
)
176+
134177
await upsertSetupIntents([setupIntent])
135178
break
136179
}
@@ -143,6 +186,10 @@ export default async function routes(fastify: FastifyInstance) {
143186
case 'subscription_schedule.updated': {
144187
const subscriptionSchedule = event.data.object as Stripe.SubscriptionSchedule
145188

189+
logger.info(
190+
`Received webhook ${event.id}: ${event.type} for subscriptionSchedule ${subscriptionSchedule.id}`
191+
)
192+
146193
await upsertSubscriptionSchedules([subscriptionSchedule])
147194
break
148195
}
@@ -152,6 +199,10 @@ export default async function routes(fastify: FastifyInstance) {
152199
case 'payment_method.updated': {
153200
const paymentMethod = event.data.object as Stripe.PaymentMethod
154201

202+
logger.info(
203+
`Received webhook ${event.id}: ${event.type} for paymentMethod ${paymentMethod.id}`
204+
)
205+
155206
await upsertPaymentMethods([paymentMethod])
156207
break
157208
}
@@ -162,6 +213,8 @@ export default async function routes(fastify: FastifyInstance) {
162213
case 'charge.dispute.closed': {
163214
const dispute = event.data.object as Stripe.Dispute
164215

216+
logger.info(`Received webhook ${event.id}: ${event.type} for dispute ${dispute.id}`)
217+
165218
await upsertDisputes([dispute])
166219
break
167220
}
@@ -175,6 +228,10 @@ export default async function routes(fastify: FastifyInstance) {
175228
case 'payment_intent.succeeded': {
176229
const paymentIntent = event.data.object as Stripe.PaymentIntent
177230

231+
logger.info(
232+
`Received webhook ${event.id}: ${event.type} for paymentIntent ${paymentIntent.id}`
233+
)
234+
178235
await upsertPaymentIntents([paymentIntent])
179236
break
180237
}
@@ -184,6 +241,8 @@ export default async function routes(fastify: FastifyInstance) {
184241
case 'credit_note.voided': {
185242
const creditNote = event.data.object as Stripe.CreditNote
186243

244+
logger.info(`Received webhook ${event.id}: ${event.type} for creditNote ${creditNote.id}`)
245+
187246
await upsertCreditNotes([creditNote])
188247
break
189248
}

src/server.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,16 @@ import { FastifyInstance } from 'fastify'
22
import { Server, IncomingMessage, ServerResponse } from 'node:http'
33
import { runMigrations } from './utils/migrate'
44
import { createServer } from './app'
5-
import pino from 'pino'
65
import { getConfig } from './utils/config'
76
import { Client } from 'pg'
7+
import { logger } from './logger'
88

99
const config = getConfig()
1010

11-
const logger = pino({
12-
formatters: {
13-
level(label) {
14-
return { level: label }
15-
},
16-
},
17-
timestamp: pino.stdTimeFunctions.isoTime,
18-
})
19-
2011
const main = async () => {
2112
const app: FastifyInstance<Server, IncomingMessage, ServerResponse> = await createServer({
2213
loggerInstance: logger,
14+
disableRequestLogging: true,
2315
exposeDocs: getConfig().NODE_ENV !== 'production',
2416
requestIdHeader: 'Request-Id',
2517
})

0 commit comments

Comments
 (0)