<?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: kingston-888</title>
    <description>The latest articles on DEV Community by kingston-888 (@kingston-888).</description>
    <link>https://dev.to/kingston-888</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%2F4076925%2F376163d0-8680-4c9c-82bd-2b1ff60c72d9.png</url>
      <title>DEV Community: kingston-888</title>
      <link>https://dev.to/kingston-888</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kingston-888"/>
    <language>en</language>
    <item>
      <title>AI Agent Workflow Tutorial: Build Reliable Automation with Human Approval</title>
      <dc:creator>kingston-888</dc:creator>
      <pubDate>Tue, 18 Aug 2026 02:14:41 +0000</pubDate>
      <link>https://dev.to/kingston-888/ai-agent-workflow-tutorial-build-reliable-automation-with-human-approval-3817</link>
      <guid>https://dev.to/kingston-888/ai-agent-workflow-tutorial-build-reliable-automation-with-human-approval-3817</guid>
      <description>&lt;p&gt;AI agents are easy to demo and surprisingly difficult to operate. A prototype may read a request, call a tool, and produce a convincing result in seconds. Production AI automation has a harder job: it must handle incomplete input, choose safe actions, recover from tool failures, and make its decisions visible to the people responsible for the outcome.&lt;/p&gt;

&lt;p&gt;The most practical design is not a fully autonomous agent. It is a &lt;strong&gt;bounded AI agent workflow&lt;/strong&gt; with explicit tools, structured state, validation rules, and human approval at the points where a mistake would be expensive.&lt;/p&gt;

&lt;p&gt;This tutorial shows how to design that workflow without turning every step into a manual process.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Separate reasoning from execution
&lt;/h2&gt;

&lt;p&gt;A reliable agent should not receive a broad instruction such as “handle this customer request” and unrestricted access to every business system. Split the workflow into stages with different responsibilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingest&lt;/strong&gt; the request and assign a workflow ID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalize&lt;/strong&gt; the input into a predictable schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan&lt;/strong&gt; the next actions using the language model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; the plan against deterministic rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approve&lt;/strong&gt; high-impact actions when required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute&lt;/strong&gt; only the approved tools and parameters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify&lt;/strong&gt; the result and record evidence.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model is useful for classification, summarization, drafting, and choosing among allowed actions. Code should still enforce permissions, required fields, spending limits, recipient restrictions, and data retention rules.&lt;/p&gt;

&lt;p&gt;For example, an AI content workflow may be allowed to research a topic and create a draft automatically. Publishing the draft, changing a campaign budget, or sending a message to a large audience should require a separate approval event.&lt;/p&gt;

&lt;p&gt;Use structured output for the planning stage:&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;"goal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Prepare a technical article draft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risk_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"actions"&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="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_docs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"input"&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="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agent workflow reliability"&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="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"create_draft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"input"&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="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"markdown"&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;"approval_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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 this object before any tool runs. Reject unknown tools, missing parameters, invalid values, or plans that exceed the agent's policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add human approval based on risk
&lt;/h2&gt;

&lt;p&gt;Requiring approval for every action removes most of the value of automation. Requiring no approval makes one bad model decision too powerful. A risk-based approval policy gives the workflow a useful middle ground.&lt;/p&gt;

&lt;p&gt;A simple policy can classify actions into three groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low risk:&lt;/strong&gt; reading public documentation, summarizing text, formatting data, or creating an internal draft. Run automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium risk:&lt;/strong&gt; updating a shared record, preparing an external message, or modifying a non-critical configuration. Run automatically only when all validation checks pass; otherwise request review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High risk:&lt;/strong&gt; publishing content, sending money, deleting data, changing permissions, or contacting a customer. Always require explicit approval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An approval request should show the original goal, exact action, target, parameters, preview, validation results, and approve or reject options. Persist the workflow state in a database or durable queue so the same workflow ID can resume after a decision or worker restart.&lt;/p&gt;

&lt;p&gt;A state model might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;received -&amp;gt; planning -&amp;gt; validating -&amp;gt; awaiting_approval
         -&amp;gt; executing -&amp;gt; verifying -&amp;gt; completed
                      \-&amp;gt; rejected
                      \-&amp;gt; failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern works in n8n, Make, a custom queue-based service, or an agent framework. The implementation differs, but the control points remain the same. When I need examples of how automation tools package repeatable workflows, I also review catalogs such as &lt;a href="https://www.coreclaw.com/?utm_source=forum&amp;amp;utm_medium=referral&amp;amp;utm_campaign=devp&amp;amp;utm_term=&amp;amp;utm_id=devp" rel="noopener noreferrer"&gt;CoreClaw&lt;/a&gt; for patterns before deciding what belongs in the production architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Design for retries, evidence, and safe failure
&lt;/h2&gt;

