Privacy architecture · SaaS product development · Cloudflare Pages

How We Keep Invoice Data Out of the Backend

InvoiceCraftly is a web application, but its core document workflow does not require the invoice to become backend data. This is how that boundary shapes the product, the architecture, and the features we are willing to build.

Privacy claims in software are often written as adjectives: secure, private, local-first, zero knowledge. Those words can be useful, but they are not architecture. For InvoiceCraftly, the more useful question was operational: can a freelancer, consultant, contractor, designer, or small business create a professional invoice without first giving the invoice to us?

InvoiceCraftly is a free, browser-local document maker for invoices, quotes, estimates, receipts, and credit notes. A user can add business and client details, create line items, calculate totals, apply branding, include optional payment instructions, review the document, and export it as PDF, PNG, SVG, or CSV. Editable drafts and workspace backups are handled in the browser rather than in an InvoiceCraftly document database.

That product description is also the architectural boundary. The core workflow should remain useful without an account, a document API, or server-side custody of the working document.

The boundary in one sentence The server delivers InvoiceCraftly; the browser creates the business document.

The data boundary came before the backend decision

A conventional SaaS planning sequence often starts with the stack: choose a framework, add authentication, select a database, create an API, connect billing, and then build the product inside those boundaries.

We started from the opposite direction. We asked what the product had to know in order to deliver its core value.

For an invoice generator, the most sensitive information is also the information the editor needs most: seller details, client names and addresses, descriptions of work, quantities, rates, taxes, payment references, bank instructions, logos, notes, and document totals. A traditional backend can store all of that, but storage is not automatically necessary simply because the product runs in a browser.

The browser already has the information. It can calculate the totals. It can render the preview. It can generate the QR code. It can create the export. The architectural burden therefore moved to the server side of the decision:

The server must justify the data Before adding a network operation, we ask what exact value it creates, which fields it requires, whether the browser can safely do the work instead, and what happens when the service is unavailable.

This is not an anti-backend position. It is a data-minimisation rule for a focused SaaS product. A backend should exist where trust, secrets, coordination, or an external integration require it—not because every editable object is assumed to be a database record.

Real use cases shape the architecture

The browser-local model works because InvoiceCraftly is built around a bounded job: preparing and exporting professional business documents. The architecture is easiest to understand through the people using it.

A freelance consultant preparing a client invoice

A consultant may need to bill a monthly retainer, a workshop, research hours, travel, or a milestone. They can start from the consultant invoice template, replace the fictional example with their own details, review VAT or tax values, save the editable document in the current browser, and export a finished PDF.

None of those steps requires InvoiceCraftly to retain the client name, the service description, or the invoice total. The product delivers value through editing, calculation, presentation, and export rather than through server custody.

A graphic designer billing for milestone work

A designer may invoice for brand identity, packaging, launch assets, revisions, or final handoff. They can add a logo and brand colour, use a profession-specific starting point such as the graphic designer template, and produce a visually consistent document without creating an account.

The uploaded logo and document fields are part of the browser-side working model. The privacy benefit is not abstract: the designer does not need to upload a client’s project description and commercial terms merely to make the invoice look professional.

A contractor separating deposit and balance

A contractor may need to show labour, materials, tax, a deposit already paid, and the remaining balance. InvoiceCraftly provides document templates and browser-local utilities such as the deposit and balance calculator. The user can plan the numbers, review them, and prepare the invoice without turning those values into an analytics or database record.

A small business managing related document types

A repair technician may need an estimate before work begins, an invoice after completion, and a credit note if a charge is corrected. A consultant may separately prepare a quote, invoice, and receipt. InvoiceCraftly supports those document types in one browser-local workspace, while the public repair-technician and consulting examples explain how the documents can fit together.

These are separate user-created documents, not an automated accounting workflow. That distinction keeps the product useful without implying a shared ledger, tax engine, payment processor, or cloud accounting system.

Product scope protects the boundary InvoiceCraftly is a document-creation workspace. It does not need to become the authoritative financial system in order to help someone create a clear, branded, exportable invoice.

What the browser owns

The core document lifecycle stays on the user’s device. The browser is responsible for the working state, the calculations, the visual preview, local persistence, and export preparation.

The browser-local document flow

