Skip to main content

Basejump Edge Function Core

Convenience functions for working with Supabase Edge Functions alongside Basejump.

Billing Endpoint

All the functionality needed to enable revenue generating on accounts within Basejump.

import {serve} from "https://deno.land/std@0.168.0/http/server.ts";
import {
    billingEndpoint,
    stripeBillingEndpoint
} from "https://deno.land/x/basejump@v2.0.2/billing-functions/mod.ts";

const stripeResponse = stripeBillingEndpoint({
    stripeClient,
});

serve(async (req) => {
    const response = await billingEndpoint(req, stripeResponse);
    return response;
});

Billing Webhooks

Webhook consumer for events from your billing provider.

import {serve} from "https://deno.land/std@0.168.0/http/server.ts";
import {
    billingWebhookEndpoint,
    stripeBillingWebhookEndpoint
} from "https://deno.land/x/basejump@v2.0.2/billing-functions/mod.ts";

const stripeResponse = stripeBillingWebhookEndpoint({
    stripeClient,
});

serve(async (req) => {
    const response = await billingWebhookEndpoint(req, stripeResponse);
    return response;
});

Requiring an account member / owner

Convenience function useful for ensuring a user should have access to a specific function.

import {serve} from "https://deno.land/std@0.168.0/http/server.ts";
import {
    requireAccountMember
} from "https://deno.land/x/basejump@v2.0.2/billing-functions/mod.ts";

serve(async (req) => {
    if (req.method === "OPTIONS") {
        return new Response("ok", {headers: corsHeaders});
    }

    const body = await req.json();

    const response = await requireAccountMember(req, {
            accountId: body.account_id,
            allowedRoles: ["owner", "member"],
            onBlocked:
                () => new Response("Unauthorized", {status: 401}),
            onAuthorized:
                async (supabaseClient) => {
                    return new Response("Authorized", {status: 200});
                },
            onError:
                (error) => new Response(error.message, {status: 500}),
        })
    ;

    return response;
});

Creating your own Billing adapters

Out of the box, Basejump provides support for a Stripe billing adapter. But there’s no reason you can’t provide your own adapters for other services, such as Lemon Squeezy.

Billing adapters should implement a client facing Edge function for handling requests as well as a webhook edge function for keeping subscriptions up to date.

Custom Billing Edge function

An Edge Function responsible for handling specific requests from the client applications.

export default function customBillingEndpoint(config) {
    return {
        async getPlans({
                           accountId, subscriptionId, customerId
                       }) {
            // Get available plans from your provider
            return {
                plans: [
                    {
                        id: "plan_123",
                        name: "Plan 123",
                        description: "Plan 123",
                        amount: 1000,
                        currency: "usd",
                        interval: "month",
                        interval_count: 1,
                        trial_period_days: 30,
                        metadata: {},
                    },
                ],
            };
        },
        async getBillingPortalUrl({accountId, subscriptionId, customerId}) {
            // load the billing portal url from your provider
            return {
                url: "https://example.com/billing-portal",
            };
        },
        async getNewSubscriptionUrl({accountId, email, planId}) {
            // load the new subscription url from your provider
            return {
                url: "https://example.com/new-subscription",
            };
        },
        async getBillingStatus({accountId, subscriptionId, customerId}) {
            // load the billing status from your provider
            return {
                customer: {
                    id: "cus_123",
                    email: "test@test.com"
                },
                subscription: {
                    id: "sub_123",
                    status: "active",
                    plan_name: "Plan 123",
                    ...
                }
            };
        },
    };
}

Custom Billing Webhook function

Responsible for receiving webhooks from the billing platform and updating customer/subscription objects

export default function customBillingWebhookEndpoint(config) {
    return {
        async handleEvent(req) {
            // handle the event from your provider
            return {
                customer: {
                    id: "cus_123",
                    email: "test@test.com"
                },
                subscription: {
                    id: "sub_123",
                    status: "active",
                    plan_name: "Plan 123",
                    ...
                }
            }
        }
    };
}