Skip to content

Changelog ​

payments-recurring-core 0.2.9 - Default allowance cap 3× (was 12×) ​

defaultAllowanceCapUsdc now approves 3 billing periods of USDC (month/week/year/five_minute), not 12. New checkouts only; existing mandates keep their stored cap.

bash
pnpm --filter @autlantic/payments-recurring-core publish --access public --no-git-checks
# then republish chain-evm / billing-engine / payments-recurring against 0.2.9 and bump hosting pins

chain-evm 0.2.17 - Charge when this period is payable (use this, not 0.2.16) ​

Same as 0.2.16: preflightLiveCharge no longer hard-blocks on the rolling cap when leftover approval still covers this invoice.

Do not use 0.2.16. It was published with bare npm publish and left a broken workspace:* dependency on npm. Use 0.2.17 (pnpm publish so deps resolve to [email protected]).

bash
pnpm --filter @autlantic/chain-evm publish --access public --no-git-checks
# bump billing-hosting pins to [email protected]

chain-evm 0.2.16 - BROKEN publish (workspace:* deps) ​

Published incorrectly via npm publish. Use 0.2.17 instead.

billing-engine 0.3.19 / chain-evm 0.2.15 / payments-recurring-core 0.2.8 - Quiet defer for CHARGE_NOT_DUE ​

Renewal worker must not treat vault NOT_DUE (off-chain due clock ahead of on-chain periodEnd) as a failed customer payment.

  • Core: first-class CHARGE_NOT_DUE, isChargeNotDueFailure, deferRetryAtFromOnChainPeriodEnd
  • chain-evm: preflightLiveCharge returns CHARGE_NOT_DUE + periodEndUnix (no longer RELAYER_ERROR)
  • Engine: deferInvoiceUntilOnChainDue; processDueInvoicesLive accepts { defer: true, retryAt } and never emits invoice.payment_failed / burns attempts for not-due
  • Aligns off-chain dueAt / currentPeriodEnd forward to on-chain periodEnd when deferring
  • Hosting must bump pins and return defer from the live submit callback; platform must skip renewal_payment_failed email for not-due (defense in depth)
bash
pnpm --filter @autlantic/payments-recurring-core publish --access public --no-git-checks
pnpm --filter @autlantic/chain-evm publish --access public --no-git-checks
pnpm --filter @autlantic/billing-engine publish --access public --no-git-checks
pnpm --filter @autlantic/payments-recurring publish --access public --no-git-checks
# bump billing-hosting pins; wire worker defer; platform notify skip

billing-engine 0.3.18 / chain-evm 0.2.14 - Checkout vault bind + one-time txHash exclusivity ​

P0 money-finalization hardening for hosted checkout:

  • setOnChainSubscriptionId refuses an on-chain id already owned by another non-canceled subscription
  • listAllOneTimePayments + findOneTimePaymentByTxHash; confirmOneTimePayment rejects reused live 0x hashes
  • assertVaultSubscriptionMatchesCheckout verifies vault customer / merchant / amount before activate bind
bash
pnpm --filter @autlantic/chain-evm publish --access public --no-git-checks
pnpm --filter @autlantic/billing-engine publish --access public --no-git-checks
# bump billing-hosting pins to [email protected] and [email protected]

billing-engine 0.3.15 / payments-recurring 0.3.16 - cancelSubscriptionsMatching ​

Enterprise store offboarding: cancel all merchant subscriptions for a metadata.creatorId.

  • Engine: cancelSubscriptionsMatching({ merchantId, creatorId, billingKinds?, immediate?, reason?, statuses? })
  • Immediate cancel voids open invoices; attemptInvoiceCharge / due processors skip canceled subscriptions
  • SDK: AutlanticBilling.cancelSubscriptionsMatching(...) → POST /v1/subscriptions/cancel-matching
  • Idempotent: already-canceled rows return in alreadyTerminal
  • Metadata: Autlantic uses billingKind = platform | platform_lifetime | creator_membership | creator_pass plus creatorId
bash
pnpm --filter @autlantic/billing-engine publish --access public --no-git-checks
pnpm --filter @autlantic/payments-recurring publish --access public --no-git-checks
# bump billing-hosting + Autlantic platform pins

billing-engine 0.3.14 - Workspace bands, plan-change proration, and usage metering ​