&lt;p&gt;An AI workflow is a distributed system. API timeouts, duplicate webhooks, expired credentials, malformed model output, and partial writes are normal operating conditions.&lt;/p&gt;

&lt;p&gt;Start with idempotency. Give each incoming request a stable key and store the result of every side-effecting action. If a worker retries, it should detect that an email was already sent or a record was already created instead of repeating the action.&lt;/p&gt;

&lt;p&gt;Use bounded retries only for temporary failures such as rate limits or network timeouts. Do not retry invalid input or permission errors. Send exhausted jobs to a review queue with the workflow ID, failed step, sanitized error, and last safe checkpoint.&lt;/p&gt;

&lt;p&gt;Keep an audit trail for every run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workflow_id
input_reference
model and prompt version
generated plan
validation decisions
approval actor and timestamp
tool calls and sanitized parameters
outputs and verification evidence
final status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verification should be independent from execution. If an agent creates a CRM record, read the record back and verify key fields. If it publishes content, confirm the final URL, title, and expected links. If verification fails, mark the workflow as uncertain rather than claiming success.&lt;/p&gt;

&lt;p&gt;Also define a safe failure response. The agent should stop when it cannot prove that an action is allowed, when required context is missing, or when a tool returns an ambiguous result. “Do nothing and ask for help” is often the correct production behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical implementation checklist
&lt;/h2&gt;

&lt;p&gt;Before releasing an AI agent workflow, confirm that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every tool has a narrow purpose and documented input schema&lt;/li&gt;
&lt;li&gt;the model cannot call unregistered tools&lt;/li&gt;
&lt;li&gt;high-impact actions require approval&lt;/li&gt;
&lt;li&gt;workflow state survives restarts&lt;/li&gt;
&lt;li&gt;side effects use idempotency keys&lt;/li&gt;
&lt;li&gt;retries are bounded and error-aware&lt;/li&gt;
&lt;li&gt;secrets and sensitive values are removed from logs&lt;/li&gt;
&lt;li&gt;execution results are verified independently&lt;/li&gt;
&lt;li&gt;operators can replay or resume a failed run safely&lt;/li&gt;
&lt;li&gt;every completed run has an auditable final status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test failure paths, not only the happy path: a timeout after a successful write, duplicate webhook, invalid model output, rejected approval, and worker restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Reliable AI automation comes from constraining the agent, not from writing a longer prompt. Let the model handle ambiguous language and flexible planning, while deterministic code controls permissions, validation, state, and side effects.&lt;/p&gt;

&lt;p&gt;A bounded workflow with risk-based human approval can automate low-risk work quickly and slow down only when the consequences justify it. That architecture is less impressive than an unrestricted demo, but it is far more useful when an AI agent becomes part of a real business process.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>n8n vs Make in 2026: Which Workflow Automation Tool Should You Choose?</title>
      <dc:creator>kingston-888</dc:creator>
      <pubDate>Mon, 17 Aug 2026 02:30:24 +0000</pubDate>
      <link>https://dev.to/kingston-888/n8n-vs-make-in-2026-which-workflow-automation-tool-should-you-choose-3kb3</link>
      <guid>https://dev.to/kingston-888/n8n-vs-make-in-2026-which-workflow-automation-tool-should-you-choose-3kb3</guid>
      <description>&lt;p&gt;Choosing between n8n and Make is not really a question of which platform has more features. Both can connect SaaS apps, call APIs, transform data, branch logic, schedule jobs, and support AI automation.&lt;/p&gt;

&lt;p&gt;The more useful question is: &lt;strong&gt;which operating model fits your team, workflow volume, and maintenance appetite?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This n8n vs Make comparison focuses on the decisions that become important after a workflow moves beyond a demo: hosting, pricing units, debugging, custom logic, and long-term ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick answer: n8n vs Make
&lt;/h2&gt;

&lt;p&gt;Choose &lt;strong&gt;n8n&lt;/strong&gt; when you need self-hosting, deeper code-level control, complex data transformations, or the ability to keep workflow execution inside your infrastructure.&lt;/p&gt;

&lt;p&gt;Choose &lt;strong&gt;Make&lt;/strong&gt; when you want a managed visual automation platform, fast access to a broad connector catalog, and workflows that non-technical operators can understand and maintain.&lt;/p&gt;

&lt;p&gt;Neither choice is automatically cheaper. The cost depends on how the platform measures usage and how much operational work your team is willing to own.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Hosting and control are the biggest difference
&lt;/h2&gt;

&lt;p&gt;n8n can run as a managed cloud service or as a self-hosted Community Edition. Self-hosting gives teams control over deployment location, network access, backups, upgrades, and data retention. This can be valuable when workflows touch internal databases, private APIs, or regulated data.&lt;/p&gt;

