<?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: T.M. Gunderson</title>
    <description>The latest articles on DEV Community by T.M. Gunderson (@tm_gunderson_9cff63a7ba).</description>
    <link>https://dev.to/tm_gunderson_9cff63a7ba</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%2F3902717%2Fd28460c5-e4e2-483f-8d0d-af8c01d109dd.png</url>
      <title>DEV Community: T.M. Gunderson</title>
      <link>https://dev.to/tm_gunderson_9cff63a7ba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tm_gunderson_9cff63a7ba"/>
    <language>en</language>
    <item>
      <title>I Stopped Manually Sorting Receipts — Here's the AI Workflow That Categorizes Every Expense</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Fri, 25 Sep 2026 09:02:20 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/i-stopped-manually-sorting-receipts-heres-the-ai-workflow-that-categorizes-every-expense-111e</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/i-stopped-manually-sorting-receipts-heres-the-ai-workflow-that-categorizes-every-expense-111e</guid>
      <description>&lt;h1&gt;
  
  
  I Stopped Manually Sorting Receipts — Here's the AI Workflow That Categorizes Every Expense
&lt;/h1&gt;

&lt;p&gt;Every month, I'd spend an entire Sunday afternoon sorting receipts. Download from email, check the vendor, figure out the category, type it into a spreadsheet. 30–50 receipts. 4–8 hours gone.&lt;/p&gt;

&lt;p&gt;Multiply that across every small business owner I know and you're looking at millions of hours wasted on what is fundamentally a pattern-matching problem. The vendor name, amount, and date are all right there in the email. The category follows predictable rules. This is exactly the kind of work AI should eat for breakfast.&lt;/p&gt;

&lt;p&gt;So I built an n8n workflow that watches my receipt emails, extracts the key data, categorizes each expense, and logs everything to a Google Sheet. Time per month: 0 hours of manual sorting, maybe 15 minutes of spot-checking.&lt;/p&gt;

&lt;p&gt;Here's the full build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Expense Categorization Is a Bigger Problem Than You Think
&lt;/h2&gt;

&lt;p&gt;Most small business owners handle expenses in one of two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Shoebox method&lt;/strong&gt; — throw every receipt in a folder and panic at tax time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual spreadsheet&lt;/strong&gt; — spend hours each month typing line items&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both cost real money. The average small business owner spends &lt;strong&gt;4–8 hours per month&lt;/strong&gt; on expense management, according to a QuickBooks survey. At $75/hour opportunity cost, that's &lt;strong&gt;$300–$600/month&lt;/strong&gt; in lost productivity.&lt;/p&gt;

&lt;p&gt;And the stakes are higher than time. The IRS estimates that &lt;strong&gt;incorrect expense categorization&lt;/strong&gt; triggers audits and missed deductions worth thousands. Misclassify a capital expense as an operating expense and you lose depreciation deductions. Put a meal with a client under "travel" and you lose the 50% deduction cap protection.&lt;/p&gt;

&lt;p&gt;The right category matters. And getting it right shouldn't take your Sunday.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 Categories That Cover 90% of Small Business Expenses
&lt;/h2&gt;

&lt;p&gt;Before building the workflow, I mapped every expense from the past 12 months. Here's what I found:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;% of Total&lt;/th&gt;
&lt;th&gt;Common Vendors&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Software &amp;amp; Subscriptions&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;AWS, Stripe, GitHub, Google Workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Office &amp;amp; Operations&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;Staples, Amazon, USPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketing &amp;amp; Advertising&lt;/td&gt;
&lt;td&gt;19%&lt;/td&gt;
&lt;td&gt;Meta Ads, Google Ads, Mailchimp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Travel &amp;amp; Meals&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;Uber, Hilton, restaurant receipts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Professional Services&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;td&gt;Lawyer invoices, CPA fees, consultants&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five categories. That's it. The long tail — office plants, random software, one-off purchases — accounted for less than 10% and almost always fell into "Office &amp;amp; Operations" as a catch-all.&lt;/p&gt;

&lt;p&gt;This matters because AI categorization works best with a small, well-defined target set. You don't need 47 QuickBooks categories. You need 5–8 that map to your actual spending patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow: Email → Extract → Categorize → Log
&lt;/h2&gt;

&lt;p&gt;Here's the architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gmail Trigger (new receipt emails)
    ↓
AI Extract Node (vendor, amount, date, description)
    ↓
AI Categorize Node (maps to 5 categories)
    ↓
Google Sheets Node (log the row)
    ↓
Slack Notification (daily summary)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 1: Gmail Trigger
&lt;/h3&gt;

&lt;p&gt;Set up a Gmail trigger that watches for emails matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;subject&lt;/span&gt;:(&lt;span class="n"&gt;receipt&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;invoice&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="n"&gt;confirmation&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="n"&gt;receipt&lt;/span&gt;)
&lt;span class="n"&gt;from&lt;/span&gt;:(&lt;span class="n"&gt;stripe&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;amazon&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;uber&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;paypal&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This catches 80%+ of automated receipt emails. Add your own vendors as you discover them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: AI Extract Node
&lt;/h3&gt;

&lt;p&gt;Use an OpenAI node with this system prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are an expense data extractor. Given an email body, extract:
1. vendor_name: The company name (e.g., "Amazon", "Stripe", "Uber")
2. amount: The total amount as a number (e.g., 49.99)
3. currency: ISO currency code, default USD
4. date: The transaction date in YYYY-MM-DD format
5. description: A 10-word summary of what was purchased
6. payment_method: Last 4 digits if visible, otherwise "unknown"

Return ONLY valid JSON with these fields. If a field cannot be determined, use null.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight: &lt;strong&gt;ask for structured JSON output, not prose.&lt;/strong&gt; This makes the next step deterministic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: AI Categorize Node
&lt;/h3&gt;

&lt;p&gt;A second OpenAI call with the extracted data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You categorize business expenses into exactly one of these categories:
- software_subscriptions: SaaS, cloud services, domains, hosting
- office_operations: supplies, shipping, equipment, furniture
- marketing_advertising: ads, email tools, design, social media management
- travel_meals: flights, hotels, rideshares, client dinners
- professional_services: legal, accounting, consulting, freelance contractors

Given the vendor name, amount, and description, return ONLY the category key.
If uncertain, default to office_operations.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why a second call instead of combining extraction and categorization? &lt;strong&gt;Separation of concerns.&lt;/strong&gt; The extraction step needs to be accurate — wrong amounts are worse than wrong categories. The categorization step can tolerate fuzziness. Combining them makes both worse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Google Sheets Log
&lt;/h3&gt;

&lt;p&gt;Map the combined output to a row:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Payment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-06-25&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;127.43&lt;/td&gt;
&lt;td&gt;software_subscriptions&lt;/td&gt;
&lt;td&gt;Monthly cloud hosting&lt;/td&gt;
&lt;td&gt;•••4821&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 5: Daily Slack Summary
&lt;/h3&gt;

&lt;p&gt;A scheduled node sends a daily digest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📊 Today's Expenses (3 items, $412.67 total)
• AWS — $127.43 (software_subscriptions)
• Uber — $23.50 (travel_meals)
• Staples — $261.74 (office_operations)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This takes 5 seconds to scan. If something looks wrong, you fix it in the sheet. Otherwise, you're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The n8n Workflow JSON
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Expense Categorizer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"pollTimes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"everyMinute"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"filters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stripe OR amazon OR uber OR paypal OR square"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"receipt OR invoice OR order confirmation"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gmail Trigger"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n8n-nodes-base.gmailTrigger"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-4o-mini"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You are an expense data extractor. Given an email body, extract:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;1. vendor_name: company name&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;2. amount: total as number&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;3. currency: ISO code, default USD&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;4. date: YYYY-MM-DD&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;5. description: 10-word summary&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;6. payment_method: last 4 digits or 'unknown'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Return ONLY valid JSON."&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $json.snippet }}"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"responseFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"json_object"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Extract Data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n8n-nodes-base.openAi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;470&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-4o-mini"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Categorize this expense into exactly one:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;- software_subscriptions&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;- office_operations&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;- marketing_advertising&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;- travel_meals&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;- professional_services&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Return ONLY the category key."&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $json.vendor_name }} — ${{ $json.amount }} — {{ $json.description }}"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Categorize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n8n-nodes-base.openAi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;690&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"append"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"documentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_SHEET_ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"range"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Expenses!A:F"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"columns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mappingMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"defineBelow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $('Extract Data').item.json.date }}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Vendor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $('Extract Data').item.json.vendor_name }}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $('Extract Data').item.json.amount }}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $('Categorize').item.json.text }}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $('Extract Data').item.json.description }}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Payment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{ $('Extract Data').item.json.payment_method }}"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Log to Sheets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n8n-nodes-base.googleSheets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;910&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#expenses"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"📊 New expense: *{{ $('Extract Data').item.json.vendor_name }}* — ${{ $('Extract Data').item.json.amount }} ({{ $('Categorize').item.json.text }})"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Slack Alert"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n8n-nodes-base.slack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Gmail Trigger"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Extract Data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Extract Data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Categorize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Categorize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Log to Sheets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Log to Sheets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Slack Alert"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy this into n8n, add your Gmail and Google Sheets credentials, and you're running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers: What This Actually Saves
&lt;/h2&gt;