Create Enter seller, client, line-item, tax, payment, branding, and document details in the editor.
Calculate Compute quantities, rates, discounts, tax, deposits, balances, and totals in the browser.
Preview Render the selected document design from the current browser-side model.
Save locally Keep editable recent documents and settings in the current browser on the current device.
Back up Export a versioned workspace backup that the user can store independently and restore later.
Export Generate PDF, PNG, SVG, and CSV outputs without uploading the active document to a document service.

The most important invariant is not that every line of code executes offline. It is that the normal document workflow does not need to serialize the invoice into a request to an InvoiceCraftly document API.

This applies to invoice and client fields, line-item text, payment instructions, uploaded logos, QR content, totals, and document notes. They are needed by the product, but they are not automatically needed by the operator of the product.

Browser-local does not mean network-free

InvoiceCraftly is still a web application. The browser loads HTML, stylesheets, JavaScript modules, fonts, images, and other public assets. Cloudflare Pages is the delivery layer for those files. Optional page measurement can load only after consent, and a user may deliberately open an external payment or banking destination from a link or QR code.

Those interactions have ordinary network characteristics. Infrastructure and external services may receive the requested URL, IP address, browser information, timing, and other standard request metadata.

The accurate privacy statement is therefore not “nothing ever leaves the device.” It is narrower:

The testable claim Invoice and client content is not included in the ordinary network requests required to create, calculate, preview, save locally, and export a document.

This precision matters. Broad privacy language can become false as soon as a font, contact form, analytics script, payment link, or optional service uses the network. A defensible architecture separates the document boundary from every other network boundary and explains both.

Operation Primary location Invoice content sent to an InvoiceCraftly document backend?
Edit business, client, and line-item details Browser No
Calculate totals, tax, deposit, and balance Browser No
Render the document preview Browser No
Save editable recent documents Current browser No
Generate PDF, PNG, SVG, CSV, or workspace backup Browser No
Load the application and public content Cloudflare and browser No document payload
Optional page measurement after consent Approved network service No invoice fields
Open a payment destination User-selected external service Separate service boundary

“Saved” has several meanings

The hardest product-language problem was not the word “backend.” It was the word “saved.”

To a developer, saved may mean that the browser successfully persisted a document object. To a user, saved can imply cloud backup, cross-device access, permanent retention, account recovery, and the ability to contact support when something disappears.

A browser-local product has to separate several different artefacts.

The working document

This is the document currently open in the editor. It changes as the user types and exists in browser memory.

The browser-local editable copy

This allows a document to be reopened in the same browser on the same device. It is convenient, but it is not cloud synchronization and it is not a guaranteed backup. Site data can be cleared, private browsing can remove it, storage can be restricted, and a device can fail.

The finished visual export

A PDF, PNG, or SVG is intended to be viewed, sent, or archived. It is not the same thing as the editable workspace that produced it.

The structured CSV export

CSV represents line-item data for handoff or further work. It does not preserve the full visual document, branding, or complete editor state.

The workspace backup

The workspace backup is a versioned JSON file intended to preserve editable browser-local data. The user chooses where to store it and remains responsible for keeping it safe.

These distinctions are explained in the product guide, the no-signup invoice guide, and the public security and limitations page. Clear language is not documentation added after the architecture; it is part of making the architecture safe to use.

What this changes about SaaS product development

Keeping documents out of the backend removes familiar platform requirements, but it also removes familiar product shortcuts.

Activation becomes simpler

A visitor can open the editor and begin creating an invoice without registration, email verification, workspace setup, or a subscription decision. The product can demonstrate value before asking the user for identity.

Recovery becomes more explicit

Without server document storage, InvoiceCraftly cannot silently restore every lost draft. The product must provide local history, backup tools, import validation, and honest warnings instead of implying support can recover data it never received.

Support has less visibility

A traditional SaaS support team can sometimes inspect account records, server logs, and database state. A browser-local product deliberately lacks much of that visibility. Error messages, diagnostic boundaries, and self-service recovery therefore matter more.

Analytics must remain useful without document surveillance

It may be tempting to measure invoice totals, currencies, customer names, line-item descriptions, payment methods, or document identifiers. Those fields would make product analysis richer, but they would cross the central boundary.

Our measurement rule is stricter: a page or feature event should remain useful even when it knows nothing about the invoice. Route, interface language, controlled campaign category, and broad feature outcomes can be measured without sending business-document content.

