<?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: Sebastian Bardach</title>
    <description>The latest articles on DEV Community by Sebastian Bardach (@bardachtech).</description>
    <link>https://dev.to/bardachtech</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%2F4240025%2F2e08cca9-b024-4a8a-9dcd-a0ea3be5da5b.png</url>
      <title>DEV Community: Sebastian Bardach</title>
      <link>https://dev.to/bardachtech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bardachtech"/>
    <language>en</language>
    <item>
      <title>The freelance day rate formula, as code: from income goal to hourly and day rate</title>
      <dc:creator>Sebastian Bardach</dc:creator>
      <pubDate>Thu, 12 Nov 2026 11:48:01 +0000</pubDate>
      <link>https://dev.to/bardachtech/the-freelance-day-rate-formula-as-code-from-income-goal-to-hourly-and-day-rate-4jg</link>
      <guid>https://dev.to/bardachtech/the-freelance-day-rate-formula-as-code-from-income-goal-to-hourly-and-day-rate-4jg</guid>
      <description>&lt;p&gt;Most freelancers set their rate by looking at what others charge. That tells you the market, not whether the rate pays your bills. The calculation is short enough to write as a function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;freelance_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;income_goal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tax_set_aside&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;business_costs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;weeks_off&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hours_per_week&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;billable_share&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days_per_week&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;revenue_needed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;income_goal&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tax_set_aside&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;business_costs&lt;/span&gt;
    &lt;span class="n"&gt;working_weeks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;weeks_off&lt;/span&gt;
    &lt;span class="n"&gt;billable_hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;working_weeks&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;hours_per_week&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;billable_share&lt;/span&gt;
    &lt;span class="n"&gt;billable_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;working_weeks&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;days_per_week&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;billable_share&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"revenue_needed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;revenue_needed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"hourly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;revenue_needed&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;billable_hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"day_rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;revenue_needed&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;billable_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;freelance_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weeks_off&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hours_per_week&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;billable_share&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# {'revenue_needed': 86000.0, 'hourly': 77.9, 'day_rate': 623.19}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why each term is there
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;income_goal / (1 - tax_set_aside)&lt;/code&gt;&lt;/strong&gt; — the goal is what you keep. 60,000 after a 25 % set-aside needs 80,000 before it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;+ business_costs&lt;/code&gt;&lt;/strong&gt; — software, hardware, insurance, accountant. 6,000 in this example.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;weeks_off&lt;/code&gt;&lt;/strong&gt; — holidays, sick days, public holidays. Six weeks is the assumption here; use your own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;billable_share&lt;/code&gt;&lt;/strong&gt; — the big one. Sales calls, proposals, admin and invoicing are work nobody pays for. 60 % is an assumption for this example; measure your own for a month; yours may differ from 60 %.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these inputs: 86,000 over 1,104 billable hours = &lt;strong&gt;77.90 an hour&lt;/strong&gt;, or &lt;strong&gt;623.19 a billable day&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sensitivity: what moves the rate most
&lt;/h2&gt;

&lt;p&gt;Drop &lt;code&gt;billable_share&lt;/code&gt; from 0.60 to 0.45 and the hourly rate becomes 103.86. Raise costs by 2,000 and it moves by 1.81. Your utilisation matters far more than your software bill, which is why tracking where unbilled hours go pays off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try your own numbers
&lt;/h2&gt;

