<?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: Bastullah Batas</title>
    <description>The latest articles on DEV Community by Bastullah Batas (@bastullah_batas_999).</description>
    <link>https://dev.to/bastullah_batas_999</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%2F4087715%2F17627149-96c9-4565-a7d7-1e2bc188da64.png</url>
      <title>DEV Community: Bastullah Batas</title>
      <link>https://dev.to/bastullah_batas_999</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bastullah_batas_999"/>
    <language>en</language>
    <item>
      <title>🌐 Web Scraping with Apify — Where There’s Data, There’s Opportunity</title>
      <dc:creator>Bastullah Batas</dc:creator>
      <pubDate>Thu, 27 Aug 2026 16:34:12 +0000</pubDate>
      <link>https://dev.to/bastullah_batas_999/web-scraping-with-apify-where-theres-data-theres-opportunity-1hlj</link>
      <guid>https://dev.to/bastullah_batas_999/web-scraping-with-apify-where-theres-data-theres-opportunity-1hlj</guid>
      <description>&lt;h1&gt;
  
  
  🌐 Web Scraping with Apify — Where There’s Data, There’s Opportunity
&lt;/h1&gt;

&lt;p&gt;The web is full of valuable information, but collecting that information efficiently is a challenge.&lt;/p&gt;

&lt;p&gt;I’ve recently been exploring &lt;strong&gt;Web Scraping with Apify&lt;/strong&gt; and how it can be connected with &lt;strong&gt;n8n&lt;/strong&gt; to build practical, automated data workflows.&lt;/p&gt;

&lt;p&gt;This hands-on learning journey is helping me understand not only how to scrape data, but also how to transform raw web information into structured and useful datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What I’m Exploring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What is Web Scraping?
&lt;/h3&gt;

&lt;p&gt;Web scraping is the process of collecting information from websites in an automated way.&lt;/p&gt;

&lt;p&gt;But scraping is not simply about extracting data. It is also important to understand the &lt;strong&gt;legal, ethical, and technical boundaries&lt;/strong&gt; involved in collecting information from the web.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Understanding Apify
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Apify&lt;/strong&gt; provides a platform for web scraping, crawling, and browser automation.&lt;/p&gt;

&lt;p&gt;One of the most interesting concepts is the &lt;strong&gt;Actor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An Actor can be thought of as a reusable cloud program designed to perform a specific task—such as collecting data from websites, search engines, business directories, or other online sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Using Ready-Made Actors
&lt;/h3&gt;

&lt;p&gt;Apify provides many ready-made Actors that can significantly reduce development time.&lt;/p&gt;

&lt;p&gt;Some useful use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📍 Google Maps data extraction&lt;/li&gt;
&lt;li&gt;💼 LinkedIn-related data collection&lt;/li&gt;
&lt;li&gt;🌐 Website crawling&lt;/li&gt;
&lt;li&gt;🔎 Search and content extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of building everything from scratch, ready-made Actors can help speed up experimentation and prototyping.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Connecting Apify with n8n
&lt;/h3&gt;

&lt;p&gt;This is where things become especially interesting.&lt;/p&gt;

&lt;p&gt;Scraped data can be passed into &lt;strong&gt;n8n&lt;/strong&gt;, where it can be cleaned, transformed, filtered, stored, or used as an input for another automated workflow.&lt;/p&gt;

&lt;p&gt;A typical workflow can look like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website → Apify Actor → Structured Data → n8n → Processing → Database / Google Sheets / Other Systems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This creates a powerful combination of &lt;strong&gt;data collection + workflow automation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Handling Real-World Challenges
&lt;/h2&gt;

&lt;p&gt;Web scraping becomes much more interesting when working with real websites.&lt;/p&gt;

&lt;p&gt;Some of the challenges I’m learning to handle include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Rate limits&lt;/li&gt;
&lt;li&gt;Dynamic websites&lt;/li&gt;
&lt;li&gt;Anti-bot mechanisms&lt;/li&gt;
&lt;li&gt;Data inconsistencies&lt;/li&gt;
&lt;li&gt;Missing or incomplete information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding these challenges is essential for building scraping workflows that are reliable and responsible.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧹 Cleaning &amp;amp; Structuring Data
&lt;/h2&gt;