Published on npm. Hosting pins 0.3.14 and wires portal/API/ops; Autlantic platform pin bump is optional (feature is hosting-side).

Workspace bands (Phase 1) ​

  • Exported workspace band constants: Live free 100 successful charges / UTC month, Growth $49 USDC/month, 7-day soft overage grace, error code workspace_plan_required
  • Pure helpers: isLiveFreeBandExceeded, workspaceEntitlementFromState, countsTowardLiveSuccessfulCharges, isWorkspaceGrowthFeeMetadata, utcMonthKey
  • Test mode never enforces bands; Growth fee metadata is excluded from the free-band counter
  • No % take rate (flat workspace fee only)

Plan-change proration (Phase 4) ​

  • previewPlanChangeProration / changeSubscriptionPlan for mid-cycle upgrades and downgrades
  • Credits unused time on the old plan, charges remaining time on the new plan; net due floored at 0 with leftover credit in invoice metadata
  • Hosting: POST /v1/subscriptions/:id/change-plan (priceId or amountUsdc)

Usage metering (Phase 5) ​

  • createUsageRecord, aggregateUsageQuantity, usageAmountUsdc, aggregateUsageIntoInvoice, createMemoryUsageStore
  • Metered quantity aggregation into open invoices (idempotent keys, increment/set actions)
  • Hosting: POST /v1/usage_records, GET /v1/subscriptions/:id/usage, POST /v1/subscriptions/:id/usage/aggregate
bash
pnpm --filter @autlantic/billing-engine publish --access public --no-git-checks
# bump billing-hosting pins to billing-engine 0.3.14

payments-recurring 0.3.15 - couponCode on create ​

  • CreateSubscriptionRequest.couponCode / CreatePaymentRequest.couponCode (optional)
  • Hosted API applies the coupon at create (same math as checkout apply; duration: once → first open invoice / payment only)
  • Local sandbox stores couponCode in metadata only (no coupon store)
bash
pnpm --filter @autlantic/payments-recurring publish --access public --no-git-checks
# bump billing-hosting + Autlantic platform pins to 0.3.15
  • replaceSnapshot on memory + write-through stores: full in-memory replace without queuing Prisma upserts
  • reloadPersistedBillingStore uses replaceSnapshot so portal delete + concurrent reload cannot resurrect rows
  • Fixes inconsistent Payment links UI (deleted links returning on refresh; empty vs disabled flicker)
bash
pnpm --filter @autlantic/billing-engine publish --access public --no-git-checks
# bump billing-hosting pins to 0.3.13

billing-engine 0.3.12 - Correct npm publish (pnpm) ​

  • Republish payment-link flush/edit/delete after 0.3.11 was published with npm publish and left broken workspace:* dependency ranges
  • Always use pnpm --filter @autlantic/billing-engine publish so peer workspace deps rewrite to registry versions
bash
pnpm --filter @autlantic/billing-engine publish --access public
# bump billing-hosting pins to 0.3.12

Published incorrectly via npm publish (workspace:* deps). Use 0.3.12 instead.

  • flushBillingStorePersist: await write-through Prisma/file queue so portal disable survives reload
  • updatePaymentLink / deletePaymentLink for merchant-editable fields and hard delete
  • resolvePaymentLinkStatus treats disabledAt as disabled

Docs - Magento Packagist, Woo 1.1.3, Shopify custom wiring ​

  • Magento install is Packagist-first: composer require autlantic/module-billing:^1.1 (Packagist 1.1.0)
  • WooCommerce docs/examples use zip 1.1.3
  • Commerce plugins: Shopify custom wiring (SDK + payment links + Admin API) while native checkout stays blocked (external) on Payments Partner
  • Languages matrix and SDK README aligned

billing-engine 0.3.10 - Incomplete checkout reuse and expiry ​

  • createOrReuseSubscription: resume the same incomplete checkout for the same merchantRef (or plan + customer) instead of minting duplicates
  • expireIncompleteCheckouts: cancel abandoned incomplete sessions after 24h (configurable) and void open invoices
  • processDueInvoicesLive: skip incomplete checkouts that never called vault.subscribe() so they are not charged or emailed as renewals
