<?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: BillFast</title>
    <description>The latest articles on DEV Community by BillFast (@billfastapp).</description>
    <link>https://dev.to/billfastapp</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%2F4129591%2F97e89eb6-4448-4f14-babb-2f2dffde9dac.png</url>
      <title>DEV Community: BillFast</title>
      <link>https://dev.to/billfastapp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/billfastapp"/>
    <language>en</language>
    <item>
      <title>Getting Paid Faster Starts Before You Send the Invoice</title>
      <dc:creator>BillFast</dc:creator>
      <pubDate>Thu, 17 Sep 2026 10:18:17 +0000</pubDate>
      <link>https://dev.to/billfastapp/getting-paid-faster-starts-before-you-send-the-invoice-26c5</link>
      <guid>https://dev.to/billfastapp/getting-paid-faster-starts-before-you-send-the-invoice-26c5</guid>
      <description>&lt;p&gt;A lot of “late payment” problems begin before the invoice exists.&lt;/p&gt;

&lt;p&gt;The client is busy, your work is done, and the payment date is suddenly a negotiation. A few small decisions at the start of a project can make getting paid much more predictable:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Put the payment moment in writing
&lt;/h2&gt;

&lt;p&gt;Don’t leave “due soon” in a proposal. Use a clear due date or terms such as Net 7 or Net 14, and repeat them in the invoice. If a client needs a different schedule, agree on it before the work starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tie invoices to milestones
&lt;/h2&gt;

&lt;p&gt;For longer projects, one large invoice at the end creates unnecessary risk. A deposit plus milestone invoices gives both sides a useful checkpoint and keeps the balance manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Make the next step obvious
&lt;/h2&gt;

&lt;p&gt;An invoice should answer three questions quickly: what was delivered, what is owed, and how can it be paid? Keep the line items readable, include your payment details, and avoid burying the total in a wall of text.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Send a friendly reminder before the due date
&lt;/h2&gt;

&lt;p&gt;A short “Just checking that this is scheduled for [date]” message is easier for everyone than chasing an overdue invoice. It also gives the client a chance to flag an issue while there is still time to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep your records consistent
&lt;/h2&gt;

&lt;p&gt;Use the same invoice numbering, client name, and description format every time. Consistency makes follow-ups faster and helps you spot what is outstanding without rebuilding the project history.&lt;/p&gt;

&lt;p&gt;You don’t need a complicated finance stack to do this well. A clean, repeatable invoicing workflow is often enough to shorten the gap between finished work and money in the bank.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://billfast-sandy.vercel.app" rel="noopener noreferrer"&gt;BillFast&lt;/a&gt; as a lightweight way to create professional invoices quickly, especially when you just need to send the next one and move on.&lt;/p&gt;

&lt;p&gt;What’s the small invoicing habit that has made the biggest difference for you?&lt;/p&gt;

</description>
      <category>freelancing</category>
      <category>productivity</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Building a simple invoice PDF tool: the boring parts that matter</title>
      <dc:creator>BillFast</dc:creator>
      <pubDate>Thu, 17 Sep 2026 09:53:33 +0000</pubDate>
      <link>https://dev.to/billfastapp/building-a-simple-invoice-pdf-tool-the-boring-parts-that-matter-32bp</link>
      <guid>https://dev.to/billfastapp/building-a-simple-invoice-pdf-tool-the-boring-parts-that-matter-32bp</guid>
      <description>&lt;h1&gt;
  
  
  Why invoices are a good small-project problem
&lt;/h1&gt;

&lt;p&gt;An invoice PDF tool sounds like a form plus a download button. In practice, it is a compact exercise in data modeling, validation, typography, and trust.&lt;/p&gt;

&lt;p&gt;The happy path is easy: enter a client, add a few line items, and export a document. The useful product is the one that does not quietly change a total, lose a decimal, or produce a PDF that looks different from the preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with a boring, explicit data model
&lt;/h2&gt;

