npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@uselark/better-auth-lark

v0.1.5

Published

Create customers and subscribe them to free plan with lark billing on signup

Readme

Better Auth Lark Plugin

A Lark billing plugin for Better Auth that automatically creates customers and subscribes them to free plans on signup.

Installation

npm i lark-billing
npm i @uselark/better-auth-lark

Core plugin

Setup

To use the Better Auth Lark plugin, you need to simply initialized the lark client and configure the plugin with options.

import { betterAuth } from "better-auth";
import LarkClient from "lark-billing";
import { lark } from "better-auth-lark";

const larkSdkClient = new LarkClient({
  apiKey: "YOUR_API_KEY_FROM_ENV_VARS",
});

const larkPlugin = lark({
    larkClient: larkSdkClient,
    createCustomerOnSignUp: true,
    freePlanRateCardId: "FREE_PLAN_RATE_CARD_ID",
});

export const auth = betterAuth({
  plugins: [larkPlugin],
});

Configuration options

  • larkSdkClient: Initialize the Lark billing client with your private API key from env vars and pass it here.
  • createCustomerOnSignUp: If true then on customer sign up a lark subject will automatically be created with lark using their name, email, and external id being better auth user.id.
  • freePlanRateCardInfo: You can optionally specify a rate card that you want all customers to get subscribed to on sign up. This rate card should have $0 fixed fees because otherwise users would have to go through a checkout flow to get subscribed and that isn't yet supported on signup. You'll need to pass in freePlanRateCardId and fixedRateQuantities as params to pass in to the create subscription api.

Client plugin

You can also use the lark client plugin to easily handle subscription cancellations, upgrades, etc.

Setup

import { createAuthClient } from "better-auth/react";
import { larkClient } from "@uselark/better-auth-lark";

export const authClient = createAuthClient({
  baseURL: process.env.NEXT_PUBLIC_BETTER_AUTH_URL || "http://localhost:3000",
  plugins: [larkClient()],
});

Usage

Subscribe to a plan

If you haven't configured the lark plugin to automatically subscribe new users to a free plan on sign by setting freePlanRateCardInfo, then you can subscribe them to a plan on demand.

const { data, error } =  authClient.larkBillingPlugin..createSubscription({
  rate_card_id: plan.rateCardId,
  fixed_rate_quantities: { "rate_quantity_code": 1 },
  checkout_callback_urls: {
    cancelled_url: currentUrl,
    success_url: currentUrl,
  },
}); 

if (error) {
  alert(error.message)
}

if (data?.result?.result_type === "requires_action" && data.result.action?.checkout_url) {
  // Redirect to checkout
  window.location.href = data.result.action.checkout_url;
  return;
} else if (data?.result?.result_type === "success") {
  alert("Successfully subscribed customer")
}

Upgrade plan

If a customer is already subscribed to a plan, you can change the rate card they are subscribed to facilitate upgrades. If a payment method doesn't exist on file for customer, then the customer will be redirect to a checkout to confirm the upgrade.

const { data, error } = await larkBillingPlugin.changeRateCard({
  subscription_id: subscriptionId,
  rate_card_id: plan.rateCardId,
  cancelled_url: currentUrl,
  success_url: currentUrl,
});

if (error) {
  alert(error.message)
}

if (data?.result?.result_type === "requires_action" && data.result.action?.checkout_url) {
  // Redirect to checkout
  window.location.href = data.result.action.checkout_url;
  return;
} else if (data?.result?.result_type === "success") {
  alert("Successfully subscribed customer")
}

Get billing state

To check entitlements for a customer you can fetch the billing state for them at any point.

const { data, error } = await larkBillingPlugin.getBillingState();

if (error) {
  alert(error.message)
}
const active_subscriptions = {data}

Cancel a subscription

You can suppot subscription cancellation with a single line in your app.

const { data, error } = await larkBillingPlugin.cancelSubscription({
  subscription_id: subscriptionId,
  reason: "User requested cancellation",
});

if (error) {
  alert(error.message)
}

alert("Subscription cancelled successfully")

Redirect to billing portal

You can also redirect a customer to the lark customer portal where they can view their upcoming bill, past invoices, etc.

const { data, error } = await larkBillingPlugin.createCustomerPortalSession({
  return_url: currentUrl,
});

if (error) {
  alert(error.message)
}

// Redirect to portal
window.location.href = data.url;

List recent invoices

If you want to show the customer their past few invoices, you can fetch them with a single command.

const { data, error } = await larkBillingPlugin.listRecentInvoices({
  return_url: currentUrl,
});

if (error) {
  alert(error.message)
}

const {invoices} = data

Learn more?

Visit docs.uselark.ai to learn more about lark billing integration. We provide frontend SDKs to fetch billing state and have simple APIs for subscription management.