export interface SaaSBillingProviderCapabilities {
supportsHostedCheckout:boolean;
supportsBillingPortal:boolean;
supportsPlanChange:boolean;
supportsCancelAtPeriodEnd:boolean;
supportsInvoiceListing:boolean;
supportsWebhooks:boolean;
supportsIdempotency:boolean;
}
export interface SaaSBillingProviderContext {
organizationId:string;
billingAccountId:string;
providerCustomerId?:string|null;
credentialReference:string;
config:Record<string,unknown>;
}
export interface SaaSBillingProvider {
readonly key:string;
readonly capabilities:SaaSBillingProviderCapabilities;
createCustomer(ctx:SaaSBillingProviderContext,input:{
email?:string;
companyName?:string;
metadata:Record<string,string>;
idempotencyKey:string;
}):Promise<{providerCustomerId:string}>;
createCheckoutSession(ctx:SaaSBillingProviderContext,input:{
providerPriceId:string;
successUrl:string;
cancelUrl:string;
trialDays?:number;
metadata:Record<string,string>;
idempotencyKey:string;
}):Promise<{url:string;providerSessionId:string}>;
createBillingPortalSession(ctx:SaaSBillingProviderContext,input:{
returnUrl:string;
}):Promise<{url:string}>;
changeSubscription(ctx:SaaSBillingProviderContext,input:{
providerSubscriptionId:string;
providerPriceId:string;
effective:'immediate'|'period_end';
idempotencyKey:string;
}):Promise<{providerSubscriptionId:string;providerStatus:string;currentPeriodEnd?:string}>;
cancelSubscription(ctx:SaaSBillingProviderContext,input:{
providerSubscriptionId:string;
atPeriodEnd:boolean;
idempotencyKey:string;
}):Promise<{providerSubscriptionId:string;providerStatus:string;cancelAtPeriodEnd:boolean}>;
getSubscription(ctx:SaaSBillingProviderContext,input:{
providerSubscriptionId:string;
}):Promise<Record<string,unknown>>;
listInvoices(ctx:SaaSBillingProviderContext):Promise<Array<Record<string,unknown>>>;
verifyWebhook(ctx:SaaSBillingProviderContext,input:{
rawBody:Buffer;
headers:Record<string,string|undefined>;
}):Promise<{
providerEventId:string;
eventType:string;
providerCreatedAt?:string;
payload:Record<string,unknown>;
}>;
}