bash
pnpm --filter @autlantic/billing-engine publish --access public
# bump billing-hosting pins to 0.3.10, then deploy billing-api + billing-worker

Docs - Commerce plugins (WooCommerce, Magento, Shopify) ​

0.3.14 / core 0.2.7 / chain-evm 0.2.11 / billing-engine 0.3.6 - Fractional allowance caps ​

  • Round default allowance caps to 6 USDC decimals (fixes 0.1 × 12 float noise)
  • Compare allowance / balance checks in USDC micros in @autlantic/chain-evm preflight
bash
pnpm publish:sdk
# bump billing-hosting + Autlantic platform pins, then pnpm install

0.3.13 - Catalog product/price writes and coupon CRUD (npm pending) ​

Hosted /v1/coupons is live. Client helpers and catalog writes land in @autlantic/payments-recurring 0.3.13 on main but are not on npm yet (latest published: 0.3.12). Until publish, call HTTP directly or pin from git.

  • SDK (source): createProduct, updateProduct, createPrice, updatePrice; listProducts({ includeInactive }); listCoupons, createCoupon, updateCoupon, deleteCoupon
  • Hosted API: POST/PATCH /v1/products, POST /v1/products/:id/prices, PATCH /v1/prices/:id, GET /v1/products?includeInactive=1
  • Catalog intervals on write: month | year | once | week | five_minute
  • Coupons HTTP: GET/POST /v1/coupons, PATCH/DELETE /v1/coupons/:id (optional scopeKey, metadata, expiresAt)
  • OpenAPI: /v1/coupons + BillingCoupon. Guide: Coupons. Creator/platform metadata: source, creatorId, planId, oncePerMember. Billing is coupon SoT.

Publish when ready (OTP on npm):

bash
cd /path/to/payments-sdk
git checkout main && git pull
pnpm publish:sdk
# then: promote main → production for docs; bump Autlantic platform pin to 0.3.13

Docs - Registries, status, and trust ​

Package versions still 0.3.12 on npm until 0.3.13 publishes. Documents registry publishes, status, and portal/trust docs since 0.3.12:

0.3.12 - Multi-language and mobile SDKs ​

  • @autlantic/payments-recurring 0.3.12 on npm: AUTLANTIC_API_VERSION (2026-01-01), Autlantic-Version header, successUrl / cancelUrl on create subscription, payment, and payment link
  • Hosted API live pin: Autlantic-Version: 2026-01-01 on billing.autlantic.com
  • Python: autlantic-billing 0.1.0 on PyPI
  • Go: module tag sdks/go/v0.1.0
  • PHP: autlantic/billing 0.1.0 (sdks/php / sdks/php/v0.1.0)
  • iOS Checkout (SPM): tag sdks/ios/v0.1.0 · iOS docs
  • Android Checkout: source in sdks/android · Android docs (Maven Central pending)
  • Docs: Languages, Mobile, API versioning, Python, Go
  • Example: examples/mobile-checkout (pnpm example:mobile) with openable iOS/Android apps and Python/Go hosted backends
  • Autlantic platform dogfood pin: @autlantic/payments-recurring 0.3.12

0.3.11 - Fix npm dependency pins ​

  • Republish with resolved semver deps (0.3.10 tarball incorrectly contained workspace:*)
  • npm README: Autlantic Limited operator line, About, Terms, Privacy, and Billing Terms links
  • Root README and LICENSE: copyright holder Autlantic Limited (UK co. 17422039)

0.3.7 - Portal webhooks only ​

  • Removed deprecated billingWebhookUrl() / AUTLANTIC_BILLING_WEBHOOK_URL delivery helper from @autlantic/billing-engine
  • Docs and npm README: merchants register webhook URL + secret in the portal; billing delivers only via those endpoints
  • @autlantic/billing-engine 0.3.5, @autlantic/payments-recurring 0.3.7

0.3.6 - Mode from API key ​

  • fromEnv() sandbox follows API key mode (abk_test_* / abk_live_*); live break-glass via AUTLANTIC_BILLING_ALLOW_LIVE_SANDBOX
  • Helpers: billingModeFromApiKey, sandboxFromApiKeyAndEnv
  • @autlantic/payments-recurring 0.3.6

