PenAStory

Direct-to-reader book publishing: web platform, REST API and a mobile reader.

Client
3
Shipped surfaces
2
App stores
2
Years running
Next.jsPostgreSQLGoFirestoreFlutterRazorpay

The problem

An independent publisher needed to sell directly to readers rather than through a marketplace that owned the customer relationship and took the margin, which meant payments, entitlements and a reading experience of their own. Selling a book directly is the easy half. The hard half is everything that follows the sale: proving on every request that this reader still owns this title, keeping that judgement on the server where it cannot be edited, and making it work identically on the web and inside a mobile reader that may be offline when the reader opens it.

What we built

  • Customer-facing web platform: catalogue, purchase flow, payment integration and reader entitlements
  • Cross-platform mobile reader application, shipped to both app stores
  • Backend work on the Go REST API behind the platform, alongside the client's own backend developer: routing, middleware, request handlers and the entity layer
  • Server-side entitlement checks, so access to a purchased book follows the account rather than the installed copy
  • Versioned API migrations and templated transactional email for purchase and account flows
  • Release and store-review process for both mobile platforms, including the metadata and build pipeline that goes with it

Decisions worth explaining

Entitlements are checked server-side, on every read

A reader app that decides locally whether someone owns a book is a reader app that gets shared. Purchase grants an entitlement the API validates on each request, so access follows the account rather than the installed copy.

One purchase, three surfaces, one source of truth

A reader who buys on the web expects the book to be there when they open the phone. That only holds if the web platform and the mobile reader ask the same API the same question rather than each keeping their own idea of what was bought. Entitlement lives in the API and both clients are thin over it, which is why adding the mobile reader did not mean reimplementing the purchase model a second time.

Going direct means owning the parts a marketplace hid

Leaving a marketplace removes its cut and its ownership of the reader relationship, and hands back the work it was quietly doing: payment capture and failure handling, receipts, account recovery, and the store review process for two mobile platforms. Each is small; together they are most of what separates a catalogue from a shop.