<?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>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>