&lt;p&gt;That control also creates responsibility. Someone needs to maintain the server, secure webhook endpoints, monitor failed executions, test upgrades, and manage credentials. A free software license does not make infrastructure operations free.&lt;/p&gt;

&lt;p&gt;Make takes a cloud-first approach. Teams create scenarios in a managed environment without maintaining the workflow engine. For many marketing, operations, and sales teams, that is an advantage: they can focus on business logic rather than deployment.&lt;/p&gt;

&lt;p&gt;The practical decision is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use n8n self-hosted if infrastructure control is a requirement and someone can own it.&lt;/li&gt;
&lt;li&gt;Use Make if reducing maintenance is more important than controlling the runtime.&lt;/li&gt;
&lt;li&gt;Use n8n Cloud if you prefer n8n's workflow model but do not want to operate the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When comparing patterns across multiple platforms, I also keep a lightweight catalog of real automation use cases. &lt;a href="https://www.coreclaw.com/?utm_source=forum&amp;amp;utm_medium=referral&amp;amp;utm_campaign=devp&amp;amp;utm_term=&amp;amp;utm_id=devp" rel="noopener noreferrer"&gt;CoreClaw&lt;/a&gt; is one reference I use for browsing workflow ideas before deciding how a specific implementation should be built.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Compare pricing units, not just monthly plans
&lt;/h2&gt;

&lt;p&gt;The platforms meter automation differently.&lt;/p&gt;

&lt;p&gt;n8n Cloud generally counts a complete workflow run as an execution. A workflow may contain many nodes, but its usage is primarily tied to how many times the workflow executes. Self-hosted n8n shifts the cost toward compute, storage, monitoring, and engineering time.&lt;/p&gt;

&lt;p&gt;Make uses a credit-based model in which module activity consumes credits. A scenario processing many bundles across several modules can use substantially more credits than a simple linear workflow.&lt;/p&gt;

&lt;p&gt;Consider a workflow that receives 1,000 records and performs five actions for each record. Its cost profile may look very different depending on whether usage is measured by full workflow executions or by module activity.&lt;/p&gt;

&lt;p&gt;Before choosing a platform, estimate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;monthly workflow runs
× records processed per run
× modules or nodes executed per record
× retry and error-handling overhead
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then include operational costs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hosting + backups + monitoring + upgrade time + incident response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents two common mistakes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;assuming self-hosting is free because there is no per-execution license fee&lt;/li&gt;
&lt;li&gt;assuming a low-cost cloud plan remains inexpensive when data volume grows&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For low-volume workflows, the difference may be insignificant. For data-heavy automation, the billing unit can influence architecture from the beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Visual design, custom logic, and debugging
&lt;/h2&gt;

&lt;p&gt;Make is strong when workflow owners prefer a visual scenario builder. Routers, filters, iterators, and app modules are displayed clearly, which helps non-developers understand how data moves through a process.&lt;/p&gt;

&lt;p&gt;n8n also uses a visual canvas, but it tends to feel more developer-oriented. Code steps, JSON data inspection, HTTP requests, sub-workflows, and custom integrations fit naturally into the platform. It is often a better match when automation is treated as part of the engineering system rather than only as an operations tool.&lt;/p&gt;

&lt;p&gt;A useful evaluation exercise is to build the same workflow in both platforms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;receive a webhook&lt;/li&gt;
&lt;li&gt;validate and normalize the payload&lt;/li&gt;
&lt;li&gt;call an external API&lt;/li&gt;
&lt;li&gt;branch on the response&lt;/li&gt;
&lt;li&gt;write to a database or CRM&lt;/li&gt;
&lt;li&gt;retry temporary failures&lt;/li&gt;
&lt;li&gt;send an alert with execution context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not judge only by how quickly the happy path is built. Test a timeout, malformed input, duplicate event, and expired credential. The better platform is the one your team can debug confidently six months later.&lt;/p&gt;

&lt;p&gt;Also consider ownership. A visually elegant Make scenario may be easier for an operations team to maintain. An n8n workflow with code and version-controlled JSON may be easier for developers to review and extend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision framework
&lt;/h2&gt;

&lt;p&gt;Choose n8n if most of these are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;self-hosting or private-network access matters&lt;/li&gt;
&lt;li&gt;developers own the workflows&lt;/li&gt;
&lt;li&gt;you need extensive custom code or unusual APIs&lt;/li&gt;
&lt;li&gt;execution volume is high relative to workflow count&lt;/li&gt;
&lt;li&gt;infrastructure maintenance is acceptable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose Make if most of these are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business users own the workflows&lt;/li&gt;
&lt;li&gt;fast setup matters more than runtime control&lt;/li&gt;
&lt;li&gt;most integrations use common SaaS applications&lt;/li&gt;
&lt;li&gt;a managed platform is preferred&lt;/li&gt;
&lt;li&gt;visual readability is a major requirement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run a short proof of concept when the decision is not obvious. Use a production-like payload and measure build time, execution consumption, error recovery, and maintenance effort—not just whether the scenario completes once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The n8n vs Make decision is less about a universal winner and more about trade-offs.&lt;/p&gt;