&lt;p&gt;Keep the editable document separate from the rendered PDF. A minimal model can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;InvoiceItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
  &lt;span class="na"&gt;unitAmountMinor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="c1"&gt;// pence/cents, never a float&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Invoice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;issueDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="c1"&gt;// YYYY-MM-DD&lt;/span&gt;
  &lt;span class="nx"&gt;dueDate&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Party&lt;/span&gt;
  &lt;span class="na"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Party&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;InvoiceItem&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="nx"&gt;notes&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important detail is &lt;code&gt;unitAmountMinor&lt;/code&gt;. Currency arithmetic with binary floating point is an unnecessary source of surprises. Store £12.50 as &lt;code&gt;1250&lt;/code&gt;, calculate in integers, and format only at the edge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subtotalMinor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;unitAmountMinor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you support tax, make the rate and rounding rule explicit. “Tax included” and “tax added” are different invoices, not a formatting option.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Validate before rendering
&lt;/h2&gt;

&lt;p&gt;Validate the same rules before an export or server-side render:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invoice number is present and unique&lt;/li&gt;
&lt;li&gt;quantities are greater than zero&lt;/li&gt;
&lt;li&gt;prices use integer minor units&lt;/li&gt;
&lt;li&gt;required seller and buyer details are complete&lt;/li&gt;
&lt;li&gt;totals reconcile after tax and rounding&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Use one source for preview and PDF
&lt;/h2&gt;

&lt;p&gt;A common trap is building a beautiful HTML preview and then maintaining a second PDF template. They drift. A font changes in one place, a long address wraps in another, and the user downloads something they did not see.&lt;/p&gt;

&lt;p&gt;For a small tool, HTML/CSS is often enough:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;render the invoice from the validated model&lt;/li&gt;
&lt;li&gt;keep print styles next to screen styles&lt;/li&gt;
&lt;li&gt;use a real print-sized page with predictable margins&lt;/li&gt;
&lt;li&gt;test long names, long addresses, three-digit quantities, and many line items&lt;/li&gt;
&lt;li&gt;export the same rendered document to PDF&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you need server-side PDFs, share the data model and formatting helpers, and make the layout testable without a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Treat pagination as a product decision
&lt;/h2&gt;

&lt;p&gt;Invoices become awkward when an item table crosses a page. Decide what should happen: repeat the table header on new pages, avoid splitting a single row where possible, keep totals together, and show a continuation marker.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep the workflow trustworthy
&lt;/h2&gt;

&lt;p&gt;The PDF is not the product; confidence is. A few details help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;show the invoice number and total in the preview&lt;/li&gt;
&lt;li&gt;make currency visible beside amounts&lt;/li&gt;
&lt;li&gt;use the same rounding in preview and export&lt;/li&gt;
&lt;li&gt;do not overwrite an existing draft accidentally&lt;/li&gt;
&lt;li&gt;make it clear whether data stays in the browser or is uploaded&lt;/li&gt;
&lt;li&gt;use a predictable filename such as &lt;code&gt;invoice-1042-client-name.pdf&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For freelancers, “I can send this without checking it three times” is a better success metric than the number of form controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Test the edges before adding features
&lt;/h2&gt;

&lt;p&gt;Before adding recurring invoices, accounts, or integrations, test the narrow workflow end to end: fill a realistic invoice, refresh where drafts matter, preview at 100% zoom, download the PDF, open it in two viewers, and verify the total independently.&lt;/p&gt;

&lt;p&gt;That process tends to uncover more value than adding another settings screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small, focused tool
&lt;/h2&gt;

&lt;p&gt;I’m applying these ideas in BillFast, a lightweight invoice workflow for freelancers. If you want to try the result, it’s available at &lt;a href="https://billfast-sandy.vercel.app" rel="noopener noreferrer"&gt;https://billfast-sandy.vercel.app&lt;/a&gt; — feedback on edge cases is welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more practical detail: invoice numbering
&lt;/h2&gt;

&lt;p&gt;A numbering scheme is easier to trust when it is unique, sequential, and easy to explain. Decide whether you need a single sequence or separate prefixes for different businesses, avoid reusing numbers after an invoice is issued, and keep a clear record of voided numbers. A short checklist is here: &lt;a href="https://billfast-sandy.vercel.app/guides/invoice-numbering" rel="noopener noreferrer"&gt;https://billfast-sandy.vercel.app/guides/invoice-numbering&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A small set of fixtures catches most regressions: one item, many items, a long description, a long address, and a second-page invoice.&lt;/p&gt;




&lt;p&gt;A good error message identifies the field and the fix. “Invalid invoice” is not actionable; “Line 2 quantity must be greater than 0” is.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
