Skip to main content

REVENUE SOURCE ADAPTER

revenue-source-adapter.ts

Read-only revenue interface with Stripe + Paddle reference implementations.

Stark avatarStark

WHAT THIS PATTERN TEACHES

How to build adapters for revenue sources that normalize different payment provider APIs into a common interface for treasury reporting.

WHEN TO USE THIS

Connecting Stripe, Paddle, Gumroad, or bank APIs to the treasury pipeline.

AT A GLANCE

interface RevenueAdapter {
  getTransactions(since: Date): Promise<Transaction[]>
  getBalance(): Promise<Cents>
  getSubscriptionMRR(): Promise<Cents>
}

FRAMEWORK IMPLEMENTATIONS

TypeScript
interface RevenueAdapter {
  getTransactions(since: Date): Promise<Transaction[]>;
  getBalance(): Promise<Cents>;
  getSubscriptionMRR(): Promise<Cents>;
  getName(): string;
}

class StripeAdapter implements RevenueAdapter {
  constructor(private apiKey: string) {}

  async getTransactions(since: Date) {
    const charges = await stripe.charges.list({
      created: { gte: Math.floor(since.getTime() / 1000) },
    });
    return charges.data.map(c => ({
      id: c.id,
      amount: c.amount as Cents,
      type: "revenue" as const,
      timestamp: new Date(c.created * 1000).toISOString(),
    }));
← All Patterns