&lt;p&gt;n8n offers stronger deployment control and a developer-friendly automation model. Make offers a polished managed experience and a visual workflow environment that is approachable for cross-functional teams.&lt;/p&gt;

&lt;p&gt;Choose based on who will maintain the automation, where the data must run, how usage grows, and how failures will be diagnosed. A workflow platform should not only help you launch faster; it should remain understandable when the workflow becomes business-critical.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Make.com Tutorial: Build a Reliable Lead Enrichment Workflow with Error Handling</title>
      <dc:creator>kingston-888</dc:creator>
      <pubDate>Fri, 14 Aug 2026 06:39:26 +0000</pubDate>
      <link>https://dev.to/kingston-888/makecom-tutorial-build-a-reliable-lead-enrichment-workflow-with-error-handling-3ei7</link>
      <guid>https://dev.to/kingston-888/makecom-tutorial-build-a-reliable-lead-enrichment-workflow-with-error-handling-3ei7</guid>
      <description>&lt;p&gt;A lead enrichment workflow looks simple on a whiteboard: capture a form submission, look up company data, score the lead, update the CRM, and notify sales. In production, however, one missing domain, a slow API, or a duplicate webhook can turn that clean diagram into unreliable data.&lt;/p&gt;

&lt;p&gt;This Make.com tutorial shows how to design a practical lead enrichment scenario that stays readable, handles partial failures, and avoids sending the same lead to sales twice. The goal is not to build the largest possible scenario. It is to build a workflow your team can understand and maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Design the scenario around one clear data contract
&lt;/h2&gt;

&lt;p&gt;Start with a webhook or form module that receives a predictable payload. At minimum, collect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;email address&lt;/li&gt;
&lt;li&gt;full name&lt;/li&gt;
&lt;li&gt;company name&lt;/li&gt;
&lt;li&gt;company website or domain&lt;/li&gt;
&lt;li&gt;source campaign&lt;/li&gt;
&lt;li&gt;submission timestamp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before calling any enrichment service, normalize the input. Convert email addresses to lowercase, trim spaces, and extract the root domain from the website URL. This gives every later module a consistent data shape.&lt;/p&gt;

&lt;p&gt;A useful Make scenario can follow this structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Custom webhook&lt;/strong&gt; receives the lead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools / Set variables&lt;/strong&gt; normalizes fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRM search&lt;/strong&gt; checks whether the email already exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Router&lt;/strong&gt; separates new leads from existing contacts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP request&lt;/strong&gt; calls the enrichment API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoring step&lt;/strong&gt; calculates lead priority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRM create or update&lt;/strong&gt; stores the final record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack or email notification&lt;/strong&gt; alerts sales only when needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The duplicate check should happen before enrichment. Otherwise, retries and repeated submissions may waste API credits and create conflicting CRM records. Use the normalized email as the primary key and the company domain as a secondary check.&lt;/p&gt;

&lt;p&gt;If you build many workflows across different tools, keeping a small reference catalog of triggers, payloads, and reusable integration patterns is helpful. A related workflow resource I have been reviewing is &lt;a href="https://www.coreclaw.com/?utm_source=forum&amp;amp;utm_medium=referral&amp;amp;utm_campaign=devp&amp;amp;utm_term=&amp;amp;utm_id=devp" rel="noopener noreferrer"&gt;CoreClaw&lt;/a&gt;, mainly as a way to compare automation use cases without turning the scenario itself into a tool-specific design.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add error handling before adding more modules
&lt;/h2&gt;

&lt;p&gt;Make.com makes it easy to add modules, but reliability comes from deciding what should happen when each module fails.&lt;/p&gt;

&lt;p&gt;For the enrichment request, distinguish between three outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Successful response:&lt;/strong&gt; parse and use the returned data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected missing data:&lt;/strong&gt; continue with the original form fields and mark enrichment as incomplete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporary failure:&lt;/strong&gt; retry later instead of dropping the lead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Attach an error handler to the HTTP module. For rate limits and server errors, store the lead in a retry queue such as Airtable, a data store, or a dedicated CRM status. Include the original payload, error code, retry count, and next retry time.&lt;/p&gt;

&lt;p&gt;Do not retry every error. A &lt;code&gt;429&lt;/code&gt; response or a temporary &lt;code&gt;5xx&lt;/code&gt; failure may succeed later. A malformed domain or a &lt;code&gt;400&lt;/code&gt; response usually requires corrected input, not another automated attempt.&lt;/p&gt;