&lt;p&gt;Raw scraped data is rarely ready to use immediately.&lt;/p&gt;

&lt;p&gt;Before using it in an automation workflow, the data may need to be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleaned → Validated → Standardized → Structured&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, names, phone numbers, URLs, categories, and other fields may need normalization before sending the data to a database or another application.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪 Hands-On Practice
&lt;/h2&gt;

&lt;p&gt;As part of this learning process, I’m working on extracting &lt;strong&gt;structured data from real-world targets&lt;/strong&gt; and connecting the results with automation workflows.&lt;/p&gt;

&lt;p&gt;The main goal is to understand the complete process:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collect → Clean → Structure → Automate&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Key Takeaway
&lt;/h2&gt;

&lt;p&gt;The most valuable part of web scraping is not simply getting data from a website.&lt;/p&gt;

&lt;p&gt;The real opportunity comes from turning that data into something useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raw Web Data → Structured Information → Automated Action&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s why the combination of &lt;strong&gt;Apify + n8n&lt;/strong&gt; is particularly interesting for building modern data and automation solutions.&lt;/p&gt;

&lt;p&gt;I’m continuing to explore how these tools can be used for real-world automation, lead generation, research, data pipelines, and other practical applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Connect With Me
&lt;/h2&gt;

&lt;p&gt;I regularly share my learning journey and automation projects on LinkedIn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="http://www.linkedin.com/in/bastullah-batas-54ab23335" rel="noopener noreferrer"&gt;www.linkedin.com/in/bastullah-batas-54ab23335&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/..." alt="Uploading image" width="800" height="400"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🏷️ Tags
&lt;/h3&gt;

&lt;h1&gt;
  
  
  webscraping #apify #n8n #automation #data #webautomation #nocode #lowcode #workflowautomation #datascience #devtools #learninginpublic
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>automation</category>
      <category>llm</category>
    </item>
    <item>
      <title>Build AI Agents and Automate Workflows with n8n: Course Review &amp; Insights</title>
      <dc:creator>Bastullah Batas</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:19:02 +0000</pubDate>
      <link>https://dev.to/bastullah_batas_999/build-ai-agents-and-automate-workflows-with-n8n-course-review-insights-c9n</link>
      <guid>https://dev.to/bastullah_batas_999/build-ai-agents-and-automate-workflows-with-n8n-course-review-insights-c9n</guid>
      <description>&lt;h1&gt;
  
  
  Build AI Agents and Automate Workflows with n8n: Course Review &amp;amp; Insights
&lt;/h1&gt;

&lt;p&gt;I just completed the &lt;strong&gt;"Build AI Agents and Automate Workflows with n8n"&lt;/strong&gt; course on LinkedIn Learning (50 minutes, completed Aug 26, 2026), and I want to break down why this matters for developers and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Context
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Certificate Verification:&lt;/strong&gt; &lt;code&gt;22c40b9551ef8da9c867ea048c175e53d9c149ac0df81f90b5eeeafd76c163ba7&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instructor:&lt;/strong&gt; Shea Hanson, Head of Learning Content Strategy at LinkedIn Learning&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills Covered:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Agents&lt;/li&gt;
&lt;li&gt;AI Productivity&lt;/li&gt;
&lt;li&gt;Generative AI&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why n8n? (And Why Now?)
&lt;/h2&gt;

&lt;p&gt;If you haven't heard of n8n yet, imagine Zapier's open-source, self-hosted cousin that gives you full control. Here's the comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;n8n&lt;/th&gt;
&lt;th&gt;Zapier&lt;/th&gt;
&lt;th&gt;Make&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Cloud only&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Proprietary&lt;/td&gt;
&lt;td&gt;❌ Proprietary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrations&lt;/td&gt;
&lt;td&gt;400+&lt;/td&gt;
&lt;td&gt;7000+&lt;/td&gt;
&lt;td&gt;1000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom code&lt;/td&gt;
&lt;td&gt;✅ JavaScript&lt;/td&gt;
&lt;td&gt;⚠️ Limited&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing model&lt;/td&gt;
&lt;td&gt;Free/self-hosted&lt;/td&gt;
&lt;td&gt;Pay per task&lt;/td&gt;
&lt;td&gt;Pay per operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The key difference:&lt;/strong&gt; With n8n, you own your workflows. No vendor lock-in. Self-host if you want full control.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned: The Three Pillars
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;AI Agents: The Intelligence Layer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AI agents are the game-changer here. They're not just "if-then" logic—they're autonomous systems that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Understand context&lt;/strong&gt; - Process information like humans do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make decisions&lt;/strong&gt; - Evaluate multiple options before acting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle ambiguity&lt;/strong&gt; - Deal with edge cases intelligently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn and adapt&lt;/strong&gt; - Improve from interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real example:&lt;/strong&gt;&lt;br&gt;
Instead of: "If email contains 'refund' → send to support@"&lt;/p&gt;

