<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Adventures of Ahone]]></title><description><![CDATA[Adventures of Ahone]]></description><link>https://jane-ahone.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Adventures of Ahone</title><link>https://jane-ahone.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 16:51:19 GMT</lastBuildDate><atom:link href="https://jane-ahone.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Over-Engineering with n8n: How I Escaped Manual Data Entry]]></title><description><![CDATA[The Ask
Scrrhh,
A chair scraped against the floor as someone pushed back from the table—probably to go get breakfast.Nothing new. Nothing worthy of lifting my head and thoughts from the screen and its]]></description><link>https://jane-ahone.hashnode.dev/over-engineering-with-n8n-how-i-escaped-manual-data-entry</link><guid isPermaLink="true">https://jane-ahone.hashnode.dev/over-engineering-with-n8n-how-i-escaped-manual-data-entry</guid><category><![CDATA[automation]]></category><category><![CDATA[n8n workflows]]></category><dc:creator><![CDATA[Jane Ahone Eloundou]]></dc:creator><pubDate>Sat, 10 Oct 2026 16:56:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac375bc8fa2dc3e4e24ece8/597a8621-80da-4f36-9968-832be719e820.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>The Ask</h1>
<p><em>Scrrhh</em>,</p>
<p>A chair scraped against the floor as someone pushed back from the table—probably to go get breakfast.Nothing new. Nothing worthy of lifting my head and thoughts from the screen and its contents in front of me. Just another day at home, living life and working.</p>
<p>Until...</p>
<p>"Can you help me with creating some documents?" my housemate asked the person sitting across from her</p>
<p>"You just have to go through the Excel sheet and each go to their website and get what they do and use it to customise the letter..." she explained</p>
<p>Sensing hesitation from her initial victim, she turned her sights on me. "Jane...can you help?"</p>
<p>"How long is it &amp; when is it due?" I replied, the words of a recovering procrastinator trying to figure out how late she can do it without being late.</p>
<p>"...About 700 rows".</p>
<p>Yeah...there's no way I'm doing that manually.</p>
<hr />
<h2>The Process</h2>
<p>In a nutshell, here's what I had to do:</p>
<p><strong>Go through a 700-row Excel sheet to visit each specified company website, extract their mission statement, assign the company to a category, and use that information to personalize a generic Word document.</strong></p>
<h3>Proposed Solution</h3>
<p>In order to safeguard my sanity from mindless copy and paste, I would need to learn and design an n8n automation workflow to programmatically read the spreadsheet, scrape the required websites, and automatically generate the personalized document.</p>
<hr />
<h3>Step #1: Learn how to install n8n</h3>
<pre><code class="language-plaintext">- Scour n8n’s website to figure out how to actually use this tool.
- Fall down a rabbit hole reading about the different deployment options.
- Spend exactly five minutes agonizing over whether to host it on a remote server or run it locally via Docker.
- Settle on a local Docker setup, convincing myself this is just a "one-time use" workflow.
</code></pre>
<h3>Step #2: Run n8n locally with Docker</h3>
<p>To make sure n8n could actually access the Excel sheet I needed to process, I mapped my local <code>Downloads</code> folder to the container's file system in the <code>volumes</code> section.</p>
<pre><code class="language-yaml">services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - TZ=Africa/Douala
      - GENERIC_TIMEZONE=Africa/Douala
      - N8N_SECURE_COOKIE=false
      - N8N_RESTRICT_FILE_ACCESS_TO=/files
    volumes:
      - n8n_data:/home/node/.n8n
      - /home/jane-ahone/Downloads:/files

volumes:
  n8n_data:
</code></pre>
<h3>Step #3: Build the workflow</h3>
<p>Automation seemed like a beautiful, seamless sequence of events. You connect dot A to dot B, and the computer does the heavy lifting while watch your favorite sitcome. Reality, was a lot more violent.</p>
<p>Here is a step-by-step breakdown of my workflow, a chronological list of how every node taught me that <em>automation is not necessary equal to speed</em>.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac375bc8fa2dc3e4e24ece8/dbd42325-4830-4ba0-9bf6-68d8740895dd.jpg" alt="" style="display:block;margin:0 auto" />

