Next.js

Use Plandalf from Next.js App Router or Pages Router with next/script, client components, identity, and checkout attributes.

Use Plandalf in client-rendered parts of your Next.js app. Load the organization SDK with next/script, render normal React buttons with Plandalf attributes, and keep identity or API work on the server.

The SDK runs in the browser

Checkout buttons, inline mounts, and promo widgets are browser behavior. Server routes are useful for signing identity tokens or creating backend records, not for opening checkout frames.

The path

  1. Use next/script with afterInteractive in your root layout or the route that contains checkout.

  2. Start with a normal button that has data-plandalf-present.

  3. If checkout should know the logged-in customer, sign a JWT in a route handler or server action, then pass it to a client component.

  4. Add data-plandalf-mode="test" or call present() with { mode: "test" } while validating the route.

App Router setup

Next.js checkout route

import Script from "next/script";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html>
      <body>
        {children}
        <Script
          src="https://acme.plandalf.com/js/plandalf-sdk.js"
          strategy="afterInteractive"
        />
      </body>
    </html>
  );
}
"use client";

export function BuyButton() {
  return (
    <button
      data-plandalf-present="pro-plan"
      data-plandalf-frame="slideout"
      data-plandalf-mode="test"
    >
      Buy Pro
    </button>
  );
}
// Server-only helper. Sign with your Plandalf API credentials.
export async function createPlandalfIdentity(user: {
  id: string;
  email: string;
}) {
  return signPlandalfJwt({
    external_id: user.id,
    email: user.email
  });
}

Programmatic checkout

Use direct SDK calls when a click needs app logic before checkout opens.

"use client";

export function UpgradeButton({ userJwt }: { userJwt?: string }) {
  async function upgrade() {
    const flow = plandalf.present("pro-plan", {
      user: userJwt,
      frame: "modal",
      mode: "test"
    });

    for await (const event of flow.events) {
      console.log(event.type);
    }

    await flow;
  }

  return <button onClick={upgrade}>Upgrade</button>;
}

Next.js boundaries

Fields
Server routesAPI keys and JWT signing

Keep API credentials and identity signing off the browser.

Client componentscheckout UI

Render buttons, inline checkout containers, and SDK method calls from browser code.

Environmenttest | live | preview

Use test mode before you expose the route to real buyers.

Builder context

Connect platform setup to the full stack.

Platform docs explain where an external system fits. The related surfaces show how integrations, offers, payments, invoices, and automation stay visible in Plandalf.

The Numi platform settings screen showing connected stack configuration.
Integrations keep external systems visible to the operator.
The Numi integrations settings page showing Stripe, PayPal, Stripe test mode, TaxJar, and Avalara connection options.
Payment processors and tax services are configured before checkout traffic goes live.
The Numi offer editor automation tab showing sequence controls beside the checkout canvas.
Automations decide what happens after the connected platform sends or receives purchase context.

Feature detail