&lt;p&gt;Same formula, no sign-up, nothing stored: &lt;a href="https://clientsroster.bardach-technologies.com/tool/?utm_source=syn-devto" rel="noopener noreferrer"&gt;freelance hourly rate calculator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built the calculator linked above and make Clientsroster, a Notion client and project hub for freelancers. Written with AI assistance and checked by me.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelancing</category>
      <category>career</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Cost a restaurant menu in a spreadsheet: four formulas and one sheet layout</title>
      <dc:creator>Sebastian Bardach</dc:creator>
      <pubDate>Thu, 12 Nov 2026 11:47:53 +0000</pubDate>
      <link>https://dev.to/bardachtech/cost-a-restaurant-menu-in-a-spreadsheet-four-formulas-and-one-sheet-layout-4fi5</link>
      <guid>https://dev.to/bardachtech/cost-a-restaurant-menu-in-a-spreadsheet-four-formulas-and-one-sheet-layout-4fi5</guid>
      <description>&lt;p&gt;A restaurant menu is a small data model: ingredients with prices, recipes that use them, and dishes with a selling price. Most kitchens keep it in their heads. Here is the version that fits in one spreadsheet, with no macros, in Excel 365 or Google Sheets.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data: three sheets
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sheet&lt;/th&gt;
&lt;th&gt;One row per&lt;/th&gt;
&lt;th&gt;Columns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ingredients&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;purchased item&lt;/td&gt;
&lt;td&gt;A name, B pack size, C pack unit, D pack price, E usable %, F cost per usable unit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Recipes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ingredient in a dish&lt;/td&gt;
&lt;td&gt;A dish, B ingredient, C quantity (in the ingredient's pack unit), D unit, E unit cost, F line cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Dishes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;menu item&lt;/td&gt;
&lt;td&gt;A dish, B portions per batch, C waste allowance %, D extras per plate, E menu price (net of tax), F target food cost %, G plate cost, H food cost %, I suggested price&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One rule saves most errors: &lt;strong&gt;recipe quantities use the same unit as the pack price&lt;/strong&gt;. If onions are priced per kg, write 0.12 kg, not 120 g (or add a conversion column).&lt;/p&gt;

&lt;h2&gt;
  
  
  Formula 1 — cost per usable unit (&lt;code&gt;Ingredients!F2&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=D2/(B2*E2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 10 kg sack of onions at 15.00 with 90 % usable after peeling: &lt;code&gt;15 / (10 × 0.9) = 1.67&lt;/code&gt; per kg, not 1.50.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formula 2 — plate cost
&lt;/h2&gt;

&lt;p&gt;Look up the unit cost and the line cost in &lt;code&gt;Recipes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E2:  =XLOOKUP(B2, Ingredients!A:A, Ingredients!F:F)
F2:  =C2*E2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Older Excel: &lt;code&gt;=INDEX(Ingredients!F:F, MATCH(B2, Ingredients!A:A, 0))&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;Then, per dish in &lt;code&gt;Dishes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;G2 (plate cost):  =SUMIF(Recipes!A:A, A2, Recipes!F:F) * (1 + C2) / B2 + D2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worked example: a batch costs 24.00 in ingredients, 5 % waste allowance, 8 portions, 0.35 of extras per plate: &lt;code&gt;24 × 1.05 / 8 + 0.35 = 3.50&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formula 3 — food cost % (&lt;code&gt;H2&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=G2/E2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At 14.00 net: &lt;code&gt;3.50 / 14.00 = 25.0 %&lt;/code&gt;, leaving 10.50 per plate before labour and overheads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formula 4 — the price that hits your target (&lt;code&gt;I2&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=G2/F2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At a 28 % target: &lt;code&gt;3.50 / 0.28 = 12.50&lt;/code&gt;. Conditional formatting on "food cost % &amp;gt; target" shows which dishes to re-price or re-portion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it current
&lt;/h2&gt;

&lt;p&gt;Supplier prices move; the menu does not. Once a month, update &lt;code&gt;Ingredients!D&lt;/code&gt; from the invoices and the whole menu re-costs. Then compare with actual food cost for the month — (opening stock + purchases − closing stock) ÷ food sales. A gap of a few points usually points to portioning, waste, comps or theft rather than prices (a common rule of thumb, not a fixed threshold).&lt;/p&gt;

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

&lt;p&gt;The same formulas for one dish run in a free calculator, no sign-up, nothing stored: &lt;a href="https://recipescosting.bardach-technologies.com/tool/food-cost-menu-price-calculator?utm_source=syn-devto" rel="noopener noreferrer"&gt;food cost and menu price calculator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built the calculator linked above and make Larderly, a ready-made version of this sheet for a whole menu. Written with AI assistance and checked by me.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>spreadsheets</category>
      <category>excel</category>
      <category>googlesheets</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