&lt;p&gt;You get: "Read email, understand the actual problem, route to appropriate department (support/billing/product), generate a contextual response"&lt;/p&gt;

&lt;p&gt;This is a massive leap forward.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;strong&gt;Workflow Automation: The Efficiency Layer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is where n8n shines. You can build workflows that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger (Webhook/Schedule/Event)
    ↓
Data Processing (Extract, Transform, Validate)
    ↓
AI Processing (Generate, Summarize, Decide)
    ↓
Integration (Send to Slack, Email, Database, etc)
    ↓
Logging (Track what happened)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; n8n uses a visual node-based interface. No code required to build basic workflows, but you can drop into JavaScript whenever you need power.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Generative AI Integration: The Superpower&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is the magic ingredient. Combining LLMs (like Claude, GPT, etc.) with workflow automation unlocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent content generation&lt;/strong&gt; - Write summaries, emails, reports automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart decision-making&lt;/strong&gt; - Workflows that actually understand what they're doing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context awareness&lt;/strong&gt; - Process information in natural language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale without overhead&lt;/strong&gt; - Do work of 10 people with 1 AI agent&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Practical Workflows I'm Building
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Smart Customer Support Pipeline&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Issue Created
    ↓
AI reads issue + context
    ↓
AI determines: (Bug? Feature? Support question?)
    ↓
Route + Auto-draft response
    ↓
Notify team
    ↓
Track in database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; ~5 mins per issue × 50 issues/month = 4+ hours saved&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Content Distribution Automation&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Blog Post Published
    ↓
AI generates: Twitter thread, LinkedIn post, Email summary
    ↓
Post to 5 platforms simultaneously
    ↓
Track engagement
    ↓
Report metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; ~1 hour per blog post&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Data Processing Pipeline&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New data in Webhook
    ↓
Validate + Clean
    ↓
AI: Extract insights, categorize, flag anomalies
    ↓
Store in Database
    ↓
Update Dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; Real-time processing, zero manual work&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Email Intelligence&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Email Received
    ↓
AI: Is this important? What's the action item?
    ↓
Smart filter + Prioritization
    ↓
Auto-draft response suggestions
    ↓
Notify on critical emails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Getting Started: The Technical Side
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation (Self-hosted)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; n8n
n8n start

&lt;span class="c"&gt;# Using Docker (Recommended)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; n8n &lt;span class="nt"&gt;-p&lt;/span&gt; 5678:5678 n8nio/n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then visit: &lt;code&gt;http://localhost:5678&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Workflow Structure
&lt;/h3&gt;