&lt;p&gt;It is also useful to preserve processing state in the CRM. Fields such as these make debugging much easier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;automation_status: enriched | partial | retry_pending | failed
enrichment_provider: provider_name
enrichment_checked_at: ISO timestamp
automation_run_id: unique scenario execution ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The unique run ID provides traceability when a salesperson reports that a record looks wrong. Instead of guessing, you can search the Make execution history and inspect the exact payload used for that CRM update.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Score leads with transparent rules
&lt;/h2&gt;

&lt;p&gt;Lead scoring does not need an AI model to be useful. Start with rules that a sales team can explain and adjust.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;company domain present: &lt;code&gt;+10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;role contains founder, head, director, or VP: &lt;code&gt;+20&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;company size matches target range: &lt;code&gt;+20&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;business email rather than free email provider: &lt;code&gt;+15&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;target region matches: &lt;code&gt;+10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;submission came from a high-intent page: &lt;code&gt;+25&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use Make functions to calculate the total, then route leads into simple groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hot:&lt;/strong&gt; score 70 or higher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warm:&lt;/strong&gt; score 40 to 69&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low priority:&lt;/strong&gt; score below 40&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only send immediate notifications for hot leads. Warm leads can enter a normal follow-up sequence, while low-priority records remain available for future segmentation. This reduces notification fatigue and gives the sales team a reason to trust the automation.&lt;/p&gt;

&lt;p&gt;Keep scoring logic visible in one module or documented note. Spreading small calculations across many filters makes the workflow difficult to audit. If the rules become complex, move them into a dedicated function, database table, or configuration sheet rather than hiding them in router branches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Make.com workflow
&lt;/h2&gt;

&lt;p&gt;Before activating the scenario, test these cases separately:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a complete new lead with a valid company domain&lt;/li&gt;
&lt;li&gt;an existing CRM contact&lt;/li&gt;
&lt;li&gt;a personal email with no company website&lt;/li&gt;
&lt;li&gt;an enrichment API timeout&lt;/li&gt;
&lt;li&gt;a duplicate webhook delivered twice&lt;/li&gt;
&lt;li&gt;a lead that qualifies as hot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verify both the final CRM record and the execution path. A scenario is not reliable just because the happy path finishes successfully.&lt;/p&gt;

&lt;p&gt;Also review what happens after a partial failure. The workflow should leave enough state for a human or scheduled retry process to continue without rebuilding the lead from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A reliable Make.com lead enrichment workflow is mostly about boundaries: normalize data early, prevent duplicates before paid API calls, treat missing enrichment as a valid outcome, and make retry behavior explicit.&lt;/p&gt;

&lt;p&gt;The best scenario is not the one with the most modules. It is the one that produces predictable CRM records, gives sales useful context, and can be debugged quickly when an external service fails.&lt;/p&gt;

&lt;p&gt;Build the smallest version first, test failure paths, and only then add more enrichment providers or scoring rules. That approach turns a fragile no-code automation into a workflow the business can actually depend on.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>n8n Tutorial: How to Build a Reliable Content Approval Workflow</title>
      <dc:creator>kingston-888</dc:creator>
      <pubDate>Fri, 14 Aug 2026 06:05:49 +0000</pubDate>
      <link>https://dev.to/kingston-888/n8n-tutorial-how-to-build-a-reliable-content-approval-workflow-2phg</link>
      <guid>https://dev.to/kingston-888/n8n-tutorial-how-to-build-a-reliable-content-approval-workflow-2phg</guid>
      <description>&lt;p&gt;A lot of teams adopt workflow automation to save time, but the first version of an automation often creates a different problem: it moves faster than the review process.&lt;/p&gt;

&lt;p&gt;That is especially common in content operations. One person writes, another reviews, a third checks links or SEO fields, and someone else finally publishes. If you automate too early, you can accidentally ship incomplete drafts. If you automate too late, the workflow stays manual and slow.&lt;/p&gt;

&lt;p&gt;A better approach is to use n8n to automate the boring transitions between stages while keeping the human approval points visible and explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why n8n works well for approval workflows
&lt;/h2&gt;

&lt;p&gt;If you are searching for an &lt;code&gt;n8n tutorial&lt;/code&gt; because you want something more flexible than a simple Zap, approval workflows are a good place to start.&lt;/p&gt;

&lt;p&gt;n8n is strong here for three reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it supports visual branching without hiding the logic&lt;/li&gt;
&lt;li&gt;it lets you mix app integrations with custom code when needed&lt;/li&gt;
&lt;li&gt;it works well for workflows that need both automation and human decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical content approval flow has more conditions than people expect. You may need to check whether a draft has a title, whether the SEO description exists, whether a reviewer has approved the content, and whether publishing is allowed for that channel.&lt;/p&gt;

