Skip to content

Changelog

Guapocado is pre-1.0. While on 0.0.x, any release may contain breaking changes — pin exact versions. The full changelog lives in CHANGELOG.md.

  • @guapocado/better-auth now preserves the selected user, organization, or team ID unchanged as customerId. It no longer adds a source prefix. Use mapCustomerId when an integration intentionally needs a namespace or a dedicated billing ID.
  • CLI environment flags renamed to match the platform’s test/live vocabulary: --sandbox--test, --production--live on push/pull/plan/generate/listen/diff. The old flags still work as deprecated aliases. When no environment flag is given, the CLI now prompts (or errors Specify --test or --live) instead of defaulting. Existing credentials.json files keep working without re-login.
  • @guapocado/sdk — a batteries-included, store-backed local read model: createGuapLocal({ apiKey, store?, webhook?, hooks? }) returns a concrete GuapAdapter, a fetch-shaped webhook receiver (handler), a projection test seam (project), and an explicit register. Verifies the guapocado-signature header, dedupes deliveries by event id, and projects domain events into a minimal GuapStore (get/put/delete/listByPrefix) using last-write-wins ordering on the event’s createdAt. createMemoryGuapStore() ships an in-memory implementation; testGuapStoreContract (from @guapocado/sdk/testing) validates a custom SQL/KV-backed store against the same contract suite. createGuapocadoClientWithLocal is the one-liner that wires the adapter in and attaches .handler to the returned client. New webhook endpoints register pending_approval until approved in the dashboard — reads stay correct via API miss-through in the meantime.
  • @guapocado/sdkwebhook hooks: guap.handler({ ... }) runs your functions after an event is verified and projected, no polling required. Catch-all onEvent; raw per-event hooks (onCustomerUpdated, onSubscriptionUpdated, onPurchaseCompleted, onPurchaseUpdated, onEntitlementsUpdated, onInvoiceUpdated); and semantic transition hooks derived from the previously stored record (onSubscribe, onCancel, onPlanChange, onPurchase). Hooks run after projection but before the delivery is marked handled, so a throwing hook causes a 500 and an at-least-once retry re-fires it — hooks must be idempotent.
  • @guapocado/sdkverifyGuapocadoSignature, extracted from @guapocado/better-auth’s internal HMAC check, so any receiver can verify a Guapocado webhook signature the same way the platform does.
  • @guapocado/honoguapLocalHandler(local, hooks?) adapts a GuapLocal’s handler into a one-line Hono route mount.
  • @guapocado/better-auth now requires better-auth ^1.6.11 (peer dependency was >=1.0.0). Older cores caused type-inference and runtime mismatches.
  • @guapocado/better-auth no longer declares its own id on the webhook tables — Better Auth adds the primary key. If you generated schema from 0.0.1, re-run better-auth generate; the old output created a duplicate-id table.
  • guap login dropped --sandbox / --production. One login authorizes a workspace and mints both keys; use guap workspace select to switch. Keys stay environment-scoped.
  • Stripe Connect is the only connection method now (the manual API-key method was removed — the take-rate can’t be charged without the Connect relationship), and it is per environment: sandbox and production are separate authorizations.
  • Checkout returns 409 for a mode: "custom" tier unless the customer has an enterprise contract supplying an inline price.
  • mode: "custom" (“contact us”) pricing — a tier with no Stripe price, sold via an enterprise deal.
  • guap … --config <path> (alias -c) on push, plan, generate, and listen.
  • guap workspace list / guap workspace select.
  • Exported @guapocado/better-auth client result types.
  • authClient.guapocado.* returns Better Auth’s { data, error } envelope. (The standalone @guapocado/sdk server client still returns values directly and throws GuapocadoError.)