&lt;p&gt;Every n8n workflow has:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trigger&lt;/strong&gt; - What starts the workflow (webhook, schedule, event)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nodes&lt;/strong&gt; - Actions (read, write, process, send)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connections&lt;/strong&gt; - How data flows between nodes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output&lt;/strong&gt; - What happens when it completes&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Integrating AI (Example with Claude)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Inside a "Code" node in n8n&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;$node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Process this customer email: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;$node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emailText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;aiResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Developers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Learn n8n if you want to automate repetitive tasks&lt;/li&gt;
&lt;li&gt;✅ Combine with AI for intelligent automation&lt;/li&gt;
&lt;li&gt;✅ Self-host for full control over sensitive workflows&lt;/li&gt;
&lt;li&gt;✅ Use the free tier to experiment (it's generous!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Stop wasting engineer time on manual tasks&lt;/li&gt;
&lt;li&gt;✅ Build workflows non-technical people can modify&lt;/li&gt;
&lt;li&gt;✅ Reduce operational overhead significantly&lt;/li&gt;
&lt;li&gt;✅ Scale without hiring more people&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Businesses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Automation ROI is immediate and measurable&lt;/li&gt;
&lt;li&gt;✅ Lower cost than hiring (especially for recurring tasks)&lt;/li&gt;
&lt;li&gt;✅ Fewer human errors&lt;/li&gt;
&lt;li&gt;✅ 24/7 operation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;We're at an inflection point where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automation is no longer optional&lt;/strong&gt; - It's table stakes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI + Automation is the winning combo&lt;/strong&gt; - Intelligent workflows &amp;gt; dumb automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-code/low-code is production-ready&lt;/strong&gt; - You don't need a full engineering team for basic workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The future of work is different&lt;/strong&gt; - More strategy, less busywork&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're not thinking about automation in 2026, you're leaving money and time on the table.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official n8n Docs:&lt;/strong&gt; &lt;a href="https://n8n.io/docs" rel="noopener noreferrer"&gt;https://n8n.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n Community:&lt;/strong&gt; &lt;a href="https://community.n8n.io" rel="noopener noreferrer"&gt;https://community.n8n.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube Tutorials:&lt;/strong&gt; Search "n8n tutorial" (plenty of good stuff)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn Learning Course:&lt;/strong&gt; The one I just completed (50 mins, highly recommend)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Next Steps for Me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Build customer support automation workflow&lt;/li&gt;
&lt;li&gt;[ ] Deploy content distribution pipeline&lt;/li&gt;
&lt;li&gt;[ ] Integrate with my personal projects&lt;/li&gt;
&lt;li&gt;[ ] Document workflows on GitHub&lt;/li&gt;
&lt;li&gt;[ ] Experiment with advanced AI integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Questions for You
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What repetitive task are you doing that could be automated?&lt;/strong&gt; Drop it in the comments—let's talk about solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you used n8n?&lt;/strong&gt; What did you build? I'd love to hear about your workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interested in AI + Automation?&lt;/strong&gt; Follow for more technical breakdowns and tutorials coming soon.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Originally completed:&lt;/strong&gt; August 26, 2026 at 09:32 AM UTC&lt;/p&gt;

&lt;p&gt;Feel free to connect with me on &lt;a href="https://linkedin.com" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://twitter.com" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; if you want to chat about automation, AI, or workflow engineering!&lt;/p&gt;




&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Getting Started with Workflow Automation&lt;/li&gt;
&lt;li&gt;AI Integration Patterns in 2026&lt;/li&gt;
&lt;li&gt;Building Scalable Automation Systems&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Happy automating! 🚀&lt;/em&gt;&lt;br&gt;
Linkedin : &lt;a href="http://www.linkedin.com/in/bastullah-batas-54ab23335" rel="noopener noreferrer"&gt;www.linkedin.com/in/bastullah-batas-54ab23335&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9rsyhz7171zr95hlw8x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9rsyhz7171zr95hlw8x.jpg" alt=" " width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>automation</category>
    </item>
    <item>
      <title>Title: How I Built an Automated Data-Cleaning Pipeline with n8n (So I Never Touch Messy Spreadsheets Again)</title>
      <dc:creator>Bastullah Batas</dc:creator>
      <pubDate>Tue, 25 Aug 2026 11:27:30 +0000</pubDate>
      <link>https://dev.to/bastullah_batas_999/title-how-i-built-an-automated-data-cleaning-pipeline-with-n8n-so-i-never-touch-messy-2h4c</link>
      <guid>https://dev.to/bastullah_batas_999/title-how-i-built-an-automated-data-cleaning-pipeline-with-n8n-so-i-never-touch-messy-2h4c</guid>
      <description>&lt;p&gt;If you've ever collected customer data through a Google Form, you already know what happens next: the spreadsheet turns into chaos. Names in different cases, duplicate emails, phone numbers missing digits, dates written five different ways in the same column.&lt;/p&gt;

&lt;p&gt;I got tired of manually cleaning this every week, so I built an automated pipeline in n8n that fixes all of it the moment a form is submitted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A raw form submissions sheet usually looks something like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Full Name&lt;/th&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;th&gt;Phone&lt;/th&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Registration Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;John doe&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:j0hn@gmail.com"&gt;j0hn@gmail.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1712345678&lt;/td&gt;
&lt;td&gt;Dhaka&lt;/td&gt;
&lt;td&gt;01/05/2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JOHN DOE&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:j0hn@gmail.com"&gt;j0hn@gmail.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1712345678&lt;/td&gt;
&lt;td&gt;Chittagong&lt;/td&gt;
&lt;td&gt;May 1, 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tanvir ahmed&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:tanvir@yahoo.com"&gt;tanvir@yahoo.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;171122&lt;/td&gt;
&lt;td&gt;Dhaka&lt;/td&gt;
&lt;td&gt;2025/06/12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same person entered twice with different casing. A copy-pasted email attached to the wrong name. A phone number missing half its digits. Three different date formats in three rows. Multiply this by a few hundred submissions and manual cleanup becomes a part-time job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: An n8n Pipeline
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A[Form Submission Trigger] --&amp;gt; B[Messy Data]
    B --&amp;gt; C[Filter Code]
    C --&amp;gt; D[Clean File]
    C --&amp;gt; E[Summary Report Filter Code]
    E --&amp;gt; F[Summary Report]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A form submission triggers the workflow, pulls in the raw row, runs it through a Code node that handles all the normalization logic, then splits into two outputs — a clean master file and an auto-generated summary report.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Cleaning Logic Actually Handles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Names&lt;/strong&gt; → consistent title-case formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emails&lt;/strong&gt; → deduplicated and validated against the right record&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone numbers&lt;/strong&gt; → normalized into one consistent format (in my case, Bangladeshi numbers into &lt;code&gt;01XXXXXXXXX&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dates&lt;/strong&gt; → every format converted into &lt;code&gt;YYYY-MM-DD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer ID&lt;/strong&gt; → auto-generated and assigned per record&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trickiest part was date and phone parsing — real-world form input is way messier than test data. A rough example of the kind of normalization logic involved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;normalizePhone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Simplified for illustration — the actual node handles a few more edge cases, like missing digits and stray country-code prefixes.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Customer ID&lt;/th&gt;
&lt;th&gt;Full Name&lt;/th&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;th&gt;Phone&lt;/th&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Registration Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CUST-0001&lt;/td&gt;
&lt;td&gt;John Doe&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:john@gmail.com"&gt;john@gmail.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;01712345678&lt;/td&gt;
&lt;td&gt;Dhaka&lt;/td&gt;
&lt;td&gt;2025-01-05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUST-0002&lt;/td&gt;
&lt;td&gt;Sarah Khan&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:sarah@gmail.com"&gt;sarah@gmail.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;01987654321&lt;/td&gt;
&lt;td&gt;Chittagong&lt;/td&gt;
&lt;td&gt;2025-05-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUST-0004&lt;/td&gt;
&lt;td&gt;Tanvir Ahmed&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:tanvir@yahoo.com"&gt;tanvir@yahoo.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;01711223344&lt;/td&gt;
&lt;td&gt;Dhaka&lt;/td&gt;
&lt;td&gt;2025-06-12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same data, but now every row is consistent, deduplicated, and immediately usable — in a CRM, a mailing list, or anywhere else it needs to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt; for orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Forms &amp;amp; Sheets&lt;/strong&gt; for data collection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excel&lt;/strong&gt; as the cleaned output&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Is Worth Automating
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No more weekly manual cleanup&lt;/li&gt;
&lt;li&gt;Fewer errors from duplicate or mistyped records&lt;/li&gt;
&lt;li&gt;A summary report that's ready the second new data comes in&lt;/li&gt;
&lt;li&gt;Scales identically whether you get 10 submissions a week or 10,000&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building something similar, or you've handled messier real-world data than this, I'd genuinely like to hear how you approached deduplication or date parsing — always looking to improve the edge-case handling.&lt;/p&gt;

&lt;p&gt;Contact With me Linkedin : &lt;a href="http://www.linkedin.com/in/bastullah-batas-54ab23335" rel="noopener noreferrer"&gt;www.linkedin.com/in/bastullah-batas-54ab23335&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuefn4wqmwry92xhka51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuefn4wqmwry92xhka51.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv23nvsjyqnoz7fxnc63m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv23nvsjyqnoz7fxnc63m.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Building a Real-Time Data Cleaning Pipeline with n8n, Google Sheets, and JavaScript</title>
      <dc:creator>Bastullah Batas</dc:creator>
      <pubDate>Sat, 22 Aug 2026 12:02:52 +0000</pubDate>
      <link>https://dev.to/bastullah_batas_999/building-a-real-time-data-cleaning-pipeline-with-n8n-google-sheets-and-javascript-2c6d</link>
      <guid>https://dev.to/bastullah_batas_999/building-a-real-time-data-cleaning-pipeline-with-n8n-google-sheets-and-javascript-2c6d</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Every Team Has a "Messy Spreadsheet"
&lt;/h2&gt;

&lt;p&gt;If you've ever inherited a spreadsheet that's been manually updated by multiple people over months, you know the pain. Here's what I was staring at recently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📞 Phone numbers in &lt;strong&gt;5+ different formats&lt;/strong&gt; — &lt;code&gt;1711019283&lt;/code&gt;, &lt;code&gt;+8801711019283&lt;/code&gt;, &lt;code&gt;+880-1678-231920&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;📧 Emails with typos in the domain — &lt;code&gt;gmail.co&lt;/code&gt;, &lt;code&gt;gmial.com&lt;/code&gt; instead of &lt;code&gt;gmail.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🔤 Status fields with inconsistent casing — &lt;code&gt;active&lt;/code&gt;, &lt;code&gt;ACTIVE&lt;/code&gt;, &lt;code&gt;Active&lt;/code&gt;, &lt;code&gt;pending&lt;/code&gt;, &lt;code&gt;INACTIVE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;📅 Join dates in at least &lt;strong&gt;4 different formats&lt;/strong&gt; — &lt;code&gt;YYYY-MM-DD&lt;/code&gt;, &lt;code&gt;DD/MM/YYYY&lt;/code&gt;, &lt;code&gt;MM/DD/YYYY&lt;/code&gt;, all mixed in the same column&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is unusual — it's what happens when data entry isn't enforced at the source. But it wrecks every filter, every report, and every automation built on top of it.&lt;/p&gt;

&lt;p&gt;Rather than clean it manually (again), I decided to automate the entire process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Approach
&lt;/h2&gt;

&lt;p&gt;I built a &lt;strong&gt;real-time transformation pipeline&lt;/strong&gt; using three pieces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trigger&lt;/td&gt;
&lt;td&gt;n8n (Google Sheets Trigger)&lt;/td&gt;
&lt;td&gt;Detects new/edited rows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transform&lt;/td&gt;
&lt;td&gt;JavaScript (Code node)&lt;/td&gt;
&lt;td&gt;Cleans &amp;amp; standardizes data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write-back&lt;/td&gt;
&lt;td&gt;n8n (Append/Update node)&lt;/td&gt;
&lt;td&gt;Writes cleaned data to sheet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 1 — Trigger on Change
&lt;/h3&gt;

&lt;p&gt;The workflow starts with a &lt;strong&gt;Google Sheets Trigger&lt;/strong&gt; node set to &lt;code&gt;anyUpdate&lt;/code&gt;, so it fires the moment a row is added or edited — no polling delay, no manual "run" button.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Transform with JavaScript
&lt;/h3&gt;

&lt;p&gt;This is where the actual cleanup logic lives. A few examples of the kind of normalization rules involved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Normalize phone numbers to a single consistent format&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;normalizePhone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[^\d]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;local&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;880&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`+880&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Fix common email domain typos&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fixEmailDomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/gmial&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;com$/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/gmail&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;co$/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Standardize status casing&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;normalizeStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each field gets passed through its own validation/normalization function, and the row is reassembled with a &lt;code&gt;Cleaned_Status&lt;/code&gt; flag so downstream steps (and humans) can tell what's already been processed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Write Back Automatically
&lt;/h3&gt;

&lt;p&gt;The cleaned row is pushed back into the sheet using an &lt;strong&gt;Append or Update Row&lt;/strong&gt; node, matching on a unique ID so existing rows get updated in place instead of duplicated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Google Sheets Trigger  →  JavaScript Transformation  →  Append/Update in Sheet
     (anyUpdate)              (clean &amp;amp; validate)          (appendOrUpdate)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero manual cleanup&lt;/strong&gt; after setup — the pipeline runs on its own&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Real-time processing&lt;/strong&gt; — rows are cleaned within seconds of being entered&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Consistent formatting&lt;/strong&gt; across phone numbers, emails, statuses, and dates&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Hours saved weekly&lt;/strong&gt; that used to go into manually fixing spreadsheet entries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;It's easy to underestimate how much time "small" data inconsistencies cost. A malformed phone number or an inconsistent status value doesn't seem like a big deal — until it silently breaks a filter, skews a report, or fails a downstream integration.&lt;/p&gt;

&lt;p&gt;Low-code tools like n8n make it realistic to solve this kind of problem without standing up a full backend service. The trigger → transform → write-back pattern shown here can be adapted to almost any messy-data scenario: CRM exports, form submissions, survey responses, you name it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways for Your Own Projects
&lt;/h2&gt;

&lt;p&gt;If you're dealing with something similar, a few principles that helped:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Normalize at the field level&lt;/strong&gt; — write one small function per field type (phone, email, date, etc.) rather than one giant cleaning function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flag what's been processed&lt;/strong&gt; — a &lt;code&gt;Cleaned_Status&lt;/code&gt; column avoids re-processing rows and makes debugging easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger on change, not on schedule&lt;/strong&gt; — real-time beats batch when the goal is "always clean," not "clean once a day."&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Have you built something similar, or dealt with messy data at scale? Would love to hear how you approached it in the comments 👇&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💼 LinkedIn: &lt;a href="http://www.linkedin.com/in/bastullah-batas-54ab23335" rel="noopener noreferrer"&gt;www.linkedin.com/in/bastullah-batas-54ab23335&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✖️ X (Twitter): @batas999&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6jfk8iuwafxxj7ws4u0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6jfk8iuwafxxj7ws4u0i.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz2vaq0q4sereomdbhj64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz2vaq0q4sereomdbhj64.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiotstb4zqetqt67yrrvf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiotstb4zqetqt67yrrvf.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building an AI-Powered Weather Agent using n8n, Groq LLM &amp; Telegram</title>
      <dc:creator>Bastullah Batas</dc:creator>
      <pubDate>Fri, 21 Aug 2026 15:53:51 +0000</pubDate>
      <link>https://dev.to/bastullah_batas_999/building-an-ai-powered-weather-agent-using-n8n-groq-llm-telegram-3kof</link>
      <guid>https://dev.to/bastullah_batas_999/building-an-ai-powered-weather-agent-using-n8n-groq-llm-telegram-3kof</guid>
      <description>&lt;p&gt;Automating everyday tasks with AI Agents has never been easier. Recently, I built an end-to-end intelligent weather assistant using n8n, Groq AI (LLM), and Telegram.&lt;/p&gt;

&lt;p&gt;In this article, I'll break down the workflow architecture, how the AI agents process intent, and how you can replicate this project.&lt;/p&gt;

&lt;p&gt;🌐 Project Overview&lt;br&gt;
Instead of simple keyword matching, this bot processes natural language queries from Telegram, extracts context using Groq AI, fetches live weather data via HTTP nodes, and formats the output into readable responses.&lt;/p&gt;

&lt;p&gt;🏗️ Architecture &amp;amp; Workflow Breakdown&lt;br&gt;
Here is how data flows through the n8n pipeline:&lt;/p&gt;

&lt;p&gt;Telegram Trigger: Listens for incoming user messages in natural language (e.g., "Is it going to rain in Dhaka today?").&lt;/p&gt;

&lt;p&gt;AI Agent (Groq Chat Model): Parses the user prompt, identifies the location, and extracts parameters.&lt;/p&gt;

&lt;p&gt;HTTP Request Nodes: Makes dynamic API calls to fetch real-time weather metrics from an external Weather API.&lt;/p&gt;

&lt;p&gt;Merge Node (chooseBranch): Manages data routing and joins parallel processing branches.&lt;/p&gt;

&lt;p&gt;Secondary AI Agent: Formats raw API JSON data into a clear, user-friendly markdown response.&lt;/p&gt;

&lt;p&gt;Telegram Send Message Node: Delivers the formatted answer back to the user.&lt;/p&gt;

&lt;p&gt;🛠️ Tech Stack&lt;br&gt;
Workflow Engine: n8n (Cloud / Self-hosted)&lt;/p&gt;

&lt;p&gt;LLM Model: Groq Chat Model&lt;/p&gt;

&lt;p&gt;Data Sources: External Weather API via HTTP Request Node&lt;/p&gt;

&lt;p&gt;Interface: Telegram Bot API&lt;/p&gt;

&lt;p&gt;🚀 Getting Started&lt;br&gt;
If you want to try this out yourself:&lt;/p&gt;

&lt;p&gt;Clone the repository from GitHub: Your Repository Link&lt;/p&gt;

&lt;p&gt;Import the workflow.json into your n8n instance.&lt;/p&gt;

&lt;p&gt;Set up credentials for Telegram Bot, Groq API, and your Weather API Key.&lt;/p&gt;

&lt;p&gt;Activate the workflow and test it out on Telegram!&lt;/p&gt;

&lt;p&gt;💬 Final Thoughts &amp;amp; Links&lt;br&gt;
Building multi-agent workflows with low-code platforms like n8n combined with fast LLMs like Groq unlocks endless automation potential.&lt;/p&gt;

&lt;p&gt;📫 Let's Connect on LinkedIn: &lt;a href="http://www.linkedin.com/in/bastullah-batas-54ab23335" rel="noopener noreferrer"&gt;www.linkedin.com/in/bastullah-batas-54ab23335&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to drop any questions or feedback in the comments below!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>automation</category>
      <category>career</category>
    </item>
    <item>
      <title>Building Automations with n8n &amp; Make – Let’s Connect!</title>
      <dc:creator>Bastullah Batas</dc:creator>
      <pubDate>Fri, 21 Aug 2026 14:11:22 +0000</pubDate>
      <link>https://dev.to/bastullah_batas_999/building-automations-with-n8n-make-lets-connect-j9e</link>
      <guid>https://dev.to/bastullah_batas_999/building-automations-with-n8n-make-lets-connect-j9e</guid>
      <description>&lt;p&gt;Act as a developer-advocate and technical content writer for dev.to. Write an engaging, value-first dev.to post introducing my expertise in AI and No-Code/Low-Code automation. &lt;/p&gt;

&lt;p&gt;Here are the details to include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Core Focus: Automation, AI workflows, and system integrations using n8n and Make (Integromat).&lt;/li&gt;
&lt;li&gt;Key Services/Skills:

&lt;ul&gt;
&lt;li&gt;Custom n8n workflows (self-hosted &amp;amp; cloud, API integrations, webhooks).&lt;/li&gt;
&lt;li&gt;Make (Integromat) multi-step scenarios &amp;amp; data syncing.&lt;/li&gt;
&lt;li&gt;Integrating LLMs/AI (OpenAI, Claude) into automation pipelines.&lt;/li&gt;
&lt;li&gt;Converting repetitive tasks into scalable background processes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Call to Action: Invite developers, founders, and teams to connect, collaborate, or reach out for freelancing/consultation if they need help with any automation projects.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tone &amp;amp; Style Guidelines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical, helpful, direct, and developer-friendly (avoid overly salesy or marketing jargon).&lt;/li&gt;
&lt;li&gt;Use Markdown formatting: clean headings, bullet points, and code blocks if relevant.&lt;/li&gt;
&lt;li&gt;Include 3 catchy title options.&lt;/li&gt;
&lt;li&gt;Include recommended dev.to tags (e.g., #automation, #n8n, #make, #ai).&lt;/li&gt;
&lt;li&gt;Include brief placeholder suggestions for cover images or workflow diagrams to increase engagement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[Optional extra info: My background/experience is n8n and make.com , and my contact/portfolio link is &lt;a href="http://www.linkedin.com/in/bastullah-batas-54ab23335" rel="noopener noreferrer"&gt;www.linkedin.com/in/bastullah-batas-54ab23335&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>career</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