&lt;p&gt;With n8n, that can all live in one workflow instead of being spread across email, chat, and spreadsheets.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple content approval flow you can actually use
&lt;/h2&gt;

&lt;p&gt;Here is a practical pattern that works for small teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Trigger when a draft is ready
&lt;/h3&gt;

&lt;p&gt;The workflow starts when a draft changes status in Airtable, Notion, Google Sheets, or your CMS.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;status = ready_for_review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;channel = blog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;owner is not empty&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives you a clean entry point instead of polling every record blindly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Validate the required fields
&lt;/h3&gt;

&lt;p&gt;Before sending anything to a reviewer, run a validation step.&lt;/p&gt;

&lt;p&gt;Check for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;title&lt;/li&gt;
&lt;li&gt;summary&lt;/li&gt;
&lt;li&gt;target keyword&lt;/li&gt;
&lt;li&gt;slug&lt;/li&gt;
&lt;li&gt;main body content&lt;/li&gt;
&lt;li&gt;canonical link or reference links if required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents the annoying situation where reviewers waste time opening half-finished drafts.&lt;/p&gt;

&lt;p&gt;In n8n, this is usually one IF node plus a small code node for custom validation rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Route to the right reviewer
&lt;/h3&gt;

&lt;p&gt;Once the draft is valid, route it based on content type.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;technical tutorial -&amp;gt; developer reviewer&lt;/li&gt;
&lt;li&gt;landing page copy -&amp;gt; marketing reviewer&lt;/li&gt;
&lt;li&gt;case study -&amp;gt; operations reviewer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where many teams overcomplicate things. You do not need a huge rules engine on day one. Even a simple mapping table is enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Send approval tasks instead of full documents
&lt;/h3&gt;

&lt;p&gt;One useful lesson from real automation projects is this: do not send the whole payload everywhere unless people truly need it.&lt;/p&gt;

&lt;p&gt;Instead, send a concise approval task with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;title&lt;/li&gt;
&lt;li&gt;target keyword&lt;/li&gt;
&lt;li&gt;author&lt;/li&gt;
&lt;li&gt;current status&lt;/li&gt;
&lt;li&gt;direct edit link&lt;/li&gt;
&lt;li&gt;approve / reject action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That keeps the workflow fast and reduces noise in Slack or email.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Publish only after explicit approval
&lt;/h3&gt;

&lt;p&gt;After approval, the workflow can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;update the record status&lt;/li&gt;
&lt;li&gt;notify the owner&lt;/li&gt;
&lt;li&gt;push the draft into a publishing queue&lt;/li&gt;
&lt;li&gt;create a publish task for the final channel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is not the automation itself. It is the fact that the approval state becomes structured and searchable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes in n8n workflow automation
&lt;/h2&gt;

&lt;p&gt;The most common problem is trying to automate every edge case too early.&lt;/p&gt;

&lt;p&gt;People often build huge workflows with too many branches, too many retries, and too many notifications. The result is technically impressive but hard to maintain.&lt;/p&gt;

&lt;p&gt;A better rule is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automate the handoff&lt;/li&gt;
&lt;li&gt;automate the validation&lt;/li&gt;
&lt;li&gt;automate the status update&lt;/li&gt;
&lt;li&gt;keep the approval decision human&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gets most of the value without making the workflow fragile.&lt;/p&gt;

&lt;p&gt;Another mistake is ignoring observability. If an approval workflow fails, you need to know where it stopped.&lt;/p&gt;

&lt;p&gt;At minimum, log:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;workflow start time&lt;/li&gt;
&lt;li&gt;content ID&lt;/li&gt;
&lt;li&gt;current stage&lt;/li&gt;
&lt;li&gt;reviewer assigned&lt;/li&gt;
&lt;li&gt;approval result&lt;/li&gt;
&lt;li&gt;failure reason&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes debugging much easier when someone asks, "Why was this draft never published?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;The best &lt;code&gt;workflow automation&lt;/code&gt; setups are not the ones that remove humans from the process.&lt;/p&gt;

&lt;p&gt;They are the ones that remove uncertainty.&lt;/p&gt;

&lt;p&gt;If you are building your first serious approval flow, n8n is a strong choice because it lets you automate structure without hiding logic. Start with one content path, make the review states explicit, and keep the first version boring enough to maintain.&lt;/p&gt;