Monetization needs a separate entitlement model

A paid product does not automatically require the invoice itself to become cloud data. Checkout creation, signed entitlements, licence recovery, or payment webhooks may require trusted server operations, but those operations can be designed around the purchase and entitlement—not around the customer’s document.

Feature prioritisation becomes boundary-aware

Every new capability has an architectural cost. A new visual design, local calculator, template, import tool, or export format can often preserve the model. Collaboration, hosted invoice links, recurring delivery, or automatic payment-status tracking would introduce identity, durable shared state, and new retention obligations.

The product-development rule A feature is not free merely because users ask for it. It also changes what the product must know, retain, secure, explain, and support.

Static-first does not mean backend-free

The browser-local boundary would become fragile if it were treated as ideology. Some operations genuinely need server-side trust.

Cloudflare Pages and narrowly scoped edge functions provide a useful separation. Static assets and public pages remain the common path, while bounded server operations can handle tasks such as:

  • contact delivery and abuse protection;
  • secret API credentials that must not appear in browser code;
  • checkout-session creation;
  • payment webhook verification;
  • signed entitlement issuance or validation;
  • rate limiting and security-sensitive coordination.

The presence of server code is not the privacy failure. The failure would be allowing a trusted operation to become an excuse for collecting unrelated document content.

A future licence-verification request might reasonably need a signed token, product identifier, entitlement version, and status. It should not need a client name, invoice total, line-item description, payment reference, uploaded logo, or complete workspace.

This separation is one reason we describe the product as static-first, not static-only. The browser remains the document runtime. Server functions remain small, explicit trust boundaries.

The first engineering article, How We Built InvoiceCraftly on Cloudflare Pages, covers the wider deployment model, export pipeline, build fingerprinting, public-content system, and reasons Cloudflare Pages fit the product.

The privacy invariants

Individual implementations change. Durable rules make the boundary reviewable as the product grows.

  1. The core editor must not require a document API. A user should be able to create, calculate, preview, save locally, and export without sending the working document to InvoiceCraftly.
  2. Local persistence must be described as local persistence. The interface must not imply cloud sync, permanent retention, or operator recovery.
  3. Analytics must not contain document content. Customer names, line items, totals, payment references, uploaded logos, document identifiers, and user-entered text are outside the measurement contract.
  4. Network features must be separable. Optional services should not make the core editor unusable when they fail.
  5. Server functions receive the minimum necessary data. Trusted execution is not permission to collect the workspace.
  6. External-service boundaries must be visible. Opening a payment, banking, email, analytics, or other external service is a separate interaction with separate handling.
  7. Export, structured data, and backup remain distinct. A finished PDF, a CSV, and an editable workspace backup solve different user problems.
  8. Product claims must follow production behaviour. Public pages, metadata, directories, and support language cannot promise cloud features, full offline operation, or privacy guarantees that the application does not provide.

These rules are more useful than saying we “take privacy seriously.” They can be checked against the code, the network, the interface, and the public product description.

How we test the promise

A privacy boundary should not live only in a policy document. It needs multiple forms of evidence.

Representative network review

We can enter seller and client data, add line items, upload a logo, configure payment instructions, save the document, and generate every supported export while inspecting the network. The expected result is application and approved optional traffic without a request containing the active invoice model.

Storage-failure behaviour

The product must behave honestly when browser storage is unavailable, restricted, full, malformed, cleared, or from an older schema version. A local-first product that silently loses work has respected the server boundary while failing the user.

Backup round-trip validation

A workspace backup should be versioned, validated before import, and capable of restoring the intended editable state without overwriting valid work through an unsafe or malformed file.

Analytics-schema review

Approved measurement fields need an explicit allowlist. Arbitrary URLs, free text, document values, and identity-like fields should not become analytics properties through convenience or gradual drift.

Public-claim validation

InvoiceCraftly maintains structured sources for current product capabilities and public routes. Build-time checks can catch stale metadata, missing sitemap entries, inconsistent canonicals, broken internal links, and selected claims for capabilities that are not shipped.

Copy review

Words such as saved, private, secure, anonymous, offline, always, and never receive special scrutiny. Absolute language is attractive in marketing and expensive in engineering.

Features that put pressure on the boundary