<hr />
<h3><strong>The Setup: Reading the Excel File (Nodes 2 - 3)</strong></h3>
<p><strong>Expectation:</strong> Simply read the 700 rows from my local drive so I can use them.</p>
<p><strong>Reality:</strong> Remember in Step 2 when I had to map the Docker volumes? Turns out, when I made changes to my local Excel file, n8n acted like nothing happened. The changes wouldn't propagate immediately. I found myself obsessively restarting the Docker container, violently refreshing the page, or sometimes doing both just to see my updates. At one point, I even had to manually pin the data to the <strong>Extract from File</strong> node just to force the workflow to acknowledge it. <mark class="bg-yellow-200 dark:bg-yellow-500/30">I </mark> <em><mark class="bg-yellow-200 dark:bg-yellow-500/30">still</mark></em> <mark class="bg-yellow-200 dark:bg-yellow-500/30"> haven't figured out a permanent fix for this.</mark></p>
<hr />
<h3><strong>The Labyrinth: Looping and Crawling (Nodes 4 - 11)</strong></h3>
<p><strong>Expectation:</strong> Visit the website, grab the text, move on and in case of an error, note it down and move on.</p>
<p><strong>Reality:</strong> Notice that chaotic web of arrows in the middle of the canvas, anchored by nodes with little fire icons? That is my website crawler setup, and it was a nightmare. First, I got slapped with rate limits and it took me hours to understand that that was why the results were coming up empty.</p>
<p>To get around that, I tried running the crawl locally, only to eventually hit timeout errors before a single tag was scraped. I had to go in and manually increase the timeout sessions, carefully spacing out the wait time between requests using that little red <strong>Wait</strong> node just so the target servers wouldn't block me.</p>
<hr />
<h3><strong>The Interrogation: AI and JavaScript (Nodes 12 - 16)</strong></h3>
<p><strong>Expectation:</strong> Feed the scraped text to AI, ask it to categorize the company, and receive perfect data.</p>
<p>This was the part that mostly went according to plan except for the few times that the API would be inaccessible, randomly crashing the entire workflow</p>
<ul>
<li><strong>The Grand Finale: Document Generation</strong> (Nodes 17 - 20)</li>
</ul>
<p><strong>The Expectation:</strong> Paste the clean data into a generic template.</p>
<p>Just like the AI step, configuring the Google Docs nodes to <strong>Create letter</strong> and <strong>Create email</strong> was relatively painless. The tragedy here was, again, the providers.</p>
<hr />
<h2>What I Could Have Done Better</h2>
<p>Looking back, here are a few things I could have done better:</p>
<ul>
<li><p><strong>Stop Re-Running From Scratch:</strong> Every time the workflow failed on a late-stage node, I hit "execute" and ran the <em>entire</em> sequence from the beginning. I wasted time forcing the crawler and AI to redo perfectly good work just to test a broken document node at the very end. I should have heavily utilized n8n's ability to pin data or execute only the specific nodes I was actively troubleshooting.</p>
</li>
<li><p><strong>Implement Error Handlers Immediately:</strong> As I mentioned, the AI and document providers loved to randomly time out. Because I did not add error handling early on, one dropped API connection would violently crash the whole batch. I should have built error branches right away so the workflow could simply log a failed row and keep moving instead of dying completely.</p>
</li>
<li><p><strong>Don't Wait Until the End for Output:</strong> The way I built it, I only get my final documents when <em>all</em> the scraping and AI processing is 100% complete. That means if the system crashes on row 699, I am basically left empty-handed. I should have designed it to write the generated documents progressively, so at least I would have a folder full of saved files even if the workflow threw a tantrum midway through.</p>
</li>
</ul>
<hr />
<h2>Happy Ending?</h2>
<p>After hours of fighting with timeouts and stubborn Docker volumes, the final node turned green. The automation ran.</p>
<p>Although I didn't end up running 700 rows because the work was split between persons (meaning I only actually had to process about 20 rows), I stand by my methods. Did I spend hours building a complex workflow to avoid a task that would have taken me an hour by hand? Absolutely.</p>
<p>But I escaped manual data entry, and more importantly, I now have a robust, reusable system ready to go for the next time she asks for a "little help."</p>
]]></content:encoded></item></channel></rss>