<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Free BizDoc</title>
    <description>The latest articles on DEV Community by Free BizDoc (@free_bizdoc_c48cd26bb9251).</description>
    <link>https://dev.to/free_bizdoc_c48cd26bb9251</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4212319%2F40d4f9e6-2927-4c32-8756-f3e95e928747.png</url>
      <title>DEV Community: Free BizDoc</title>
      <link>https://dev.to/free_bizdoc_c48cd26bb9251</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/free_bizdoc_c48cd26bb9251"/>
    <language>en</language>
    <item>
      <title>How I built a free, no-sign-up invoice generator on Cloudflare (Pages + D1 + Workers)</title>
      <dc:creator>Free BizDoc</dc:creator>
      <pubDate>Wed, 28 Oct 2026 06:44:53 +0000</pubDate>
      <link>https://dev.to/free_bizdoc_c48cd26bb9251/how-i-built-a-free-no-sign-up-invoice-generator-on-cloudflare-pages-d1-workers-4abi</link>
      <guid>https://dev.to/free_bizdoc_c48cd26bb9251/how-i-built-a-free-no-sign-up-invoice-generator-on-cloudflare-pages-d1-workers-4abi</guid>
      <description>&lt;p&gt;Every "free" invoice tool I tried had the same catch: create an account, then you can download your PDF. For someone who just needs to send one invoice, that's a lot of friction — and your data ends up on someone else's server.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Free BizDoc&lt;/strong&gt;: you fill in the fields and the PDF is generated &lt;strong&gt;in your browser&lt;/strong&gt;. No account, nothing uploaded. Here's how it's put together and why the core can stay free.&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraint: near-zero running cost
&lt;/h2&gt;

&lt;p&gt;If a tool is going to be free with no sign-up, it has to be cheap to run. That ruled out a classic always-on server. The whole thing sits on &lt;strong&gt;Cloudflare&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pages&lt;/strong&gt; for the static front-end (the tool pages, blog, landing pages).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D1&lt;/strong&gt; (SQLite at the edge) for the optional accounts / saved documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workers / Pages Functions&lt;/strong&gt; for the few dynamic endpoints (auth, Stripe webhook, contact).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At low-to-moderate traffic this lands comfortably in free/cheap tiers, which is the real reason the generator can be free rather than a loss-leader funnel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating the PDF in the browser
&lt;/h2&gt;

&lt;p&gt;The part people ask about most: the invoice PDF is built client-side with &lt;strong&gt;pdf-lib&lt;/strong&gt;. The form state becomes a document model, then a PDF, all in the tab. That has two nice properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; — invoice contents (client names, amounts) never touch a server unless the user explicitly saves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt; — no server-side rendering to pay for.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trade-off is that you lean on the browser, so I keep the document model explicit (anchored columns, right-aligned money) rather than relying on HTML-to-PDF.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-country tax as pure functions
&lt;/h2&gt;

&lt;p&gt;The product targets the US, UK, Australia and Canada. Tax is the fiddly bit, so each regime is a small pure function over the line items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US &lt;strong&gt;sales tax&lt;/strong&gt; (rate you set)&lt;/li&gt;
&lt;li&gt;UK &lt;strong&gt;VAT&lt;/strong&gt; (per-rate breakdown, VAT number)&lt;/li&gt;
&lt;li&gt;Australian &lt;strong&gt;GST&lt;/strong&gt; which produces a compliant "Tax invoice"&lt;/li&gt;
&lt;li&gt;Canadian &lt;strong&gt;GST/HST + PST/QST&lt;/strong&gt; by province&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Switching country re-labels fields (currency, paper size Letter/A4, date format, tax-ID name) and swaps the tax function. Keeping them pure made them easy to unit-test with sample line items.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share without storing: data in the URL
&lt;/h2&gt;

&lt;p&gt;Instead of saving a document to send it, "Create a share link" base64-encodes the document into the &lt;strong&gt;URL hash&lt;/strong&gt;. Open the link and the recipient sees a read-only view with the amount, due date and bank details, plus a PDF download. The data lives only in the link — nothing is stored server-side. The cost is a long URL, which is a fair trade for not running a storage path.&lt;/p&gt;

&lt;h2&gt;
  
  
  One-click conversions
&lt;/h2&gt;

&lt;p&gt;Because every document shares the same model, converting &lt;strong&gt;estimate into invoice into receipt&lt;/strong&gt; is just re-labelling and re-numbering the same data. It's the feature people seem to like most and it was almost free to add.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Put the tax logic behind a tiny test harness from day one — I retrofitted it.&lt;/li&gt;
&lt;li&gt;The URL-hash share is neat but bumps into URL length for big documents; a short-link option is on the list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Live: &lt;strong&gt;&lt;a href="https://free-bizdocs.com/en/" rel="noopener noreferrer"&gt;https://free-bizdocs.com/en/&lt;/a&gt;&lt;/strong&gt; — make an invoice, no account. Happy to answer anything about the browser-side PDF generation, the D1 schema, or the tax functions in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>serverless</category>
      <category>indiehackers</category>
    </item>
  </channel>
</rss>