&lt;p&gt;If you want to compare how different workflow tools and orchestration patterns handle these kinds of approval chains, this related resource is a useful reference: &lt;a href="https://www.coreclaw.com/?utm_source=forum&amp;amp;utm_medium=referral&amp;amp;utm_campaign=devp&amp;amp;utm_term=&amp;amp;utm_id=devp" rel="noopener noreferrer"&gt;https://www.coreclaw.com/?utm_source=forum&amp;amp;utm_medium=referral&amp;amp;utm_campaign=devp&amp;amp;utm_term=&amp;amp;utm_id=devp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>Ship Faster by Removing Hidden Friction from Browser Automation</title>
      <dc:creator>kingston-888</dc:creator>
      <pubDate>Fri, 14 Aug 2026 03:59:37 +0000</pubDate>
      <link>https://dev.to/kingston-888/ship-faster-by-removing-hidden-friction-from-browser-automation-4j7p</link>
      <guid>https://dev.to/kingston-888/ship-faster-by-removing-hidden-friction-from-browser-automation-4j7p</guid>
      <description>&lt;p&gt;Most automation failures are not caused by a broken click or a missing selector. They come from hidden friction: slow content generation, repeated verification, and workflows that type into a browser one tiny action at a time.&lt;/p&gt;

&lt;p&gt;When people say an automation is unreliable, what they often mean is that it is doing too much work before the real task even begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first bottleneck is usually over-generation
&lt;/h2&gt;

&lt;p&gt;A lot of content automations start with an overly ambitious prompt. The system is asked to create a long article, multiple sections, several tags, and extra polish before anything reaches the editor.&lt;/p&gt;

&lt;p&gt;That sounds impressive, but it slows the entire pipeline.&lt;/p&gt;

&lt;p&gt;A faster approach is to set tighter constraints from the beginning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep the article short and publishable&lt;/li&gt;
&lt;li&gt;reduce the number of sections&lt;/li&gt;
&lt;li&gt;limit tags to the most relevant few&lt;/li&gt;
&lt;li&gt;optimize for clarity instead of completeness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a developer platform like dev.to, a focused 700-word post often performs better operationally than a bloated draft that takes much longer to produce and write.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second bottleneck is slow browser writing
&lt;/h2&gt;

&lt;p&gt;Even after content is ready, many automations waste time by filling the page in fragments. They type a little, verify a little, pause, then continue.&lt;/p&gt;

&lt;p&gt;That pattern makes the run longer and increases the chance of interruption.&lt;/p&gt;

&lt;p&gt;It is usually better to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;attach to the real visible browser window&lt;/li&gt;
&lt;li&gt;confirm the editor once&lt;/li&gt;
&lt;li&gt;write title and body in one pass&lt;/li&gt;
&lt;li&gt;add only the necessary tags&lt;/li&gt;
&lt;li&gt;publish immediately if the page is healthy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more an automation behaves like a hesitant human, the slower it becomes. Good automation should be decisive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability often comes from subtraction
&lt;/h2&gt;

&lt;p&gt;People often try to speed up automation by adding more logic. In reality, the biggest gains often come from removing steps that no longer earn their cost.&lt;/p&gt;

&lt;p&gt;That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeated page checks&lt;/li&gt;
&lt;li&gt;unnecessary formatting rules&lt;/li&gt;
&lt;li&gt;extra retries before failure&lt;/li&gt;
&lt;li&gt;too many fallback branches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lean workflow is easier to debug, easier to trust, and much faster to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;If you want browser automation to move faster, do not only optimize the code. Optimize the workflow.&lt;/p&gt;

&lt;p&gt;Shorter content, fewer checks, and one-pass writing can remove most of the delay without reducing the value of the result.&lt;/p&gt;

&lt;p&gt;Fast automation is rarely about doing more in parallel.&lt;/p&gt;

&lt;p&gt;It is usually about doing less on purpose.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>From Detached Automation to Same-Window Control: A Practical Lesson in Browser Reliability</title>
      <dc:creator>kingston-888</dc:creator>
      <pubDate>Fri, 14 Aug 2026 03:42:33 +0000</pubDate>
      <link>https://dev.to/kingston-888/from-detached-automation-to-same-window-control-a-practical-lesson-in-browser-reliability-548p</link>
      <guid>https://dev.to/kingston-888/from-detached-automation-to-same-window-control-a-practical-lesson-in-browser-reliability-548p</guid>
      <description>&lt;p&gt;When people talk about browser automation, the conversation usually starts with selectors, scripts, and speed.&lt;/p&gt;

&lt;p&gt;In practice, the real challenge often shows up somewhere less glamorous: &lt;strong&gt;session fidelity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I recently worked through a publishing workflow where the browser automation looked correct on paper. It could open the right URL, navigate to the post editor, inspect page structure, and take screenshots. But the first few runs kept reporting a login page, while the human operator was clearly looking at a fully authenticated editor window.&lt;/p&gt;

&lt;p&gt;That mismatch turned out to be the entire story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real problem was not navigation
&lt;/h2&gt;

&lt;p&gt;The task itself was simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open &lt;code&gt;https://dev.to/new&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;confirm the editor is available&lt;/li&gt;
&lt;li&gt;fill in the title, tags, and article body&lt;/li&gt;
&lt;li&gt;publish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The automation &lt;em&gt;did&lt;/em&gt; reach the correct URL. The problem was that it was doing so in a &lt;strong&gt;different browser context&lt;/strong&gt; from the one the user was actively looking at.&lt;/p&gt;