0.3.5 - Resume + first-period charge fix ​

  • resumeSubscription(id) undoes cancel-at-period-end (hosted POST /v1/subscriptions/:id/resume)
  • First invoice payment no longer advances currentPeriodStart / currentPeriodEnd (renewals still advance)
  • @autlantic/billing-engine 0.3.4, @autlantic/payments-recurring 0.3.5

0.3.4 - Unwrap getSubscription / getInvoice ​

  • getSubscription and getInvoice now return the resource object (same as getPayment), not the { subscription } / { invoice } API wrapper
  • Fixes remote-mode ownership checks that read metadata / status on an undefined nested object

0.3.3 - Docs and npm positioning ​

  • npm / README: non-custodial settlement, relayer gas-only wording, product security links
  • Docs: Test / Live wording without Stripe-as-model framing; example store custody notes
  • Package versions: @autlantic/payments-recurring / @autlantic/billing-engine 0.3.3, @autlantic/chain-evm 0.2.8

0.3.2 - Enterprise SDK diagnostics ​

  • Pluggable BillingLogger + opt-in debug / AUTLANTIC_BILLING_DEBUG
  • Redacted HTTP request/response traces (X-Autlantic-Client-Request-Id, sdk version header)
  • Typed AutlanticBillingError (code, type, statusCode, requestId)
  • Webhook verifyBillingWebhookDetailed, parseBillingWebhookEventDetailed, assertBillingWebhook
  • Write-through store persist failures no longer hardcode console.error (optional onPersistError)
  • logRelayerIntent is silent unless a log fn is passed
  • Docs: Debugging; fixed webhook verify argument order
  • Docs DX: 15-minute integration, Local webhooks, FAQ, OpenAPI, Postman

Package versions: @autlantic/payments-recurring / @autlantic/billing-engine 0.3.2, @autlantic/chain-evm 0.2.7.

0.3.1 - Align engine with hosted portal / billing ​

Upstream features required by Autlantic hosted billing (portal, API, worker) so npm matches production behavior:

  • Test/Live mode on customers, subscriptions, invoices, and one-time payments
  • resumeSubscription for cancel-at-period-end undo
  • chainIdForBillingMode("test" | "live") (Sepolia vs Base)
  • processDueInvoices / processDueInvoicesLive optional mode filter
  • Checkout session extras: coupons, listAmountUsdc, nextPaymentAt, merchant branding
  • BillingPersistAdapter.loadPaymentLink? for cross-process link loads
  • Payment links stamp mode on minted one-time payments

Package versions: @autlantic/payments-recurring / @autlantic/billing-engine 0.3.1, @autlantic/payments-recurring-core / @autlantic/chain-evm 0.2.6.

  • Shareable payment links: fixed USDC amount, optional max uses / expiry
  • SDK: createPaymentLink, listPaymentLinks, getPaymentLink, disablePaymentLink, openPaymentLink
  • Hosted: POST /v1/payment-links, public /checkout/link/:id (opens into one-time pay checkout)
  • Merchant portal: Payment links page with copy URL and QR
  • Webhooks: payment.created / payment.paid when a link is opened and paid
  • E2E smoke: pnpm test:e2e:payment-links

Docs - Test / Live API keys ​

  • Document Test and Live: portal toggle, abk_test_ / abk_live_ keys, Sepolia vs Base mainnet
  • Webhook docs use per-mode endpoint signing secrets
  • Clarify AUTLANTIC_BILLING_SANDBOX is not the primary hosted mode switch

0.2.6 - Catalog products + example store ​

  • listProducts() and priceId on createSubscription
  • Hosted GET /v1/products
  • Example storefront in the public payments-sdk repo

0.2.1 - Public docs alignment ​

  • Marketing and getting-started samples match the real AutlanticBilling API
  • Clarify that activateSubscription charges the first invoice
  • Docs site no longer links to the private GitHub repo

0.2.0 - Recurring USDC on Base ​

  • @autlantic/payments-recurring merchant SDK
  • @autlantic/payments-recurring-core types and retry policy
  • @autlantic/chain-evm Base + USDC adapter
  • @autlantic/billing-engine subscriptions, invoices, webhooks
  • Hosted billing-api and billing-worker

0.1.x - Legacy (removed) ​

Tron USDT one-off checkout (@autlantic/payments, @autlantic/chain-tron) has been removed from this monorepo.