Create a Flowglad server factory function in a shared file:
utils/flowglad.ts
Copy
Ask AI
import { FlowgladServer } from '@flowglad/nextjs/server'export const flowglad = (customerExternalId: string) => { // customerExternalId is the ID from YOUR app's database, NOT Flowglad's customer ID return new FlowgladServer({ customerExternalId, getCustomerDetails: async (externalId) => { // Fetch customer details from YOUR database using YOUR app's ID const user = await db.users.findOne({ id: externalId }) if (!user) { throw new Error('Customer not found') } return { email: user.email, name: user.name, } }, })}
Important:customerExternalId is the ID from your app’s database (e.g., user.id or organization.id), not Flowglad’s customer ID.B2C apps: Pass user.id as customerExternalId B2B apps: Pass organization.id or team.id as customerExternalId
import { nextRouteHandler } from '@flowglad/nextjs/server'import { flowglad } from '@/utils/flowglad'export const { GET, POST } = nextRouteHandler({ flowglad, getCustomerExternalId: async (req) => { // Extract customerExternalId from your auth/session // This should be YOUR app's user/organization ID, NOT Flowglad's customer ID // For B2C: return user.id (from your database) // For B2B: return organization.id (from your database) const userId = await getUserIdFromRequest(req) if (!userId) { throw new Error('User not authenticated') } return userId },})
import { nextRouteHandler} from '@flowglad/nextjs/server'import { flowglad } from '@/utils/flowglad'export const { GET, POST } = nextRouteHandler({ flowglad, // derive customer external id from the request getCustomerExternalId: async (req) => { // for B2B apps, provide organization or team id instead const user = await getUserForReq(req) return user.id }, // optional hooks for custom behavior beforeRequest: async () => { // side effect to run before the request is processed }, afterRequest: async () => { // side effect to run after the request is processed }, onError: (error) => { // handle errors }})
import { FlowgladServer } from '@flowglad/nextjs/server'export const flowglad = (customerExternalId: string) => { // customerExternalId is the ID from YOUR app's database, NOT Flowglad's customer ID return new FlowgladServer({ customerExternalId, getCustomerDetails: async (externalId) => { // Fetch customer details from YOUR database using YOUR app's ID const user = await db.users.findOne({ id: externalId }) if (!user) { throw new Error('Customer not found') } return { email: user.email, name: user.name, } }, })}
app/api/flowglad/[...path]/route.ts
Copy
Ask AI
import { nextRouteHandler } from '@flowglad/nextjs/server'import { flowglad } from '@/utils/flowglad'export const { GET, POST } = nextRouteHandler({ flowglad, getCustomerExternalId: async (req) => { // Extract customerExternalId from your auth/session // This should be YOUR app's user/organization ID, NOT Flowglad's customer ID // For B2C: return user.id (from your database) // For B2B: return organization.id (from your database) const userId = await getUserIdFromRequest(req) if (!userId) { throw new Error('User not authenticated') } return userId },})
Important:customerExternalId is the ID from your app’s database (e.g., user.id or organization.id), not Flowglad’s customer ID.B2C apps: Pass user.id as customerExternalId B2B apps: Pass organization.id or team.id as customerExternalIdFlowglad doesn’t need to know how you authenticate—just provide the ID from your system that represents the customer entity which will be billed.