&lt;p&gt;For a business processing 50 expenses/month:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Saved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opening &amp;amp; reading receipts&lt;/td&gt;
&lt;td&gt;2.5 hrs&lt;/td&gt;
&lt;td&gt;0 hrs&lt;/td&gt;
&lt;td&gt;2.5 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Categorizing expenses&lt;/td&gt;
&lt;td&gt;1.5 hrs&lt;/td&gt;
&lt;td&gt;0.25 hrs (spot-check)&lt;/td&gt;
&lt;td&gt;1.25 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data entry into sheets&lt;/td&gt;
&lt;td&gt;1.5 hrs&lt;/td&gt;
&lt;td&gt;0 hrs&lt;/td&gt;
&lt;td&gt;1.5 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finding missed receipts&lt;/td&gt;
&lt;td&gt;1 hr&lt;/td&gt;
&lt;td&gt;0.25 hrs&lt;/td&gt;
&lt;td&gt;0.75 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.5 hrs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.5 hrs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6 hrs/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At $75/hour: &lt;strong&gt;$450/month saved.&lt;/strong&gt; At scale with 200+ expenses: &lt;strong&gt;$1,200+/month.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And this is before tax-season benefits. When your CPA asks for expense categories, you hand them a clean spreadsheet instead of a shoebox. That alone can save $500–$1,000 in CPA fees.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Mistakes I Made Building This (So You Don't Have To)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1: Combining extraction and categorization into one prompt.&lt;/strong&gt;&lt;br&gt;
The AI would sometimes hallucinate categories into the amount field, or combine vendor names with descriptions. Two separate calls with clear, single-purpose prompts fixed this completely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 2: Too many categories.&lt;/strong&gt;&lt;br&gt;
I started with 15 categories matching our chart of accounts. The AI got confused between "office supplies" and "office equipment" and "office furniture." Reducing to 5 broad categories pushed accuracy from ~70% to ~95%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 3: Not handling multi-item receipts.&lt;/strong&gt;&lt;br&gt;
Amazon receipts often have 3–5 items in one order. The workflow now splits multi-item receipts into separate rows, each with its own category. This required a small loop node but was worth the accuracy gain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Connects To
&lt;/h2&gt;

&lt;p&gt;Expense categorization is step one. Once your expenses are structured data, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flag anomalous spending&lt;/strong&gt; — "You spent 40% more on software this month"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-generate P&amp;amp;L reports&lt;/strong&gt; — monthly profit &amp;amp; loss without manual rollups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predict cash flow&lt;/strong&gt; — feed categorized expenses into a simple forecasting model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Catch duplicate charges&lt;/strong&gt; — same vendor, same amount, within 7 days = alert&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these is another n8n workflow layered on top of the same clean data foundation.&lt;/p&gt;

&lt;p&gt;Start with categorization. Get your expenses into a shape a computer can reason about. Then stack the next automation on top.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're building expense automation or want the full n8n workflow with error handling and multi-item receipt parsing, drop a comment or reach out. I share complete workflows with working JSON — no gated PDFs.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your Team Already Creates Content — Here's How to Turn It Into a Growth Engine</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Fri, 25 Sep 2026 09:01:47 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/your-team-already-creates-content-heres-how-to-turn-it-into-a-growth-engine-347h</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/your-team-already-creates-content-heres-how-to-turn-it-into-a-growth-engine-347h</guid>
      <description>&lt;p&gt;Most small businesses treat content marketing as the owner's job. The owner hates it, posts irregularly, and gets crickets. Meanwhile, five employees are posting personal stuff to social media every day — and reaching exactly the audience the business needs.&lt;/p&gt;

&lt;p&gt;The fix isn't "make everyone post on LinkedIn." The fix is a structured game that makes employee content creation fun, measurable, and worth doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Model: A Point System, Not a Mandate
&lt;/h2&gt;

&lt;p&gt;The Tenex Creator Cup runs a quarterly competition where employees earn points for creating content. The prize pool is $5,000 — split across winners. But here's the math that matters: if one employee's content leads to a single quality hire, that $5K already paid for itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scale this down for a 5-20 person business:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prize pool:&lt;/strong&gt; $500–$1,000 per quarter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point system:&lt;/strong&gt; Assign points per action (see below)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duration:&lt;/strong&gt; 4-week sprints, not open-ended marathons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule:&lt;/strong&gt; No mandatory participation — opt-in only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The opt-in rule is critical. Forced content sounds like homework. Voluntary content sounds like a game people might win.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Point System
&lt;/h2&gt;

&lt;p&gt;Assign point values to content actions that map to actual business value:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write a short post about your work&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Lowest barrier to start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Post a behind-the-scenes photo&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Authenticity &amp;gt; polish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record a 60-second video tip&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Video reaches further&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write a how-to article&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;Long-form builds authority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get 10+ engagements on a post&lt;/td&gt;
&lt;td&gt;20 bonus&lt;/td&gt;
&lt;td&gt;Rewards quality, not just volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mention a coworker or the business&lt;/td&gt;
&lt;td&gt;5 bonus&lt;/td&gt;
&lt;td&gt;Cross-pollination grows reach&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep it simple. Five action types, two bonuses. Don't build a 20-row spreadsheet — nobody will read it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Works for Small Businesses
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Your employees already have the audience you're paying ads to reach.&lt;/strong&gt; A landscaper's crew chief knows other landscapers. A salon stylist follows hundreds of potential clients. A restaurant server's personal network includes people who eat out.&lt;/p&gt;

&lt;p&gt;Employee content reaches warm audiences — people who already trust the person sharing it. That trust transfers to the business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One good hire = full ROI.&lt;/strong&gt; If your mechanic posts a 30-second reel about working at your shop and it attracts one qualified applicant, you just saved $3,000–$5,000 in recruiting costs. The prize pool is already justified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It builds culture.&lt;/strong&gt; When people see their coworkers creating content and getting recognized, it shifts the vibe. The business stops feeling like "the place I go to work" and starts feeling like "the place that values what I say."&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Shortcut
&lt;/h2&gt;

&lt;p&gt;Here's where AI makes this actually feasible for small teams:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content prompts:&lt;/strong&gt; Feed your business type into any AI assistant and ask for 30 days of post ideas tailored to your industry. Distribute one idea per employee per week.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Draft assistance:&lt;/strong&gt; Employees who say "I don't know what to write" can paste their rough thoughts into an AI tool and get a polished first draft in 30 seconds. They edit, approve, and post.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tracking:&lt;/strong&gt; Use a simple shared spreadsheet or free project board. Employees drop links to what they posted. Calculate points weekly. Post a leaderboard somewhere visible — a group chat, a whiteboard, wherever your team already looks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Repurposing:&lt;/strong&gt; One employee's 60-second video becomes three short clips, a text post, and a how-to article draft. AI can extract key points from video transcripts and spin them into multiple content pieces.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Launching It: The 4-Week Sprint
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 1 — Soft launch.&lt;/strong&gt; Announce the game. Share the point system. Give everyone their first content prompt. Don't expect a flood — expect 3-5 people to try it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2 — First results.&lt;/strong&gt; Post the leaderboard. Highlight what's working. Share a specific post that got engagement and explain why it worked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3 — Momentum.&lt;/strong&gt; More people join because they see others having fun and getting recognized. The competitive instinct kicks in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 4 — Close and celebrate.&lt;/strong&gt; Tally points, announce winners, distribute prizes. Do a quick retro: what got the most engagement? What felt easy? What felt forced?&lt;/p&gt;

&lt;p&gt;Then start sprint two with the lessons from sprint one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Not To Do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't script people.&lt;/strong&gt; Give ideas, not scripts. Scripted employee content is obvious and off-putting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't gatekeep.&lt;/strong&gt; Don't require management approval before every post. Trust your team or don't run the program.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't make it about virality.&lt;/strong&gt; A post that reaches 50 of the &lt;em&gt;right&lt;/em&gt; people beats a post that reaches 5,000 random accounts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't forget to promote the program internally.&lt;/strong&gt; If nobody knows the game exists, nobody plays.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Your business already employs its best content creators. They just don't know it yet — and nobody's asked them to think of themselves that way.&lt;/p&gt;

&lt;p&gt;A $500 quarterly prize pool, a simple point system, and four weeks of low-pressure competition can turn your team into a content engine that produces more authentic, effective marketing than any agency contract.&lt;/p&gt;

&lt;p&gt;Start this month. Run one sprint. See what happens. The worst case is you spend $500 and your team learns something about social media. The best case is you attract your next great hire through a 30-second video your cashier filmed on a Tuesday afternoon.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your Inbox Is a Triage Problem — Not a Communication Problem</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Fri, 25 Sep 2026 09:01:14 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/your-inbox-is-a-triage-problem-not-a-communication-problem-394j</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/your-inbox-is-a-triage-problem-not-a-communication-problem-394j</guid>
      <description>&lt;p&gt;The average small business owner spends over 5 hours a week on email. Not writing thoughtful responses — just sorting, skimming, and deciding what to ignore.&lt;/p&gt;

&lt;p&gt;That's not communication. That's triage. And triage is a process, which means it's automatable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three-Bucket Email Problem
&lt;/h2&gt;

&lt;p&gt;Every email that lands in your inbox falls into one of three buckets:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bucket 1: Noise&lt;/strong&gt; — Newsletters, promotions, cold outreach, CC'd FYIs. No action required. Delete or archive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bucket 2: Quick Response&lt;/strong&gt; — "Can you confirm the meeting time?" "Here's the invoice." "Thanks for the update." These need 1-2 sentences and under 60 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bucket 3: Real Work&lt;/strong&gt; — Client requests, proposal questions, project decisions. These require thought, context, and careful replies.&lt;/p&gt;

&lt;p&gt;Most SMB owners spend 80% of their email time on Buckets 1 and 2. That's the automation opportunity.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Automate Email Triage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Audit Your Last 50 Emails
&lt;/h3&gt;

&lt;p&gt;Pull up your inbox. Categorize the last 50 messages into the three buckets. Count them.&lt;/p&gt;

&lt;p&gt;Typical SMB breakdown:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bucket&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;% of Inbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Noise&lt;/td&gt;
&lt;td&gt;20-25&lt;/td&gt;
&lt;td&gt;40-50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick Response&lt;/td&gt;
&lt;td&gt;15-20&lt;/td&gt;
&lt;td&gt;30-40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real Work&lt;/td&gt;
&lt;td&gt;5-10&lt;/td&gt;
&lt;td&gt;10-20%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your numbers look like this, half your email doesn't need you at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Set Up Rules for Bucket 1
&lt;/h3&gt;

&lt;p&gt;Before you touch AI, use what you already have. Gmail, Outlook, and most email clients support rules and filters.&lt;/p&gt;

&lt;p&gt;Create rules that automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Archive newsletters you never read&lt;/li&gt;
&lt;li&gt;Move transactional emails (receipts, confirmations) to a dedicated folder&lt;/li&gt;
&lt;li&gt;Label cold outreach from unknown senders&lt;/li&gt;
&lt;li&gt;Flag emails where you're CC'd (not the primary recipient) for bulk review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This alone typically cuts 30-40% of inbox volume before AI enters the picture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add an AI Agent for Bucket 2
&lt;/h3&gt;

&lt;p&gt;This is where automation gets powerful. Set up an AI agent that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monitors incoming email&lt;/strong&gt; via your email API or a tool like Zapier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classifies each message&lt;/strong&gt; using a simple prompt: "Is this a quick response, real work, or noise?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drafts responses for Bucket 2&lt;/strong&gt; emails using your business context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flags Bucket 3&lt;/strong&gt; emails for your attention with a brief summary&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent doesn't send anything automatically. It drafts, you approve. Over time, you'll trust it with more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Measure Weekly
&lt;/h3&gt;

&lt;p&gt;Track two numbers each week:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time spent on email&lt;/strong&gt; (set a timer, don't estimate)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emails handled without you&lt;/strong&gt; (drafted by AI, approved and sent)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal: reduce your email time by 50% within 30 days. If you're currently at 5 hours/week, that's 2.5 hours reclaimed — every single week.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Automate First
&lt;/h2&gt;

&lt;p&gt;Start with the highest-volume, lowest-judgment email types in your business:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Appointment confirmations and reschedules&lt;/strong&gt; — Template responses with schedule links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoice and payment acknowledgments&lt;/strong&gt; — "Received, processing" auto-replies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project status requests&lt;/strong&gt; — Pull data from your project tool, draft a summary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor/supplier routine communications&lt;/strong&gt; — Order confirmations, shipping updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review and testimonial follow-ups&lt;/strong&gt; — Timed reminders with draft text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these follows a pattern. Patterns are what AI handles best.&lt;/p&gt;

&lt;h2&gt;
  
  
  What NOT to Automate Yet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Client complaints or escalations&lt;/li&gt;
&lt;li&gt;Negotiations on pricing or scope&lt;/li&gt;
&lt;li&gt;Sensitive personnel matters&lt;/li&gt;
&lt;li&gt;Anything requiring legal or compliance judgment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These need human nuance. The AI agent should surface these for you immediately, not attempt to handle them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quick-Start Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Categorize your last 50 emails into Noise / Quick Response / Real Work&lt;/li&gt;
&lt;li&gt;[ ] Set up email rules for the Noise bucket (archive, label, filter)&lt;/li&gt;
&lt;li&gt;[ ] Identify your top 3 Quick Response email types by volume&lt;/li&gt;
&lt;li&gt;[ ] Create draft templates for those 3 types&lt;/li&gt;
&lt;li&gt;[ ] Set up an AI agent to classify incoming email and draft Quick Responses&lt;/li&gt;
&lt;li&gt;[ ] Approve all AI drafts for the first 2 weeks (no auto-send)&lt;/li&gt;
&lt;li&gt;[ ] Measure time saved weekly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Email triage is the lowest-hanging fruit in SMB automation. It's high-volume, repetitive, and low-judgment — exactly the pattern where AI agents deliver fast, measurable results.&lt;/p&gt;

&lt;p&gt;Stop sorting. Start automating.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building an email triage agent and want a classification prompt template? Drop a comment — I'll share what's working for SMBs.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Google Paid $10M for a Bankrupt Airline's Data. Yours Is Worth More Than You Think.</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Fri, 25 Sep 2026 09:00:43 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/google-paid-10m-for-a-bankrupt-airlines-data-yours-is-worth-more-than-you-think-2e9j</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/google-paid-10m-for-a-bankrupt-airlines-data-yours-is-worth-more-than-you-think-2e9j</guid>
      <description>&lt;p&gt;When Spirit Airlines went under, the planes and routes got the headlines. The quieter sale was stranger: Google paid $10 million for the airline's &lt;em&gt;data&lt;/em&gt; — de-identified business records, software code, and operations history — at the bankruptcy auction, and said it plans to use the trove to improve its AI models (&lt;a href="https://www.reuters.com/legal/litigation/google-buy-spirit-airlines-business-data-10-million-2026-08-17/" rel="noopener noreferrer"&gt;Reuters&lt;/a&gt;, &lt;a href="https://www.axios.com/2026/08/17/google-spirit-airlines-bankruptcy" rel="noopener noreferrer"&gt;Axios&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Nobody paid eight figures for Spirit's desks. They paid it for the records. That's the clearest signal yet of what business data has become: not a byproduct of doing business, but an asset in its own right.&lt;/p&gt;

&lt;p&gt;You don't have an airline's worth of data. But the same logic applies at the scale of a 10-person shop — and the AI era makes your data pay twice. Here's why, and here's the 30-minute audit that puts it to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Buyers Care About Data Now
&lt;/h2&gt;

&lt;p&gt;When a small business sells, the price is mostly a multiple of earnings. But the multiple itself moves with risk. A service business that depends entirely on the founder's daily involvement might sell for two to three times earnings; a business with recurring revenue, a strong team, and diversified clients can command five or six times (&lt;a href="https://www.forbes.com/sites/liendepau/2026/08/29/how-to-know-what-your-business-is-actually-worth/" rel="noopener noreferrer"&gt;Forbes&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;What's inside that gap? Transferability. A buyer is asking one question: &lt;em&gt;does the value of this business leave when the owner does?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Clean, organized, exported data is the most underrated answer to that question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customer history&lt;/strong&gt; — who buys, how often, at what price points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational records&lt;/strong&gt; — job history, costs, turnaround times, warranty claims&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing rules&lt;/strong&gt; — documented rate logic instead of "it's in the owner's head"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor and contract terms&lt;/strong&gt; — renewable agreements a buyer inherits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A business where that information lives in the owner's inbox sells at a discount, if it sells at all. A business where it's organized sells at a premium. Buyers price risk relentlessly — and messy data is risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Second Payoff: AI Readiness
&lt;/h2&gt;

&lt;p&gt;The Spirit sale points at the second reason this matters now. Google bought that data &lt;em&gt;to train AI&lt;/em&gt;. The same shift is happening at every scale: businesses want to put AI to work, and AI can only work with what it can read.&lt;/p&gt;

&lt;p&gt;Every AI automation — drafted follow-ups, invoice chasing, lead qualification, demand forecasting — runs on the same fuel: your data, in a usable form. A business whose records live in five SaaS tools, twelve spreadsheets, and one founder's memory has nothing an AI agent can use. The 30-minute audit below is, not coincidentally, also step one of almost every automation project.&lt;/p&gt;

&lt;p&gt;That's the double payoff: &lt;strong&gt;the same data hygiene that makes a business sellable is what makes it automatable.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-Minute Data Audit
&lt;/h2&gt;

&lt;p&gt;This isn't a data-science project. It's a map. Set a timer and answer four questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Where does data live? (10 minutes)
&lt;/h3&gt;

&lt;p&gt;List every place your business information is stored. Most small businesses end up with five buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SaaS tools&lt;/strong&gt; — CRM, scheduling, invoicing, email marketing, POS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spreadsheets&lt;/strong&gt; — the tracking files nobody admits they rely on&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email and text threads&lt;/strong&gt; — pricing quotes, client decisions, supplier terms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paper and notes&lt;/strong&gt; — job-site notes, receipts, the notebook in the truck&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People's heads&lt;/strong&gt; — pricing logic, supplier terms, "who we don't work with anymore"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write the buckets down. Don't fix anything yet — just see the sprawl honestly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: What's exportable? (10 minutes)
&lt;/h3&gt;

&lt;p&gt;Go down your SaaS list and run the export test for each: &lt;em&gt;can you get a full export — right now, without contacting support?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A CSV export button and an API key are the baseline. If the only path to your own data is "email our success team," that's a flag — your data lives in someone else's vault. Note each tool as &lt;strong&gt;exportable&lt;/strong&gt; or &lt;strong&gt;locked&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This matters in a sale (buyers ask for data rooms, not logins) and it matters for automation (your AI can't use what it can't reach).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Who owns each piece? (5 minutes)
&lt;/h3&gt;

&lt;p&gt;For each bucket, note who depends on it and what breaks if that person leaves. The spreadsheet only one person can read, the pricing logic only the founder knows — these are your single points of failure, and they're exactly what buyers and lenders probe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Write the one-page data map (5 minutes)
&lt;/h3&gt;

&lt;p&gt;Turn your notes into a single page:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Where it lives&lt;/th&gt;
&lt;th&gt;Exportable?&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customer list&lt;/td&gt;
&lt;td&gt;CRM&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Job history&lt;/td&gt;
&lt;td&gt;Spreadsheets&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing logic&lt;/td&gt;
&lt;td&gt;Owner's head&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That single page is the deliverable. It becomes the backbone of a data room if you ever sell, and the starting point for any AI automation you attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do With the Map
&lt;/h2&gt;

&lt;p&gt;Once the audit exists, three moves pay for themselves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Close the export gaps.&lt;/strong&gt; Move anything sitting in a locked tool to a place you control, or at minimum set a recurring export. Recurring monthly exports of every SaaS tool is the cheapest insurance in business.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get the head-data out.&lt;/strong&gt; The pricing rules and supplier terms that live in your head are worth more written down than stored. A one-hour session with an AI assistant dictating "how we price" produces a document a buyer — or an AI — can actually use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feed the map to an AI agent.&lt;/strong&gt; Hand your data map to any capable AI assistant with a prompt like: &lt;em&gt;"Here's where my business data lives. List the five automations this data supports, ranked by hours saved."&lt;/em&gt; That's a faster route to an automation roadmap than most paid audits.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Honest Limits
&lt;/h2&gt;

&lt;p&gt;A few caveats, because this topic attracts over-promising:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google's $10M purchase is an outlier. It involved millions of operational records from a national carrier. Your data won't sell at auction — its value shows up as a smoother sale, a better multiple, and lower diligence risk, not a headline number.&lt;/li&gt;
&lt;li&gt;A data audit doesn't create value out of nothing. If the underlying business is unhealthy, clean books won't fix it. Data hygiene multiplies value; it doesn't substitute for it.&lt;/li&gt;
&lt;li&gt;Doing the audit once isn't the win. The win is the habit — quarterly, 30 minutes, re-run the map.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Spirit Airlines' most interesting asset turned out to be its records. For a small business, the lesson isn't "someone might buy your data" — it's that your data is the part of the business that survives you, and it's the fuel every AI tool needs. Most owners are sitting on both a sellability gap and an automation opportunity, and they're the same gap.&lt;/p&gt;

&lt;p&gt;Thirty minutes and one page closes both.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want help with step three — turning your data map into working automations? The &lt;a href="https://smbscaleup.gumroad.com/l/boring-automation-pack" rel="noopener noreferrer"&gt;Boring Automation Pack&lt;/a&gt; includes ready-to-use templates for the follow-up, review response, and reminder workflows your audit will surface.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Stop Logging Into Your Software: The Buying Question Nobody Asks Yet</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Fri, 25 Sep 2026 09:00:12 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/stop-logging-into-your-software-the-buying-question-nobody-asks-yet-3kan</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/stop-logging-into-your-software-the-buying-question-nobody-asks-yet-3kan</guid>
      <description>&lt;p&gt;At Salesforce's flagship conference this year, the headline theme wasn't a feature. It was the absence of one: don't log into the app. Point an AI at the work and let it run the software for you.&lt;/p&gt;

&lt;p&gt;When the company whose entire product is a screen you stare at makes "never open our UI" the keynote message, the direction is settled. The value of business software is shifting from the interface to the work the software does — and increasingly, that work will be triggered by an AI assistant instead of a human with a mouse.&lt;/p&gt;

&lt;p&gt;That changes the question you should ask before buying any tool for a small business. It used to be "is it easy to use?" The better question now is: &lt;strong&gt;can my AI operate this?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a 10-Person Business Should Care
&lt;/h2&gt;

&lt;p&gt;You don't need an enterprise transformation to feel this. The first place it lands in a small business is admin work — chasing invoices, updating the CRM, scheduling, copying data between tools. Every one of those jobs gets dramatically cheaper when an AI agent can do it directly.&lt;/p&gt;

&lt;p&gt;But whether that takes an afternoon or a vendor negotiation depends entirely on decisions you already made when you bought the software. Most owners have signed up for tools that quietly lock agents out — and they won't find out until the automation fails.&lt;/p&gt;

&lt;p&gt;The fix is cheap: ask five questions before you buy, and re-ask them at every renewal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Green Flags
&lt;/h2&gt;

&lt;p&gt;Look for these when evaluating any tool:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Clean Exports
&lt;/h3&gt;

&lt;p&gt;Can you get your data out — full data, in a real format — without filing a support ticket? A CSV export button and an API endpoint are the baseline. If the only path out is "contact our success team," your data lives in someone else's vault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; Try exporting something before you commit. If you can't do it during the trial, that's the answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. API Access on Your Tier
&lt;/h3&gt;

&lt;p&gt;An API that exists but is gated to the enterprise plan is a data hostage with better marketing. Check the pricing page: is API access included at the tier a business your size would actually buy?&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Automation-Platform Connectors
&lt;/h3&gt;

&lt;p&gt;Does the tool have native connectors for Zapier, Make, or an MCP-style integration? Connectors to automation platforms are the bridge agents use to act. A tool with no connectors forces everything through its own UI — which an agent can't click.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Public, Readable Documentation
&lt;/h3&gt;

&lt;p&gt;Docs you can paste into an AI assistant are becoming more valuable than docs you can read. Public documentation means any agent can learn to operate the tool in seconds. Login-walled docs mean it can't.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Machine-Friendly Pricing
&lt;/h3&gt;

&lt;p&gt;Seat-based pricing punishes you for adding non-human workers. The vendors adapting fastest are moving toward usage- or outcome-based pricing, where an agent running a workflow costs the same whether a human triggered it or not. Ask how the vendor prices API and automation usage — the answer tells you which decade they're living in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Red Flags
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Contact us" for data export.&lt;/strong&gt; That's not a process, that's a wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports that only render in-app.&lt;/strong&gt; If it can't leave the product, you don't own it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API listed as an enterprise feature.&lt;/strong&gt; Same tool, different hostage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything requires a logged-in human.&lt;/strong&gt; No webhooks, no triggers, no scheduled runs — a tool that can only be operated by a person clicking is a tool your AI can't touch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 10-Minute Test
&lt;/h2&gt;

&lt;p&gt;Before buying — or at every renewal — spend ten minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Export something right now.&lt;/strong&gt; Full data, real format. Time it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask the vendor or check the docs:&lt;/strong&gt; "Can an automation platform trigger this without a human logged in?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find the API pricing.&lt;/strong&gt; Is it on your tier, or three upgrades away?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search for a Zapier or Make connector.&lt;/strong&gt; Absence is information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check if the docs are public.&lt;/strong&gt; Try opening one in a logged-out browser.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Score the answers. Two or more failures means the tool will cost you far more than its subscription price the moment you try to automate around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cheap Insurance
&lt;/h2&gt;

&lt;p&gt;None of this means ditching tools you like, or demanding features you don't need yet. It means making agent-readiness a standard part of the buying decision — the same way "does it work on mobile" became a checkbox nobody skips.&lt;/p&gt;

&lt;p&gt;The cheapest time to ask "can my AI run this?" is before you sign. The second cheapest is at the next renewal. The most expensive is after you've built your workflow on top of a tool that won't let the agent in.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want a reusable audit for scoring every tool in your stack? The &lt;a href="https://smbscaleup.gumroad.com/l/boring-automation-pack" rel="noopener noreferrer"&gt;Boring Automation Pack&lt;/a&gt; includes software-evaluation checklists, automation setup guides, and templates built for small businesses.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your CRM Is a Graveyard — How to Stop Drowning in Data Entry</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Thu, 24 Sep 2026 09:02:18 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/your-crm-is-a-graveyard-how-to-stop-drowning-in-data-entry-bhp</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/your-crm-is-a-graveyard-how-to-stop-drowning-in-data-entry-bhp</guid>
      <description>&lt;p&gt;You know that CRM you paid for six months ago? The one your team was "definitely going to use this time"? Go look at the last 10 entries. I'll wait.&lt;/p&gt;

&lt;p&gt;Half of them are probably incomplete. Three have wrong phone numbers. Two are duplicates. And the one contact you actually need to follow up with? Missing the deal amount entirely.&lt;/p&gt;

&lt;p&gt;This isn't a discipline problem. It's a systems problem. Data entry is the most hated task in any small business, which means it's the task most likely to be skipped, rushed, or done wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Cost of Bad CRM Data
&lt;/h2&gt;

&lt;p&gt;A CRM with garbage data isn't just useless — it's actively harmful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Missed follow-ups:&lt;/strong&gt; The "call next Tuesday" note that never got entered means a $4,000 job walks out the door&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate outreach:&lt;/strong&gt; Two salespeople call the same prospect because the entry exists twice with slightly different names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lost institutional knowledge:&lt;/strong&gt; When an employee leaves, their contacts live in their phone, not in your system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad forecasting:&lt;/strong&gt; You can't plan next quarter's revenue when half your deals have no estimated close date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The average SMB loses 5-8 hours per week on manual CRM work — or, more commonly, loses that much value by &lt;em&gt;not&lt;/em&gt; doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Automation Pipeline
&lt;/h2&gt;

&lt;p&gt;Stop trying to get humans to type data into forms. Build a pipeline that captures, cleans, and files information automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Capture at the Source
&lt;/h3&gt;

&lt;p&gt;Every business has 3-5 points where customer information enters. Map them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web forms&lt;/strong&gt; — estimate requests, contact forms, quote requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt; — prospect emails, inquiry threads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone calls&lt;/strong&gt; — voicemails, call logs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-person&lt;/strong&gt; — business cards, trade shows, walk-ins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Referrals&lt;/strong&gt; — "my friend John mentioned you"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each entry point, set up a capture rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web forms → Direct to CRM.&lt;/strong&gt; Most form tools (Gravity Forms, Typeform, whatever your site uses) can push directly into your CRM. No copy-paste. Set this up once and it runs forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email → AI extraction.&lt;/strong&gt; Route new inquiry emails to an AI agent that pulls out name, company, phone, service interest, and urgency level, then creates a draft CRM entry. You just review and approve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone → Quick voice note.&lt;/strong&gt; After a call, record a 15-second voice memo: "New lead, Sarah, roofing job, call back Thursday." An AI transcription agent converts it to a CRM entry with all fields populated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business cards → Photo + AI.&lt;/strong&gt; Snap a photo of the card. AI extracts every field. This has been possible for years — the technology isn't new, most people just don't have the workflow set up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Clean and Deduplicate
&lt;/h3&gt;

&lt;p&gt;Capturing data is half the battle. The other half is making sure it's not a mess.&lt;/p&gt;

&lt;p&gt;Set up a weekly automation that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Flags duplicates&lt;/strong&gt; — matches on name + phone or name + email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardizes formats&lt;/strong&gt; — phone numbers, addresses, company names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fills gaps&lt;/strong&gt; — if you have a company name but no industry, AI can infer it and add it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scores completeness&lt;/strong&gt; — marks records as "complete" or "needs follow-up info"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most CRM platforms have built-in deduplication. Turn it on. If yours doesn't, a simple AI agent can run this as a weekly batch job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Update Without Asking
&lt;/h3&gt;

&lt;p&gt;The biggest CRM sin is stale data. Contacts change jobs, companies change names, phone numbers go dead.&lt;/p&gt;

&lt;p&gt;Set up a quarterly automation that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checks email bounce rates on your last campaign — bounced emails get flagged&lt;/li&gt;
&lt;li&gt;Runs company names against a business directory API — catches name changes and closures&lt;/li&gt;
&lt;li&gt;Flags contacts with no activity in 90+ days — either re-engage or archive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need to do this manually. A scheduled script does it while you sleep.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before automation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monday: 3 new leads come in via website form. You see them Thursday. Two have gone cold.&lt;/li&gt;
&lt;li&gt;Wednesday: Trade show. 12 business cards collected. 3 get entered by Friday. The rest sit in a desk drawer.&lt;/li&gt;
&lt;li&gt;Friday: You remember you were supposed to follow up with someone. Search the CRM. Can't find them. Search email. Find thread. No deal amount recorded. Guess.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After automation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monday: 3 new leads auto-populate in CRM with full contact info, service interest, and source. AI drafts a personalized follow-up email for each. You click send on all three by 10 AM.&lt;/li&gt;
&lt;li&gt;Wednesday: 12 business cards photographed and processed. All 12 entries exist in CRM by Thursday morning with extracted details and suggested next actions.&lt;/li&gt;
&lt;li&gt;Friday: Dashboard shows 3 deals needing follow-up this week, sorted by value. Click, call, close.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same business. Same leads. Different system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup Effort
&lt;/h2&gt;

&lt;p&gt;This isn't a weekend project, but it's not a six-month initiative either:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Setup Time&lt;/th&gt;
&lt;th&gt;Ongoing Effort&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web form → CRM integration&lt;/td&gt;
&lt;td&gt;1-2 hours&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email → AI extraction&lt;/td&gt;
&lt;td&gt;2-3 hours&lt;/td&gt;
&lt;td&gt;10 min/week review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice note → CRM entry&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business card → AI extraction&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly deduplication&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;Automated after setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarterly data cleanup&lt;/td&gt;
&lt;td&gt;2-3 hours&lt;/td&gt;
&lt;td&gt;Automated after setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total initial setup: 8-12 hours. Total ongoing effort: 10-15 minutes per week.&lt;/p&gt;

&lt;p&gt;Compare that to the 5-8 hours per week you're currently spending (or losing by not spending).&lt;/p&gt;

&lt;h2&gt;
  
  
  What Not To Do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't over-customize fields.&lt;/strong&gt; A CRM with 40 custom fields is a CRM nobody will use. Start with 8-10 fields that actually matter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't require manual entry for things that can be automated.&lt;/strong&gt; If the data exists in an email, it should end up in the CRM without a human touching it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't build a perfect system on day one.&lt;/strong&gt; Start with the biggest leak (usually web forms or email) and automate that first. Add more entry points over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't skip the review step.&lt;/strong&gt; AI is great at extraction, but it will occasionally misread a phone number or confuse two similar contacts. A 2-minute daily review catches errors before they compound.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Your CRM isn't a graveyard because your team is lazy. It's a graveyard because manual data entry is a terrible use of human attention.&lt;/p&gt;

&lt;p&gt;The fix is simple: capture information where it enters, use AI to extract and clean it, and review rather than type. Set it up once, maintain it in minutes per week, and spend those reclaimed 5+ hours actually talking to customers instead of typing their details into a form.&lt;/p&gt;

&lt;p&gt;Start with whatever leaks the most leads today — web forms, email inquiries, or business cards — and automate that one pipeline. Then add the next one. Within a month, your CRM goes from a chore to a tool you actually trust.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;SMB Scale Up helps trades and service businesses cut admin time with practical automation. No hype, just tools that work.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Stop Losing Money to Auto-Renewals: Build a Contract Renewal Tracker with AI</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Thu, 24 Sep 2026 09:01:47 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/stop-losing-money-to-auto-renewals-build-a-contract-renewal-tracker-with-ai-23op</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/stop-losing-money-to-auto-renewals-build-a-contract-renewal-tracker-with-ai-23op</guid>
      <description>&lt;h2&gt;
  
  
  The Silent Revenue Drain
&lt;/h2&gt;

&lt;p&gt;Every SMB has contracts they forget about until the renewal notice hits — or worse, until the charge hits. Software subscriptions, vendor agreements, service contracts, lease terms. Most get auto-renewed at whatever rate the vendor feels like charging.&lt;/p&gt;

&lt;p&gt;The math is brutal: a 20-person company typically carries 30–50 active contracts. Missing just one unfavorable renewal can cost thousands. Missing several across a year? Tens of thousands in avoidable spend.&lt;/p&gt;

&lt;p&gt;The fix isn't "be more organized." It's building a system that never forgets.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Contract Renewal Tracker Needs to Do
&lt;/h2&gt;

&lt;p&gt;At minimum, you need three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt;: Get contract details into a single place — vendor, term, renewal date, auto-renew status, cost, and notice period&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert&lt;/strong&gt;: Surface renewals before the notice window closes (typically 30–90 days out)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide&lt;/strong&gt;: Give someone enough context to make a renegotiate, cancel, or renew decision&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a perfect AI automation problem because the inputs are semi-structured (contracts, emails, PDFs), the timing is date-driven, and the action is always the same shape: "review this before [date] or it renews automatically."&lt;/p&gt;

&lt;h2&gt;
  
  
  Building It: The Architecture
&lt;/h2&gt;

&lt;p&gt;Here's a practical setup using tools most SMBs already have or can get cheaply:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Centralize Contract Data
&lt;/h3&gt;

&lt;p&gt;Create a structured store — a Google Sheet, Airtable, or Notion database with these fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vendor name&lt;/td&gt;
&lt;td&gt;Obvious&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract type&lt;/td&gt;
&lt;td&gt;Software, service, lease, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual cost&lt;/td&gt;
&lt;td&gt;For prioritization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start date&lt;/td&gt;
&lt;td&gt;Context for negotiation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renewal date&lt;/td&gt;
&lt;td&gt;The critical trigger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-renew?&lt;/td&gt;
&lt;td&gt;Changes urgency completely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notice period&lt;/td&gt;
&lt;td&gt;How many days before renewal you can cancel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Active, under review, cancelled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;Who's responsible for the decision&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Set Up Monitoring with an AI Agent
&lt;/h3&gt;

&lt;p&gt;Use an AI agent (OpenClaw, n8n, or similar) to handle two jobs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingest&lt;/strong&gt;: When a new contract email or PDF comes in, the agent extracts key terms and populates the database. No manual data entry. Point it at your contracts inbox or shared drive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor&lt;/strong&gt;: The agent runs a daily check against renewal dates. When a contract hits its notice window (e.g., 60 days before renewal), it fires an alert to the contract owner with a summary: what's renewing, when, for how much, and whether it auto-renews.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Build the Decision Workflow
&lt;/h3&gt;

&lt;p&gt;For each flagged contract, the agent presents three paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Renegotiate&lt;/strong&gt; — If the cost is above market or usage is low. The agent can draft a renegotiation email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cancel&lt;/strong&gt; — If the tool isn't being used. The agent generates a cancellation notice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renew as-is&lt;/strong&gt; — If the value justifies the cost. One click, done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: the agent doesn't make the decision. It surfaces the decision at the right time with enough context that the human can decide in 60 seconds instead of 60 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Prompt That Does the Heavy Lifting
&lt;/h2&gt;

&lt;p&gt;Here's the core extraction prompt for pulling contract details from emails and PDFs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Extract&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;contract&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;renewal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;details&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;following&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;document.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vendor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contract_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"annual_cost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YYYY-MM-DD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"renewal_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YYYY-MM-DD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auto_renew"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notice_period_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"key_terms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;any&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ambiguous,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;note&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;key_terms.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;conservative&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;auto_renew&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;only&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;explicitly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;stated.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wire this into your document pipeline. Every contract that touches your inbox gets logged automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Saves in Practice
&lt;/h2&gt;

&lt;p&gt;Consider a realistic SMB scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40 active contracts averaging $3,000/year each&lt;/li&gt;
&lt;li&gt;Typical auto-renewal markup: 10–25% if you don't renegotiate&lt;/li&gt;
&lt;li&gt;Without tracking: you miss the notice window on maybe 8–12 contracts per year&lt;/li&gt;
&lt;li&gt;With tracking: you review every contract before the window closes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conservative estimate: catching just 5 unfavorable renewals per year and renegotiating or cancelling them saves $7,500–$15,000. That's a meaningful number for a 20-person company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Set up your contract database (Sheet, Airtable, or Notion)&lt;/li&gt;
&lt;li&gt;[ ] Define the schema with all fields from the table above&lt;/li&gt;
&lt;li&gt;[ ] Build or deploy an AI agent for contract ingestion&lt;/li&gt;
&lt;li&gt;[ ] Configure daily renewal monitoring (60-day notice window)&lt;/li&gt;
&lt;li&gt;[ ] Set up alert routing (email, Slack, whatever your team uses)&lt;/li&gt;
&lt;li&gt;[ ] Add decision templates (renegotiate, cancel, renew)&lt;/li&gt;
&lt;li&gt;[ ] Backfill existing contracts into the system&lt;/li&gt;
&lt;li&gt;[ ] Test with 3–5 contracts before going live&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with your top 10 contracts by annual cost. You don't need to track everything on day one. Get the system working for the contracts that matter most, then expand coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Contract renewals are a quiet, consistent money leak for SMBs. The fix isn't better memory or a shared calendar — it's a system that watches every deadline and surfaces decisions before windows close. Build it once, and it pays for itself every single year.&lt;/p&gt;

&lt;p&gt;The companies that save money on contracts aren't the ones with the best negotiators. They're the ones that never miss a deadline.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>management</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Losing Clients in Week One — Automate Your Onboarding Handoff</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Thu, 24 Sep 2026 09:01:15 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/stop-losing-clients-in-week-one-automate-your-onboarding-handoff-556m</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/stop-losing-clients-in-week-one-automate-your-onboarding-handoff-556m</guid>
      <description>&lt;h1&gt;
  
  
  Stop Losing Clients in Week One — Automate Your Onboarding Handoff
&lt;/h1&gt;

&lt;p&gt;You signed the contract. The invoice went out. And then... silence.&lt;/p&gt;

&lt;p&gt;The client waits three days for a welcome email. Nobody sends them the intake form. The project brief lives in someone's head. By Friday, they're already second-guessing the engagement.&lt;/p&gt;

&lt;p&gt;That's not a branding problem. That's an onboarding problem.&lt;/p&gt;

&lt;p&gt;For small businesses especially — agencies, consultancies, service shops — the first seven days after a signed contract are where you either build trust or bleed it. The good news: onboarding is one of the easiest workflows to automate, and the payoff is immediate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Manual Onboarding
&lt;/h2&gt;

&lt;p&gt;Here's what "onboarding" typically looks at a 5-15 person shop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sales closes the deal&lt;/strong&gt; and sends a Slack message: "Hey, we got Client X!"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Someone remembers&lt;/strong&gt; (or doesn't) to send a welcome email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An intake form gets shared&lt;/strong&gt; — maybe Google Forms, maybe a Word doc, maybe nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The PM gets looped in&lt;/strong&gt; a day or two late, already behind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The client follows up&lt;/strong&gt; asking what happens next. Awkward.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every step is a person-dependent handoff. Miss one and the client feels it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Automated Onboarding Stack
&lt;/h2&gt;

&lt;p&gt;Here's a setup that runs without you touching it. Total cost: your existing tools plus $0-20/month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Trigger on Deal Won
&lt;/h3&gt;

&lt;p&gt;Connect your CRM (HubSpot, Pipedrive, whatever) so that when a deal moves to "Closed Won," it fires a webhook.&lt;/p&gt;

&lt;p&gt;In Zapier, that's your trigger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger: New Deal in Stage "Closed Won" (HubSpot/Pipedrive)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't use a CRM, a Google Form submission works too — "New Client Intake" form, submitted by sales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Send the Welcome Email
&lt;/h3&gt;

&lt;p&gt;Action one in Zapier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Action: Send Email (Gmail / SMTP)
To: Deal contact email
Subject: Welcome aboard, {{company_name}} — here's what happens next
Body: [template with next steps, timeline, intake form link]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write this email once. It goes out within 60 seconds of the deal closing. No more "we'll follow up Monday."&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create the Project Workspace
&lt;/h3&gt;

&lt;p&gt;Action two:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Action: Create Page (Notion) / Create Folder (Drive) / Create Board (Trello)
Template: Client Onboarding Template
Variables: {{company_name}}, {{contact_name}}, {{deal_value}}, {{close_date}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now there's a workspace ready before the PM even knows about the deal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Send the Intake Form
&lt;/h3&gt;

&lt;p&gt;Action three:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Action: Send Email (or Slack notification)
To: Client contact
Content: Link to your intake form pre-filled with {{company_name}}, {{contact_name}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a pre-fill URL so the client doesn't re-type what you already know. This alone doubles form completion rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Notify the Team
&lt;/h3&gt;

&lt;p&gt;Action four:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Action: Send Slack Message
Channel: #new-clients
Message: 🎉 New client: {{company_name}} ({{deal_value}}). Welcome email sent. Intake form dispatched. Project workspace created.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everyone's aligned. No Slack ping pong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Zapier Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deal Closed Won
  → Welcome email to client
  → Create Notion project page
  → Send pre-filled intake form
  → Post to #new-clients Slack channel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four steps. Zero human delay. Every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Actually Fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No more 3-day gaps&lt;/strong&gt; between signing and first contact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No more "who's handling this?"&lt;/strong&gt; — the team channel covers it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No more copy-paste errors&lt;/strong&gt; — variables pull from the CRM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No more lost intake forms&lt;/strong&gt; — the pre-fill link goes out automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No more "I thought you sent that"&lt;/strong&gt; — it's sent before anyone can forget&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips from the Trenches
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep the welcome email short.&lt;/strong&gt; 4-5 sentences max. Link to the intake form and say when they'll hear from their PM. That's it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't over-automate.&lt;/strong&gt; The PM's first call should still be human. Automate the handoff, not the relationship.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a delay step&lt;/strong&gt; (1-2 hours) between the workspace creation and the team notification if you want a chance to review first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track form completion.&lt;/strong&gt; Add a Zapier step that watches for form submissions and notifies the PM. If the client hasn't filled it out in 48 hours, trigger a follow-up email.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to Measure
&lt;/h2&gt;

&lt;p&gt;After you set this up, track these for two weeks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time from deal close to first client contact&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intake form completion rate&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Days to project kickoff&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client satisfaction (week 1 survey)&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;td&gt;___&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're not seeing improvement, the automation isn't the problem — the form or email copy is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;Client onboarding is the first experience someone has &lt;em&gt;working with you.&lt;/em&gt; If it's slow, scattered, or silent, you're starting from a trust deficit that takes months to climb out of.&lt;/p&gt;

&lt;p&gt;Automate the handoff. Keep the human touch where it matters. And stop losing clients in week one over something a Zapier workflow could handle in 60 seconds.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building automation playbooks for small businesses. More at &lt;a href="https://smb-scaleup.com" rel="noopener noreferrer"&gt;smb-scaleup.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Stop Installing Other People's AI Skills — Build Your Own</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Thu, 24 Sep 2026 09:00:42 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/stop-installing-other-peoples-ai-skills-build-your-own-4d2m</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/stop-installing-other-peoples-ai-skills-build-your-own-4d2m</guid>
      <description>&lt;p&gt;You've seen the lists. "10 AI Skills You Need Right Now." "Install These 5 Plugins and Watch Your Business Grow." Every week, someone drops a roundup of pre-built AI skills you should add to your workflow.&lt;/p&gt;

&lt;p&gt;Here's the problem: pre-built skills are generic by design. They solve &lt;em&gt;everyone's&lt;/em&gt; problems, which means they solve &lt;em&gt;your&lt;/em&gt; problems — imprecisely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Generic Skill Trap
&lt;/h2&gt;

&lt;p&gt;When a developer builds an AI skill for public distribution, they optimize for the widest possible audience. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vague triggers&lt;/strong&gt; — "when a customer messages you" instead of "when a lead from Google Business Profile messages after hours"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-size outputs&lt;/strong&gt; — "write a professional reply" instead of "reply using your brand voice, reference your current promo, and log the lead in your CRM"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing context&lt;/strong&gt; — No access to your pricing sheet, your service area, your scheduling rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? You install a skill, it works &lt;em&gt;okay&lt;/em&gt;, and you spend time manually fixing its output every time. That's not automation. That's a new kind of busywork.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Building Your Own Actually Means
&lt;/h2&gt;

&lt;p&gt;Building a custom AI skill sounds intimidating. It isn't. You're not writing software. You're writing instructions — the same kind of instructions you'd give a new employee.&lt;/p&gt;

&lt;p&gt;A custom AI skill is just a structured prompt that tells your AI assistant:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;When to act&lt;/strong&gt; — The specific trigger (e.g., "a new review appears on my Google Business Profile")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What to do&lt;/strong&gt; — The exact steps (e.g., "analyze the sentiment, draft a personalized response, and flag if it's negative")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to sound&lt;/strong&gt; — Your brand voice, tone, and formatting rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What to reference&lt;/strong&gt; — Your pricing, policies, service descriptions&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A Practical Example
&lt;/h2&gt;

&lt;p&gt;Say you run a landscaping company. A generic "customer response" skill might generate bland replies like "Thank you for your feedback." &lt;/p&gt;

&lt;p&gt;A custom skill you build yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recognizes the service mentioned (lawn care, hardscaping, irrigation)&lt;/li&gt;
&lt;li&gt;References your seasonal availability and current wait times&lt;/li&gt;
&lt;li&gt;Uses your brand tone (friendly, not corporate)&lt;/li&gt;
&lt;li&gt;Automatically categorizes the lead by service type and urgency&lt;/li&gt;
&lt;li&gt;Flags any mention of competitors for follow-up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same trigger. Completely different result. The generic skill saves you 30 seconds. The custom skill saves you 5 minutes and produces a better outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Start
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Identify your highest-volume repetitive task.&lt;/strong&gt; Not the most complex one. The one you do most often. Customer replies, estimate follow-ups, review responses — pick one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Write down how you do it now.&lt;/strong&gt; Not how a tutorial says to do it. How &lt;em&gt;you&lt;/em&gt; actually do it. Your steps, your language, your exceptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Turn that into a skill.&lt;/strong&gt; Most AI platforms (Claude, ChatGPT, Gemini) let you save custom instructions or projects. Paste your process in. Add your business specifics. Test it on 10 real cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Iterate.&lt;/strong&gt; The first version won't be perfect. Adjust the instructions based on what it gets wrong. After 2-3 rounds of fixes, you'll have something that works better than any downloaded plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real ROI
&lt;/h2&gt;

&lt;p&gt;A generic AI skill saves you the time of writing a prompt from scratch. A custom AI skill saves you the time of &lt;em&gt;fixing&lt;/em&gt; a generic output. That difference compounds.&lt;/p&gt;

&lt;p&gt;When you build your own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You own the logic — no vendor changes breaking your workflow&lt;/li&gt;
&lt;li&gt;You control the quality — every output matches your standards&lt;/li&gt;
&lt;li&gt;You can evolve it — as your business changes, your skill changes with it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pre-built skills are training wheels. Useful for learning what's possible. But at some point, you need to ride on your own.&lt;/p&gt;

&lt;p&gt;Your business is unique. Your AI should be too.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building custom AI workflows for your small business? &lt;a href="https://smbscaleup.com" rel="noopener noreferrer"&gt;SMB Scale Up&lt;/a&gt; helps you design automation that fits — not force-fits.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The AI Price War Is Your Cost Window</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Thu, 24 Sep 2026 09:00:11 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/the-ai-price-war-is-your-cost-window-2jg8</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/the-ai-price-war-is-your-cost-window-2jg8</guid>
      <description>&lt;p&gt;The smartest AI model lost to the cheapest one. That's the headline from this week's AI pricing data, and it's the most important thing happening in small business technology right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Just Happened to AI Prices
&lt;/h2&gt;

&lt;p&gt;In one week:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt; launched at half its predecessor's price&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek V4-Pro&lt;/strong&gt; moved to off-peak pricing at 50% of normal cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grok 4.6&lt;/strong&gt; matched GPT-5.6 Sol's capability at lower per-task pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; previewed 14x faster inference (which effectively cuts per-task cost dramatically)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic's Fable 5&lt;/strong&gt; is the most capable model — and gets only 6% of business tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern is clear: capability is commoditizing. Price is winning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Your Small Business
&lt;/h2&gt;

&lt;p&gt;Six months ago, the AI tools that could genuinely automate your operations — dispatch, customer communication, scheduling, document processing — were priced for enterprise budgets. A small plumbing company or dental practice couldn't justify $200/month per AI agent when the ROI was uncertain.&lt;/p&gt;

&lt;p&gt;That math just flipped.&lt;/p&gt;

&lt;p&gt;When models cost 50% less to run, the tools built on top of them cost less too. The AI receptionist that was $300/month is now $150. The document processor that was $500/month is now $250. The gap between "nice to have" and "must have" just got cut in half.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Window Is Open — But It Won't Stay Open Forever
&lt;/h2&gt;

&lt;p&gt;Price wars happen in cycles. Here's what the pattern looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Competition drives prices down&lt;/strong&gt; (we're here now)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidation happens&lt;/strong&gt; — two or three providers dominate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prices stabilize or rise&lt;/strong&gt; — the winners have pricing power&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New disruption starts the cycle again&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You're in step 1. That's the cost window. It could last 12–18 months before consolidation starts pushing prices back up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do Right Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Audit your monthly AI spend.&lt;/strong&gt; If you're paying 2025 prices for any AI tool, you're overpaying. Check whether your provider has moved to a cheaper model tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start the automation you've been putting off.&lt;/strong&gt; The ROI math that didn't work at $200/month works at $100/month. The customer service bot, the appointment reminder system, the proposal generator — pick one and start this month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't chase the cheapest model.&lt;/strong&gt; This isn't about finding the lowest per-token price. It's about finding the tool that solves your actual business problem at a price that makes the ROI obvious. Cheap and useless is still useless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lock in annual pricing if you can.&lt;/strong&gt; If a tool you need is offering annual pricing at current rates, take it. Prices will stabilize, and you want to be locked in at the low point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure the ROI from day one.&lt;/strong&gt; Every AI tool should answer: "How many hours does this save, and what's that worth?" If a $100/month tool saves 5 hours of admin work at $30/hour, that's $150/month in value. The math works. Track it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The AI price war isn't a tech story. It's a small business opportunity story. The tools that were "someday" purchases six months ago are "this month" purchases now. The cost window is open. Use it.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Stop Writing Proposals by Hand — This n8n Workflow Turns Lead Data into Polished Proposals in Minutes</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Wed, 23 Sep 2026 15:51:32 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/stop-writing-proposals-by-hand-this-n8n-workflow-turns-lead-data-into-polished-proposals-in-3k8i</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/stop-writing-proposals-by-hand-this-n8n-workflow-turns-lead-data-into-polished-proposals-in-3k8i</guid>
      <description>&lt;p&gt;You get a lead at 2 PM. By the time you've gathered requirements, written the proposal, formatted it, had someone proofread it, exported the PDF, and emailed it — it's Thursday. The lead has already talked to three competitors who responded faster.&lt;/p&gt;

&lt;p&gt;Speed wins deals. Not flashy designs. Not 40-page documents. &lt;strong&gt;Speed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;According to a Zendesk benchmark, responding to a lead within an hour makes you 7x more likely to qualify them. Most small businesses take 2–3 days to send a proposal. That's 2–3 days of the client shopping around, forgetting about you, or going with the first responder.&lt;/p&gt;

&lt;p&gt;The fix isn't hiring a proposal writer. It's automating the mechanical parts so you can focus on the 20% that actually requires human judgment.&lt;/p&gt;

&lt;p&gt;Here's an n8n workflow that takes submitted lead data, generates a formatted proposal document, creates a PDF, and emails it to the prospect — all within minutes of their initial inquiry.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Proposals Are 80% Boilerplate
&lt;/h2&gt;

&lt;p&gt;Look at your last 10 proposals. I'll bet they share 80% of the same structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introduction and company overview&lt;/li&gt;
&lt;li&gt;Scope of work (with a few line items swapped)&lt;/li&gt;
&lt;li&gt;Pricing section (pulled from a rate card)&lt;/li&gt;
&lt;li&gt;Timeline and milestones&lt;/li&gt;
&lt;li&gt;Terms and conditions&lt;/li&gt;
&lt;li&gt;Next steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only parts that change per proposal are the client name, specific deliverables, pricing for their scope, and timeline. Everything else is copy-paste — and copy-paste is exactly what automation should handle.&lt;/p&gt;

&lt;p&gt;When you write proposals manually, you're spending 4–5 hours on what should take 30 minutes of review and 2 minutes of generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: Lead Form to Sent Proposal
&lt;/h2&gt;

&lt;p&gt;Here's the end-to-end flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Webhook Trigger (lead form submission)
  → Validate and enrich lead data
  → Look up pricing from rate card (Google Sheets)
  → Select template based on service type
  → Populate proposal template (Docu-templating or Google Docs)
  → Generate PDF
  → Send proposal email to prospect
  → Log proposal to CRM/tracking sheet
  → Notify team in Slack
  → Schedule follow-up reminder (3 days)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire pipeline runs in under 5 minutes from form submission to proposal in the client's inbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Webhook Trigger — Catch the Lead
&lt;/h2&gt;

&lt;p&gt;Start with a Webhook node that receives form submissions from your lead intake (Tally, Typeform, or a custom form).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Webhook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"httpMethod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"generate-proposal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"responseMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lastNode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The webhook receives a payload like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jordan Rivera"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jordan@riveraconsulting.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rivera Consulting Group"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"monthly-retainer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"budget_range"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5000-10000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Looking for ongoing marketing support, 6-month engagement"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate the basics right away — required fields present, email format valid. If validation fails, send a polite error response and skip the rest of the workflow. No point generating a proposal for an incomplete lead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Look Up Pricing from Your Rate Card
&lt;/h2&gt;

&lt;p&gt;Connect a Google Sheets node that reads your rate card. This is where you maintain your pricing by service type, tier, and any add-ons.&lt;/p&gt;

&lt;p&gt;Your rate card sheet might look like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Monthly Price&lt;/th&gt;
&lt;th&gt;Setup Fee&lt;/th&gt;
&lt;th&gt;Deliverables&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;monthly-retainer&lt;/td&gt;
&lt;td&gt;standard&lt;/td&gt;
&lt;td&gt;$3,500&lt;/td&gt;
&lt;td&gt;$1,000&lt;/td&gt;
&lt;td&gt;Strategy + 12 posts/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;monthly-retainer&lt;/td&gt;
&lt;td&gt;premium&lt;/td&gt;
&lt;td&gt;$6,000&lt;/td&gt;
&lt;td&gt;$2,000&lt;/td&gt;
&lt;td&gt;Strategy + 20 posts + ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;project-based&lt;/td&gt;
&lt;td&gt;standard&lt;/td&gt;
&lt;td&gt;$5,000&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Audit + report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;project-based&lt;/td&gt;
&lt;td&gt;premium&lt;/td&gt;
&lt;td&gt;$8,500&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Audit + report + implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The workflow matches the &lt;code&gt;service&lt;/code&gt; field from the form to the rate card, then picks the tier based on the &lt;code&gt;budget_range&lt;/code&gt;. This means your proposals always reflect current pricing — update the sheet once, and every proposal from that point forward uses the new numbers.&lt;/p&gt;

&lt;p&gt;No more "oops, I quoted last year's rate."&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Generate the Proposal Document
&lt;/h2&gt;

&lt;p&gt;Use an HTTP Request node or a document-generation service (like Docu-templating or the Google Docs API via n8n) to populate your proposal template.&lt;/p&gt;

&lt;p&gt;The template has placeholders like &lt;code&gt;{{client_name}}&lt;/code&gt;, &lt;code&gt;{{company_name}}&lt;/code&gt;, &lt;code&gt;{{scope_description}}&lt;/code&gt;, &lt;code&gt;{{monthly_price}}&lt;/code&gt;, &lt;code&gt;{{setup_fee}}&lt;/code&gt;, and &lt;code&gt;{{deliverables}}&lt;/code&gt;. The workflow maps the lead data and rate card lookup results into these fields.&lt;/p&gt;

&lt;p&gt;Here's the key design decision: &lt;strong&gt;keep the template simple and modular.&lt;/strong&gt; Three sections max — scope, pricing, and next steps. Clients don't read 15-page proposals. They read the pricing page and the deliverables bullet list. Optimize for that reality.&lt;/p&gt;

&lt;p&gt;If you're using Google Docs as your template engine, the n8n Google Docs node can duplicate a template document and perform find-and-replace operations on the copy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Docs - Copy Template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"copy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_TEMPLATE_FILE_ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Proposal - {{company_name}} - {{date}}"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a follow-up node replaces the placeholders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Docs - Replace Placeholders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replaceAll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$('Copy Template').json.id}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"replacements"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{client_name}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"replace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{$json.name}}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{company_name}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"replace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{$json.company}}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{monthly_price}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"replace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{$('Rate Card').json.monthly_price}}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{deliverables}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"replace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{$('Rate Card').json.deliverables}}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Create the PDF
&lt;/h2&gt;

&lt;p&gt;Use a PDF conversion node. If you went the Google Docs route, n8n's Google Drive node can export as PDF:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Drive - Export PDF"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"download"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$('Copy Template').json.id}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application/pdf"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you prefer self-hosted document generation, the &lt;code&gt;n8n-nodes-document-generator&lt;/code&gt; community node or a simple Puppeteer-based microservice work well. The key is getting a clean PDF with your branding — logos, colors, fonts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Send the Proposal Email
&lt;/h2&gt;

&lt;p&gt;Use the Send Email node (or Gmail/SMTP node) to deliver the proposal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Send Email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fromEmail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proposals@smbscaleup.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"toEmail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{$json.email}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your Proposal from SMB Scale Up — {{$json.company}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hi {{$json.name}},&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Thanks for reaching out. We've put together a proposal based on your requirements.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Please find it attached. We'd love to chat through the details — feel free to book a call at your convenience.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Best,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;The SMB Scale Up Team"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attachments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"={{$('Export PDF').json.data}}"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the email short. The proposal PDF does the heavy lifting. The email's only job is to get the attachment opened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Log and Notify
&lt;/h2&gt;

&lt;p&gt;Two final nodes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google Sheets — Log Proposal&lt;/strong&gt;: Append a row to your proposal tracking sheet with the client name, service, price, date sent, and status ("sent").&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Slack — Notify Team&lt;/strong&gt;: Post a message to your sales channel: "NewProposal sent to {{$json.company}} — {{$json.service}} @ {{$json.monthly_price}}/mo"&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives your team visibility without anyone having to remember to update a spreadsheet manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Schedule the Follow-Up
&lt;/h2&gt;

&lt;p&gt;Add a Wait node set to 3 days, then a follow-up email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wait (3 days)
  → Send follow-up email ("Checking in on your proposal...")
  → Update tracking sheet status to "followed-up"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three days is the sweet spot — long enough that they've read the proposal, short enough that you're still top of mind. Most small businesses never follow up on proposals. Automating the follow-up alone puts you ahead of 80% of your competitors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ROI: Hours Back, Deals Closed Faster
&lt;/h2&gt;

&lt;p&gt;Here's what this workflow delivers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Manual Process&lt;/th&gt;
&lt;th&gt;Automated Workflow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time from lead to proposal&lt;/td&gt;
&lt;td&gt;2–3 days&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hours per proposal&lt;/td&gt;
&lt;td&gt;4–5 hours&lt;/td&gt;
&lt;td&gt;15 minutes (review only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow-up consistency&lt;/td&gt;
&lt;td&gt;Maybe&lt;/td&gt;
&lt;td&gt;Always, day 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing accuracy&lt;/td&gt;
&lt;td&gt;Manual lookup&lt;/td&gt;
&lt;td&gt;Rate card synced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proposal tracking&lt;/td&gt;
&lt;td&gt;Spreadsheet you forget to update&lt;/td&gt;
&lt;td&gt;Automatic logging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 10 proposals per month, that's 35–40 hours reclaimed. And faster proposals mean more deals — not just because you're first, but because you're responsive. Responsiveness signals professionalism. Professionalism wins contracts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build your rate card in Google Sheets first.&lt;/strong&gt; This is the single most important piece — if your pricing is messy, your proposals will be messy regardless of automation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a clean proposal template.&lt;/strong&gt; Three sections: what you'll do, what it costs, what happens next. That's it. Don't overcomplicate the template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set up your lead form.&lt;/strong&gt; Make sure it captures service type and budget range — those two fields drive the entire proposal generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build the workflow in stages.&lt;/strong&gt; Start with webhook → template → PDF → email. Add the rate card lookup and follow-up scheduling once the core pipeline works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review every proposal before it goes out.&lt;/strong&gt; Automation handles the boilerplate. You handle the 20% that needs a human touch — custom scope adjustments, relationship-building language, strategic pricing decisions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal isn't to remove yourself from proposals entirely. It's to remove the 80% that's pure mechanical repetition so you can spend your time on the parts that actually close deals.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about setting up proposal automation for your business? Drop a comment — happy to share more specifics on the n8n configuration.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How an AI Agent Handled 66% of a Support Inbox — And How Yours Can Too</title>
      <dc:creator>T.M. Gunderson</dc:creator>
      <pubDate>Wed, 23 Sep 2026 15:51:01 +0000</pubDate>
      <link>https://dev.to/tm_gunderson_9cff63a7ba/how-an-ai-agent-handled-66-of-a-support-inbox-and-how-yours-can-too-2b02</link>
      <guid>https://dev.to/tm_gunderson_9cff63a7ba/how-an-ai-agent-handled-66-of-a-support-inbox-and-how-yours-can-too-2b02</guid>
      <description>&lt;p&gt;Your support inbox is eating your mornings. Every day, you start with 20, 50, 100 emails — most of them the same questions you've answered a hundred times. What if an AI agent could read, triage, draft replies, and only escalate the tricky ones to you?&lt;/p&gt;

&lt;p&gt;That's not hypothetical. Nate B Jones recently gave an AI agent full access to his customer support inbox. The result: &lt;strong&gt;two-thirds of the work disappeared&lt;/strong&gt;. Not a chatbot on a website — an actual agent that reads inbound messages, sorts them, drafts responses, and flags what it can't handle.&lt;/p&gt;

&lt;p&gt;Here's how to replicate that for your business.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Difference Between a Chatbot and an Agent
&lt;/h2&gt;

&lt;p&gt;Most businesses that have tried "AI for support" installed a website chatbot. It answers FAQs and not much else. That's Level 0.&lt;/p&gt;

&lt;p&gt;An AI agent is different. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reads&lt;/strong&gt; every incoming email or message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classifies&lt;/strong&gt; it (billing question, feature request, bug report, complaint)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drafts&lt;/strong&gt; a response using your brand voice and policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sends&lt;/strong&gt; routine replies autonomously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalates&lt;/strong&gt; anything ambiguous, angry, or high-value to a human&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as a front-line support employee who works 24/7 and costs a few dollars a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Audit What's Actually in Your Inbox
&lt;/h2&gt;

&lt;p&gt;Before setting anything up, sort your last 200 support emails into categories. You'll find that 60-70% fall into 5-8 recurring patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Where's my order?"&lt;/li&gt;
&lt;li&gt;"How do I reset my password?"&lt;/li&gt;
&lt;li&gt;"Can I change my subscription?"&lt;/li&gt;
&lt;li&gt;"What's your refund policy?"&lt;/li&gt;
&lt;li&gt;"I need an invoice for last month"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write these down. These are your agent's bread and butter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Build a Decision Tree
&lt;/h2&gt;

&lt;p&gt;For each recurring category, define:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What the agent should do&lt;/strong&gt; — draft a reply, pull data from your system, forward to a specific person&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What information it needs&lt;/strong&gt; — order lookup, account status, policy text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to escalate&lt;/strong&gt; — any hint of legal threat, any amount over $500, any VIP customer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is your playbook. The agent follows it; humans handle the exceptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Connect Your Tools
&lt;/h2&gt;

&lt;p&gt;Your agent needs access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your inbox&lt;/strong&gt; (Gmail, Outlook, or helpdesk like Zendesk/Help Scout)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your business data&lt;/strong&gt; (order status, subscription info, refund eligibility)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your brand voice&lt;/strong&gt; (a short style guide: "We say 'we' not 'I', we're warm but concise, we never promise refunds without manager approval")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most modern AI platforms (OpenAI, Anthropic, or agentic tools like Lindy, Relevance AI, or even Zapier + ChatGPT) can connect to these via API or built-in integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Start in Shadow Mode
&lt;/h2&gt;

&lt;p&gt;Don't let the agent reply to customers on day one. Run it in &lt;strong&gt;shadow mode&lt;/strong&gt; first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent reads and drafts replies&lt;/li&gt;
&lt;li&gt;You review every draft before it goes out&lt;/li&gt;
&lt;li&gt;You correct mistakes and feed those corrections back as training&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do this for 1-2 weeks. You'll see the agent improve fast. When it's getting 90%+ of drafts right without edits, turn on autonomous mode for the easy categories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Handle the 33%
&lt;/h2&gt;

&lt;p&gt;The agent won't handle everything. That's fine — it's not supposed to. The goal is to remove the bottom two-thirds so you can focus your human attention on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex account issues&lt;/li&gt;
&lt;li&gt;Escalations from unhappy customers&lt;/li&gt;
&lt;li&gt;Strategic conversations&lt;/li&gt;
&lt;li&gt;Anything the agent flags as uncertain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set up a clear escalation inbox or Slack channel. When the agent is unsure, it routes the message there with a note: "I think this is a billing dispute, but the customer is upset. Over to you."&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Costs
&lt;/h2&gt;

&lt;p&gt;A support hire in North America runs $35-50K/year. An AI agent handling 66% of that workload costs roughly $50-200/month depending on volume and platform. The ROI speaks for itself.&lt;/p&gt;

&lt;p&gt;Even if you only automate password resets, order status checks, and refund policy questions — that's easily 30-40% of a typical SMB inbox. Time you get back every single day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Categorize your last 200 support emails&lt;/li&gt;
&lt;li&gt;[ ] Identify the top 5-8 recurring patterns&lt;/li&gt;
&lt;li&gt;[ ] Write a decision tree for each (action → data needed → escalation trigger)&lt;/li&gt;
&lt;li&gt;[ ] Choose a platform (OpenAI custom GPT, Lindy, Relevance AI, or Zapier + ChatGPT)&lt;/li&gt;
&lt;li&gt;[ ] Connect your inbox and business data&lt;/li&gt;
&lt;li&gt;[ ] Write a 1-page brand voice guide&lt;/li&gt;
&lt;li&gt;[ ] Run in shadow mode for 1-2 weeks&lt;/li&gt;
&lt;li&gt;[ ] Review and correct agent drafts daily&lt;/li&gt;
&lt;li&gt;[ ] Enable autonomous mode for easy categories&lt;/li&gt;
&lt;li&gt;[ ] Monitor escalation quality weekly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with one category. Get it working. Add the next one. Before you know it, your mornings are yours again.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Your support inbox shouldn't be the thing that owns your schedule. Set up an AI agent to handle the routine stuff — and keep the conversations that actually need a human touch.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