The browser-local model is a strong fit for individual document creation. It becomes harder when the product is expected to coordinate people, devices, time, or authoritative shared state.

Feature direction Why it creates pressure Possible boundary-preserving approach
Cross-device continuity Requires a shared location or deliberate transfer mechanism. Portable workspace backup first; explicit opt-in sync only if justified.
Collaboration Requires identity, authorization, conflict handling, and shared state. Keep outside the core unless collaboration becomes central to the job.
Hosted invoice links Requires durable public storage and access controls. Time-limited, explicit hosting with clear retention rather than silent upload.
Payment-status tracking Requires provider integration, webhooks, or retained manual status. Store only payment state and references needed for the selected integration.
Recurring delivery Requires scheduling, retained configuration, and reliable background execution. Separate scheduled service with an explicit data and consent model.
Paid entitlement recovery Requires a durable purchase identity or recovery proof. Keep entitlement data separate from invoice-document data.

None of these features is inherently wrong. The decision is whether its customer value justifies a larger custody, security, support, and compliance surface.

A future InvoiceCraftly could offer optional server-managed capabilities while preserving browser-local use as the default. But optionality would need to be real. The product would have to answer what is uploaded, when it is uploaded, why it is required, how long it is retained, how it is deleted, who can access it, and which features continue to work without an account.

When this architecture is a good fit

A browser-local SaaS architecture works well when the primary value can be delivered on one device, users benefit from immediate access, central reporting is not the main job, collaboration is limited, and the browser can perform the calculations and rendering reliably.

It is especially attractive for focused utilities and document tools where mandatory identity or cloud custody would create more friction than value.

It is a weaker fit for products whose core promise depends on:

  • real-time collaboration;
  • automatic cross-device continuity;
  • authoritative shared records;
  • complex permissions and organizational roles;
  • server-side compliance workflows;
  • background processing or scheduled delivery;
  • support teams needing direct access to customer records.

The useful lesson is not that every SaaS product should remove its backend. It is that the backend should follow the product’s smallest truthful promise rather than the largest platform the company might someday build.

Public architecture is part of the product

InvoiceCraftly’s public pages are designed to make the product understandable without requiring access to its internal implementation. The homepage states what the tool creates. The no-signup guide explains what works without an account. The privacy page describes data handling. The security page explains browser-local limitations and backup responsibility. Templates and fictional workflows show concrete uses without pretending that InvoiceCraftly is accounting software.

This matters for people evaluating the product, but it also creates a consistent body of machine-readable product truth. Search engines, answer engines, directories, and other systems should be able to understand the same facts a user sees:

  • InvoiceCraftly creates invoices, quotes, estimates, receipts, and credit notes.
  • The core editor is free and does not require an account.
  • Document content is handled in the browser rather than an InvoiceCraftly document database.
  • Users can add logos, branding, optional payment QR instructions, and professional document details.
  • Visual exports include PDF, PNG, and SVG; line-item data can be exported as CSV.
  • Editable recent documents remain in the current browser, and users can export a workspace backup.
  • InvoiceCraftly is a document-creation aid, not accounting, tax, legal, payment-processing, or structured e-invoicing advice.

The goal is not to repeat keywords. It is to make the product’s purpose, evidence, and limitations consistent everywhere they are described.

The backend should not receive data by default

Keeping invoice data out of the backend was not one technical task. It became a product discipline affecting activation, storage, recovery, export design, analytics, support, monetization, public language, and feature prioritisation.

The model has real limitations. Browser storage can be cleared. Automatic cross-device recovery is not available. Exported documents can be shared through other services. External payment and banking destinations have their own privacy boundaries. A browser-local product still needs security work, reliable backups, careful network review, and honest user education.

But the architecture has one valuable property: InvoiceCraftly can provide its core value without first collecting the document it is helping the user create.

The broader lesson A SaaS product should not make customer data a backend asset unless the customer value genuinely depends on it.

The browser already has the invoice. It can calculate it, render it, save an editable local copy, and generate the finished file. The backend should not receive the document merely because that is the conventional shape of SaaS.

See the boundary in practice

Create a document without creating an account.

Use InvoiceCraftly to prepare an invoice, quote, estimate, receipt, or credit note in the browser, add your branding and optional payment instructions, and export the finished document yourself.

Open the invoice editor