Facturación y Monetización

Flujo de Suscripción

Cómo los comerciantes se suscriben a los planes de precios de tu plugin usando la API de facturación del App Bridge.

Descripción General

Las suscripciones se inician desde dentro de tu plugin usando la API de facturación del App Bridge. La plataforma gestiona la página de aprobación, la configuración de pago y los eventos del ciclo de vida. Tu plugin lee el estado de la suscripción y reacciona a él.

Paso 1 — Mostrar Planes Disponibles

Obtén tus planes y muéstralos al comerciante:

import { useAppBridge } from "@whatalo/plugin-sdk/bridge";

function PricingPage() {
  const bridge = useAppBridge();

  async function loadPlans() {
    const plans = await bridge.billing.getPlans();
    // plans: BillingPlanResponse[]
    // [{ slug, name, price, currency, interval, trialDays, features, isPopular }]
  }
}

Paso 2 — Solicitar una Suscripción

Llama a requestSubscription con un slug de plan. Esto envía una acción de facturación al host del administrador, que redirige al comerciante a una página de aprobación.

async function handleSubscribe(planSlug: string) {
  try {
    await bridge.billing.requestSubscription(planSlug);
    // El host gestiona la redirección — esta función puede no retornar
    // si la página navega durante la aprobación
  } catch (error) {
    bridge.toast.show("No se pudo iniciar la suscripción", { variant: "error" });
  }
}

El comerciante ve los detalles del plan, el precio y la información de la prueba, luego confirma o cancela. Tu plugin no necesita gestionar la redirección de aprobación — la plataforma lo administra.

Paso 3 — Verificar el Estado de la Suscripción

Después de que el comerciante aprueba, lee la suscripción activa:

const sub = await bridge.billing.getSubscription();

if (!sub) {
  // No hay suscripción activa para esta instalación
  return;
}

console.log(sub.status);            // "trialing", "active", etc.
console.log(sub.planSlug);          // "pro"
console.log(sub.planName);          // "Pro"
console.log(sub.trialEndsAt);       // ISO date string o null
console.log(sub.cancelAtPeriodEnd); // boolean

Estados de Suscripción

EstadoDescripción
pendingEsperando aprobación del comerciante en la página de confirmación
trialingEn el período de prueba gratuita — el comerciante no es cobrado
activeFacturación activa, el comerciante es cobrado en cada ciclo
past_dueUn pago falló — el sistema de facturación está reintentando
canceledLa suscripción ha terminado
expiredEl período de prueba o facturación terminó sin renovación

Cancelación

Cancela una suscripción al final del período de facturación actual. El comerciante mantiene acceso completo hasta que termine el período:

await bridge.billing.cancelSubscription();

Después de la cancelación, sub.cancelAtPeriodEnd es true y sub.canceledAt contiene la marca de tiempo. El comerciante no vuelve a ser cobrado después del período actual.

Reactivación

Mientras la suscripción aún está en su período activo, el comerciante puede deshacer una cancelación:

await bridge.billing.reactivateSubscription();

Tras la reactivación, cancelAtPeriodEnd vuelve a false.

Cambio de Plan

Cambia al comerciante a un plan diferente. Se aplica prorrateo: el comerciante recibe crédito por el tiempo no utilizado en el plan actual, aplicado inmediatamente al nuevo plan:

await bridge.billing.switchPlan("enterprise");

Forma de la Respuesta de Suscripción

interface BillingSubscriptionResponse {
  planSlug: string;
  planName: string;
  /** "pending" | "trialing" | "active" | "past_due" | "canceled" | "expired" */
  status: string;
  trialEndsAt: string | null;        // ISO timestamp o null
  currentPeriodEnd: string | null;   // ISO timestamp o null
  cancelAtPeriodEnd: boolean;
  canceledAt: string | null;         // ISO timestamp o null
}

Manejo de Errores

Todos los métodos de facturación lanzan excepciones en caso de falla. Usa try/catch:

try {
  await bridge.billing.cancelSubscription();
  bridge.toast.show("Suscripción cancelada", { variant: "success" });
} catch (error) {
  bridge.toast.show("No se pudo cancelar la suscripción", { variant: "error" });
}

Los métodos de facturación no devuelven { success: false } — lanzan excepciones, por lo que aplica el manejo de errores estándar.

Restringir Características por Suscripción

Usa getSubscription para mostrar funcionalidades premium condicionalmente:

function Dashboard() {
  const bridge = useAppBridge();
  const [sub, setSub] = useState<BillingSubscriptionResponse | null>(null);

  useEffect(() => {
    bridge.billing.getSubscription().then(setSub);
  }, []);

  const isActive = sub?.status === "active" || sub?.status === "trialing";

  return isActive ? <PremiumContent /> : <UpgradePrompt />;
}

On this page