<?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: Cove</title>
    <description>The latest articles on DEV Community by Cove (@coveos).</description>
    <link>https://dev.to/coveos</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%2F4108959%2Fd1f8db6d-dabe-4ee6-984d-93bad5ce2829.jpg</url>
      <title>DEV Community: Cove</title>
      <link>https://dev.to/coveos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coveos"/>
    <language>en</language>
    <item>
      <title>I needed a Notion Freelance OS under $20 — here's what I built</title>
      <dc:creator>Cove</dc:creator>
      <pubDate>Fri, 04 Sep 2026 08:17:07 +0000</pubDate>
      <link>https://dev.to/coveos/i-needed-a-notion-freelance-os-under-20-heres-what-i-built-1i8g</link>
      <guid>https://dev.to/coveos/i-needed-a-notion-freelance-os-under-20-heres-what-i-built-1i8g</guid>
      <description>&lt;p&gt;I kept opening Freelance OS template listings priced around &lt;strong&gt;$49&lt;/strong&gt; and closing the tab. I needed clients, projects, invoices, and unpaid hours in Notion — not another $50 template I would half-use.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Cove Freelance OS&lt;/strong&gt; for myself, then packaged it. Launch price &lt;strong&gt;$19&lt;/strong&gt;. One-click &lt;strong&gt;Duplicate&lt;/strong&gt;. Runs on &lt;strong&gt;Notion Free&lt;/strong&gt;. Disclosure up front: this is my product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually needed
&lt;/h2&gt;