&lt;p&gt;That meant two seemingly contradictory things were both true at once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the visible Chrome window showed the authenticated editor&lt;/li&gt;
&lt;li&gt;the automation session still saw a login page&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At first glance, this looks like flaky tooling. It usually is not. It is a context boundary problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this happens so often
&lt;/h2&gt;

&lt;p&gt;A lot of browser automation is effectively "open another browser and do the same thing there." That approach works fine for public pages, test environments, and clean-room scripts.&lt;/p&gt;

&lt;p&gt;It gets fragile when the workflow depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;existing login state&lt;/li&gt;
&lt;li&gt;extensions&lt;/li&gt;
&lt;li&gt;browser-specific storage&lt;/li&gt;
&lt;li&gt;multiple user profiles&lt;/li&gt;
&lt;li&gt;tabs the user already opened manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, &lt;em&gt;the browser&lt;/em&gt; is not the important thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The session is.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your automation launches a fresh controlled browser, even with the same executable, you may still miss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cookies&lt;/li&gt;
&lt;li&gt;localStorage&lt;/li&gt;
&lt;li&gt;extension state&lt;/li&gt;
&lt;li&gt;profile-specific authentication&lt;/li&gt;
&lt;li&gt;tab state that only exists in the user’s live window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the script says "not logged in," while the user says "I am literally staring at the editor right now."&lt;/p&gt;

&lt;p&gt;They can both be right.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: bind to the same visible window
&lt;/h2&gt;

&lt;p&gt;The reliable solution was to stop pretending that "same URL" means "same state."&lt;/p&gt;

&lt;p&gt;Instead of opening a separate automation-only browser context, the better approach was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;connect to the user’s current visible Chrome window&lt;/li&gt;
&lt;li&gt;verify the actual active tab&lt;/li&gt;
&lt;li&gt;operate inside that exact browser session&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the automation was attached to the same visible window, the page state finally lined up with reality.&lt;/p&gt;

&lt;p&gt;The signals became unambiguous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Create Post&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Upload Cover Image&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;New post title here...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Write your post content here...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point there was no more guessing. The automation and the human were looking at the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changed in the workflow
&lt;/h2&gt;

&lt;p&gt;After switching to same-window control, the workflow became much more trustworthy.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opening a fresh browser context&lt;/li&gt;
&lt;li&gt;inferring state from a lookalike session&lt;/li&gt;
&lt;li&gt;risking false negatives on login checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;we could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;attach to the user’s real window&lt;/li&gt;
&lt;li&gt;confirm the real editor state&lt;/li&gt;
&lt;li&gt;fill content directly where the user was already working&lt;/li&gt;
&lt;li&gt;keep human review possible at every step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters more than convenience.&lt;/p&gt;

&lt;p&gt;When a workflow includes external actions like publishing, sending, or submitting, &lt;strong&gt;trust in the execution context&lt;/strong&gt; is part of correctness.&lt;/p&gt;

&lt;p&gt;A script that acts on the wrong session is not just annoying. It is operationally unsafe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical rules I will reuse
&lt;/h2&gt;

&lt;p&gt;If I build similar browser automations again, these are the rules I would keep:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Treat authenticated state as a first-class requirement
&lt;/h3&gt;

&lt;p&gt;Do not treat login as a side note. Make it part of the design.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Verify the visible page, not just the target URL
&lt;/h3&gt;

&lt;p&gt;A correct URL does not prove you are in the correct state.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prefer attaching to an existing session for real user workflows
&lt;/h3&gt;

&lt;p&gt;Fresh browser launches are great for tests. Existing sessions are often better for production-like desktop tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Capture evidence early
&lt;/h3&gt;

&lt;p&gt;Screenshots and page snapshots prevent arguments with assumptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Separate "browser control" from "window truth"
&lt;/h3&gt;

&lt;p&gt;If the user is watching one window and the automation is driving another, you do not yet have a reliable workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;The hardest bugs in automation are often not code bugs.&lt;/p&gt;

&lt;p&gt;They are &lt;strong&gt;assumption bugs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this case, the bad assumption was simple: if automation opens the same page, it must be seeing the same thing as the user.&lt;/p&gt;

&lt;p&gt;It was not.&lt;/p&gt;

&lt;p&gt;Once we changed the design from detached automation to same-window control, the workflow became understandable, inspectable, and trustworthy.&lt;/p&gt;

&lt;p&gt;That is a good reminder for any automation project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;reliability starts with sharing the same reality as the user.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>playwright</category>
      <category>ai</category>
      <category>productivity</category>
      <category>career</category>
    </item>
  </channel>
</rss>
