E-commerce 6.1.8

26 August 2026

MOBILECOMPLIANCEPRODUCTSDOWNLOADS

E-commerce v6.1.8

Release Date: August 26, 2026 Tags: MOBILE, COMPLIANCE, PRODUCTS, DOWNLOADS

Overview

Digital products do not exist for the mobile app. Apple exempts physical goods consumed outside the app from in-app purchase; a file you download is not physical, so the in-app-purchase rule governs it — and this store charges a custodial wallet at checkout, which that rule names verbatim as a forbidden unlock mechanism. Play's payments policy reaches the same product. A store selling physical goods from a phone is fine; the same store selling a downloadable file from the same phone is the violation.

The Flutter build already filtered downloadable products out of the lists it rendered, and that filter was the only thing in the way: the server would list a digital product, sell it, mark the order complete and stream the bytes to a phone that asked directly. That is the shape this platform treats as worse than doing nothing — hidden in the interface, honoured at the endpoint.

Nothing changes on the web. Requires Core v6.7.2.

Update Instructions

pnpm updator

Restart the backend. There is no database change and no configuration.


Changed

The app is never shown, sold or handed a digital product

  • Changed every list that can carry one to remove digital products before a native client sees them: the product list, a category's products, the nested products on a category, the landing data, the wishlist, order history and an order's items.
  • Changed the landing statistics to report zero digital products to a native client, so the count cannot contradict the catalogue beside it on the same screen.
  • Changed checkout, order creation and both download doors to refuse a native client with a 403 that explains itself. Somebody reaching those did try to buy or fetch something.
  • Changed a digital product's own detail page to answer 404 to a native client. That is deliberately unlike the rest: the lists a native client sees no longer contain the row, so from its point of view the slug genuinely is not a product it can reach, and a 403 would say "this exists and you may not have it" to a client that was never shown it.

Fixed

A refused product read as a broken server

The product detail route wrapped its whole body in a catch that converted every error into a 500 "Error processing product data" — including deliberate refusals raised inside it, which carry their own status and their own message written for a person.

  • Fixed the handler to re-throw a deliberate refusal unchanged. Only a genuinely unexpected failure becomes a 500.