Customers who pay by link and have no email
- Customers have a new field,
payment_collection_warning, in the REST payload, in thecustomer.*webhooks and in GraphQL (Customer.paymentCollectionWarning). It isbilling_entity_email_missingorcustomer_email_missingwhen the customer pays each invoice by link (Razorpay, or Stripe without a saved payment method) and no email can carry the link. It isnullotherwise. - While it is set, the automatic payment request of an invoice is skipped. Nozle then sends
invoice.payment_failurefor that invoice, once per invoice, with the same value inprovider_error.error_code, and notifies the team. Add an email to the billing entity or the customer to fix it. POST /payment_requestsnow accepts a finalized unpaid invoice of a Razorpay customer before it is overdue, because the pay link is the only way to collect it. Other providers still answer422 invoices_not_overdue, and so does a paid or draft invoice.
Saved card data is removed
- Nozle no longer stores card display data. Stripe and Moneyhash events keep the provider ids and the method type only, so the brand, last digits, expiry, holder name and issuer are gone from payment methods and payments. The receipt PDF shows no card details, and the Factur-X invoice has no card section.
- On deploy, a background job clears the values stored before from payment methods and payments, in batches. It keeps provider ids, the method type and the Razorpay mandate fields. Re-syncing from the provider is the only way back.
- GraphQL
PaymentMethodDetails.brand,last4,expirationMonthandexpirationYearare deprecated and alwaysnull. DELETE /customers/{external_customer_id}/payment_methods/{id}and thedestroyPaymentMethodmutation answer410withcode: payment_method_managed_by_providerfor a Stripe or other card provider, and ahintthat points to manage a customer payment method. Removing a card only hid it in Nozle while it stayed attached at the provider. Razorpay still cancels the mandate.
Margin floor removed
min_margin_percent, margin_enforcement_mode and enforce_plan_margin are no longer in plan and subscription entitlements, in the public plan catalog or in GraphQL PlanEntitlement. A request body or a GraphQL EntitlementInput that still sends them is accepted and the values are ignored, so an old client gets no error. The plan_config entitlement is gone: the GraphQL createOrUpdatePlanConfig and deletePlanConfig mutations, PlanConfigObject and Plan.planConfig.
Workspace upgrade at the MRR limit
When the tracked MRR of a Nozle workspace passes its plan limit, the workspace moves to the next plan at once, with or without a saved payment method and with unpaid earlier invoices. The change invoice is collected like any invoice, so the workspace can use the higher plan before it is paid. An upgrade you start yourself still waits for its payment. See MRR limit and automatic upgrade.Revenue labels and invoiced revenue
- Engine 2.3.0 labels the usage estimate.
GET /analytics/overviewreturnstotal_revenue_basis(estimated_usage) andtotal_revenue_estimated(true).top-customers,top-plans,revenue-by-plan,revenue-trendandmargin-trendreturn a top-levelbasisandestimated. basis=invoicedontop-customers,top-plans,revenue-by-planandrevenue-trendanswers from the fees of finalized invoices, in onecurrency. See Overview revenue. Anotherbasisanswers400 invalid_basis.- GraphQL. The revenue queries take optional
basisandcurrencyarguments. Their rows gainbasis,estimated,currencyand, on plan rows,planName.NozleAnalyticsOverviewgainstotalRevenueBasis,totalRevenueEstimated,invoicedRevenueCents,previousPeriodInvoicedRevenueCents,invoicedRevenueMomPercent,invoicedRevenueByCurrency(currency,revenueCents,previousPeriodRevenueCents,momPercent),periodStart,periodEnd,previousPeriodStartandpreviousPeriodEnd(YYYY-MM-DD). All of them are nullable: they arenullfrom an Engine that does not return them, andcostCents,marginPercentandeventsof a top customer arenullfor an invoiced answer.