&lt;p&gt;Freelance ops for me is four questions on one Home page:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which invoices are overdue?&lt;/li&gt;
&lt;li&gt;What is due this week?&lt;/li&gt;
&lt;li&gt;Where is each lead in the pipeline?&lt;/li&gt;
&lt;li&gt;How many unpaid billable hours am I sitting on?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most “complete” Freelance OS packs I compared were built like product suites. Fine if you want that. I wanted a spine I open every morning without scrolling past features I never touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The spine (four databases)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clients&lt;/strong&gt; — Name, Status, Email, Rate, one Next action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Projects&lt;/strong&gt; — related to Clients (limit 1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoices&lt;/strong&gt; — related to Clients + Projects; Status is source of truth (&lt;code&gt;Draft&lt;/code&gt; / &lt;code&gt;Sent&lt;/code&gt; / &lt;code&gt;Paid&lt;/code&gt; / &lt;code&gt;Overdue&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time log&lt;/strong&gt; — Hours + Billable Yes/No, related to Clients + Projects&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Home is four linked views of those databases. No second copy of the data. No Duplicate-into-chaos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Home views that matter
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overdue invoices&lt;/strong&gt; — Status is Overdue, sort Due date oldest first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This week&lt;/strong&gt; — tasks due this week, not Done&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline&lt;/strong&gt; — board Lead → Call → Proposal → Won → Lost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpaid hours&lt;/strong&gt; — Time log, Billable Yes, this month, Sum Hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If Home takes more than one scroll of attention, you added too much.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why under $20
&lt;/h2&gt;

&lt;p&gt;I was comparing the common &lt;strong&gt;~$49&lt;/strong&gt; Freelance OS price point and asking a blunt question: do I need the kitchen sink, or do I need overdue + unpaid hours visible today?&lt;/p&gt;

&lt;p&gt;Cove is deliberately smaller:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works on &lt;strong&gt;Notion Free&lt;/strong&gt; (no Plus required to use the OS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click Duplicate&lt;/strong&gt; into your workspace&lt;/li&gt;
&lt;li&gt;Clients / projects / invoices / time / pipeline already related&lt;/li&gt;
&lt;li&gt;Sample rows for wiring — delete them after your first real client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is a payment and ops tracker. Not tax software. Not legal advice. No fake “1,000 freelancers love this” claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional overdue formula
&lt;/h2&gt;

&lt;p&gt;If you want a formula flag instead of only marking Status by hand:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Property:&lt;/strong&gt; &lt;code&gt;Late?&lt;/code&gt; (Formula)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if(
  and(
    prop("Status") != "Paid",
    prop("Due date") &amp;lt; now()
  ),
  "Overdue",
  ""
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Home can filter Status is Overdue &lt;strong&gt;or&lt;/strong&gt; &lt;code&gt;Late?&lt;/code&gt; is Overdue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Walkthrough (long form): &lt;a href="https://youtu.be/hRAZmlWSUD0" rel="noopener noreferrer"&gt;https://youtu.be/hRAZmlWSUD0&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cove Freelance OS — &lt;strong&gt;$19&lt;/strong&gt; — &lt;a href="https://clearstay.gumroad.com/l/myopfv" rel="noopener noreferrer"&gt;https://clearstay.gumroad.com/l/myopfv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shop: &lt;a href="https://attractive-crib-5bc.notion.site/Cove-3d0d7a0e569e80d2a58fe8ff9b692e60" rel="noopener noreferrer"&gt;https://attractive-crib-5bc.notion.site/Cove-3d0d7a0e569e80d2a58fe8ff9b692e60&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again: I built this. If you only need the DIY schema, the sections above are enough to recreate it. If you want it pre-wired under twenty bucks, Duplicate from the product page after purchase.&lt;/p&gt;

&lt;p&gt;Affiliate: none. Not tax software. Not legal advice.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>freelance</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Photographer Notion OS: shoots, galleries, who still owes you</title>
      <dc:creator>Cove</dc:creator>
      <pubDate>Fri, 04 Sep 2026 05:12:28 +0000</pubDate>
      <link>https://dev.to/coveos/photographer-notion-os-shoots-galleries-who-still-owes-you-3fp</link>
      <guid>https://dev.to/coveos/photographer-notion-os-shoots-galleries-who-still-owes-you-3fp</guid>
      <description>&lt;p&gt;I was losing shoot dates in a calendar, proofing links in DMs, and finals in a notes app. This is the Notion setup I use for wedding and portrait work. It runs on the &lt;strong&gt;Free plan&lt;/strong&gt;. It is a shoot / gallery / payment tracker — not tax software, not legal advice, and it does not host galleries.&lt;/p&gt;

&lt;p&gt;Walkthrough video: &lt;a href="https://youtu.be/8UCMlw5jQqE" rel="noopener noreferrer"&gt;https://youtu.be/8UCMlw5jQqE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The spine is four databases plus a gear checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clients&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shoots&lt;/strong&gt; (related to Clients)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Galleries&lt;/strong&gt; (related to Shoots)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoices&lt;/strong&gt; (related to Clients and Shoots)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gear checklist&lt;/strong&gt; (optional, but useful the night before)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Home is three linked views: this week's shoots, overdue invoices, undelivered galleries.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Clients
&lt;/h2&gt;

&lt;p&gt;Create a full-page database named &lt;strong&gt;Clients&lt;/strong&gt;. Title property: &lt;strong&gt;Name&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Unique. Shoots and invoices point here.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Wedding&lt;/code&gt; &lt;code&gt;Portrait&lt;/code&gt; &lt;code&gt;Brand&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Lead&lt;/code&gt; &lt;code&gt;Booked&lt;/code&gt; &lt;code&gt;Delivered&lt;/code&gt; &lt;code&gt;Lost&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next action&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;One line. What you do next.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not rename &lt;strong&gt;Name&lt;/strong&gt;. Everything else matches on that value.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Shoots
&lt;/h2&gt;

&lt;p&gt;Create &lt;strong&gt;Shoots&lt;/strong&gt;. Title: &lt;strong&gt;Name&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Unique. Galleries and invoices match on this.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Relation → Clients&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Date only. When you are on site.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;Venue or studio. One line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Inquiry&lt;/code&gt; &lt;code&gt;Booked&lt;/code&gt; &lt;code&gt;Shot&lt;/code&gt; &lt;code&gt;Edited&lt;/code&gt; &lt;code&gt;Delivered&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Shoot fee, USD, 0 decimals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Wire the Client relation after both databases exist. Limit 1.&lt;/p&gt;

&lt;p&gt;Home view: Date is &lt;strong&gt;This week&lt;/strong&gt;. That is your week board — not a second calendar.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Galleries
&lt;/h2&gt;

&lt;p&gt;Create &lt;strong&gt;Galleries&lt;/strong&gt;. Title: &lt;strong&gt;Name&lt;/strong&gt; (usually the shoot name plus “proofs”).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Scannable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shoot&lt;/td&gt;
&lt;td&gt;Relation → Shoots&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Not started&lt;/code&gt; &lt;code&gt;Sent&lt;/code&gt; &lt;code&gt;Approved&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gallery URL&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;Pixieset / Pic-Time / your host. Notion does not host files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expiry&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;When the proofing link dies.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Undelivered Home view: Delivery status is &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;Approved&lt;/code&gt;. That is who still owes you a gallery selection — or who you still owe proofs.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Invoices (who still owes you)
&lt;/h2&gt;

&lt;p&gt;Create &lt;strong&gt;Invoices&lt;/strong&gt;. Title property: &lt;strong&gt;Number&lt;/strong&gt; (&lt;code&gt;INV-0001&lt;/code&gt;, unique).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INV-0000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Relation → Clients&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shoot&lt;/td&gt;
&lt;td&gt;Relation → Shoots&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amount&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;USD, 0 decimals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Draft&lt;/code&gt; &lt;code&gt;Sent&lt;/code&gt; &lt;code&gt;Paid&lt;/code&gt; &lt;code&gt;Overdue&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Due&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Date only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Invoice &lt;strong&gt;Status&lt;/strong&gt; is the source of truth. If the final is late, set &lt;strong&gt;Overdue&lt;/strong&gt;. Do not hope.&lt;/p&gt;

&lt;p&gt;Home view: Status is &lt;code&gt;Overdue&lt;/code&gt;. Sort Due oldest first. Empty state means you are current on money.&lt;/p&gt;

&lt;p&gt;This is a tracker. It does not file VAT, send dunning email, or replace an accountant.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Gear checklist (optional)
&lt;/h2&gt;

&lt;p&gt;One database. Title: &lt;strong&gt;Item&lt;/strong&gt;. Select for Wedding / Portrait. Packed: &lt;code&gt;Yes&lt;/code&gt; / &lt;code&gt;No&lt;/code&gt;. The night before a wedding, filter to Wedding and set Packed to No, then tick as you load the bag.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Home
&lt;/h2&gt;

&lt;p&gt;One page. Three linked views. Do not duplicate the databases.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;This week&lt;/strong&gt; — Shoots, Date is This week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overdue invoices&lt;/strong&gt; — Invoices, Status is Overdue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undelivered galleries&lt;/strong&gt; — Galleries, Delivery status is not Approved.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If Home takes more than one scroll of attention, you added too much.&lt;/p&gt;

&lt;h2&gt;
  
  
  First-day rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One &lt;strong&gt;Next action&lt;/strong&gt; per client. Not three.&lt;/li&gt;
&lt;li&gt;Shoot &lt;strong&gt;Date&lt;/strong&gt; is on-site day. Gallery &lt;strong&gt;Expiry&lt;/strong&gt; is when the proofing link dies.&lt;/li&gt;
&lt;li&gt;Invoice status is the source of truth for who still owes you.&lt;/li&gt;
&lt;li&gt;Sample rows are for wiring. Delete them after your first real client.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you do not want to build it
&lt;/h2&gt;

&lt;p&gt;I packaged this as &lt;strong&gt;Cove Shoot OS&lt;/strong&gt;. Duplicate into your workspace. Works on Notion Free. Clients, shoots, galleries, invoices, gear, Home already related.&lt;/p&gt;

&lt;p&gt;Disclosure: these are my paid templates.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shoot OS (shoots / galleries / who still owes you): &lt;strong&gt;$15&lt;/strong&gt; — &lt;a href="https://clearstay.gumroad.com/l/dydcf" rel="noopener noreferrer"&gt;https://clearstay.gumroad.com/l/dydcf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Freelance OS (clients / invoices / unpaid hours): &lt;strong&gt;$19&lt;/strong&gt; — &lt;a href="https://clearstay.gumroad.com/l/myopfv" rel="noopener noreferrer"&gt;https://clearstay.gumroad.com/l/myopfv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shop: &lt;a href="https://attractive-crib-5bc.notion.site/Cove-3d0d7a0e569e80d2a58fe8ff9b692e60" rel="noopener noreferrer"&gt;https://attractive-crib-5bc.notion.site/Cove-3d0d7a0e569e80d2a58fe8ff9b692e60&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo video: &lt;a href="https://youtu.be/8UCMlw5jQqE" rel="noopener noreferrer"&gt;https://youtu.be/8UCMlw5jQqE&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Affiliate: none. Not tax software. Not legal advice. Does not host galleries.&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Freelance Notion OS: clients, overdue invoices, unpaid hours</title>
      <dc:creator>Cove</dc:creator>
      <pubDate>Fri, 04 Sep 2026 03:22:50 +0000</pubDate>
      <link>https://dev.to/coveos/freelance-notion-os-clients-overdue-invoices-unpaid-hours-15g4</link>
      <guid>https://dev.to/coveos/freelance-notion-os-clients-overdue-invoices-unpaid-hours-15g4</guid>
      <description>&lt;p&gt;I was losing unpaid hours in a Notes app and overdue invoices in a spreadsheet. This is the Notion setup I use now. It runs on the &lt;strong&gt;Free plan&lt;/strong&gt;. It is a payment tracker, not tax software and not legal advice.&lt;/p&gt;

&lt;p&gt;Walkthrough video (long form): &lt;a href="https://youtu.be/hRAZmlWSUD0" rel="noopener noreferrer"&gt;https://youtu.be/hRAZmlWSUD0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The spine is three databases plus a time log:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clients&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Projects&lt;/strong&gt; (related to Clients)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoices&lt;/strong&gt; (related to Clients and Projects)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time log&lt;/strong&gt; (related to Clients and Projects)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Home is four linked views: overdue invoices, this week's tasks, pipeline, unpaid hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Clients
&lt;/h2&gt;

&lt;p&gt;Create a full-page database named &lt;strong&gt;Clients&lt;/strong&gt;. Title property: &lt;strong&gt;Name&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Unique. Every other database points here.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Lead&lt;/code&gt; &lt;code&gt;Active&lt;/code&gt; &lt;code&gt;Paused&lt;/code&gt; &lt;code&gt;Won&lt;/code&gt; &lt;code&gt;Lost&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rate&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Hourly, USD, 0 decimals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next action&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;One line. What you do next.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;Short.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not rename &lt;strong&gt;Name&lt;/strong&gt;. Projects, invoices, and time log match on that value.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Projects
&lt;/h2&gt;

&lt;p&gt;Create &lt;strong&gt;Projects&lt;/strong&gt;. Title: &lt;strong&gt;Name&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Unique. Tasks and invoices match on this.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Relation → Clients&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Proposal&lt;/code&gt; &lt;code&gt;Active&lt;/code&gt; &lt;code&gt;Blocked&lt;/code&gt; &lt;code&gt;Done&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Due&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Date only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Project fee, not hourly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Wire the relation after both databases exist. Limit 1. One project, one client.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Invoices
&lt;/h2&gt;

&lt;p&gt;Create &lt;strong&gt;Invoices&lt;/strong&gt;. Title property: &lt;strong&gt;Number&lt;/strong&gt; (&lt;code&gt;INV-0001&lt;/code&gt;, unique).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INV-0000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Relation → Clients&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;Relation → Projects&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amount&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;USD, 0 decimals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Draft&lt;/code&gt; &lt;code&gt;Sent&lt;/code&gt; &lt;code&gt;Paid&lt;/code&gt; &lt;code&gt;Overdue&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Due date&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Date only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid date&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Empty until Status is Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Invoice &lt;strong&gt;Status&lt;/strong&gt; is the source of truth. If it is late, set &lt;strong&gt;Overdue&lt;/strong&gt;. Do not hope.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overdue formula (optional)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Property name:&lt;/strong&gt; &lt;code&gt;Late?&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Type:&lt;/strong&gt; Formula&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;and&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Paid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Due date&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Overdue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is Formula 2.0. It returns &lt;code&gt;"Overdue"&lt;/code&gt; when the due date is in the past and the invoice is not Paid.&lt;/p&gt;

&lt;p&gt;Home view: filter Invoices where Status is &lt;code&gt;Overdue&lt;/code&gt;, &lt;strong&gt;or&lt;/strong&gt; where &lt;code&gt;Late?&lt;/code&gt; is &lt;code&gt;Overdue&lt;/code&gt;. Sort Due date, oldest first. Empty state means you are current.&lt;/p&gt;

&lt;p&gt;This is a tracker. It does not file VAT, send dunning email, or replace an accountant.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Time log and unpaid hours
&lt;/h2&gt;

&lt;p&gt;Create &lt;strong&gt;Time log&lt;/strong&gt;. Title property: &lt;strong&gt;Note&lt;/strong&gt;. Date is a Date property, not the title.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Note&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;What you did. One line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Relation → Clients&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;Relation → Projects&lt;/td&gt;
&lt;td&gt;Limit 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;1 decimal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billable&lt;/td&gt;
&lt;td&gt;Select&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Yes&lt;/code&gt; &lt;code&gt;No&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If it is billable, &lt;strong&gt;Yes&lt;/strong&gt;. Unpaid hours live here until the matching invoice is &lt;strong&gt;Sent&lt;/strong&gt; or &lt;strong&gt;Paid&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unpaid-hours rollup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A. Home view (fast)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Linked view of Time log:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filter: Billable is &lt;code&gt;Yes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Filter: Date is This month&lt;/li&gt;
&lt;li&gt;Calculate: Sum of Hours at the bottom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;B. Rollup on Clients (per-client total)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;Clients&lt;/strong&gt;, add a rollup &lt;strong&gt;Unpaid hours&lt;/strong&gt; → Relation: Time log → Property: Hours → Calculate: Sum.&lt;/p&gt;

&lt;p&gt;I use the Home view as the daily number and the Client rollup as a sanity check.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Home
&lt;/h2&gt;

&lt;p&gt;One page. Four linked views. Do not duplicate the databases.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Overdue invoices&lt;/strong&gt; — Invoices table, Status is Overdue, sort Due date oldest first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This week&lt;/strong&gt; — Tasks, Due is This week, Status is not Done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline&lt;/strong&gt; — board grouped by stage (&lt;code&gt;Lead&lt;/code&gt; → &lt;code&gt;Call&lt;/code&gt; → &lt;code&gt;Proposal&lt;/code&gt; → &lt;code&gt;Won&lt;/code&gt; → &lt;code&gt;Lost&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpaid hours&lt;/strong&gt; — Time log, Billable Yes, this month, Sum Hours.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If Home takes more than one scroll of attention, you added too much.&lt;/p&gt;

&lt;h2&gt;
  
  
  First-day rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One &lt;strong&gt;Next action&lt;/strong&gt; per client. Not three.&lt;/li&gt;
&lt;li&gt;Invoice status is the source of truth.&lt;/li&gt;
&lt;li&gt;Time log: if it is billable, Yes.&lt;/li&gt;
&lt;li&gt;Sample rows are for wiring. Delete them after your first real client.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you do not want to build it
&lt;/h2&gt;

&lt;p&gt;I packaged this as &lt;strong&gt;Cove Freelance OS&lt;/strong&gt;. Duplicate into your workspace. Works on Notion Free. Clients, projects, invoices, time, pipeline, Home already related.&lt;/p&gt;

&lt;p&gt;Disclosure: these are my paid templates.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Freelance OS (clients / invoices / unpaid hours): &lt;strong&gt;$19&lt;/strong&gt; — &lt;a href="https://clearstay.gumroad.com/l/myopfv" rel="noopener noreferrer"&gt;https://clearstay.gumroad.com/l/myopfv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shoot OS (shoot dates, galleries, pending balances): &lt;strong&gt;$15&lt;/strong&gt; — &lt;a href="https://clearstay.gumroad.com/l/dydcf" rel="noopener noreferrer"&gt;https://clearstay.gumroad.com/l/dydcf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shop: &lt;a href="https://attractive-crib-5bc.notion.site/Cove-3d0d7a0e569e80d2a58fe8ff9b692e60" rel="noopener noreferrer"&gt;https://attractive-crib-5bc.notion.site/Cove-3d0d7a0e569e80d2a58fe8ff9b692e60&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo video: &lt;a href="https://youtu.be/hRAZmlWSUD0" rel="noopener noreferrer"&gt;https://youtu.be/hRAZmlWSUD0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Affiliate: none. Not tax software. Not legal advice.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>freelance</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
