<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>FlowFuse</title>
    <link href="https://flowfuse.com/blog/index.xml" rel="self"/>
    <link href="https://flowfuse.com/blog"/>
    <updated>2026-09-23T00:00:00.000Z</updated>
    <id>https://flowfuse.com/blog</id>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/ai-in-manufacturing/</id>
        <title>AI in Manufacturing: Use Cases, Software, and Implementation</title>
        <summary>AI in manufacturing is applied to machine, PLC, sensor, camera, MES, and SCADA data to predict failures, detect defects, optimize processes, and support production decisions. Putting a model into production takes more than the model itself: it needs industrial data connectivity, somewhere to run it, and a way to deliver results to the people and systems that act on them.</summary>
        <content type="html"><![CDATA[<p>AI is being used in manufacturing to predict equipment failures, detect defects, optimize processes, and help operators and engineers make better production decisions. These applications use data from machines, PLCs, sensors, cameras, MES, SCADA, and other factory systems.</p><p>Implementing AI in a manufacturing environment is more than selecting the right model. It requires connecting data, building applications, and bringing results to where they can have the most impact. This article covers the <a href="#common-use-cases-of-ai-in-manufacturing">main use cases for AI in manufacturing</a>, the <a href="#software-stack-for-ai-in-manufacturing">software required</a>, and <a href="#how-to-implement-ai-in-manufacturing">how to implement AI</a> in production.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/09/images/ai-in-manufacturing-cta-1.png" alt="Connect your factory data to an AI application with FlowFuse - start your free trial"/></a><h2 id="what-is-ai-in-manufacturing">What Is AI in Manufacturing?</h2><p>AI stands for artificial intelligence. It encompasses technologies that enable learning from data, recognizing patterns, making predictions, and performing tasks that require human intelligence.</p><p>Applied to manufacturing, AI can analyze production data to detect anomalies and defects, predict equipment failures, optimize processes, and support production decisions.</p><h2 id="common-use-cases-of-ai-in-manufacturing">Common Use Cases of AI in Manufacturing</h2><p>AI can be applied to many aspects of a manufacturing operation. The particular use case depends on the process, the problem to be addressed, and the data involved.</p><p>At a high level, AI can help manufacturers <strong>predict</strong> what may happen, <strong>detect</strong> problems as they occur, <strong>optimize</strong> processes and resources, <strong>assist</strong> operators and engineers through applications and analysis, and <strong>automate</strong> repetitive tasks. These capabilities span equipment maintenance, quality inspection, process optimization, and support for operators and engineers.</p><h3 id="predictive-maintenance">Predictive Maintenance</h3><p>Equipment availability is one of the most critical metrics in manufacturing, and unplanned downtime is costly. Predictive maintenance uses AI to estimate when a machine is likely to fail, so maintenance can be scheduled before it does.</p><p>The model analyzes machine data over time to find patterns associated with equipment degradation. For example, it might analyze vibration, temperature, and current data from a motor to detect changes that predict a bearing is starting to wear. Maintenance teams can use that signal to investigate early, order parts in advance, and schedule the work during planned downtime rather than after a breakdown.</p><h3 id="anomaly-detection">Anomaly Detection</h3><p>Anomaly detection is similar to predictive maintenance, but it answers a different question. Instead of predicting a specific failure, it flags when equipment has stopped behaving normally, and it doesn't need examples of past failures to do it.</p><p>The model learns what normal looks like from signals such as temperature, pressure, vibration, current consumption, and cycle time, then raises an alert when readings stray from that pattern. Since it only needs normal operating data, it's a practical starting point when failures are rare or poorly documented.</p><p>For example, an AI-powered <a href="https://flowfuse.com/blog/2026/02/motor-anomaly-detector-ai/">motor anomaly detector built with FlowFuse</a> can detect abnormal behavior in a motor's current consumption, so teams can investigate before the issue turns into a larger production problem.</p><h3 id="quality-inspection">Quality Inspection</h3><p>The same pattern recognition can be used to inspect product quality. AI-powered vision systems can detect defects, variations, or other characteristics that are hard to catch consistently through manual inspection.</p><p>For example, a camera can capture each product as it exits a conveyor while a vision model checks for surface defects. The results can be used to sort defective products and reveal recurring issues that point back to a particular machine, tool, or material batch.</p><h3 id="process-and-energy-optimization">Process and Energy Optimization</h3><p>Process optimization is about making production itself as efficient as possible. AI can analyze process variables to see which ones contribute the most to the outcome, for example machine speed, temperature, material feed rate, and energy use, to find the combination that delivers the required output with the least waste.</p><p>Energy is a typical optimization target, since it's often one of the largest controllable costs. AI can flag wasteful energy usage such as idling equipment or compressed air leaks, and help shift flexible loads to lower-cost periods. These optimizations are typically measured in terms of energy per unit produced.</p><h3 id="demand-forecasting">Demand Forecasting</h3><p>AI can find patterns in historical demand data that indicate future trends. Manufacturers can use this to estimate demand for particular products or components in the coming weeks and months, accounting for seasonality, promotions, and market changes.</p><h3 id="production-planning-and-scheduling">Production Planning and Scheduling</h3><p>Building on demand forecasts, AI can help decide what to produce, when, and on which line. It can sequence orders, balance workloads, anticipate material shortages, and re-plan when a machine goes down or a rush order arrives.</p><p>The value is in handling many constraints at once, such as machine availability, changeover times, material lead times, and delivery dates. Many teams start with recommendations that a planner reviews before moving toward automated scheduling.</p><h3 id="digital-twins-and-simulation">Digital Twins and Simulation</h3><p>Digital twins create virtual representations of machines, production lines, or processes using data from their physical counterparts. AI can analyze this data to identify patterns, predict outcomes, and test “what if” scenarios, such as changes to line speed or production settings, before applying them to the real process.</p><p>Simulation can also supplement real-world data when failures are rare or difficult to capture. These applications are typically most valuable for complex or high-value processes where testing changes in production is costly or risky.</p><h3 id="operator-assistance">Operator Assistance</h3><p>Operators, engineers, maintenance staff, and quality teams spend a lot of time searching for information: what an alarm means, what the procedure is, whether it's happened before. AI can shorten that search.</p><p>For example, when a machine raises an alarm, an operator can ask an AI assistant to explain the likely cause, pull the relevant troubleshooting procedure from a knowledge base, and surface recent data from that machine for review. The same approach works at a plant-wide level, where an engineer can ask which lines are underperforming this week and get an explanation of what's driving the gap.</p><h2 id="software-stack-for-ai-in-manufacturing">Software Stack for AI in Manufacturing</h2><p>AI is only one part of an AI application in manufacturing. To put a model into production, manufacturers also need software to collect and connect machine data, process and store it, run the model, and deliver its results to the systems and people who need them.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/09/images/ai-in-manufacturing-cta-2.png" alt="See how FlowFuse fits into an AI application's software stack - talk to our team"/></a><h3 id="industrial-data-and-connectivity">Industrial Data and Connectivity</h3><p>An AI application needs data, which comes from sources including <a href="https://flowfuse.com/landing/plc/">machines and PLCs</a>, sensors, <a href="https://flowfuse.com/use-cases/mes/">MES</a>, <a href="https://flowfuse.com/use-cases/scada/">SCADA</a>, <a href="https://flowfuse.com/docs/node-red/database/">databases</a>, <a href="https://flowfuse.com/blog/2026/06/process-rtsp-camera-feeds-at-the-edge/">cameras</a>, and more.</p><p>Industrial connectivity software gathers this data and makes it available to the AI application. <a href="https://flowfuse.com/use-cases/data-integration/">FlowFuse connects industrial equipment and routes this data through the application</a>, which is essential for processing it. Its <a href="https://flowfuse.com/docs/user/teambroker/">built-in MQTT broker</a> can also act as the central hub where this data is published and made available to the AI application and other systems.</p><h3 id="edge-and-cloud-computing">Edge and Cloud Computing</h3><p>AI applications need computing resources to run models and generate predictions or other outputs. That computation can happen close to the machine at the edge or in the cloud, depending on the requirements of the workload.</p><p>Edge AI is useful where inference needs to happen with low latency and without a network connection, while cloud AI can provide access to more compute for demanding workloads. FlowFuse supports AI applications across both environments, running AI alongside industrial applications at the edge and connecting flows to cloud-hosted AI services when required.</p><h3 id="ai-and-machine-learning">AI and Machine Learning</h3><p>The AI component itself depends on the use case, since it needs to be trained to perform a particular task such as predicting demand, detecting anomalies, or optimizing a process.</p><p>Various AI and machine learning software can implement these functions. For example, FlowFuse can run an ONNX machine learning model on an edge device using the <a href="https://flowfuse.com/docs/flowfuse-nodes/ai/onnx/">ONNX node</a>.</p><h3 id="data-storage">Data Storage</h3><p>Depending on the application, data may need to be stored for later use, such as training models or displaying results to users. Various types of databases, including SQL and NoSQL, can be used for this.</p><p>FlowFuse can connect to databases already in use in the manufacturing environment, and also provides a <a href="https://flowfuse.com/docs/flowfuse-nodes/flowfuse-tables/">built-in database</a> for storing operational data.</p><h3 id="applications-and-workflows">Applications and Workflows</h3><p>Finally, for an AI application to have an effect, its results need to reach the people and systems that can act on them. That could be a dashboard showing predicted demand, an alert indicating a machine is about to fail, or a maintenance task created automatically when an anomaly is detected.</p><p>FlowFuse provides a visual application development environment for building these applications and workflows and connecting them to industrial data. FlowFuse also integrates with AI agents, allowing <a href="https://flowfuse.com/docs/user/expert/">FlowFuse Expert</a> and a coding agent of your choice to interact with the platform and build applications and data workflows through its MCP server and <a href="https://flowfuse.com/docs/flowfuse-nodes/mcp/">MCP nodes</a>. This is how <a href="https://flowfuse.com/blog/2026/09/industrial-ai-agent/">external AI services such as Claude, OpenAI, and Gemini connect to FlowFuse</a> to work with manufacturing data and applications.</p><p>Not every application needs the full stack; it depends on the problem you're solving. At minimum, you need industrial data connectivity, somewhere to run the model, and the model itself. Beyond that, some applications also need data storage, dashboards, workflows, or AI assistants before the results can actually close the loop.</p><h2 id="how-to-implement-ai-in-manufacturing">How to Implement AI in Manufacturing</h2><p>A successful manufacturing AI project starts with a clear production problem, not an AI model. In practice, implementation can be approached in five stages:</p><ol><li>Define the outcome. Decide what you want to improve: reduce downtime, detect defects, increase throughput, help operators troubleshoot equipment faster. A specific, measurable outcome makes the project easier to scope and evaluate.</li><li>Validate the data. Identify the data needed to support the use case and confirm it's available and collected consistently.</li><li>Pilot a focused use case. Connect the relevant factory systems and test the AI on one machine, line, or process rather than across the entire plant. Starting small makes it easier to validate results, measure impact, and catch data or integration issues before scaling.</li><li>Put results into the workflow. Once results are validated, connect them to where people can act on them: a dashboard that displays a prediction, an alert that indicates a likely failure, or a maintenance task created automatically when an anomaly is detected. A prediction only creates value when someone can act on it.</li><li>Monitor and iterate. Treat the application as part of normal operations, not a one-time deployment. Equipment, processes, and production conditions change over time, and the models and applications built around them may need updating as new data becomes available.</li></ol><p>The objective isn't to add AI for its own sake, but to apply it where it produces a measurable improvement in a real manufacturing process.</p><p><strong>Connect Your Factory Data to an AI Application</strong></p><p>Talk to the FlowFuse team about connecting your machines, PLCs, and factory systems to the AI use case you're evaluating.</p><p><a href="https://flowfuse.com/contact-us/">Contact Us</a></p>]]></content>
        <updated>2026-09-23T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/ai-in-manufacturing/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/automotive-mes/</id>
        <title>Automotive MES: Buy, Build, or Extend What You Have</title>
        <summary>Off-The-Shelf And Custom MES Both Leave Plant-Specific Gaps: Most automotive manufacturers don't fail on routing and dispatch; they fail on the plant-specific quality gates, genealogy, and downtime coding that off-the-shelf and custom-built MES both leave for each site to configure. Buying Is Fast To Start, Building Only Pays Off If You'll Maintain It: Buying gets routing, dispatch, and error-proofing running fast, but quality gates and genealogy still take months to configure on top. Building only pays off for a differentiated process with a team in place to maintain it. Extending Closes The Gap Without Replacing What Already Works: Extending is usually fastest when the core MES already works, and the real gaps are quality gates, genealogy, and downtime standardization, without replacing anything running the plant.</summary>
        <content type="html"><![CDATA[<h2 id="what-automotive-mes-actually-does">What Automotive MES Actually Does</h2><p>A Manufacturing Execution System (MES) sits between two systems every plant already runs. ERP plans production at the scale of days and weeks: what to build, how much, by when. SCADA supervises the equipment below it, collecting tag data from PLCs in real time. MES is the layer in between, taking the ERP plan, dispatching it as work orders, and tracking execution as it happens.</p><h3 id="from-monolithic-mes-to-modular-mes">From Monolithic MES to Modular MES</h3><p>For most of MES's history, the entire stack shipped as one tightly coupled platform (hence the term ‘monolith’). Changing any piece meant touching the whole system: a vendor engagement and months of lead time for custom configurations.</p><p>That model is breaking down for the same reason why automotive plants are hard to standardize in the first place. Every plant, product line, and OEM contract has its own quality requirements, downtime taxonomy, and mix of legacy equipment. The industry's response has been a shift toward modular, composable MES architecture that breaks routing, quality, genealogy, and downtime tracking into pieces that can be built or replaced independently. Extending an existing MES, the third option here, is that same shift applied to a plant that already has a working MES and no interest in replacing it just to get modularity.</p><h2 id="why-automotive-manufacturing-makes-mes-decisions-harder">Why Automotive Manufacturing Makes MES Decisions Harder</h2><p>Automotive manufacturing carries more accumulated technical debt than most manufacturing environments, and it's structural, not incidental. Equipment spans decades, so a single line can mix PLCs from different vendors and eras never built to talk to each other. Plants added through M&amp;A bring their own MES instances, ERP configurations, and naming conventions with them. Every integration is custom and manual, usually an integrator writing point-to-point code for one connection at one plant that nobody else can safely touch, and when that engineer leaves, it's a real risk.</p><p>None of this is unique to any specific manufacturer. It's the normal condition of any automotive manufacturer or supplier, and it's exactly why a corporate rollout can't assume one MES configuration fits every site.</p><h2 id="the-real-decision-buy-build-or-extend">The Real Decision: Buy, Build, or Extend</h2><h3 id="when-buying-an-off-the-shelf-mes-is-right">When Buying an Off-the-Shelf MES Is Right</h3><p>An off-the-shelf MES is the fastest path to solid routing, dispatch, and out-of-box error-proofing. It's right when a plant runs a standardized process, has no system yet, and needs core execution running quickly. Cost varies a lot by architecture and market: on-premise systems typically run {% raw %}<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>120</mn><mo separator="true">,</mo><mn>000</mn><mi>t</mi><mi>o</mi></mrow><annotation encoding="application/x-tex">120,000 to </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">120</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">000</span><span class="mord mathnormal">t</span><span class="mord mathnormal">o</span></span></span></span>600,000{% endraw %} upfront, plus around 20% of license cost annually in maintenance, with six to eighteen months before going live, while cloud-native platforms start in the low thousands per month (<a href="https://www.symestic.com/en-us/blog/mes-system-prices-2026" rel="nofollow">Symestic, 2026</a>). In the UK, a cloud MES typically runs £6,000 to £15,000 a year with a 90-day go-live, against £75,000 to £150,000 to implement on-premise and three-year totals of £120,000 to £450,000 (<a href="https://totalcontrolpro.com/guides/the-end-of-the-production-black-box-how-much-does-a-modern-mes-really-cost/" rel="nofollow">TotalControlPro, 2025</a>).</p><p>There are plenty of strong MES platforms on the market, from comprehensive systems like <a href="https://www.siemens.com/en-us/products/opcenter/execution/" rel="nofollow">Siemens Opcenter Execution</a> and <a href="https://www.rockwellautomation.com/en-us/products/software/factorytalk/operationsuite/mes/plex-mes.html" rel="nofollow">Rockwell's Plex</a>, to composable, build-your-own-app platforms like <a href="https://tulip.co/" rel="nofollow">Tulip</a>. Manufacturers running these don't need to rip them out to close the gaps this blog covers. In practice, manufacturers have implemented FlowFuse alongside deployments like these to extend their functionality, which is what the next option is about.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/09/images/extend-the-capablities-of-mes.png" alt="FlowFuse Extends capablities of your mes cta"/></a><h3 id="when-building-a-custom-mes-is-right">When Building a Custom MES Is Right</h3><p>Building makes sense when a process is differentiated enough that no off-the-shelf platform fits it, and the organization has the capacity to own it long term, not just ship it once. The trade-off is real: a custom build competes with the IT roadmap for a year or more, and every future change depends on that same team staying in place. Hexagon Manufacturing Intelligence took this route, building its own Smart Factory Manager rather than buying off-the-shelf, after concluding the fit and long-term ownership were worth the investment (<a href="https://www.industryweek.com/technology-and-iiot/video/55296538/build-or-buy-your-mes-lessons-from-hexagon-manufacturing-intelligence" rel="nofollow">IndustryWeek, 2025</a>).</p><h3 id="when-extending-your-existing-mes-is-the-right-move">When Extending Your Existing MES Is The Right Move</h3><p>Extending is right when the core MES already works, and the actual gaps are plant-specific: a quality gate that enforces a specific <a href="https://flowfuse.com/blog/2026/08/control-plans/">control plan</a>, a genealogy structure that satisfies a specific OEM's <a href="https://flowfuse.com/blog/2026/08/safe-launch/">safe launch requirements</a>, a downtime taxonomy that matches how a plant fails. Those are the pieces that get patched together in scripts and spreadsheets when nobody builds them properly, and what a modular extension layer standardizes.</p><p>This is where FlowFuse fits, and it's worth being direct: FlowFuse is not an <a href="https://flowfuse.com/use-cases/mes/">MES</a>, and it doesn't compete with the one already running the plant. It's an application layer that connects to <a href="https://flowfuse.com/blog/2025/06/what-is-mes/">MES</a>, <a href="https://flowfuse.com/landing/enterprise-integration/">ERP</a>, and <a href="https://flowfuse.com/use-cases/scada/">SCADA</a> systems already in place and makes them more configurable at the plant level.</p><p>It's also worth naming a fact that shapes this whole decision: to our knowledge, no vendor sells an MES built and sold specifically as an automotive-only product. MES platforms are horizontal, enterprise-wide systems used across automotive, pharma, food and beverage, and electronics alike, not vertical-specific products with a separate automotive SKU. That's why customizing your existing MES is often the more practical path:</p><ul><li>Capturing torque measurements across the chassis line with poka-yoke checks that stop the station before a bad fastener moves downstream, then standardizing that application for other lines like powertrain.</li><li>Measuring operator productivity at one plant and rolling that application out across all sites so data flows into a standard dashboard without manual reconciliation.</li><li>Automating genealogy capture, binding component lots to serial numbers, for one vehicle program, then extending that logic to additional programs or plants instead of running a custom integration project each time.</li><li>Adding real-time quality gate enforcement, control plan limits with automatic hold-and-containment, to a line where the base MES configuration lacks it, then standardizing that pattern across other lines and plants building for the same OEM, even though each site submits its own PPAP per part number.</li></ul><h2 id="where-the-gaps-are-and-what-extension-needs-to-cover">Where the Gaps Are, and What Extension Needs to Cover</h2><p>Routing and dispatch are the core of what a packaged MES sells, and an extension layer doesn't need to touch that logic. FlowFuse supports <a href="https://flowfuse.com/use-cases/it-ot-middleware/">IT/OT connectivity</a> that layers on top of existing MES routing, adding what a packaged system leaves as a gap.</p><p>The gaps themselves cluster into two categories: quality gate enforcement (capturing a measurement, holding the station when a control-plan rule trips, routing the part to containment, and logging it against the serial number) and standardization across sites (a shared downtime taxonomy and genealogy captured at the point of consumption, so a reason code or a build record means the same thing at every plant). Unplanned downtime alone costs industrial manufacturers an estimated $50 billion annually (<a href="https://www.forbes.com/councils/forbestechcouncil/2022/02/22/unplanned-downtime-costs-more-than-you-think/" rel="nofollow">Forbes Technology Council, 2022</a>), and without standardization, a recall investigation ends up tracing the same defect to a shift's production at one plant and specific serial numbers at another.</p><h2 id="final-thoughts">Final Thoughts</h2><p>So where do we go from here? It honestly depends on how fast you want to see results and the availability of your existing resources.</p><p>If the core MES is good, a manufacturer can use FlowFuse to extend its existing capabilities rather than replace it, closing the quality gate, genealogy, and downtime gaps most vendors leave for each plant to solve on its own. FlowFuse gives IT and operations teams a way to build custom applications, <a href="https://flowfuse.com/blog/2026/05/manufacturing-software-built-in-stages/">starting small and expanding from there</a>, instead of reconfiguring the same enforcement at every site. It's part of FlowFuse's broader <a href="https://flowfuse.com/industries/automotive/">automotive manufacturing solutions</a>, used by 30+ automotive manufacturers in 20 countries.</p><h2 id="sources">Sources</h2><ul><li>Forbes Technology Council. (2022). <a href="https://www.forbes.com/councils/forbestechcouncil/2022/02/22/unplanned-downtime-costs-more-than-you-think/" rel="nofollow">"Unplanned downtime costs more than you think."</a></li><li>Symestic. (2026). <a href="https://www.symestic.com/en-us/blog/mes-system-prices-2026" rel="nofollow">"MES System Prices 2026: Cost Comparison, TCO &amp; ROI."</a></li><li>TotalControlPro. (2025). <a href="https://totalcontrolpro.com/guides/the-end-of-the-production-black-box-how-much-does-a-modern-mes-really-cost/" rel="nofollow">"The End of the Production Black Box: How Much Does a Modern MES Really Cost?"</a></li><li>IndustryWeek. (2025). <a href="https://www.industryweek.com/technology-and-iiot/video/55296538/build-or-buy-your-mes-lessons-from-hexagon-manufacturing-intelligence" rel="nofollow">"Build or Buy Your MES? Lessons from Hexagon Manufacturing Intelligence."</a></li></ul><p><strong>Start building with your own industrial data</strong></p><p>Connect your systems, automate workflows, and see what’s possible in your environment.</p><p><a href="https://app.flowfuse.com/account/create">Try it out</a></p>]]></content>
        <updated>2026-09-22T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/automotive-mes/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/five-whys-template/</id>
        <title>5 Whys Analysis Template: Free Download</title>
        <summary>Download a free 5 Whys template to document problems, root causes, corrective actions, and verification.</summary>
        <content type="html"><![CDATA[<p>A <a href="https://flowfuse.com/blog/2025/12/five-whys-root-cause-analysis-definition-examples/">5 Whys</a> template gives your team a consistent structure to run a root cause analysis without missing a step or drifting into guesswork.</p><p>A good template keeps the analysis disciplined: one problem statement, one causal chain, evidence at every step, and a corrective action with an owner and a due date.</p><p><em>Download the free template below to give your team a consistent way to run a 5 Whys analysis and document it for corrective action tracking.</em></p><h2 id="what-should-be-on-a-5-whys-template">What Should Be on a 5 Whys Template?</h2><p>A 5 Whys template only needs a few fields, each filled in with something you can verify rather than an assumption:</p><ul><li><strong>Problem statement:</strong> What happened, where, when, and how you know it.</li><li><strong>Why 1–5 (as needed):</strong> Each answer builds on the one before it. Stop once you reach something fixable at a systemic level.</li><li><strong>Root cause:</strong> The systemic gap the chain of whys points to.</li><li><strong>Corrective action:</strong> The specific fix, an owner, and a due date.</li><li><strong>Verification:</strong> Confirmation, at a later date, that the fix actually held.</li></ul><p>Not every analysis needs all five whys filled in, and some need more than five. The fields matter more than the count.</p><h2 id="how-to-fill-in-a-5-whys-template">How to Fill In a 5 Whys Template</h2><p>Each answer should be specific enough that someone reading it later, without having been in the room, understands exactly what was found.</p><table><thead><tr><th>Avoid</th><th>Better</th></tr></thead><tbody><tr><td>Operator error</td><td>The torque tool had not been recalibrated after its 90-day interval</td></tr><tr><td>Machine broke</td><td>The bearing seized from insufficient lubrication, confirmed by the oil flow log</td></tr><tr><td>Process issue</td><td>The work instruction was not updated after the March engineering change</td></tr></tbody></table><p>The goal is an answer that is <strong>objective and traceable to evidence</strong> (a log, a measurement, a witness), not a label that just restates the problem.</p><h2 id="_5-whys-template-example">5 Whys Template Example</h2><p>Consider a line that produced 40 rejected units during a single shift.</p><p>The team fills in the problem statement with the exact count, shift, and defect type rather than "quality issue on Line 3." Each why is answered with something checked on the floor, not a guess, until the chain reaches a worn sensor that was past its replacement interval. The corrective action gets an owner and a due date, and a follow-up entry on the template confirms the replacement held during the next production run.</p><p>The template makes this process repeatable across shifts and lines without each team reinventing the format.</p><h2 id="keep-the-template-simple">Keep the Template Simple</h2><p>A 5 Whys template should stay simple enough to fill out during the analysis itself, not after the fact from memory.</p><p>Resist adding fields for every possible category of information. If a template starts accumulating sign-off boxes, severity ratings, and cost fields beyond the owner and due date, it has drifted from a root cause tool into a different kind of form. Keep it to the problem, the chain of whys, the root cause, and the corrective action.</p><p><strong>Connect Production Data to Corrective Actions</strong></p><p>See how FlowFuse connects machine and process data with quality workflows so your team can track corrective actions and verify that fixes work.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-09-18T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/five-whys-template/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/ishikawa-fishbone-diagram-template/</id>
        <title>Fishbone Diagram Template: Free Download</title>
        <summary>Download a free fishbone (Ishikawa) diagram template to sort possible causes into categories, then verify the top suspects with data.</summary>
        <content type="html"><![CDATA[<p>A <a href="https://flowfuse.com/blog/2026/07/ishikawa-fishbone-diagram/">fishbone diagram</a> template gives your team a fish shape to draw on instead of a blank whiteboard, so the session starts with brainstorming instead of formatting.</p><p>Unlike a <a href="https://flowfuse.com/blog/2025/12/five-whys-root-cause-analysis-definition-examples/">5 Whys</a> template, which documents one causal chain going deep, a fishbone template holds several categories side by side going wide. That shape is the whole point: it's built for the moment you don't yet know where a problem lives.</p><p><em>Download the free template below and use it the next time your team needs to brainstorm causes across categories, not drill into one.</em></p><h2 id="fishbone-diagram-parts">Fishbone Diagram Parts</h2><p>A fishbone template is really just four zones, each doing a different job:</p><ul><li><strong>The head:</strong> a single problem statement, specific enough that "what happened, where, and how often" are all answered in one sentence.</li><li><strong>The spine:</strong> the line running into the head. It doesn't hold information, it just gives the ribs somewhere to attach.</li><li><strong>The ribs:</strong> four to six categories branching off the spine. The 6Ms (Manpower, Method, Machine, Material, Measurement, Mother Nature) are the manufacturing default, not a requirement, rename or drop any that don't match your process.</li><li><strong>The branches:</strong> the specific, checkable causes hanging off each rib, plus a note on which ones you later verified against data.</li></ul><p>An empty rib isn't a gap to fill. It means that category doesn't apply to this problem, and forcing entries into it just to fill the space adds noise, not signal.</p><h2 id="how-to-fill-out-the-template">How to Fill Out the Template</h2><p>The most common way teams misuse the template is drilling into the first plausible cause the moment someone suggests it. That collapses a breadth tool into a narrow one before it's done its job.</p><p>Work one rib at a time and exhaust it before moving to the next: everything Machine-related, then everything Material-related, and so on. Only once every rib has been brainstormed should the team circle the two or three strongest branches and hand those to a depth tool like the 5 Whys.</p><p>Vague branches defeat the exercise just as fast as skipping ribs does:</p><table><thead><tr><th>Avoid</th><th>Better</th></tr></thead><tbody><tr><td>Machine issue</td><td>Print head height drifted out of spec last week</td></tr><tr><td>Bad material</td><td>New ink supplier introduced two weeks ago</td></tr><tr><td>Training</td><td>Night shift not trained on the new ink's dry time</td></tr></tbody></table><p>A branch should be <strong>specific and testable</strong>, not a category name repeated back as if it were an answer.</p><h2 id="example">Example</h2><p>A packaging line is rejecting cartons because the printed date code is smearing, that's the head. Working rib by rib, the team notes a drifted print head under Machine, a new ink supplier under Material, an unwritten cleaning interval under Method, and rising plant humidity since an HVAC repair under Mother Nature. No single rib explains it alone.</p><p>Two branches stand out once all six are filled: the new ink and the humidity shift. Those are the ones worth verifying against a log or measurement, not whichever one came up first.</p><h2 id="using-the-template-for-different-problems">Using the Template for Different Problems</h2><p>The categories on this template are meant to be edited, not treated as fixed. A service outage will need ribs that look nothing like a factory floor's, and that's expected. What should stay constant across every use is the shape: a specific head, ribs that actually apply, and branches specific enough to check against real data rather than restating the category they sit under.</p><p><strong>Verify Which Suspected Cause Is Real</strong></p><p>See how FlowFuse connects PLCs, sensors, and quality systems so your team can test which cause on the fishbone is real, using live production data.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-09-17T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/ishikawa-fishbone-diagram-template/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/capa-corrective-preventive-action/</id>
        <title>CAPA: Corrective and Preventive Action Process &amp; Effectiveness</title>
        <summary>CAPA stands for Corrective Action and Preventive Action: corrective action fixes the cause of a problem that already happened, preventive action addresses the cause of one that hasn't happened yet. Both processes depend on a real root cause investigation, not just the first plausible explanation, and neither is complete until effectiveness is verified with evidence.</summary>
        <content type="html"><![CDATA[<p>Quality problems cost time and money, and quality teams need a structured way to address problems that have already occurred and risks that could lead to future problems. Corrective and Preventive Action (CAPA) provides that structure.</p><p>It's a core part of quality management in standards such as <a href="https://www.iso.org/standard/62085.html" rel="nofollow">ISO 9001</a> and <a href="https://www.iso.org/standard/59752.html" rel="nofollow">ISO 13485</a>, but determining whether an action actually worked can be difficult when teams rely on manually updated records. Connecting shop-floor data to quality workflows, with platforms like <a href="https://flowfuse.com/">FlowFuse</a>, can give teams objective production data to support investigations and effectiveness checks.</p><p>This article explains the difference between corrective and preventive action, how each process works, where CAPA systems break down, and how <a href="#how-flowfuse-supports-capa">FlowFuse supports CAPA</a> with connected production data.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/09/images/capa-cta-1.png" alt="Connect production data to your CAPA process - explore FlowFuse"/></a><h2 id="what-is-corrective-action-and-preventive-action">What Is Corrective Action and Preventive Action?</h2><p>Corrective action is the action taken to eliminate the cause of an existing nonconformity and prevent it from recurring.</p><p>Preventive action is the action taken to address the cause of a potential nonconformity before it occurs.</p><p>Under ISO 9001:2015, corrective action is addressed in <strong>Clause 10.2</strong>. Preventive action is no longer a standalone requirement; the 2015 revision incorporated prevention into the standard's risk-based thinking approach. Quality teams may still use preventive action as part of their risk management practices.</p><h3 id="a-simple-example">A Simple Example</h3><p>Say a machine's cutting tool wears down and starts producing parts outside tolerance. Replacing the worn tool and changing the maintenance interval to prevent the same failure from recurring is corrective action because it addresses an actual defect and its cause.</p><p><img alt="Diagram comparing corrective action, taken after a torque deviation is found out of spec, with preventive action, taken after monitoring shows torque drifting toward the lower limit" data-zoomable="" src="https://flowfuse.com/blog/2026/09/images/corrective-vs-preventive.png"/></p><p>If a technician notices during a routine check that a different tool on a similar machine is wearing faster than expected and replaces it before it produces a bad part, that's preventive action. No defect has occurred; the action addresses a potential failure.</p><p>This is the same logic behind <a href="https://flowfuse.com/blog/2025/09/preventive-maintenance-equipment-failure/">preventive maintenance programs</a> and <a href="https://flowfuse.com/blog/2025/09/poka-yoke-mistake-proofing/">poka-yoke, or mistake-proofing</a>: both aim to prevent a failure before it produces a defect.</p><p>Fixing the immediate bad parts, such as scrapping them or sorting the batch, is neither. That's <a href="https://flowfuse.com/blog/2026/08/containment-action/">containment</a>. Containment limits the immediate impact, while corrective and preventive actions address the cause.</p><h2 id="root-cause-analysis">Root Cause Analysis</h2><p>Corrective and preventive actions depend on understanding why a problem occurred or could occur. Stopping at the first plausible explanation can result in a fix that addresses the symptom while leaving the underlying cause in place.</p><p>A few methods cover most cases:</p><ul><li><strong><a href="https://flowfuse.com/blog/2025/12/five-whys-root-cause-analysis-definition-examples/">5 Whys</a>:</strong> Ask "why" repeatedly, with each answer guiding the next question, until you reach an actionable cause rather than restating the symptom.</li><li><strong><a href="https://flowfuse.com/blog/2026/07/ishikawa-fishbone-diagram/">Fishbone (Ishikawa) diagram</a>:</strong> Maps potential causes across categories such as people, methods, materials, and equipment. It's useful when a problem may have several contributing causes.</li><li><strong>Fault tree analysis:</strong> Works backward from a failure, breaking it into the combination of conditions that had to be present for it to occur. It's commonly used for complex or safety-critical processes; NASA's <a href="https://s3vi.ndc.nasa.gov/ssri-kb/static/resources/Fault%20Tree%20Handbook_NASA.pdf" rel="nofollow">Fault Tree Handbook</a> is a widely cited reference for the method.</li></ul><p>The investigation should draw on multiple sources of evidence, including process records, operator interviews, maintenance logs, and inspection results. A problem can have more than one contributing cause, so addressing only one may not prevent recurrence.</p><h2 id="corrective-action-vs-preventive-action-comparison">Corrective Action vs. Preventive Action: Comparison</h2><table><thead><tr><th>Aspect</th><th>Corrective Action</th><th>Preventive Action</th></tr></thead><tbody><tr><td>Trigger</td><td>A nonconformity has occurred</td><td>A potential nonconformity is identified</td></tr><tr><td>Objective</td><td>Prevent recurrence</td><td>Prevent occurrence</td></tr><tr><td>Timing</td><td>Reactive</td><td>Proactive</td></tr><tr><td>Common inputs</td><td>Nonconformities, complaints, defects, audit findings</td><td>FMEA, risk assessments, trends, near misses</td></tr><tr><td>Common tools</td><td>5 Whys, root cause analysis</td><td>FMEA, risk assessment, trend analysis</td></tr><tr><td>Example</td><td>Investigating and fixing a failed batch</td><td>Replacing a fixture before it causes defects</td></tr></tbody></table><p>The key difference is <strong>when the action is taken</strong>: corrective action responds to an existing problem, while preventive action addresses a potential one.</p><h2 id="the-corrective-action-process">The Corrective Action Process</h2><p>A corrective action process typically follows these five steps:</p><ol><li><strong>Identify and document the nonconformance.</strong> Record what happened, when it happened, and any immediate containment taken.</li><li><strong>Investigate the cause.</strong> Use an appropriate root cause analysis method and gather enough evidence to understand why the nonconformity occurred.</li><li><strong>Determine the appropriate response.</strong> The severity and impact of the problem determine the response, which can range from changing a process to scrapping product, notifying customers, or initiating a recall.</li><li><strong>Implement the action.</strong> Address the identified cause rather than only correcting the defective output.</li><li><strong>Verify effectiveness.</strong> Monitor the relevant process or quality indicator to confirm that the action achieved its intended result before closing the CAPA.</li></ol><h2 id="the-preventive-action-process">The Preventive Action Process</h2><p>Preventive action follows a similar structure, but starts with a potential failure rather than an existing nonconformity:</p><ol><li><strong>Identify potential failure points.</strong> Use FMEA, near-miss trends, maintenance logs, or process capability data to identify where a nonconformity could occur.</li><li><strong>Assess and prioritize risk.</strong> Evaluate likelihood and severity to determine which risks require action.</li><li><strong>Implement the preventive measure.</strong> This might mean changing a maintenance schedule, modifying a process, updating work instructions, or adding mistake-proofing.</li><li><strong>Monitor the result.</strong> Track the relevant process or risk indicator to determine whether the preventive measure achieved its intended result.</li><li><strong>Document the action.</strong> Record the identified risk, action taken, and evidence that the measure was effective.</li></ol><p>Both processes can follow the <strong>Plan-Do-Check-Act (PDCA)</strong> cycle: plan and investigate, implement the action, check whether it worked, then apply what was learned.</p><h2 id="where-capa-systems-break-down">Where CAPA Systems Break Down</h2><p>A CAPA process can look complete on paper and still fail to solve the underlying problem. One common issue is that teams focus on forms and approval chains instead of collecting enough evidence during the investigation. Another is stopping at the first plausible cause and moving directly to a fix.</p><p>Even when the right action is identified, closing the CAPA without objective evidence can make it difficult to determine whether the change actually worked.</p><p>A strong CAPA process needs clear ownership, an evidence-based investigation, and a defined effectiveness check. Production data can support this. For example, <a href="https://flowfuse.com/blog/2025/07/quality-control-automation-spc-charts/">SPC charts</a> built from live process data can show whether a corrective action actually shifted a process back into control.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/09/images/capa-cta-2.png" alt="See what data-driven CAPA could look like - talk to the FlowFuse team"/></a><h2 id="how-flowfuse-supports-capa">How FlowFuse Supports CAPA</h2><p>CAPA investigations and effectiveness checks often require data from multiple systems, including machines, PLCs, databases, and quality systems. When that information is disconnected, teams may have to rely on manual records or piece together evidence from several sources.</p><p><a href="https://flowfuse.com/">FlowFuse</a> connects production systems and data sources so manufacturers can use operational data as part of their existing CAPA process.</p><p>For example, FlowFuse can help teams:</p><ul><li><strong>Collect relevant production data</strong> when a quality issue or nonconformity occurs using <a href="https://flowfuse.com/use-cases/data-integration/">data integration</a> workflows.</li><li><strong>Connect data across machines, PLCs, databases, and quality systems</strong> to support root cause investigations.</li><li><strong>Automate workflows and notifications</strong> when production or quality events require attention, including <a href="https://flowfuse.com/use-cases/production-monitoring/">production monitoring</a> and <a href="https://flowfuse.com/node-red/notification/">notifications</a>.</li><li><strong>Monitor process and quality data after an action is implemented</strong> to provide evidence for effectiveness checks, such as through <a href="https://flowfuse.com/blog/2026/08/manufacturing-dashboard-examples/#_4-quality-dashboard-defect-quality-monitoring">quality dashboards</a>.</li></ul><p>FlowFuse does not replace an organization's CAPA or quality management system. Instead, it helps connect the production data and operational workflows that support investigations, corrective actions, and verification that an action actually worked.</p><h2 id="tracking-capa-effectiveness">Tracking CAPA Effectiveness</h2><p>Closing a CAPA does not mean the problem is solved. Teams need to check whether the action actually worked.</p><p>Useful measures include CAPA cycle time, recurrence rate, overdue actions, and recurring root causes. A <a href="https://flowfuse.com/blog/2025/08/pareto-chart-manufacturing-guide/">Pareto chart</a> can help identify which causes need attention, while <a href="https://flowfuse.com/blog/2025/12/mttf-vs-mtbf-vs-mttr/">MTTF, MTBF, and MTTR</a> can help measure the effect of corrective actions on equipment reliability.</p><p>The quality of these measures depends on the data behind them. Production records, process measurements, machine states, and maintenance history can give teams the evidence they need to investigate a problem and confirm that the action was effective.</p><p><strong>Start building with your own industrial data</strong></p><p>Connect your systems, automate workflows, and see what’s possible in your environment.</p><p><a href="https://app.flowfuse.com/account/create">Try it out</a></p>]]></content>
        <updated>2026-09-08T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/capa-corrective-preventive-action/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/first-pass-inspection-fpa/</id>
        <title>First Article Inspection (FAI): Process, Requirements &amp; Report</title>
        <summary>First Article Inspection (FAI) verifies that a newly manufactured part meets its engineering requirements. Learn when FAI is required, how the process works, what an FAI report includes, and how it differs from PPAP.</summary>
        <content type="html"><![CDATA[<p>Before full-scale production, <a href="https://flowfuse.com/industries/automotive/">automotive manufacturers</a> need to verify that a part can be produced according to its engineering requirements. First Article Inspection (FAI) provides documented evidence that a part produced using the intended manufacturing process conforms to its engineering drawing, specifications, and other applicable requirements.</p><p>Much of this still runs on paper checklists and spreadsheets, which makes it easy for inspection results to drift away from the production data that explains them.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/09/images/fai-process-cta1.png" alt="Use FlowFuse to connect production data, build digital inspection workflows, and get better visibility into your quality processes - start your free trial"/></a><h2 id="what-is-first-article-inspection-fai">What Is First Article Inspection (FAI)?</h2><p>First Article Inspection (FAI) is a planned, complete, independent, and documented physical and functional inspection process used to verify that production processes can produce an item that meets specified requirements.</p><p>That definition comes from <a href="https://saemobilus.sae.org/standards/as9102c-aerospace-series-first-article-inspection-requirements" rel="nofollow">SAE AS9102</a>, the standard that establishes the requirements for performing and documenting FAI. AS9102 originated in aerospace, but its terminology and report structure now shape how many customers outside aerospace, including automotive customers, define FAI in their own purchase documents.</p><p>Inspectors check dimensions, tolerances, materials, surface finishes, and other specified characteristics against the engineering drawing, specifications, and applicable requirements.</p><p>The goal is to confirm that the manufacturing process can produce a part that meets the defined requirements before or during production approval.</p><h2 id="fai-example-inspecting-an-automotive-part">FAI Example: Inspecting an Automotive Part</h2><p>Consider a supplier manufacturing a machined mounting bracket. Its drawing specifies:</p><table><thead><tr><th>Characteristic</th><th>Requirement</th><th>Actual Result</th><th>Status</th></tr></thead><tbody><tr><td>Overall length</td><td>120 ± 0.5 mm</td><td>120.2 mm</td><td>Pass</td></tr><tr><td>Hole diameter</td><td>10 ± 0.1 mm</td><td>10.04 mm</td><td>Pass</td></tr><tr><td>Hole position</td><td>±0.2 mm</td><td>0.15 mm</td><td>Pass</td></tr><tr><td>Material</td><td>Specified alloy</td><td>Verified</td><td>Pass</td></tr></tbody></table><p>If the hole position measured 0.35 mm against a ±0.2 mm requirement, it would fail. The supplier would document the nonconformance, determine the cause, take the required corrective action, and reinspect the affected characteristic.</p><h2 id="when-is-fai-required">When Is FAI Required?</h2><p>FAI requirements vary by customer, industry, and quality procedures. It is typically performed when a new part or a change could affect the part's requirements.</p><p>In automotive, the specifics usually come from the customer rather than from a single industry-wide FAI standard. IATF 16949 requires suppliers to run a product and manufacturing process approval process that conforms to requirements the customer defines, and each OEM publishes its own <a href="https://www.iatfglobaloversight.org/oem-requirements/customer-specific-requirements/" rel="nofollow">customer-specific requirements</a> through the IATF. Check the applicable purchase document and customer-specific requirements before deciding what to inspect and submit.</p><p>Common triggers include:</p><ul><li>New part introduction</li><li>Significant design or engineering changes</li><li>New tooling or equipment</li><li>Manufacturing process changes</li><li>New manufacturing location or supplier</li><li>Production restart after a significant interruption</li></ul><p>Depending on the applicable requirements, a change may require a <strong>full or partial FAI</strong>. A partial FAI focuses on the characteristics affected by the change rather than repeating the entire inspection.</p><h2 id="how-does-the-fai-process-work">How Does the FAI Process Work?</h2><p><img alt="FAI process flow: requirements, produce, inspect, record, correct, and traceability, with nonconformance looping back from correct to inspect before production approval" data-zoomable="" src="https://flowfuse.com/blog/2026/09/images/fai-flow.png"/></p><h3 id="_1-review-the-requirements">1. Review the requirements</h3><p>Use the latest engineering drawing, specifications, and revision. Identify the characteristics that require inspection and any applicable customer requirements.</p><h3 id="_2-produce-the-first-article">2. Produce the first article</h3><p>Manufacture the part using the intended materials, tooling, equipment, and production process. The objective is to inspect a part representative of the manufacturing process being evaluated.</p><h3 id="_3-inspect-the-part">3. Inspect the part</h3><p>Measure the required characteristics using appropriate inspection equipment. Compare each result with the specified requirement and acceptance criteria.</p><h3 id="_4-record-the-results">4. Record the results</h3><p>Document the requirements, measurements, inspection equipment, and other required information in the FAI report.</p><h3 id="_5-address-failures">5. Address failures</h3><p>If a characteristic does not conform, document the nonconformance, determine the cause and required corrective action, and reinspect the affected characteristic after correction.</p><h3 id="_6-maintain-traceability">6. Maintain traceability</h3><p>Maintain records that connect the inspection results to the part, drawing revision, production run, tooling, equipment, and measurement equipment where required. This is the same <a href="https://flowfuse.com/blog/2026/08/automotive-traceability/">traceability</a> backbone that makes it easier to determine what was inspected and investigate issues later.</p><h2 id="what-does-an-fai-report-include">What Does an FAI Report Include?</h2><p>An FAI report documents the requirements that were inspected and the results obtained. Depending on the applicable requirements, it may include:</p><ul><li>Part number and name</li><li>Drawing number and revision</li><li>Characteristic or feature identification</li><li>Nominal dimensions and tolerances</li><li>Actual measurement results</li><li>Material and process information</li><li>Inspection and measurement equipment</li><li>Inspection date and personnel</li><li>Nonconformities and disposition</li><li>Supporting documentation and traceability information</li></ul><p>For example, a dimensional characteristic might be recorded with its drawing requirement, actual measurement, inspection method or equipment, and pass/fail result. This creates a traceable record showing whether the inspected part met the specified requirements.</p><p>The exact contents and format of an FAI report depend on the applicable customer, industry, and quality requirements. Customers that work to AS9102 expect the results on its three standard forms: part number accountability, product accountability for material and special processes, and the characteristic-level results.</p><h2 id="fai-vs-ppap">FAI vs. PPAP</h2><p>FAI and Production Part Approval Process (PPAP) both help verify that manufactured parts meet requirements, but they serve different purposes. PPAP is defined in the <a href="https://www.aiag.org/training-and-resources/manuals" rel="nofollow">PPAP manual published by AIAG</a>, and most North American OEMs name that manual directly in their customer-specific requirements.</p><table><thead><tr><th></th><th>FAI</th><th>PPAP</th></tr></thead><tbody><tr><td>Main focus</td><td>Verifying a part against its engineering requirements</td><td>Demonstrating that the production process can consistently produce conforming parts</td></tr><tr><td>Dimensional inspection</td><td>Yes</td><td>Typically included</td></tr><tr><td>Material/process records</td><td>May be included</td><td>May be required</td></tr><tr><td><a href="https://flowfuse.com/blog/2026/08/control-plans/">Control Plan</a></td><td>Not inherently part of FAI</td><td>Common PPAP element</td></tr><tr><td>PFMEA</td><td>Not inherently part of FAI</td><td>Common PPAP element</td></tr><tr><td>Process capability</td><td>Not the main focus</td><td>May be required</td></tr><tr><td>Measurement system analysis</td><td>May be applicable</td><td>May be required</td></tr></tbody></table><p>FAI primarily demonstrates that the inspected part conforms to the defined design requirements. PPAP provides broader evidence that the supplier's production process and supporting quality systems are capable of consistently producing conforming parts. AIAG publishes the supporting core tool manuals, including MSA and SPC, that PPAP submissions draw on.</p><p>FAI can support a PPAP submission, but it does not replace PPAP when a customer requires it. PPAP approval also isn't the end of the story — most OEMs require a <a href="https://flowfuse.com/blog/2026/08/safe-launch/">safe launch</a> monitoring period once production starts.</p><h2 id="common-first-article-inspection-mistakes">Common First Article Inspection Mistakes</h2><p>Common FAI errors include using an outdated drawing or specification, <a href="https://flowfuse.com/blog/2026/07/what-is-instrument-calibration/">uncalibrated inspection equipment</a>, inspecting a part made with the wrong production process, missing characteristics, and incomplete measurement records.</p><p>Calibration is where inspection records most often lose their weight. Calibration by a laboratory accredited to <a href="https://www.iso.org/standard/66912.html" rel="nofollow">ISO/IEC 17025</a> ties a measurement result back to recognized measurement standards through a documented chain, which is what makes the number on the FAI report defensible during a customer review or an investigation.</p><p>Using the correct drawing revision, appropriate and calibrated inspection equipment, the intended production process, and traceable inspection records helps avoid these errors. Tracking calibration status against due dates in a <a href="https://flowfuse.com/blog/2026/07/calibration-management-dashboard/">live dashboard</a> makes it easier to catch an overdue instrument before it ends up on an FAI report.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/09/images/fai-cta2.png" alt="Use FlowFuse to connect your equipment data, track calibration status and due dates, and build a dashboard around your calibration workflow - build a calibration dashboard"/></a><h2 id="improving-first-article-inspection-with-digital-data">Improving First Article Inspection With Digital Data</h2><p>Traditional FAI can rely on inspection sheets, spreadsheets, and manual data entry. This can leave inspection results disconnected from the production data associated with the part.</p><p><a href="https://flowfuse.com/">FlowFuse</a> connects machines, inspection systems, databases, and other factory systems so manufacturers can collect and process data in one workflow.</p><p>For example, an FAI workflow can associate inspection results with a part, machine, production run, tooling, material batch, or work order. If a hole diameter repeatedly approaches its tolerance, manufacturers can compare inspection results with machine and production data to investigate whether tooling, equipment, material, or a specific production run is contributing to the issue.</p><p>FlowFuse does not replace the FAI process. It connects the production data around it, reducing manual data handling and making inspection results easier to use for <a href="https://flowfuse.com/blog/2026/07/defect-and-quality-monitoring/">quality analysis and investigation</a>.</p><p><strong>Connect First Article Inspection Data with FlowFuse</strong></p><p>Connect inspection results with machine and production data using FlowFuse to reduce manual data handling and investigate quality issues.</p><p><a href="https://flowfuse.com/contact-us/">Contact Us</a></p>]]></content>
        <updated>2026-09-08T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/first-pass-inspection-fpa/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/industrial-ai-agent/</id>
        <title>Connect Your Industrial AI Agent to FlowFuse</title>
        <summary>FlowFuse 3.0 acts as an MCP server, so the AI agent your company already approved can operate FlowFuse and build flows in your Node-RED instances. You add one address, sign in, and choose which teams the agent reaches and whether it gets editing rights. It manages the FlowFuse platform and builds flows on a Node-RED canvas you are watching. It cannot delete anything, so you remain in control of deploying your flows. For teams under approved-AI-only policy, this is the difference between no AI on the platform and all of it.</summary>
        <content type="html"><![CDATA[<p>What used to happen is that an engineer would open their AI agent of choice in another tab or application, describe what they would need to happen in Node-RED, they get the JSON back, then copy, paste, and import that into the editor. Doing so, on repeat, until it is right. The AI is already doing the work, just not in an efficient way that requires you to be a part of it.</p><p>That's not how an industrial AI agent should work. It should be able to work directly with your industrial systems, rather than generating something for you to copy and paste.</p><p>That's what our first class integrated industrial AI agent, FlowFuse Expert, was built to do. It works within the FlowFuse platform, where it can understand your applications, instances, flows, and operational data, and then build and edit the operational flows directly in Node-RED instances.</p><table><thead><tr><th align="left"></th><th align="left"><strong>Without FlowFuse Expert</strong></th><th align="left"><strong>With FlowFuse Expert</strong></th></tr></thead><tbody><tr><td align="left"><strong>Creating and editing Node-RED flows</strong></td><td align="left">Wiring flows by hand or asking an external AI for JSON to be copy and pasted over, including errors.</td><td align="left">The industrial AI agent creates or edits the flows right in front of you.</td></tr><tr><td align="left"><strong>Setting up an industrial application</strong></td><td align="left">Manually setting up FlowFuse applications, instances, and connecting them together through submodules or pipelines so it's ready for a production setup, plus configuring the flows.</td><td align="left">The industrial AI agent helps you set it up from start to finish. You can even plan with the AI agent so you are sure it aligns with your expectations. The AI will help you ensure it will be ready for a production setup.</td></tr><tr><td align="left"><strong>Asking about your industrial fleet</strong></td><td align="left">Manually walking through the platform UI to figure out what runs how.</td><td align="left">The industrial AI agent scans your FlowFuse instance and understands what there is and its status, then reports it to you in natural language.</td></tr><tr><td align="left"><strong>Asking about your operational data</strong></td><td align="left">Manually configuring the data aggregation, modeling, and visualisation into dashboards, then monitoring those.</td><td align="left">The industrial AI agent configures the data aggregation, modeling, and visualisation for you into a usable dashboard. And it can also create custom MCP servers which allow you to ask about your operational data in natural language.</td></tr></tbody></table><h2 id="so-why-did-this-happen">So why did this happen?</h2><p>Ask why they don't use the FlowFuse Expert built into the platform, and the answer usually isn't about quality; it's about policy. Plenty of the companies we work with run an approved-AI-only rule. So for those teams the only option was to use "their AI, through the clipboard" with the alternative being no AI-support at all.</p><h2 id="what-changed-in-flowfuse-30">What changed in FlowFuse 3.0</h2><p>FlowFuse now acts as an MCP server. Your own AI agent connects to it as a client and because the AI agent is yours, so is the choice of model it uses.</p><p>That means the AI agent your company already approved can work the platform directly: look at your teams and applications, check what your instances are doing, read runtime logs, query your <a href="https://flowfuse.com/docs/flowfuse-nodes/flowfuse-tables/">FlowFuse Tables</a> data, create applications and instances, and build and edit the flows inside your instances.</p><h2 id="how-an-ai-agent-connects-to-flowfuse">How an AI agent connects to FlowFuse</h2><p>Connecting an AI agent to FlowFuse takes three steps depending on the agent you would like to use.</p><p>You add one address in your AI agent's connector settings. On FlowFuse Cloud that address is <code>https://app.flowfuse.com/mcp</code>. You are then triggered to sign in to FlowFuse, after which you pick which teams the AI agent may act on, and whether it gets editing rights or read access only.</p><p>If you want to jump ahead and get connected now, <a href="#connect-your-own-agent">skip to the steps at the end</a>.</p><h2 id="what-youre-actually-granting">What you're actually granting</h2><p>"We gave an AI agent access to production" is usually a sentence that ends conversations, so let's clarify.</p><p>You choose the teams. If you have a production team and a development team, granting only development means an instruction can only hit what you manage in that team.</p><p>You choose read access or editing rights. Read access is useful on its own: what's running, what's failing, what the logs say, what's in your tables, and so on. An industrial AI agent with read access has no ability to change anything. When permitting editing rights, the agent can set up applications, instances, and edit the flows inside of them.</p><p>And there are things nobody can grant. An industrial AI agent working through FlowFuse can't delete an instance, an application, a snapshot, or a team. That is because those tools don't exist. Lastly, deploying a Node-RED flow is, for now, still done by you manually as well.</p><p>Two things run underneath all of it. The role-based access control that already governs your teams affects the industrial agent too, so it can't reach past what your own account reaches. And every action it takes lands in the audit log attributed to you and marked <code>via MCP</code>, so "what the AI did last Tuesday" is a question with an answer.</p><p>Most agents will prompt you and ask before they act. This logic belongs to the agent itself rather than to FlowFuse, so it looks different in each one, but in practice you see the tool call before it runs, so you retain visibility and control.</p><p>We're working towards AI that can act as required in production setups and in setups where experimentation is fine, and those are different settings for different scenarios. But what is described above is the boundary as it ships right now.</p><h2 id="it-builds-where-you-can-see-it">It builds where you can see it</h2><p>Node-RED has always been visual. You look at a flow and you can tell what it does.</p><p>We didn't want to trade away control for AI, so when your agent builds a flow, it builds it in a live editor session, on the canvas in front of you. You watch the nodes appear and get wired up. If it's going somewhere you don't like, you can see that while it's happening rather than afterwards. Up for review before you enable the deployment.</p><p>Asking questions about your platform needs no active browser session open at all. It's flow work specifically that runs in an editor you're looking at.</p><h2 id="the-conversation-with-it">The conversation with IT</h2><p>Most people reading this can't add a connector on their company sanctioned AI agent. On ChatGPT, a workspace administrator switches on custom connectors. On Claude Team and Enterprise, an owner adds the connector for the organisation and then people connect individually. On Microsoft Copilot, a tenant administrator approves it.</p><p>It's one address. Everyone still signs in with their own FlowFuse account, and still chooses their own scopes, so nobody inherits anyone else's access. Nothing about it makes FlowFuse a new data processor for your organisation.</p><p>We're also working on removing the question at all.</p><note><p><strong>Coming soon:</strong> FlowFuse in the Microsoft Copilot, Claude and ChatGPT connector directories. No custom connector, no admin request. FlowFuse Cloud only.</p></note><h2 id="where-to-start">Where to start</h2><p>If your team is on FlowFuse Cloud, you can get connected already. Our <a href="https://flowfuse.com/ai/">Industrial AI page</a> has the three steps for whichever agent you use similar as noted above.</p><p>If your team is on FlowFuse self-hosted, make sure to be on at least version FlowFuse 3.0 or higher. On self-hosted, platform messaging runs over the MQTT broker, so the Team Broker needs to be available. Whether anything is needed from you depends on how your self-hosted platform was installed. <a href="https://flowfuse.com/docs/user/expert/third-party-agents/">Our documentation</a> has further details on what to do for custom situations.</p><p>For now, begin with any of the following prompts when authenticated with the platform:</p><h2 id="connect-your-own-agent">Connect your own agent</h2><p>Three steps, and they depend on which agent you would like to use.</p><p><strong>Want to see this against your own setup?</strong></p><p>Walk through connecting your agent with our team, on your instances, and see what it can and cannot reach.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-09-03T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/industrial-ai-agent/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/09/layered-process-audit-checklist-template/</id>
        <title>Layered Process Audit Checklist: Free Template and Examples</title>
        <summary>A layered process audit (LPA) checklist helps manufacturers consistently verify critical process controls. Learn what to include, how to write effective LPA questions, and download a free checklist template.</summary>
        <content type="html"><![CDATA[<p>A <a href="https://flowfuse.com/blog/2026/08/layered-process-audit/">Layered Process Audit (LPA)</a> checklist gives supervisors and managers a consistent way to verify critical process controls on the shop floor.</p><p>A good checklist is focused rather than comprehensive. It should cover the controls that matter most to the process and use questions that can be answered by observing the work.</p><p><em>If you're building an LPA program, having a consistent set of questions makes it easier for different management layers to audit the same critical controls. Download the free checklist below as a starting point for creating your own LPA.</em></p><h2 id="what-should-be-on-an-lpa-checklist">What Should Be on an LPA Checklist?</h2><p>LPA questions should come from the controls that are important to the process. Useful sources include the PFMEA, control plan, work instructions, previous audit findings, customer complaints, and recurring scrap or rework.</p><p>Depending on the process, a checklist might cover:</p><ul><li><strong>Standard work:</strong> Is the current work instruction being used?</li><li><strong>Materials:</strong> Is the correct material being used at the station?</li><li><strong>Equipment:</strong> Is the machine parameter within the approved range?</li><li><strong>Tooling:</strong> Is the torque tool within its required calibration period?</li><li><strong>Error-proofing:</strong> Is the poka-yoke device active?</li><li><strong>Traceability:</strong> Is the required batch or serial number recorded?</li></ul><p>Not every checklist needs all of these areas. Select the controls that are most relevant to the process being audited.</p><h2 id="how-to-write-lpa-questions">How to Write LPA Questions</h2><p>Questions should be specific enough that the auditor knows exactly what to check.</p><table><thead><tr><th>Avoid</th><th>Better</th></tr></thead><tbody><tr><td>Are the tools OK?</td><td>Is the torque tool within its required calibration period?</td></tr><tr><td>Is the operator following the process?</td><td>Is the operator following the defined assembly sequence?</td></tr><tr><td>Is quality being maintained?</td><td>Is the approved work instruction being used?</td></tr></tbody></table><p>The goal is to make each question <strong>objective and observable</strong>, rather than dependent on the auditor's opinion.</p><h2 id="lpa-checklist-example">LPA Checklist Example</h2><p>Consider an automotive assembly station where a component is fastened using a torque-controlled tool.</p><p>The checklist might verify that the current work instruction is being used, the correct component is at the station, the torque tool is within its approved range, and the error-proofing system is active.</p><p>During the audit, the supervisor finds the torque setting outside the approved range. They correct the setting, record the finding, and check what the station has built since the last verified check. Anything suspect gets segregated before it moves down the line.</p><p>A later audit verifies the setting held.</p><p>The checklist makes these critical controls easy to verify consistently without turning the LPA into a full process audit.</p><h2 id="keep-the-checklist-relevant">Keep the Checklist Relevant</h2><p>A checklist should change when the process or its risks change.</p><p>Review it after significant process changes, recurring quality problems, new customer requirements, or findings that show the current questions are no longer sufficient.</p><p>Avoid adding questions simply to make the checklist more comprehensive. The goal is to check the controls that matter, not everything that could possibly be checked.</p><p><strong>Build a Digital LPA with FlowFuse</strong></p><p>Use FlowFuse to build digital LPA forms, connect audit results to machine and production data, trigger alerts, and track corrective actions.</p><p><a href="https://flowfuse.com/contact-us/">Contact Us</a></p>]]></content>
        <updated>2026-09-03T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/09/layered-process-audit-checklist-template/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/vda-6.3/</id>
        <title>VDA 6.3 Process Audits Explained: Structure, Scoring, and How to Prepare</title>
        <summary>VDA 6.3 evaluates whether processes are planned, controlled, and capable of producing conforming output. The audit covers seven process elements, from potential analysis and project management to production and customer service. Strong audit preparation depends on consistent documentation, production data, process controls, and objective evidence.</summary>
        <content type="html"><![CDATA[<p>VDA 6.3 audits assess whether automotive processes are consistently controlled and capable of meeting requirements. For suppliers, the challenge is not just following procedures but being able to demonstrate how processes perform with reliable evidence.</p><p>That evidence is often spread across machines, <a href="https://flowfuse.com/landing/plc/">PLCs</a>, sensors, <a href="https://flowfuse.com/use-cases/mes/">MES platforms</a>, and quality systems. FlowFuse can connect these production systems and bring operational data together, making it easier to access the evidence needed to monitor and demonstrate process performance.</p><p>This guide covers VDA 6.3 process elements, scoring, audit evidence, common findings, and how to prepare.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/08/images/vda-6-3.cta.png" alt="make process data easier to access during audits - book a demo"/></a><h2 id="what-vda-63-audits">What VDA 6.3 audits</h2><p>VDA 6.3 was developed by the Verband der Automobilindustrie (VDA) to evaluate process performance across the product and process lifecycle. The <a href="https://vda-qmc.de/en/education/vda-6-3-process-audit-at-a-glance-id-380/" rel="nofollow">VDA QMC</a> describes it as a reference manual for conducting process audits across the automotive supply chain.</p><p>VDA 6.3 is different from <a href="https://www.iatfglobaloversight.org/" rel="nofollow">IATF 16949</a>. IATF 16949 focuses on the automotive quality management system, while VDA 6.3 examines whether a specific process is planned, controlled, and capable of producing the required output. VDA 6.5, by comparison, focuses on the product itself.</p><p>Auditors review documented procedures, inspect the production floor, question process owners, and compare records with actual conditions. Having IATF 16949 certification does not guarantee a strong VDA 6.3 result.</p><h2 id="when-is-vda-63-used">When is VDA 6.3 used?</h2><p>VDA 6.3 can be used at different stages of the supplier and production lifecycle. A potential supplier may be assessed before a contract is awarded, while established suppliers may be audited during product development or series production.</p><p>Process audits can also be triggered by major process changes, recurring quality problems, or customer requirements. The scope depends on the purpose of the audit, so an audit does not necessarily cover every process element from P1 to P7.</p><h2 id="the-seven-process-elements">The seven process elements</h2><p>VDA 6.3 divides the audit into seven process elements:</p><table><thead><tr><th>Element</th><th>Name</th><th>What it covers</th></tr></thead><tbody><tr><td>P1</td><td>Potential Analysis</td><td>Capability of a prospective supplier before awarding work</td></tr><tr><td>P2</td><td>Project Management</td><td>Planning, scheduling, and control of development projects</td></tr><tr><td>P3</td><td>Planning of Product and Process Development</td><td>Requirements, feasibility, and risk analysis</td></tr><tr><td>P4</td><td>Carrying Out Product and Process Development</td><td>Development, FMEA, validation, and release</td></tr><tr><td>P5</td><td>Supplier Management</td><td>Selection, evaluation, and monitoring of sub-suppliers</td></tr><tr><td>P6</td><td>Process Analysis / Production</td><td>Production inputs, controls, resources, and outputs</td></tr><tr><td>P7</td><td>Customer Care / Customer Satisfaction / Service</td><td>Complaints, field performance, and corrective actions</td></tr></tbody></table><p>P1 is generally used when assessing a potential supplier or new location and is not scored with P2–P7. For established production, the audit typically covers P2–P7.</p><p>P6 focuses on the production process and examines six areas: process inputs, work carried out, personnel resources, material resources, effectiveness, and process outputs. These areas cover everything from incoming materials and process instructions to operator qualifications, equipment, process controls, and the quality of the finished output.</p><h2 id="how-a-vda-63-audit-works">How a VDA 6.3 audit works</h2><p>A VDA 6.3 audit starts with preparation and definition of the audit scope. The auditor reviews relevant information and identifies the processes and personnel to be assessed.</p><p>Before the audit, potential process risks should be identified so they can be assessed during the audit. VDA 6.3 uses the <strong>Turtle Model</strong> as one way to structure this risk analysis. It examines what enters and leaves the process, how the work is performed, which personnel and resources support it, and how process effectiveness is measured. The model can be applied to different process elements, including P6.</p><p><img alt="Turtle diagram for VDA 6.3 process audits, showing a central process surrounded by six questions covering input, output, resources used, personnel involved, and process results" src="https://flowfuse.com/blog/2026/08/images/turtle-diagrm.png"/><em>Turtle diagram for VDA 6.3 process audits, showing a central process surrounded by six questions covering input, output, resources used, personnel involved, and process results</em></p><p>During the audit, the auditor examines documents, observes the process, asks employees questions, and reviews objective evidence. Findings are recorded and the applicable questions are scored.</p><p>The audit ends with a closing meeting where the results and identified weaknesses are discussed. Corrective actions may then be assigned, followed by a review of whether those actions have addressed the findings.</p><h2 id="how-vda-63-scoring-works">How VDA 6.3 scoring works</h2><p>Audit questions are scored according to how well the requirement is met:</p><table><thead><tr><th>Score</th><th>Meaning</th></tr></thead><tbody><tr><td>10</td><td>Requirement fully met</td></tr><tr><td>8</td><td>Requirement largely met</td></tr><tr><td>6</td><td>Requirement partially met</td></tr><tr><td>4</td><td>Requirement inadequately met</td></tr><tr><td>0</td><td>Requirement not met</td></tr></tbody></table><p>The auditor bases the score on objective evidence from the process. Individual question scores are then used to calculate the result for the relevant process elements and the overall audit.</p><p>The classification is:</p><ul><li><strong>A:</strong> 90% or higher — capable</li><li><strong>B:</strong> 80–89% — conditionally capable</li><li><strong>C:</strong> Below 80% — not capable</li></ul><p>Specific downgrade rules can also affect the classification when serious weaknesses are identified. The overall percentage should therefore not be considered in isolation. The A/B/C classification and 10-8-6-4-0 scoring model remain part of VDA 6.3:2023.</p><h2 id="what-auditors-look-for">What auditors look for</h2><p>Auditors compare documented requirements with what is happening on the production floor.</p><p>They may check control plans against the current process, FMEA and <a href="https://flowfuse.com/blog/2026/08/control-plans">control plan</a> linkage, <a href="https://flowfuse.com/blog/2026/08/statistical-process-control">SPC</a> data and capability values such as Cp and Cpk, reaction plans for out-of-control conditions, operator training records, corrective actions and their effectiveness, and production and inspection records.</p><p>The main risk is a gap between documentation and actual production. When production data is spread across different machines and systems, it can be difficult to connect that data back to the documented process and demonstrate that the required controls were followed.</p><p>For example, a control plan may identify a bore diameter as a critical characteristic, while the measurement system stores that value under a different name with different limits. If the systems are not connected, proving that the characteristic was checked correctly can require manual data matching.</p><p>By connecting these systems, FlowFuse can help make the production data behind these checks easier to access and trace.</p><h2 id="common-reasons-suppliers-lose-points">Common reasons suppliers lose points</h2><p>Common findings include outdated control plans after process changes, missing links between FMEAs and control plans, capability values below requirements without an effective reaction plan, weak oversight of sub-suppliers, corrective actions closed without effectiveness evidence, training records that do not match the current process, and production data that cannot be traced to the relevant characteristic or operation.</p><p>These issues often develop when process changes are not reflected across documents, systems, and training records.</p><p><a href="https://flowfuse.com/blog/2026/08/layered-process-audit">Layered process audits</a> can help identify these gaps between formal VDA 6.3 audits. Short, regular checks on the production floor can catch bypassed controls, outdated work instructions, and missing records earlier.</p><h2 id="how-to-prepare-for-a-vda-63-audit">How to prepare for a VDA 6.3 audit</h2><p>Run an internal audit against the applicable VDA 6.3 requirements before the external audit. Focus on evidence from the current production process.</p><ol><li><strong>Check process documentation.</strong> Make sure control plans, <a href="https://flowfuse.com/blog/2026/07/digital-work-instruction">work instructions</a>, and FMEAs match the current process.</li><li><strong>Review production data.</strong> Check SPC charts, capability values, inspection records, and deviation logs. Make sure the data can be retrieved quickly.</li><li><strong>Check the production floor.</strong> Verify that equipment, materials, process parameters, identification, and controls match the documented process.</li><li><strong>Review corrective actions.</strong> Confirm that open and recently closed actions include evidence that the corrective action was effective.</li><li><strong>Prepare process owners and operators.</strong> Make sure the people involved can explain their processes and understand the controls that apply to their work.</li></ol><p>The best preparation is to keep process documentation, production data, training, and corrective actions aligned throughout the year rather than preparing only before the audit.</p><p><strong>Connect your production data with FlowFuse</strong></p><p>Bring data from machines, PLCs, and industrial systems into one place to make process information easier to access and monitor.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-08-31T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/vda-6.3/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/control-plans/</id>
        <title>Control Plans: Linking Quality Characteristics to Measurement Data</title>
        <summary>Control plans specify what to measure, how often, and how to react, but this logic is rarely connected to the equipment collecting data on the floor, creating gaps in identifiers, limits, inspection frequency, and reaction plans. Closing the gap requires mapping characteristics to measurement points, capturing production context with each reading, maintaining a single source of truth for limits, and triggering reactions automatically when measurements fall out of spec.</summary>
        <content type="html"><![CDATA[<p>A control plan requires a bore diameter check on every part, within a defined tolerance, with a reaction if it falls outside. The gauge records the measurement under its own point ID; the CMM uses another. Neither is directly linked to the control plan.</p><p>That makes compliance a manual exercise: match measurements to control plan requirements, check inspection coverage, verify limits, and confirm reactions.</p><p>The solution is to connect control plan characteristics to production measurements so each reading can be evaluated against the right requirement as it happens. That only works when the measurement data itself is trustworthy, including <a href="https://flowfuse.com/blog/2026/07/calibration-management-dashboard/">calibration status</a>.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/08/images/control-plan-cta-1.png" alt="Know which gauges are due for calibration - sign up for FlowFuse"/></a><h2 id="what-a-control-plan-specifies">What a control plan specifies</h2><p>A control plan is a structured document that defines what needs to be controlled during production, how it should be measured, how often it should be checked, and what to do when a result is out of specification. It is typically developed as part of <a href="https://www.aiag.org/training-and-resources/manuals/details/APQP-3" rel="nofollow">APQP</a> and maintained within an <a href="https://www.iatfglobaloversight.org/iatf-169492016/" rel="nofollow">IATF 16949</a> quality system.</p><p>For each process step, it defines:</p><ul><li><strong>Characteristic:</strong> the dimension, torque, weld strength, surface finish, or other property being controlled</li><li><strong>Specification:</strong> the required value and acceptable tolerance</li><li><strong>Measurement method:</strong> the equipment or method used to check it</li><li><strong>Inspection frequency:</strong> how often the check must be performed</li><li><strong>Reaction plan:</strong> what happens when a result is outside the specified limits</li><li><strong>Special characteristic:</strong> whether the characteristic has additional control requirements</li></ul><p>For example, a row might specify: bore diameter at Station 30, 25.00 mm ± 0.05 mm, measured with an in-line air gauge on every part, with CMM verification every 50 parts. An out-of-spec result requires the part to be rejected and the quality engineer notified.</p><h2 id="where-the-link-breaks-down">Where the link breaks down</h2><p>Control plans get created before production starts, then reviewed and updated as the process changes. That part usually works. What doesn't is the equipment on the floor, which carries on with whatever was configured at installation. Gauges, CMMs, torque controllers, vision systems, and <a href="https://flowfuse.com/blog/2025/12/what-is-plc/">PLCs</a> collect measurements without knowing what the control plan requires.</p><h3 id="identifiers-dont-match">Identifiers don't match</h3><p>A control plan might call something "Bore Diameter, Station 30," while the CMM stores it as <code>DIM_30_04</code> and the in-line gauge reports it as channel 4. Without a stable mapping between them, no system can confirm they're referring to the same characteristic. That mapping has to be built device by device, then maintained as equipment is added, replaced, or reconfigured.</p><h3 id="measurements-arrive-without-context">Measurements arrive without context</h3><p>A torque reading of 42.1 Nm only becomes useful for <a href="https://flowfuse.com/blog/2026/08/automotive-traceability/">traceability</a> once it's tied to the part, the workstation, a timestamp, the operator, and the device. Capturing that context at the moment of measurement avoids reconstructing it later, a reconstruction that isn't always possible.</p><h3 id="limits-drift-apart">Limits drift apart</h3><p>The control plan might specify 24.95 to 25.05 mm for the Station 30 bore while the in-line gauge enforces 24.94 to 25.06 mm. Both systems work fine; they just enforce different requirements, and a change to one can go unnoticed for a long time. The fix is a single source of truth for <a href="https://flowfuse.com/blog/2025/11/industrial-data-validation-guide/">limits and validation</a>, with a controlled path for pushing changes to equipment and a record of which limits were active when each part was produced. On validated processes, that path may itself need to go through change control.</p><h3 id="reactions-stay-manual">Reactions stay manual</h3><p>The control plan may require a failed part to be rejected, held, and reported, but the measurement device just records the value. Someone still has to catch it and act. Closing this gap means triggering the reaction at the moment of measurement: the part held, the right person notified, the event logged automatically.</p><p>Inspection frequency compounds all four. A control plan may require 100% inspection, but a measurement system just collects whatever gets recorded. The presence of data doesn't prove the required frequency was followed. Solving the four gaps above is what makes frequency verifiable in the first place: a mapped, contextualized measurement stream is what lets you confirm every required check actually happened.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/08/images/control-plan-cta-2.png" alt="Not sure where your measurement data gaps are? Book a demo"/></a><h2 id="a-practical-example">A practical example</h2><p>Consider a fastener torque check with the following requirements:</p><ul><li><strong>Specification:</strong> 40 to 45 Nm</li><li><strong>Inspection:</strong> 100%</li><li><strong>Reaction:</strong> Reject the part and notify the line lead</li></ul><p>The torque controller records 38 Nm.</p><p>In a disconnected setup, the controller just stores the value locally. A technician has to find the failed reading, trace it to the right part, and confirm the reaction was taken.</p><p>With the characteristic mapped to the measurement stream, that same 38 Nm reading is evaluated the instant it's captured. The system already knows the characteristic, the part, the location, the timestamp, and the applicable limit. The part gets held, the line lead is notified, and the event lands in the production record, without anyone hunting for it after the fact.</p><h2 id="where-this-fits-in-the-data-architecture">Where this fits in the data architecture</h2><p>Measurement data comes from PLCs, gauges, CMMs, torque controllers, vision systems, and other floor equipment. Wherever it originates, it has to be <a href="https://flowfuse.com/blog/2025/06/structuring-storing-data-mes-integration/">collected, tied to production context</a>, checked against the applicable limits, and routed to whatever handles the next step.</p><p>FlowFuse can sit between these systems as the integration layer, pulling data from sources like <a href="https://flowfuse.com/blog/2025/07/reading-and-writing-plc-data-using-opc-ua/">OPC UA</a>, <a href="https://flowfuse.com/blog/2025/09/using-modbus-with-flowfuse/">Modbus</a>, and <a href="https://flowfuse.com/blog/2024/06/how-to-use-mqtt-in-node-red/">MQTT</a>, adding production context, checking it against configured limits, and routing anything out of spec to an <a href="https://flowfuse.com/blog/2025/06/what-is-mes/">MES</a>, notification system, or quality database.</p><p>The control plan stays in the system the quality team already manages. The measurement workflow uses its requirements to evaluate production data and trigger the right response.</p><h2 id="verifying-the-control-plan-was-followed">Verifying the control plan was followed</h2><p>Once control plan characteristics are mapped to production measurements, compliance becomes directly queryable. For any characteristic, you can see:</p><ul><li>Coverage: were all required inspections completed?</li><li>Conformance: were measurements within the limits in effect at the time?</li><li>Response: for out-of-spec results, was the reaction plan followed, and how quickly?</li></ul><p>An audit becomes a report, not a multi-day export-and-match exercise. You can answer "show every bore diameter check from Station 30 last quarter and prove every out-of-spec result was caught and contained" from one traceable record. Proving nothing out of spec left the building takes one more link, to part genealogy and dispatch records. That link is only worth building once the measurement side underneath it is trustworthy.</p><p><strong>Connect your control plans to production data</strong></p><p>See how FlowFuse integrates measurement data from OPC UA, Modbus, and MQTT sources with your control plan requirements to automate quality reactions in real time.</p><p><a href="https://flowfuse.com/contact-us/">Contact Us</a></p>]]></content>
        <updated>2026-08-28T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/control-plans/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/dashboard-themes-and-rendering-fixes/</id>
        <title>FlowFuse Dashboard 1.31.0: Five Themes for a Dark Mode Dashboard</title>
        <summary>Node-RED Dashboard themes get five new presets in 1.31.0, making it easier to build a dark mode dashboard, with fixes for charts, gauges, tables, and more.</summary>
        <content type="html"><![CDATA[<p><a href="https://flowfuse.com/platform/dashboard/">FlowFuse Dashboard</a> 1.31.0 adds five built-in themes, giving you everything you need to build a dark mode dashboard, along with layout improvements for charts, buttons, and gauges. Previously, dark mode had contrast issues across widgets, charts collapsed to empty boxes at their default size, long button labels clipped mid-word, and gauges got sliced off by their own card.</p><p>This release ships alongside FlowFuse 3.0; <a href="https://flowfuse.com/blog/2026/08/flowfuse-release-3-0/">see what else is new in that announcement</a>.</p><p>What's new in FlowFuse Dashboard 1.31.0:</p><ul><li>Five built-in themes — Light, Dark, Dracula, Nord, Sepia — all WCAG AA contrast compliant</li><li>Everything you need to build a dark mode dashboard: date pickers, charts, gauges, and icons all render legibly</li><li>Charts draw at their default size; no more empty boxes on auto-height</li><li>Long button labels wrap or truncate instead of clipping mid-word</li><li>Gauges size and draw correctly on auto</li><li>Table date/time columns render in the viewer's own local timezone</li></ul><h2 id="node-red-dashboard-themes-build-a-better-light-dark-mode-dashboard-with-flowfuse-dashboard">Node-RED Dashboard Themes: Build a Better Light &amp; Dark Mode Dashboard with FlowFuse Dashboard</h2><p>Choose from five built-in Node-RED Dashboard themes in FlowFuse Dashboard: Light, Dark, Dracula, Nord and Sepia. The selected theme applies across every page, group and widget.</p><p>Until now you got one white-and-blue default. Changing it meant hand-editing ten theme values, or writing CSS against Vuetify class names to reach anything the theme didn't expose.</p><p>If you built a dark mode FlowFuse dashboard before this release, native date and time pickers rendered black on black. Chart text sat at a contrast ratio you couldn't read across a desk. Icons stayed dark while the text around them flipped.</p><p>All five themes now meet WCAG AA contrast for text and icons. On the dark themes, date and time pickers, charts, gauges and markdown all render legibly.</p><p><img alt="Switching between the five built-in themes — Light, Dark, Dracula, Nord and Sepia" data-zoomable="" src="https://flowfuse.com/blog/2026/08/images/dashboard-themes.gif"/></p><p>Existing FlowFuse dashboards keep the theme they have. Nothing changes unless you pick a preset, and if you already built a dark mode FlowFuse dashboard by hand, it renders better than it did.</p><h2 id="flowfuse-dashboard-charts-draw-at-their-default-size">FlowFuse Dashboard charts draw at their default size</h2><p>Add a chart, leave the size at auto, deploy. You get a chart.</p><p>Previously you got a title and an empty box. A chart set to auto height collapsed to a single 48-pixel row, and since a chart has no natural height of its own, it drew nothing at all. The workaround was to guess pixel heights until something appeared and that assumed you'd worked out sizing was the problem in the first place. The empty box gave you no clue.</p><h2 id="flowfuse-dashboard-buttons-wrap-long-labels-instead-of-clipping-them">FlowFuse Dashboard buttons wrap long labels instead of clipping them</h2><p>A button labelled "Acknowledge compressor fault" now wraps onto a second line instead of being sliced at both ends. Long labels wrap across up to two lines, and anything beyond that truncates cleanly with an ellipsis rather than losing characters from the start and finish of the text.</p><p>If your FlowFuse dashboard carries equipment names or fault descriptions, this is the fix you'll notice first.</p><h2 id="flowfuse-dashboard-gauges-size-correctly-on-auto">FlowFuse Dashboard gauges size correctly on auto</h2><p>Gauges no longer leave a band of dead space above them as the screen narrows, and the card edge no longer slices them off.</p><p>Three-quarter gauges size correctly on auto, and the needle dial draws at the right proportions. If you run gauges on a wall-mounted screen, they'll look deliberate rather than approximate.</p><h2 id="flowfuse-dashboard-tables-show-real-dates-not-raw-timestamps">FlowFuse Dashboard tables show real dates, not raw timestamps</h2><p>Set a <code>ui-table</code> column to date, time or datetime and it renders as a readable date, formatted in the viewer's own locale.</p><p>A timestamp column used to show <code>1735689600000</code>. Getting a date out of it meant adding a function node to reformat every row before it reached the table — which also baked in one timezone. Formatting now happens in the browser, so someone in Stuttgart and someone in Detroit each see their own local time from the same flow.</p><p><img alt="A ui-table column set to datetime rendering a readable, locale-aware date instead of a raw timestamp" data-zoomable="" src="https://flowfuse.com/blog/2026/08/images/dashboards-table-timestamps.gif"/></p><p>See the <a href="https://dashboard.flowfuse.com/nodes/widgets/ui-table.html" rel="nofollow">ui-table documentation</a> for the column types.</p><h2 id="smaller-fixes-in-flowfuse-dashboard-1310">Smaller fixes in FlowFuse Dashboard 1.31.0</h2><ul><li><strong>Editing one theme changes only that theme.</strong> Changing a colour used to change it on every theme not assigned to a page.</li><li><strong>Tables fill the height you give them.</strong> Set a table to a fixed size and it used to clamp to a single row, hiding everything below the first. Now it fills the widget.</li><li><strong>Text input renders correctly as a multi-line text area.</strong> It used to render partially.</li></ul><h2 id="thank-you-to-our-contributors">Thank you to our contributors</h2><p>This release includes a fix from <strong><a href="https://github.com/waldbaer" rel="nofollow">waldbaer</a></strong>, who solved widget ordering inside subflows (<a href="https://github.com/FlowFuse/node-red-dashboard/issues/710" rel="nofollow">#710</a>). Put a widget in a subflow where the group already held two others and you couldn't position it between them — it stuck to the top or the bottom whatever you did. waldbaer tracked it down and fixed it.</p><p>Thanks as well to everyone filing issues with reproduction steps and screenshots. Several fixes above came from reports that included exactly what we needed to reproduce the problem — <a href="https://github.com/FlowFuse/node-red-dashboard/issues/151" rel="nofollow">#151</a>, <a href="https://github.com/FlowFuse/node-red-dashboard/issues/1607" rel="nofollow">#1607</a> and <a href="https://github.com/FlowFuse/node-red-dashboard/issues/1772" rel="nofollow">#1772</a> among them. That saves us hours, and it goes straight into what ships.</p><h2 id="where-flowfuse-dashboard-is-going">Where FlowFuse Dashboard is going</h2><p>Our goal is that you can build a real operator screen with FlowFuse Dashboard — the kind mounted next to a production line: glanceable, green when things are running, red when they aren't, readable from across the room. Today, FlowFuse Dashboard builds a good data dashboard. It doesn't yet build an HMI.</p><p>Two things stand in the way, and they're what the next two releases are about.</p><p><strong>The first is that FlowFuse Dashboard is message-driven.</strong> A widget shows whatever the last message told it, and shows nothing until one arrives. That's fine on a laptop while you're building. It's a problem on a screen next to a machine, where an operator walks up mid-shift and needs the state of the line right now.</p><p><strong>Tags</strong> fix that. Define a named, typed data point once, feed it from wherever your data comes from, and bind widgets to it. FlowFuse Dashboard holds the value server-side, so a page renders real state the moment it opens. Tags also carry what industrial data needs and messages don't: a type, a range, warning and alarm limits.</p><p><strong>The second is that you can only arrange widgets in a grid.</strong> Every widget is a rectangle that flows into rows and columns. That works for a set of charts and readouts. It can't give you a picture of your process: three tanks with the pipes between them, a motor symbol that spins while it's running, a temperature sitting on top of the vessel it came from.</p><p><strong>Canvas</strong> is a new page type you draw on. Drop shapes and industrial symbols wherever you want them, bind each one to a tag, and set rules like green in range and red out of range.</p><p>We're still working out the shape of both, including where tags should live. If you're running FlowFuse dashboards across machines, sites or lines, tell us what you'd bind, what you'd want stored, and what would have to be true for this to replace how you wire data today.</p><p>Tell us <a href="https://flowfuse.com/dashboard/tags-and-canvas-feedback/">on this form</a>.</p><h2 id="flowfuse-dashboard-1310-faq">FlowFuse Dashboard 1.31.0 FAQ</h2><h3 id="how-do-i-change-the-color-scheme-of-my-flowfuse-dashboard">How do I change the color scheme of my FlowFuse Dashboard?</h3><p>Pick a theme from the dropdown — Light, Dark, Dracula, Nord, or Sepia. Every page, group, and widget updates automatically, and existing FlowFuse dashboards keep their current look until you choose one.</p><h3 id="will-switching-to-flowfuse-dashboards-dark-mode-break-my-existing-flows">Will switching to FlowFuse Dashboard's dark mode break my existing flows?</h3><p>No. Your FlowFuse dashboard keeps the theme it already has. Nothing changes unless you actively select a preset from the dropdown.</p><h3 id="does-this-fix-apply-to-self-hosted-flowfuse-dashboard-instances-or-only-flowfuse-cloud">Does this fix apply to self-hosted FlowFuse Dashboard instances, or only FlowFuse Cloud?</h3><p>Both. FlowFuse Dashboard is an open source npm package that installs into any Node-RED instance, whether you run it on FlowFuse Cloud or your own hardware.</p><p>This feature is available to all users from FlowFuse Dashboard v1.31.0, open source under Apache 2.0.</p><p><strong>Start building with your own industrial data</strong></p><p>Connect your systems, automate workflows, and see what’s possible in your environment.</p><p><a href="https://app.flowfuse.com/account/create">Try it out</a></p>]]></content>
        <updated>2026-08-27T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/dashboard-themes-and-rendering-fixes/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/flowfuse-release-3-0/</id>
        <title>FlowFuse 3.0: Build, deploy, and govern — matched to how you run</title>
        <summary>FlowFuse 3.0 introduces three new products - Flowfuse Edge, FlowFuse Hub, and FlowFuse Fleet - now allows connecting your own AI agent and brings updates to Dashboards.</summary>
        <content type="html"><![CDATA[<p>FlowFuse exists to do one thing well: help teams build, deploy, and govern the operational applications that run their production. This goes from a single data center to every machine on the plant floor to thousands of devices in the field.</p><p>FlowFuse 3.0 sharpens that promise. We reorganized the way you buy the platform around how you actually work, so the edition you run matches your use case and you get exactly what you need out of the box. We also made updates that move the build experience forward: faster app creation, more usable dashboard interface, and additional certified connectivity.</p><h2 id="introducing-flowfuse-hub-edge-and-fleet">Introducing FlowFuse Hub, Edge, and Fleet</h2><h3 id="which-flowfuse-product-should-i-use">Which FlowFuse Product Should I Use?</h3><p>Until now, picking the right FlowFuse setup meant reasoning about tiers. FlowFuse 3.0 replaces that with three clearly-positioned products, each built around a real deployment shape:</p><h4 id="flowfuse-hub-integrate-enterprise-systems-and-apis">FlowFuse Hub: Integrate Enterprise Systems and APIs</h4><p><a href="https://flowfuse.com/product/hub/">FlowFuse Hub</a> is for IT teams. Integrate and orchestrate data across enterprise systems, APIs, and databases, with centralized governance.</p><p>Hub fits teams moving data between ERPs, databases, and cloud APIs, where the applications live in a data center rather than on a plant floor.</p><h4 id="flowfuse-edge-connect-plcs-and-machines-across-sites">FlowFuse Edge: Connect PLCs and Machines Across Sites</h4><p><a href="https://flowfuse.com/product/edge/">FlowFuse Edge</a> is for OT teams. Deploy, manage, and scale industrial applications across sites, with certified industrial connectivity and centralized governance.</p><p>Edge fits teams connecting PLCs, machines, and systems, and businesses standardizing automation across multiple plants. Certified nodes ship with Edge, so the protocols your flows depend on come tested and supported rather than maintained by volunteers.</p><h4 id="flowfuse-fleet-manage-node-red-on-distributed-devices">FlowFuse Fleet: Manage Node-RED on Distributed Devices</h4><p><a href="https://flowfuse.com/product/fleet/">FlowFuse Fleet</a> is for large IoT deployments. Run managed Node-RED across distributed field devices, with remote flow updates and fleet-wide visibility.</p><p>Fleet fits telemetry collection, distributed device deployments, and hardware and OEM partners shipping FlowFuse to their own customers. Where Edge gives you depth at each site, Fleet gives you reach across thousands of them.</p><p>It's the same strong platform underneath. The difference is which problem each one is tuned for — data center, manufacturing site, or a distributed fleet — so the path from "sign up" to "in production" is shorter for every team, making everything easier from POCs to prod and scaling.</p><p>Every product is enabled by FlowFuse Expert, and every product connects the AI agent you already use.</p><h2 id="build-faster-from-idea-to-working-application">Build: faster from idea to working application</h2><p>FlowFuse 3.0 makes it easier to go from an idea to a working application, with new AI capabilities and a more intuitive dashboard experience. Describe what you want to build, and <a href="https://flowfuse.com/docs/user/expert/">FlowFuse Expert</a> helps assemble it.</p><h3 id="connect-your-own-ai-agent">Connect Your Own AI Agent</h3><p>Expert works through a set of tools on the FlowFuse MCP server. In 3.0, it stops being the only agent that can use them.</p><p>Add the FlowFuse MCP server to whichever AI agent you already use, sign in, and choose which teams it can reach and whether it has editing rights. Microsoft Copilot, ChatGPT, Claude and Gemini all connect this way, as does a local agent with MCP capabilities running any model. Command-line agents use the same address as well and all have access to the same tools as our integrated agent.</p><p>This way the AI your company already approved can be extended with FlowFuse and Node-RED, under the same governance you already have in place. The agent you are familiar with, now extended.</p><p>Tell it what you want to build and it will build it for you with what the platform offers including applications, hosted and remote instances, snapshots, mqtt brokers, tables, device groups, or the materials in your team library like custom nodes from submodules or blueprints. It will navigate your browser session to the Node-RED editor so it can build it out in front of you, read the debug output, and correct its own node configuration when needed. You stay in control, you can watch it happen and take over at any point.</p><p>Three things follow from that:</p><ul><li><strong>Company-sanctioned AI, unlocked.</strong> Govern and secure agentic development and orchestration at scale.</li><li><strong>Your agent, your setup.</strong> Each engineer stays in the agent they already work in, next to their existing MCP servers and customizations.</li><li><strong>One workflow.</strong> FlowFuse platform operations and Node-RED flow editing become a natural extension of the AI workflow you already own leading you to more efficiently and effectively deliver results.</li></ul><p>FlowFuse ensures control and enforces on every call what you granted: the teams, and read access or editing rights. Visual coding work runs in one of your own browser sessions making sure you have visibility and which ends when you close the tab. Every action lands in the audit log attributed to you and marked <code>via MCP</code>.</p><p><a href="https://flowfuse.com/ai/">Pick your agent on the AI page</a> to get setup in three simple steps.</p><p><video auto-play loop muted plays-inline aria-label="Connecting an AI agent to FlowFuse over MCP, granting it a team and an access level, then asking it to set up an instance" width="1600" height="900" preload="none"><source src="https://flowfuse.com/blog/2026/08/images/connect-your-own-ai-agent.webm" type="video/webm"></source></video><em>Connect the agent you already use, grant it a team and an access level, and work with FlowFuse from there.</em></p><h3 id="whats-new-with-flowfuse-dashboard">What's new with FlowFuse Dashboard?</h3><p><a href="https://dashboard.flowfuse.com/" rel="nofollow">FlowFuse's Dashboard</a> v1.31.0 delivers a round of UX and UI improvements — the low-friction fixes that make building and reading a dashboard feel obvious instead of fiddly. <a href="http://dashboard.flowfuse.com/nodes/config/ui-theme.html" rel="nofollow">Built-in themes for Node-RED Dashboard 2.0 lead the release</a>: predictable to edit, and every preset meets WCAG AA contrast, so dark mode stays legible. Charts render instead of leaving empty boxes. Tables show readable dates instead of raw epoch numbers. Plus a run of smaller UI fixes — labels and gauges that stay inside their cards, spacing that holds at narrow widths. Less setup. More dashboard.</p><p><video auto-play loop muted plays-inline aria-label="Node-RED Dashboard theme showcase, switching between Light, Dark, Dracula, Nord, and Sepia themes" width="1000" height="517" preload="none"><source src="https://flowfuse.com/blog/2026/08/images/dashboard-theme-showcase.webm" type="video/webm"></source></video><em>Five built-in themes, one dropdown, all meet WCAG AA contrast.</em></p><p><video auto-play loop muted plays-inline aria-label="Node-RED Dashboard table showing a date formats column rendering epoch values as readable dates" width="1000" height="571" preload="none"><source src="https://flowfuse.com/blog/2026/08/images/dashboard-table-date-formats.webm" type="video/webm"></source></video><em>Set the column type to Date, Time, or Datetime. Epoch values format themselves.</em></p><h2 id="deploy-to-the-edge-at-any-scale">Deploy: to the edge, at any scale</h2><p>The Hub / Edge / Fleet split is, at its core, a deployment story. Whether your applications live in a data center, run per manufacturing site, or spread across thousands of small instances in the field, 3.0 gives you a product shaped for that reality rather than a one-size-fits-all tier. Deploying to the edge and scaling out stop being exceptions you work around and start being the default the product expects.</p><p>Running at the edge starts with our Device Agent; it provides the bridge back to the FlowFuse platform. We’re continuing to improve the entire experience of getting setup with the Device Agent - making it as easy as possible to install while retaining flexibility in how you want it set up. This release of the installer guides you through more options on where the agent gets installed and how it gets run - making it easier than ever to get running on your hardware.</p><h2 id="govern-centralized-control-wherever-flows-run">Govern: centralized control wherever flows run</h2><p>As soon as applications spread across sites and devices, the hard part shifts from building them to keeping them under control. Every 3.0 product carries centralized governance through the same lens — <a href="https://flowfuse.com/docs/user/role-based-access-control/">role-based access control</a>, <a href="https://flowfuse.com/docs/user/logs/#audit-log">audit logging</a>, and a single place to see and manage what's running — so extending to the edge doesn't mean giving up oversight. One team, one set of controls, whether you're running one instance or a fleet.</p><h2 id="how-do-i-get-started-with-flowfuse-30">How Do I Get Started With FlowFuse 3.0?</h2><p>Explore the <a href="https://flowfuse.com/product/">product page</a> to decide if FlowFuse Edge, FlowFuse Hub, or FlowFuse Fleet is for you. FlowFuse 3.0 is live today on Cloud and Self-Hosted.</p><ol><li><a href="https://app.flowfuse.com/account/create" rel="nofollow">Start a Free Trial of FlowFuse Edge</a>: All OT teams can request a free 30-day trial immediately; if you're looking to try out FlowFuse Hub or FlowFuse Fleet, just <a href="https://flowfuse.com/contact-us/">contact us</a> and we'll make it happen.</li><li>See the full feature set and request <a href="https://flowfuse.com/pricing/">Pricing</a></li><li><a href="https://flowfuse.com/book-demo/">Set up a demo</a> to see all of these new features</li></ol><p>Note: FlowFuse Self-Hosted requires the 3.0 release installed for the new license types and features mentioned in this release.</p><p><strong>Find out which FlowFuse product fits how you run</strong></p><p>Walk through Hub, Edge, and Fleet with our team and leave with the right fit for your deployment, not a generic tier.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-08-27T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/flowfuse-release-3-0/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/containment-action/</id>
        <title>Containment Action and Controlled Shipping: Surviving CS1 and CS2</title>
        <summary>Containment Triggers: CS1 and CS2 are escalations, not automatic responses to a single defect. They follow severity, repeat issues, stop-ship events, or an inadequate response to an earlier corrective action request. Documentation Under Scrutiny: A containment plan only holds up if inspection points, sign-offs, and results are tracked consistently across every site and shift, not just on paper after the fact. Root Cause to Release: Exiting CS1 or CS2 permanently requires connecting containment data to a documented root cause fix and proving consistency across a sustained, defect-free run.</summary>
        <content type="html"><![CDATA[<p><em>A containment action is the set of temporary measures a supplier puts in place to stop a known defect from reaching the customer while the root cause is still under investigation.</em> Extra inspection, quarantined stock, tightened sign-offs: anything that guarantees what ships is clean, even if the process producing it is not yet fixed.</p><p>Controlled shipping is what happens when the automaker stops taking that on trust. It is a formal status assigned after a defect reaches a customer plant, and it comes in two levels. CS1 requires the supplier to add its own inspection layer before shipment, document it, and report on it. CS2 adds an independent third party on top of CS1. The supplier keeps running its own containment; the third party verifies it, at the supplier's cost.</p><p>Both are survivable. What makes them hard is not the inspection itself. It is proving, shipment after shipment and site after site, that the inspection actually happened the way you said it did. Most MES platforms handle single-site nonconformance well. Producing one consistent containment record across several plants on a two-week timeline is where they tend to fall short.</p><h2 id="what-triggers-cs1-and-cs2-controlled-shipping">What Triggers CS1 and CS2 Controlled Shipping</h2><p>A defect reaching the customer plant is the starting point, but controlled shipping is an escalation beyond it. Automakers apply it when the defect is severe, when a previously closed issue resurfaces, when a line stops, or when the initial corrective action response falls short. A defect caught at incoming inspection, a field failure, or a warranty claim can each lead there. CS1 typically requires the supplier to add an extra layer of inspection before shipment, while CS2 means the automaker brings in a third party to inspect on the supplier's behalf, at the supplier's cost. Both carry real financial and reputational stakes.</p><p>For <a href="https://flowfuse.com/industries/automotive/">automotive quality manufacturing</a>, the trigger event is rarely the hard part. The harder part is proving, with data, that every unit shipped afterward meets the added inspection requirement. Without a system connecting inspection points to production data in real time, that proof often depends on manual logs that are slow to compile and easy to dispute during a customer audit.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/08/images/containment-blog-cta-1.png" alt="Replace manual containment logs - see how it works"/></a><h2 id="building-containment-that-holds-up-under-scrutiny">Building Containment That Holds Up Under Scrutiny</h2><p>Surviving CS1 or CS2 status depends on more than reacting to the initial defect notice. Automakers and third-party auditors expect proof that every containment action is documented, repeatable, and traceable back to a specific inspection point and operator sign-off. Building that level of rigor across multiple sites, each with its own systems and habits, requires structure in three key areas.</p><h3 id="documenting-every-inspection-point">Documenting Every Inspection Point</h3><p>Every added inspection step needs a written record: what is being checked, how often, and by whom. Inspection also has to happen in a dedicated containment area, separate from normal production flow, staffed by people other than the operators who produced the part. Real-time <a href="https://flowfuse.com/use-cases/production-monitoring/">production monitoring</a> can capture this automatically at the line level, giving you a live record instead of a stack of paper checklists compiled after each shift. It's the same discipline a <a href="https://flowfuse.com/blog/2026/08/layered-process-audit/">layered process audit</a> runs on: defined checks, at a defined frequency, signed off by someone other than the operator.</p><h3 id="sign-offs-that-hold-up-during-customer-containment">Sign-Offs That Hold Up During Customer Containment</h3><p>Customer containment often involves the automaker's own quality team reviewing supplier data directly. A shared <a href="https://flowfuse.com/platform/dashboard/">FlowFuse Dashboard</a> gives operators, quality engineers, and customer auditors the same live view of inspection results, so sign-offs reflect what actually happened on the line, not a summary written after the fact.</p><h3 id="where-cs1cs2-automotive-plans-break-down">Where CS1/CS2 Automotive Plans Break Down</h3><p>Most CS1/CS2 automotive plans fail at scale, not on day one. A process that works on a single line becomes inconsistent across five plants using different spreadsheets and different definitions of "checked." Standardizing the same containment action across every site closes that gap without rebuilding it at each location.</p><h3 id="identifying-certified-stock">Identifying Certified Stock</h3><p>Contained parts need distinct marking, usually a containment label or coloured tag, agreed with the customer and applied from a defined start date. That marking is how the customer separates parts that passed containment inspection from parts shipped before containment began. Containment also covers material sitting in your warehouse, already in transit, and on the floor at the customer's plant, not only what ships next. That marking needs to tie back to the same <a href="https://flowfuse.com/blog/2026/08/automotive-traceability/">automotive traceability</a> record as everything else you ship, not a separate log that only exists for the duration of containment.</p><h2 id="from-customer-containment-to-exiting-cs1-and-cs2-for-good">From Customer Containment to Exiting CS1 and CS2 for Good</h2><p>Passing containment inspections is only half the work. To exit CS1 or CS2 status permanently, a supplier has to show the automaker that the root cause has been identified and corrected, not just contained. That shift from reactive inspection to lasting correction happens across three areas.</p><h3 id="connecting-containment-data-to-root-cause">Connecting Containment Data to Root Cause</h3><p>Containment inspection data is only useful if it points back to where the defect originated. Ongoing <a href="https://flowfuse.com/blog/2026/07/defect-and-quality-monitoring/">defect and quality monitoring</a> at the line level helps quality teams trace a recurring issue to a specific machine, shift, or process step. Structuring that investigation with a tool like an <a href="https://flowfuse.com/blog/2026/07/ishikawa-fishbone-diagram/">Ishikawa fishbone diagram</a> keeps the search organized instead of guessing at a fix.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/08/images/containment-action-cta-2.png" alt="Track contained parts from line to customer - build with FlowFuse"/></a><h3 id="keeping-every-shift-aligned-on-corrective-action">Keeping Every Shift Aligned on Corrective Action</h3><p>Corrective action fails when one shift changes a process and the next shift reverts it. Clear <a href="https://flowfuse.com/use-cases/shop-floor-communication/">shop floor communication</a> keeps operators, quality engineers, and plant leadership working from the same updated procedure, reducing the risk of the same defect resurfacing after containment is lifted.</p><h3 id="proving-consistency-before-requesting-release">Proving Consistency Before Requesting Release</h3><p>Automakers typically require a sustained defect-free run before lifting controlled shipping status. Every containment action taken during that run needs a documented, consistent trail across shifts and lines, giving the supplier a clear case to present when requesting release from CS1 or CS2.</p><h2 id="final-thoughts">Final Thoughts</h2><p>CS1 and CS2 status test more than a supplier's quality process. They test whether that process can be documented, trusted, and applied the same way across every site under scrutiny, often on a timeline that leaves no room for rebuilding tools from scratch at each plant. The suppliers who exit controlled shipping fastest are usually the ones who can prove consistency without relying on manual logs and disconnected spreadsheets to make their case.</p><p>An industrial application platform like FlowFuse gives manufacturers a way to standardize that proof once and apply it everywhere it is needed, from inspection tracking to shift communication to root cause data. Getting through CS1 or CS2 is difficult enough without also rebuilding the containment process at every site. Build it once, and let it run everywhere containment is required.</p><p><strong>Build containment you can prove</strong></p><p>Talk to us about connecting inspection data, sign-offs, and root cause tracking so your containment action holds up across every site.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-08-26T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/containment-action/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/safe-launch/</id>
        <title>Safe Launch: The Post-PPAP Monitoring Period</title>
        <summary>Safe Launch Starts Where PPAP Ends: PPAP proves capability over a significant production run, typically 300 consecutive parts. A safe launch program proves the process holds that capability over months, across every shift, operator, and a full tooling wear cycle. Escalation Beats Observation: Safe launch is already a containment event. Defined thresholds tied to live production data catch a drift before it turns into a customer complaint or an extension of the containment period. Containment Data Should Outlive the Launch: Insights captured during early production containment can be standardized into reusable operational applications, giving future launches a stronger starting point across every plant.</summary>
        <content type="html"><![CDATA[<p><em>PPAP approval feels like the finish line. For most suppliers, it is the point at which the customer starts watching most closely.</em> Different OEMs give this period different names. GM calls it GP-12, or early production containment. Ford and others call it safe launch. The requirement is broadly the same: a defined window of additional inspection sitting on top of your normal process controls, starting at first production shipment and ending only when the customer says so.</p><h2 id="what-is-a-safe-launch-automotive-program-and-why-does-it-start-after-ppap">What is a Safe Launch Automotive Program, and Why Does it Start After PPAP?</h2><p>A safe launch program is a defined containment period that runs from the first production shipment. It usually follows PPAP approval, though a supplier operating under interim approval is often required to contain from day one. PPAP proves capability over a significant production run, typically 300 consecutive parts at production rate on production tooling. Safe launch proves the process holds that capability over months, across every shift, every operator, and a full tooling wear cycle. For manufacturers running <a href="https://flowfuse.com/industries/automotive/">automotive manufacturing solutions</a> across multiple plants, that distinction matters because failure modes at launch rarely match what showed up in validation.</p><p>This is why safe launch exists as its own phase. A redundant inspection layer, tighter reaction limits, and faster escalation paths catch issues that a one-time approval cannot. In most programs this means 100% inspection of specified characteristics, carried out separately from the normal in-process checks, not a higher sampling rate. Without them, defects can reach hundreds of vehicles before anyone notices a trend, turning a manageable process shift into a costly field action.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/08/images/safe-launch-cta-1.png" alt="See your safe launch containment data the way your customer does"/></a><h2 id="building-a-safe-launch-plan-for-the-post-ppap-monitoring-period">Building a Safe Launch Plan for the Post-PPAP Monitoring Period</h2><p>A safe launch plan gives structure to what would otherwise be a loosely managed monitoring period. It defines how long the elevated scrutiny lasts, what triggers an escalation, and who owns the response when a defect trend appears. Four elements determine whether that plan actually works on the shop floor.</p><h3 id="containment-inspection-that-sits-on-top-of-normal-controls">Containment Inspection That Sits On Top of Normal Controls</h3><p>Containment inspection is additional, not a substitute. It runs at a dedicated station downstream of the normal process, covering the characteristics the customer specified, usually at 100%. Operators need to see which characteristics are under containment and what the current results look like, on the line, in the shift they are working. Real-time <a href="https://flowfuse.com/use-cases/production-monitoring/">production monitoring</a> turns that into a live view instead of a paper checklist.</p><h3 id="escalation-criteria-everyone-understands">Escalation Criteria Everyone Understands</h3><p>A safe launch plan fails when escalation depends on someone noticing a problem manually. Defined thresholds, tied to real-time production monitoring data, remove that guesswork and route alerts to the right person before a trend becomes a containment event.</p><h3 id="exit-criteria-set-by-the-customer-proven-by-you">Exit Criteria Set by the Customer, Proven by You</h3><p>The customer defines the exit criteria at the start, usually a combination of elapsed time, cumulative volume, and zero containment defects. You cannot exit unilaterally. You build the evidence, request release, and wait for sign-off. A defect found during the window normally resets the clock rather than simply extending it, which makes a clean, continuous record worth more than a strong average.</p><h3 id="identification-of-contained-parts">Identification of Contained Parts</h3><p>Parts that clear containment inspection carry a customer-agreed label or mark, applied from a defined start date, so the receiving plant can tell contained stock from anything shipped before the program began. Missing or inconsistent identification is one of the most common reasons a containment period gets extended.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/08/images/safe-launch-cta-2.png" alt="Route safe launch escalations before they become containment events"/></a><h2 id="early-production-containment-turning-launch-data-into-long-term-quality-gains">Early Production Containment: Turning Launch Data Into Long-Term Quality Gains</h2><p>Early production containment generates a large volume of data in a short window, but most of that data gets archived once launch monitoring ends. This is a missed opportunity. The same data used to catch defects during launch can improve quality processes well beyond it: three approaches make that connection possible.</p><h3 id="feed-containment-data-into-standard-quality-workflows">Feed Containment Data Into Standard Quality Workflows</h3><p>Containment findings should not disappear once a program exits its monitoring period. Applying the same defect and quality monitoring logic used during launch to standard production keeps defect detection sharp long after containment ends.</p><h3 id="use-launch-insights-to-improve-future-programs">Use Launch Insights to Improve Future Programs</h3><p>Every launch surfaces failure modes specific to a part, process, or line. Capturing those patterns in a reusable operational application means the next launch starts with better containment plans and escalation thresholds instead of starting from scratch.</p><h3 id="standardize-containment-logic-across-plants">Standardize Containment Logic Across Plants</h3><p>A containment workflow built for one line can run at every site without rebuilding it, following FlowFuse's build once, run everywhere approach to <a href="https://flowfuse.com/industries/automotive/">automotive manufacturing</a>, so standardized workflows scale across brownfield environments instead of starting over at each plant.</p><h2 id="final-thoughts">Final Thoughts</h2><p>A safe launch program only works when it treats the post-PPAP period as its own discipline, not an extension of validation. That means containment inspection layered on top of normal controls, escalation paths that do not depend on manual observation, and exit criteria the customer sets and you prove. Getting this right protects against the kind of defect trends that turn into costly field actions.</p><p>The bigger opportunity is what happens to that containment data afterward. Instead of archiving it once monitoring ends, manufacturers can carry those insights into standard quality workflows and future launches. An industrial application platform like FlowFuse makes that possible by letting quality teams build a containment workflow once and run it everywhere it's needed, so every new launch starts ahead of the last one instead of rebuilding the process from scratch.</p><p><strong>Get your next launch off to a clean start</strong></p><p>Talk to us about connecting inspection points, escalation criteria, and containment reporting so you can prove your safe launch program held up and exit with confidence.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-08-25T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/safe-launch/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/run-at-rate/</id>
        <title>Run at Rate: Proving Production Capacity Before Launch</title>
        <summary>Run at rate verifies that a production line can meet its required output using production tooling, staffing, and standard processes. The demonstrated rate is based on good parts produced against theoretical output at the target cycle time, with the customer or program team setting the pass threshold.</summary>
        <content type="html"><![CDATA[<p><em>Run at rate is a timed production run, performed at the actual target cycle time with production tooling and production staffing, meant to confirm a line can hold both quality and output over a real shift, not just a handful of closely watched parts.</em></p><p>The distinction matters because process validation alone doesn't prove it. A supplier can pass validation with every checked part coming back within spec, launch, and still miss its shift target three weeks in, at which point it's a customer problem instead of an engineering one. Run at rate is the check meant to catch that before launch happens, not after.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/blog/2026/08/images/run-at-rate-cta2.png" alt="Need to prove production capacity before launch?"/></a><h2 id="where-the-requirement-comes-from">Where the requirement comes from</h2><p>General Motors formalized the requirement in its <a href="https://www.scribd.com/document/572952029/GM-1927-35-Run-at-Rate-Procedure-Rev-2-EG" rel="nofollow">GM Global APQP Supplier Quality Manual (GM 1927)</a>, performed after PPAP approval as confirmation of the rate claimed on the supplier's warrant. Ford builds it into the PPAP submission itself, through the capacity evaluation section of the official <a href="https://www.aiag.org/training-and-resources/manuals" rel="nofollow">AIAG Production Part Approval Process (PPAP) Manual</a>. Stellantis standardizes its version via the <a href="https://www.google.com/search?q=https://www.supplier.stellantis.com" rel="nofollow">Stellantis Supplier Portal</a> Capacity Assessment Tool (CAT) framework. German OEMs execute a two-day trial called 2 Tagesproduktion (2TP), governed by the <a href="https://webshop.vda.de/qmc/volume-2-ppa" rel="nofollow">VDA QMC Volume 2 PPA Standard</a>.</p><p>The paperwork varies by customer. The question underneath it doesn't: can this line, with this tooling and these operators, actually produce at the rate that was quoted.</p><h2 id="requirements-for-a-valid-run">Requirements for a valid run</h2><p>A few conditions have to hold.</p><p>The setup has to match real production, not a demo. Production tooling, production gauges, trained operators, standard work as documented. Auditors specifically watch for stand-ins, an engineer hovering over a fixture, hand-picked material, extra staff who wouldn't be on the floor during a normal shift. Any of that and the result doesn't count.</p><p>The run has to cover enough time to mean something. A line can hold <a href="https://flowfuse.com/blog/2025/09/what-is-takt-time/">takt time</a> for twenty minutes and still drift once fixtures heat up and operators settle into a real pace instead of a rehearsed one. That's why most programs require a full shift or a defined multi-hour window rather than a short burst at rate.</p><p>And everything counts against the result, not just the good parts. <a href="https://flowfuse.com/blog/2026/07/build-downtime-logger/">Downtime</a>, changeovers, scrap, and rework all subtract from the demonstrated rate.</p><h2 id="how-to-calculate-run-at-rate">How to calculate run at rate</h2><p>The math only needs two numbers: what the line was supposed to produce, and what it actually produced as good parts.</p><p><strong>Theoretical output</strong> = run duration ÷ target cycle time</p><p><strong>Run at rate %</strong> = (net good output ÷ theoretical output) × 100</p><p>Take an 8-hour shift, or 480 minutes, against a 60-second target cycle time. The theoretical output for that window is 480 units.</p><p><img alt="Run at rate calculation diagram showing theoretical output, good parts produced, and resulting percentage" src="https://flowfuse.com/blog/2026/08/images/run-at-rate-calculation-image.png"/></p><p>During the run, 45 minutes are lost to downtime, leaving 435 minutes of actual production time. At the target cycle time, the line produces 435 units, but 12 are scrapped, leaving 423 good parts.</p><p><strong>Run at rate = (423 ÷ 480) × 100 = 88.1%</strong></p><p>Downtime and scrap don't get calculated separately and added back in. They show up as fewer good parts against the theoretical output, which is why a line can be running most of the shift and still post a rate well under target..</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/08/images/run-at-rate-cta-1.png" alt="Tracking run-at-rate data manually?"/></a><h2 id="what-does-pass-or-fail-look-like">What Does Pass or Fail Look Like?</h2><p>The customer or program team sets the required run-at-rate threshold before the test, based on the production capacity that was quoted or required. The threshold varies by customer and program, so 95% is an example rather than a universal requirement.</p><p>If the agreed threshold is 95%, a result of 95% or higher passes. In the example above, the line achieved <strong>88.1%</strong>, so it fails to demonstrate the required capacity. That restarts the clock rather than ending the program: trace the shortfall to downtime, scrap, or cycle drift, fix it, and run again. Until a run passes, the quoted capacity stays unproven, and launch approval waits with it.</p><p><strong>Pass:</strong> ≥ required threshold<br/><strong>Fail:</strong> &lt; required threshold</p><h2 id="run-at-rate-vs-process-validation-vs-ppap">Run at rate vs. process validation vs. PPAP</h2><p>Process validation confirms a process can hold tolerance, usually at reduced volume with an engineer watching each unit come off the line. That's a different test than holding tolerance for 400 consecutive cycles at full speed with nobody intervening, which is what runs at rate checks.</p><p>PPAP is the larger documentation package: control plans, measurement system analysis, part approval as a whole. Run at rate is one piece of that package, specific to volume. It isn't a substitute for the rest of the file, and the rest of the file isn't a substitute for it. For how a control plan's characteristics get tied to the measurement data collected on the floor, see <a href="https://flowfuse.com/blog/2026/08/control-plans/">Control Plans: Linking Quality Characteristics to Measurement Data</a>.</p><p><img alt="Comparison diagram showing PPAP components and where run at rate fits within the approval process" src="https://flowfuse.com/blog/2026/08/images/pap-vs-run-rate.png"/></p><h2 id="why-capacity-gaps-still-show-up-after-launch">Why capacity gaps still show up after launch</h2><p>Changeover time gets estimated instead of measured live, and the real changeover, with new operators and no rehearsal, runs longer than planned. A station that tested fine on its own turns out to be the actual bottleneck once the full line runs together, starved for parts or backed up behind a slower neighbor. <a href="https://flowfuse.com/blog/2026/07/defect-and-quality-monitoring">Quality</a> that looked stable during a short trial drifts once tooling wears across a full shift, a failure mode a short run wouldn't catch. If that drift reaches the customer plant, it's the kind of defect that triggers <a href="https://flowfuse.com/blog/2026/08/containment-action/">CS1 or CS2 controlled shipping</a>.</p><p>Some of the challenge comes down to how run-at-rate data is collected. During a live run, cycle times, downtime, production counts, and rejects are often recorded manually, making it difficult to capture every event accurately. Much of this data is already available from the equipment through <a href="https://flowfuse.com/landing/plc/">PLC</a> tags and machine states. A platform like <a href="https://flowfuse.com/">FlowFuse</a> can connect to that equipment to automatically collect the data, calculate the demonstrated production rate, and visualize the results as the run progresses, giving teams a clearer view of how the line is performing against its target.</p><h2 id="why-it-matters">Why it matters</h2><p>Process validation proves a line can make a good part. Run at rate proves it can make good parts fast enough, for long enough, to hit the number in the launch plan. With production data collected directly from your equipment, FlowFuse helps <a href="https://flowfuse.com/industries/automotive/">automotive manufacturers</a> monitor production counts, cycle time, downtime, and quality in real time, making capacity gaps visible before they become launch problems.</p><p><strong>See What Your Production Line Is Capable Of</strong></p><p>Connect your production equipment with FlowFuse to collect production data, calculate demonstrated rates, and monitor performance against target capacity.</p><p><a href="https://app.flowfuse.com/account/create">Try it out</a></p>]]></content>
        <updated>2026-08-21T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/run-at-rate/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/what-is-scada/</id>
        <title>What Is SCADA? Supervisory Control and Data Acquisition</title>
        <summary>SCADA Architecture: SCADA systems rely on field devices, PLCs and RTUs, and HMIs working together to give operators real-time visibility and control across equipment. System Boundaries Matter: Knowing where SCADA ends and PLCs, HMIs, and MES platforms begin prevents duplicated effort and gaps in coverage across multi-site operations. Extend, Don't Replace: Legacy SCADA systems in brownfield environments can be connected to modern IT/OT tools using platforms like FlowFuse, allowing manufacturers to standardize a workflow once and deploy it across every site without rebuilding from scratch.</summary>
        <content type="html"><![CDATA[<p>A production line goes down and the first alarm appears on a screen minutes before anyone on the floor notices. For teams managing multiple plants, that screen is often the only real-time view into what is happening across PLCs, sensors, and equipment scattered across dozens of sites. Understanding what SCADA is matters more than ever, especially with unplanned downtime costing industrial manufacturers an estimated <a href="https://www.eng.auburn.edu/~szm0001/papers/GC23-technology.pdf" rel="nofollow">$50 billion</a> a year.</p><p>FlowFuse, an industrial application platform, works directly inside the environments where SCADA systems operate, connecting to PLCs, sensors, and edge devices as part of building operational applications across plants and production lines. The platform is SOC 2 Type 1 and Type 2 certified and is trusted by manufacturers including Bosch, Cargill, Moderna, and 25 or more other enterprise customers to standardize workflows across hundreds of sites without rebuilding from scratch.</p><p>This article breaks down what SCADA is, how it works, how it compares to related systems like PLCs and HMIs, and why it still matters in brownfield environments today.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/08/images/scada-article-cta.png" alt="Extend your SCADA, don't replace it — connect to a PLC over OPC UA or Modbus and build a view on top"/></a><h2 id="how-does-scada-work-the-core-components">How Does SCADA Work? The Core Components</h2><p>SCADA, which stands for Supervisory Control and Data Acquisition, is a system that collects data from equipment across a plant and gives operators a centralized view to monitor and control that equipment in real time. A simple definition covers what the system does, while the SCADA meaning points to its core function beyond just the acronym, supervising and gathering data across distributed equipment. Any basic SCADA system definition includes four layers working together: field devices, controllers, communication networks, and the software that displays and stores the data. Each of these layers works together as follows:</p><p><img alt="SCADA architecture diagram showing sensors and manual inputs feeding data to PLCs or RTUs, which pass it to server infrastructure, connected over a LAN or WAN network to an HMI or SCADA operator view." src="https://flowfuse.com/blog/2026/08/images/scada-basic-diagram.png"/><em>The four layers of a SCADA system: field devices, controllers, communication networks, and the software operators use to monitor and control equipment.</em></p><h3 id="field-devices-and-sensors">Field Devices And Sensors</h3><p>Sensors and field devices sit closest to the physical process, measuring variables like temperature, pressure, flow rate, and machine status. These devices generate the raw data that everything else in the system depends on. Without accurate field-level data, supervisory dashboards and historical trends built on top of a <a href="https://flowfuse.com/use-cases/scada/">SCADA</a> system lose their value almost immediately.</p><h3 id="plcs-and-rtus">PLCs And RTUs</h3><p>Programmable Logic Controllers and Remote Terminal Units take the raw signals from field devices and convert them into structured data. PLCs typically run more complex local control logic and keep equipment operating safely between supervisory updates, while RTUs are more common in geographically spread-out environments, like pipelines or remote wellheads, where they focus more on data acquisition and communication over long distances. Most industrial environments rely on PLCs as the layer directly beneath SCADA, translating physical inputs into a format the rest of the system can use.</p><h3 id="communication-networks">Communication Networks</h3><p>Communication networks carry data between field devices, controllers, and the central SCADA software, using protocols like <a href="https://flowfuse.com/docs/node-red/protocol/modbus/">Modbus</a>, <a href="https://flowfuse.com/blog/2025/07/reading-and-writing-plc-data-using-opc-ua">OPC UA</a>, <a href="https://flowfuse.com/blog/2024/06/how-to-use-mqtt-in-node-red/">MQTT</a>, or <a href="https://flowfuse.com/blog/2025/10/using-ethernet-ip-with-flowfuse/">Ethernet/IP</a> depending on the equipment and environment. This layer determines how reliably and securely data moves across a facility, and it becomes especially important when connecting older equipment to newer IT/OT platforms.</p><h3 id="hmi-and-central-monitoring-software">HMI And Central Monitoring Software</h3><p>The Human-Machine Interface, or HMI, is where operators view live data, alarms, and trends pulled from PLCs and RTUs. Central SCADA software aggregates this information across multiple lines or sites, storing historical data for reporting and analysis. This layer is what turns raw signals into the visibility manufacturers depend on to catch problems early.</p><h2 id="scada-vs-plc-hmi-and-mes-where-it-fits-in-the-stack">SCADA vs. PLC, HMI, And MES: Where It Fits In The Stack</h2><p>Anyone asking what is SCADA usually runs into overlapping terminology almost immediately, since PLCs, HMIs, and MES platforms all touch the same data at different points. Each system serves a distinct purpose, and confusing them leads to gaps in coverage or duplicated effort across sites. Getting the distinctions right matters for anyone responsible for architecture decisions across multiple plants:</p><h3 id="scada-vs-plc">SCADA vs. PLC</h3><p>A PLC executes control logic directly on the equipment it is connected to, reacting to inputs in real time without needing a central system. SCADA, by contrast, supervises multiple PLCs at once, pulling their data into a single view for monitoring and historical analysis, and sending supervisory commands like setpoint changes back down to the equipment. For a full breakdown of how PLCs function on their own, see <a href="https://flowfuse.com/blog/2025/12/what-is-plc/">What Is PLC</a>.</p><h3 id="scada-vs-hmi">SCADA vs. HMI</h3><p>An HMI is the interface operators interact with directly, usually tied to a single machine or line. SCADA software aggregates data from many HMIs and PLCs across a facility or multiple sites, giving a broader operational picture than any single interface can provide. Guidance on setting up interfaces at the equipment level is covered in <a href="https://flowfuse.com/blog/2025/11/building-hmi-for-equipment-control/">Building HMI for Equipment Control</a>.</p><h3 id="scada-vs-mes">SCADA vs. MES</h3><p>MES platforms manage production scheduling, quality records, and traceability at a business process level, while SCADA focuses on real-time equipment data and control. These systems are meant to work together, not replace each other, though many manufacturers still rely on tools like <a href="https://flowfuse.com/vs/kepware/">Kepware</a> to bridge the gap between SCADA data and <a href="https://flowfuse.com/blog/2025/06/what-is-mes/">MES</a> or <a href="https://flowfuse.com/blog/2025/06/connect-shop-floor-to-odoo-erp-flowfuse/">ERP</a> systems. This is a core part of what SCADA is often used for in practice.</p><h2 id="why-scada-still-matters-in-modern-brownfield-environments">Why SCADA Still Matters In Modern Brownfield Environments</h2><p>SCADA systems are not going anywhere in most industrial facilities, and understanding why requires looking at how much infrastructure is built around them. Many plants run SCADA installations that are ten or twenty years old, tied directly to equipment that still works fine and would be expensive or risky to replace. Ripping out a functioning brownfield environment rarely makes sense when the goal is better visibility, not a full overhaul.</p><p>The real challenge is connecting older SCADA systems to newer IT and OT tools without breaking what already works. Protocol choice plays a large role here, and manufacturers evaluating how to move data between legacy equipment and modern platforms often need SCADA explained in the context of specific protocols like OPC UA and MQTT. The comparison in <a href="https://flowfuse.com/blog/2026/01/opcua-vs-mqtt/">OPCUA vs MQTT</a> covers how each protocol handles that kind of connectivity differently.</p><p><img alt="Diagram showing a SCADA chain of field devices, PLCs or RTUs, server infrastructure, and an HMI or SCADA view, with a FlowFuse IT/OT connectivity and application layer exchanging data with the PLC and server tiers and feeding FlowFuse operational applications and MES, ERP, or cloud systems." src="https://flowfuse.com/blog/2026/08/images/scada-flowfuse-extension.png"/><em>Extending a brownfield SCADA system with an IT/OT layer rather than replacing it.</em></p><p>Extending a brownfield SCADA system, rather than replacing it, lets manufacturers keep proven equipment logic in place while adding the <a href="https://flowfuse.com/use-cases/it-ot-middleware/">IT/OT connectivity</a> needed for enterprise-wide visibility. That approach protects existing investment and reduces the operational risk that comes with large-scale system replacement.</p><h2 id="final-thoughts">Final Thoughts</h2><p>SCADA remains one of the most important systems on any plant floor, giving operators and engineers the visibility needed to catch issues before they turn into costly downtime. Knowing how the pieces fit together, from field devices up through PLCs, HMIs, and central monitoring software, makes it easier to spot where gaps exist and where legacy equipment can be extended rather than replaced.</p><p>For manufacturers managing SCADA across multiple sites, the harder problem is often not the system itself but everything built around it: custom scripts, one-off integrations, and workflows that get rebuilt at every new plant. An industrial application platform like FlowFuse addresses that layer directly, letting teams take a proven operational workflow and deploy it across every site instead of starting over each time. Build once, run everywhere is not just a convenience. It is what breaks the rebuild cycle for good.</p><p><strong>Reading about SCADA only gets you so far</strong></p><p>Connect to a PLC over OPC UA or Modbus, watch live tags arrive, and build a view on top of them.</p><p><a href="https://app.flowfuse.com/account/create">Try it out</a></p>]]></content>
        <updated>2026-08-20T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/what-is-scada/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/automotive-traceability/</id>
        <title>Automotive Traceability: How Production Data Gets Tied to a Part</title>
        <summary>Identity Is the Foundation: Traceability starts with a unique identifier for each part, which turns isolated machine readings into an as-built record that can be searched later. Connection Beats Collection: Most factories already generate the data traceability needs. The hard part is associating a PLC reading, a scanner event, and an inspection result with the same part at the same moment. Extend, Don't Replace: An integration layer like FlowFuse connects existing PLCs, MES platforms, and databases into traceability workflows, so manufacturers build genealogy around the systems already running their lines.</summary>
        <content type="html"><![CDATA[<p>A finished vehicle carries more than its physical components. It carries a production history: the materials used, processes performed, machines involved, and quality checks completed along the way.</p><p>Automotive traceability makes that history possible to reconstruct.</p><h2 id="what-is-automotive-traceability">What Is Automotive Traceability?</h2><p>Automotive traceability is the ability to follow a vehicle, component, or individual part through manufacturing and connect it with the data that production generates along the way. At vehicle level the anchor identifier is the VIN. At component level it is a serial number that serialization applies at the start of the process, and the finished result is often called the as-built record: everything known about how that specific unit came together.</p><p>Take a manufacturer producing brake assemblies. Each assembly receives a unique identifier, and as it moves through production the manufacturer ties that identifier to the supplier who provided the components, the line that assembled the part, the machine that performed each operation, the torque values the tool recorded, the inspection results, the operator, the timestamp of each operation, the batch number, and whether the part passed its quality check.</p><p>Now suppose a quality issue surfaces several days later. Instead of searching through disconnected machine logs, spreadsheets, and production records, the manufacturer looks up the affected part and reads its production history. That is the real value of traceability: it turns production data into a history someone can follow.</p><h2 id="why-traceability-matters-in-automotive-manufacturing">Why Traceability Matters in Automotive Manufacturing</h2><p>Traceability matters more in <a href="https://flowfuse.com/industries/automotive/">automotive manufacturing</a> than in most industries because a problem with one component can affect a large number of vehicles, and because the supply chain runs deep. An OEM depends on Tier 1 suppliers who depend on Tier 2 suppliers, and a defect can enter at any level. It is also expected rather than optional, since IATF 16949 requires manufacturers to define traceability so they can identify and contain suspect product.</p><p>The scale explains the pressure. NHTSA <a href="https://www.nhtsa.gov/sites/nhtsa.gov/files/2025-01/recall-completion-rates-report-update-01172025.pdf" rel="nofollow">processes over 1,000 new recalls each year</a>, and <a href="https://www.nhtsa.gov/document/report-congress-vehicle-safety-recall-completion-rates-report" rel="nofollow">completion rates for most component categories land between 60% and 75%</a>. A recall that covers more vehicles than it needs to therefore costs more and still leaves defective units on the road. Narrowing the scope is not only cheaper, it is more effective.</p><p>Consider a supplier discovering that a batch of components does not meet specification. The manufacturer needs to determine which parts from that batch entered production and which vehicles contain them. That is forward traceability: start with a suspect input and find everywhere it went. Backward traceability works the other way, starting from a returned vehicle and reconstructing what went into it. Without reliable records, either direction turns into a manual investigation across production logs, databases, and spreadsheets. With them, the manufacturer queries the relevant identifiers and gets the affected scope directly.</p><p>The same connected history speeds up root-cause analysis. When a component fails final test, a quality engineer starts at its identifier and works backward. Which material batch went into it? Which machine and station handled it? What were the process parameters, and did other parts from the same window show similar results? That makes traceability an engineering tool rather than a compliance checkbox.</p><p>It also works proactively. If failures start increasing on one assembly line, engineers compare failed parts against machine parameters, tooling changes, and operating conditions. When a process parameter drifts outside its normal range, teams catch the trend before it produces a large batch of defective parts.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/images/cta/book-a-demo.png" alt="Walk through your FlowFuse setup with our team - book a demo"/></a><h2 id="where-traceability-starts-incoming-material">Where Traceability Starts: Incoming Material</h2><p>Most traceability projects begin at the first production station, which is one station too late. The chain has to start at receiving, because that is where the plant takes custody of material whose history it did not record.</p><p>When a shipment arrives, the plant captures the supplier, the supplier's lot or batch number, the material certificate where one applies, the quantity, and the date. That record becomes the top of the genealogy chain, and every part built from that material inherits the link. Skip it, and forward traceability stops at the plant boundary: you can prove which vehicles used lot <code>B-184</code>, but not who supplied <code>B-184</code> or what else arrived alongside it.</p><p>This is the line between internal and external traceability. Internal covers everything inside the plant, from receiving through production and shipping. External extends the chain across organizational boundaries, so a Tier 1 supplier can answer questions about material that came from a Tier 2 supplier. Recall investigations almost always need both, which is why label and identification standards matter: a code applied at a Tier 2 plant has to stay readable at the Tier 1 plant and again at the OEM.</p><p>Incoming material also brings the batch-versus-unit question forward. A supplier may ship serialized components, or a lot of bulk material with one identifier covering thousands of pieces. Whatever granularity arrives at the dock sets the floor for how precisely the plant can trace anything built from it.</p><h2 id="what-data-needs-to-be-tracked">What Data Needs to Be Tracked?</h2><p>A traceability system is only as useful as the data connected to each part. Requirements vary, but a few categories show up almost everywhere.</p><p>Part identity is the starting point: a <a href="https://flowfuse.com/blog/2025/11/building-label-scanner-with-flowfuse/">serial number, Data Matrix code, or RFID tag</a> that links a physical component to its digital record. Automotive commonly uses direct part marking, where a laser or dot-peen head cuts the code into the component itself so it survives washing, painting, and handling. Production information describes where and when the plant processed the part, covering line, workstation, machine, operator, and timestamp. Process data adds detail about the operation itself, which might mean torque, pressure, temperature, or cycle time. <a href="https://flowfuse.com/blog/2026/08/statistical-process-control/">Quality data</a> records whether the part passed its inspections and tests. Material and batch information connects the finished component back to its source, which matters most when a supplier batch later turns out to have a problem.</p><p>Not every part warrants a serial number. Safety-critical and high-value components such as airbags, brake assemblies, and battery packs usually get unit-level identity, while fasteners, adhesives, and bulk materials stay at batch or lot level. Choosing the wrong granularity costs money in both directions: serializing everything adds marking and scanning time at every station, while batch-tracking a safety-critical part widens the containment scope when something goes wrong.</p><p>None of these datasets should sit in isolation. The goal is to establish relationships between them, so a vehicle connects to an assembly, which connects to a component, a production step, a machine, its process data, and the resulting quality result.</p><h2 id="why-connecting-the-factory-is-the-hard-part">Why Connecting the Factory Is the Hard Part</h2><p>The information traceability requires comes from systems that nobody designed to work together. A PLC holds machine states and process values. A scanner identifies the part. A vision system produces an inspection result. An MES manages production information while a database holds historical records. Each works fine on its own.</p><p>A tightening controller may report that an operation finished at 10:42:13 with a torque value of 42 Nm. A scanner may have identified the part as <code>BRK-10482</code> moments earlier. The traceability system has to establish that those two events belong together, which means treating machine connectivity, timestamps, identifiers, and storage as one workflow rather than five separate projects.</p><p>The problem compounds because one line often includes equipment from several vendors, each exposing information differently. One machine speaks <a href="https://flowfuse.com/blog/2025/07/reading-and-writing-plc-data-using-opc-ua">OPC UA</a>, another communicates over <a href="https://flowfuse.com/blog/2025/10/using-ethernet-ip-with-flowfuse/">EtherNet/IP</a>, and other equipment publishes through <a href="https://flowfuse.com/blog/2024/06/how-to-use-mqtt-in-node-red/">MQTT</a> or exposes a vendor interface of its own.</p><p>None of this requires replacing the existing <a href="https://flowfuse.com/blog/2025/06/what-is-mes/">MES</a>, <a href="https://flowfuse.com/use-cases/scada/">SCADA</a>, <a href="https://flowfuse.com/landing/plc/">PLCs</a>, or vendor systems. FlowFuse acts as a low-code <a href="https://flowfuse.com/use-cases/it-ot-middleware/">IT/OT integration layer</a> between them, connecting machines, protocols, databases, and MES platforms without a rip-and-replace project. Rather than pushing every piece of machine data into a central system, workflows process and route information when relevant production events occur.</p><h2 id="associating-production-data-with-individual-parts">Associating Production Data With Individual Parts</h2><p>Collecting machine data is only half the problem. The system also needs to know which part that data belongs to, and a unique identifier provides the answer.</p><p>Take a simple assembly station. A scanner reads <code>PART-84721</code>, and the station opens an active context for that part. The identifier also selects the tightening program, so the tool runs the limits that belong to this specific assembly and stays locked until a valid scan arrives. When the operation finishes, the stored record shows part <code>PART-84721</code> at station <code>Assembly-04</code>, tightened under program 7, with a torque of 42.1 Nm, an angle of 87.4°, an <code>OK</code> result, and a timestamp of 10:42:13.</p><p><img alt="Diagram showing a scanner sending part ID PART-84721 to a station PLC, which selects the program and enables a tightening controller over fieldbus and receives an OK or NOK status. FlowFuse reads the part ID from the PLC over OPC UA and exchanges the identifier and results with the tightening controller over Open Protocol, then writes one record to data storage, which an operational application uses for genealogy lookup and containment." src="https://flowfuse.com/blog/2026/08/images/station-data-flow.png"/><em>A scan opens the context; the tightening result lands against the part that was scanned.</em></p><p>Notice that the values arrive from two different systems. The identifier lives in the station controller, the torque and the verdict live in the tightening controller, and neither one means much without the other. That record is far more useful than an isolated 42.1 Nm reading, because the identifier supplies the context. A FlowFuse workflow handles the logic directly: take the identifier, collect the values from the relevant equipment, transform them into the required structure, and route the record to its destination.</p><p>The same identity check also enables error-proofing. If a part reaches station 5 without a passing record from station 4, the workflow blocks the operation instead of adding another entry to a history nobody reads until a recall. Traceability that only records is a reporting system. Traceability that interlocks stations stops defects from moving down the line.</p><h2 id="building-part-genealogy">Building Part Genealogy</h2><p>Once manufacturers connect production records, they can build part genealogy, which describes the relationships between a finished product and everything that contributed to it.</p><p>Vehicle A contains battery pack 1042, which contains module M-07, built from cell lot <code>B-184</code> supplied by cell supplier X. Line 3 and station 7 are not links in that chain. They belong to the point where one item was consumed into another, recorded alongside the timestamp, operator, and result.</p><p><img alt="Vertical chain showing part genealogy: a vehicle identified by VIN contains battery pack serial 1042, which contains battery module M-07, which contains cells from lot B-184 supplied by an external cell supplier. Arrows show the chain can be read upward to find what went into a unit or downward to find where a lot was used." src="https://flowfuse.com/blog/2026/08/images/part-genealogy.png"/><em>Genealogy links a finished vehicle to the components and suppliers behind it, and reads in both directions.</em></p><p>The chain reads both ways. Trace back from a returned vehicle to find every component behind it, or forward from a defective cell lot to find which modules used it, which packs took those modules, and which vehicles received those packs. The same principle applies down to individual fastening operations, welds, and inspection points.</p><p>Notice also where the identifiers change type. The vehicle carries a VIN and the pack and module carry serial numbers, so each one is traceable as a single unit. The cells carry a lot number, so they are traceable as a batch. Where serialization stops is where containment scope widens.</p><h2 id="structuring-and-storing-traceability-data">Structuring and Storing Traceability Data</h2><p>Genealogy only works if the <a href="https://flowfuse.com/blog/2025/06/structuring-storing-data-mes-integration/">underlying data has structure</a>. A traceability database typically holds parts and serial numbers, production orders, workstations, machines, process steps, materials and batches, measurements, quality results, and timestamps, and the relationships between those records matter as much as the values themselves. A production event that references a part ID, station ID, process ID, and timestamp lets someone reconstruct the history later without duplicating information across systems.</p><p>FlowFuse transforms and routes production data into the platform a manufacturer already runs, so teams structure information to fit their existing architecture instead of forcing every production system into one storage technology.</p><p>High-volume environments usually separate real-time operational data from long-term historical data. Real-time data supports production monitoring and immediate decisions, while historical data stays available for quality analysis, audits, and investigations. Retention is worth settling early, because customer contracts and regulatory requirements often set it rather than leaving it to the plant.</p><h2 id="scaling-traceability-across-production-lines">Scaling Traceability Across Production Lines</h2><p>A solution that works at one station becomes hard to manage once it spreads across an entire factory. Different lines carry different equipment, protocols, and processes, while manufacturers still want one consistent approach to collecting production information.</p><p>Instead of running a separate integration project for every line, manufacturers can <a href="https://flowfuse.com/landing/building-and-scaling-industrial-applications/">establish reusable workflows and deployment patterns</a>. FlowFuse provides centralized management for industrial applications across production environments, which helps teams move past one-off integrations as applications reach multiple lines or plants. Workflows still adapt to the equipment at each site while following common patterns for deployment, management, and governance.</p><h2 id="final-thoughts">Final Thoughts</h2><p>Automotive traceability is about more than knowing where a part came from. It makes production observable enough that manufacturers understand what happened, when it happened, and how the events connect.</p><p>That takes more than collecting data. Manufacturers need to connect machines and assets, move information between protocols and systems, structure the result, and deliver it to the people and applications that depend on it. An event-driven integration layer like FlowFuse supplies that connective tissue without replacing the systems already running the factory.</p><p>The payoff is an architecture that grows with the operation, from one station to a full line and eventually across multiple plants. When every relevant production event connects to the part it belongs to, manufacturers gain a complete, searchable history of how their products were made. The next time a quality issue appears, they are no longer asking what happened. They can start answering it.</p><p><strong>Build Traceability On the Systems You Already Run</strong></p><p>Connect PLCs, scanners, inspection systems, and databases into production workflows you can deploy across every line with FlowFuse.</p><p><a href="https://flowfuse.com/contact-us/">Contact Us</a></p>]]></content>
        <updated>2026-08-19T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/automotive-traceability/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/layered-process-audit/</id>
        <title>What Is a Layered Process Audit (LPA)?</title>
        <summary>A layered process audit (LPA) is a structured way to verify critical manufacturing process controls through regular checks by different levels of management.</summary>
        <content type="html"><![CDATA[<p>Manufacturing problems are often found after production rather than where they start. A machine setting may be wrong, a process step may be skipped, or a critical control may no longer be followed.</p><p>A <strong>Layered Process Audit (LPA)</strong> helps manufacturers catch these problems earlier by regularly checking critical process controls while production is running.</p><p>This guide explains what an LPA is, how the layers work, and how manufacturers use them on the shop floor. As LPA programs grow, digitizing audits can make it easier to capture findings, track corrective actions, and connect audit results with production data.</p><a href="https://app.flowfuse.com/account/create"><img src="https://flowfuse.com/blog/2026/08/images/lpa-cta-1.png" alt="Turn Shop-Floor Audits Into Actionable Data"/></a><h2 id="what-is-a-layered-process-audit">What Is a Layered Process Audit?</h2><p>A <strong>Layered Process Audit (LPA)</strong> is a structured, process-focused audit in which personnel at different levels of an organization systematically verify that critical manufacturing processes, controls, and work practices conform to defined requirements and standards.</p><p>Instead of inspecting finished parts, an LPA checks the process itself. An auditor observes the operation and verifies selected controls such as machine settings, standard work, tooling, materials, or error-proofing.</p><p>The <strong>layers</strong> are different levels of management. A supervisor may check a process daily, an area manager weekly, and plant leadership monthly.</p><p>The layers are not different stages of production. They are different levels of oversight.</p><p>LPAs are widely used in <a href="https://flowfuse.com/industries/automotive/">automotive manufacturing</a> and other industries where consistent process control is important. They complement formal process and product audits rather than replacing them.</p><h2 id="how-do-lpa-layers-work">How Do LPA Layers Work?</h2><p>Each layer checks important process controls at a different frequency.</p><table><thead><tr><th>Layer</th><th>Typical role</th><th>Typical frequency</th></tr></thead><tbody><tr><td>Layer 1</td><td>Supervisor / Team leader</td><td>Daily</td></tr><tr><td>Layer 2</td><td>Area manager</td><td>Weekly</td></tr><tr><td>Layer 3</td><td>Plant manager / Director</td><td>Monthly</td></tr></tbody></table><p>These frequencies are common starting points, not universal requirements. Manufacturers can adjust them based on process risk.</p><p><img alt="Three layered process audit levels: Layer 1 Supervisor daily, Layer 2 Area Manager weekly, and Layer 3 Plant Leadership monthly, all checking the same critical controls at the same station." data-zoomable="" src="https://flowfuse.com/blog/2026/08/images/layered-process-audit-level.png"/></p><p>Layer 1 is closest to the operation and focuses on whether the process is being followed as defined.</p><p>Layer 2 provides broader oversight across production areas and can identify recurring findings or problems that were not resolved.</p><p>Layer 3 looks across the plant to identify patterns and verify that important issues are being addressed.</p><p>The same critical controls can therefore be checked regularly by people with different levels of responsibility.</p><h2 id="layered-process-audit-example">Layered Process Audit Example</h2><p>Consider an automotive assembly station where a component must be tightened to a defined torque.</p><ol><li><strong>Select the process.</strong> Start with a high-risk operation such as one with customer complaints, scrap, rework, safety exposure, or critical process parameters. A <a href="https://flowfuse.com/blog/2025/08/pareto-chart-manufacturing-guide/">Pareto chart</a> is a useful way to identify the stations causing the largest share of defects.</li><li><strong>Create the checklist.</strong> Use the <a href="https://www.aiag.org/quality/automotive-core-tools/fmea" rel="nofollow">PFMEA</a>, control plan, work instructions, and recent quality issues. Ten to fifteen objective questions is usually enough.</li><li><strong>Define the schedule.</strong> Decide which layer audits each area and how often.</li><li><strong>Train the auditors.</strong> Auditors should observe the process, ask factual questions, and record evidence rather than opinions.</li><li><strong>Perform the audit at the station.</strong> Watch the operation and record answers while standing at the workstation.</li><li><strong>Correct immediate issues.</strong> Fix simple problems during the audit whenever possible.</li><li><strong>Assign <a href="https://flowfuse.com/blog/2026/09/capa-corrective-preventive-action/">corrective actions</a>.</strong> Give each finding an owner and a due date.</li><li><strong>Verify closure.</strong> Confirm that the action was completed and remains effective during the next audit cycle.</li></ol><p>The supervisor corrects the setting and records the finding. During a later Layer 2 audit, the area manager checks the same control and confirms that the tool is still being used within the required range.</p><p>If similar findings appear on other stations, plant leadership can identify a wider problem with tool settings or process control.</p><p>This illustrates the purpose of an LPA: <strong>find process deviations close to where they happen and use different management layers to keep critical controls in place.</strong></p><h2 id="how-to-run-a-layered-process-audit">How to Run a Layered Process Audit</h2><p>An LPA can be straightforward when it focuses on the controls that matter most.</p><h3 id="identify-the-process">Identify the Process</h3><p>Start with a process where regular verification is valuable, such as one with recurring defects, high scrap or rework, customer complaints, or critical process parameters. A <a href="https://flowfuse.com/blog/2025/08/pareto-chart-manufacturing-guide/">Pareto chart</a> can help identify where problems are concentrated.</p><h3 id="define-what-to-verify">Define What to Verify</h3><p>Use information from the PFMEA, <a href="https://flowfuse.com/blog/2026/08/control-plans">control plan</a>, <a href="https://flowfuse.com/blog/2026/07/digital-work-instruction/">work instructions</a>, and previous quality problems to identify the critical controls. Our <a href="https://flowfuse.com/blog/2026/09/layered-process-audit-checklist-template/">LPA checklist template</a> has example questions to help you get started.</p><h3 id="assign-the-layers">Assign the Layers</h3><p>Decide which management level will perform the audit and how often. Higher-risk processes may need more frequent checks.</p><h3 id="perform-the-audit-at-the-workstation">Perform the Audit at the Workstation</h3><p>The auditor observes the actual operation and records whether the defined requirements are being followed.</p><h3 id="correct-and-follow-up">Correct and Follow Up</h3><p>Simple problems can be corrected immediately. Other findings should have an owner and due date, with a later audit confirming that the issue has been resolved.</p><p>An LPA should be short enough to fit into normal shop-floor activity. If it becomes a lengthy inspection, its scope is probably too broad.</p><h2 id="common-lpa-problems">Common LPA Problems</h2><p>An LPA program can lose its value when the audit becomes a paperwork exercise.</p><p>Pencil-whipping is one common problem: an audit is marked complete without the auditor actually checking the process.</p><p>Another is repeat findings. If the same problem appears in every audit but nothing changes, the organization is recording the problem without solving it.</p><p>Missed management layers can also weaken the program. If higher-level managers stop performing their audits, the additional oversight disappears.</p><p>Finally, the audit criteria can become outdated when the process changes. LPA questions should be reviewed periodically to make sure they still focus on current process risks.</p><h2 id="lpa-vs-process-audit">LPA vs. Process Audit</h2><p>An LPA and a process audit both examine manufacturing processes, but they are used differently.</p><table><thead><tr><th></th><th>Layered Process Audit</th><th>Process Audit</th></tr></thead><tbody><tr><td>Frequency</td><td>Frequent</td><td>Usually less frequent</td></tr><tr><td>Scope</td><td>Selected critical controls</td><td>Broader process</td></tr><tr><td>Auditors</td><td>Multiple management levels</td><td>Typically trained auditors</td></tr><tr><td>Purpose</td><td>Routine process verification</td><td>Detailed process evaluation</td></tr></tbody></table><p>An LPA provides frequent checks of important controls, while a process audit provides a deeper assessment of the overall process.</p><h2 id="digitizing-layered-process-audits">Digitizing Layered Process Audits</h2><p>Manufacturers can start an LPA program with paper forms or spreadsheets, but managing audits and findings becomes harder as the program grows.</p><p>A digital LPA can help schedule audits, record findings, notify responsible people, and track actions through closure.</p><p>Connecting the audit with production data provides another benefit. With FlowFuse, manufacturers can connect an LPA application to machines, <a href="https://flowfuse.com/landing/plc/">PLCs</a>, sensors, <a href="https://flowfuse.com/docs/node-red/database/">databases</a>, and other industrial systems.</p><p>This allows audit results to be viewed alongside production information such as downtime, machine states, or process parameters. Instead of only recording that a process failed, teams can investigate what was happening around the failure.</p><p>With <a href="https://flowfuse.com/platform/dashboard">FlowFuse Dashboard</a>, manufacturers can build applications to record audit results, track findings, and visualize them alongside operational data.</p><p><strong>Digitize your shop-floor audits</strong></p><p>Talk to us about building LPA forms, alerts, and corrective action tracking on your existing industrial data infrastructure.</p><p><a href="https://flowfuse.com/contact-us/">Contact Us</a></p>]]></content>
        <updated>2026-08-14T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/layered-process-audit/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/connect-agvs-vda-5050-mqtt/</id>
        <title>VDA 5050 Tutorial: Connect AGVs to Factory Systems over MQTT</title>
        <summary>VDA 5050 explained: how the standard structures AGV communication over MQTT, and how to build a working master control flow in FlowFuse.</summary>
        <content type="html"><![CDATA[<p>If you run AGVs from more than one vendor, you already know the problem. Each vendor ships its own fleet manager. Those fleet managers don't talk to each other.</p><p>Two fleets under separate control can't share an intersection. So you either accept deadlocks, or you split the floor into separate lanes and waste space. Each fleet manager also needs its own link to your ERP, MES, or WMS. Adding a vehicle from a new vendor means <a href="https://flowfuse.com/blog/2024/11/why-point-to-point-connection-is-dead/">another integration project</a>. And because no single system sees all the work, one vendor's AGVs sit idle while the other's are backed up.</p><p>VDA 5050 solves that. FlowFuse gives you somewhere to build the master control system that uses it.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/images/cta/book-a-demo.png" alt="Walk through your FlowFuse setup with our team - book a demo"/></a><h2 id="why-vda-5050">Why VDA 5050?</h2><p>VDA 5050 is an open communication standard. The VDA (the German automotive association) and the VDMA (the machinery association) publish it together. The Institute for Material Handling and Logistics (IFL) at KIT leads the technical work.</p><p>It first appeared in 2019. It sets out how a master control system sends transport orders to a vehicle, and how that vehicle reports back. Messages travel over MQTT as JSON.</p><p>Most AGVs and AMRs on factory floors today speak the 2.x version. Version 3.0 came out on 19 March 2026 and adds support for freely navigating robots.</p><h3 id="one-interface-any-vehicle">One interface, any vehicle</h3><p>A master control system that speaks VDA 5050 can drive vehicles from different makers. You don't write a new integration for each one.</p><p>The standard fixes the message contract, not the vehicle. How an AGV avoids obstacles or plans its path is still up to the manufacturer. What you get is a shared order format and a shared status format.</p><p>If you already run <a href="https://flowfuse.com/blog/2026/06/mqtt-vs-sparkplug-b/">Sparkplug B</a> on the same broker, the two solve different problems. Sparkplug standardizes telemetry from any device. VDA 5050 standardizes a command-and-report contract for one class of device, so it says what an order looks like as well as what a status message looks like.</p><p>Safety stays out of scope. Emergency stops and person detection live on the vehicle and follow standards like ISO 3691-4. VDA 5050 reports safety state. It does not implement it.</p><h3 id="real-detail-not-just-a-heartbeat">Real detail, not just a heartbeat</h3><p>The messages carry operational data. A <code>state</code> message includes position, battery charge, order progress, and any active errors. An <code>order</code> describes a route of nodes and edges with actions attached, such as pick, drop, wait, or charge.</p><p>That detail is what lets master control make dispatch decisions, instead of just knowing a vehicle is online.</p><h3 id="built-on-mqtt">Built on MQTT</h3><p>MQTT suits a fleet well. It is lightweight, it uses <a href="https://flowfuse.com/blog/2024/06/how-to-use-mqtt-in-node-red/">publish and subscribe</a>, and it copes with devices that drop off the network. Vehicles report when something changes rather than waiting to be polled, which is <a href="https://flowfuse.com/blog/2026/02/what-is-event-driven-architecture-in-manufacturing/">event-driven architecture</a> applied to a floor full of moving hardware.</p><p>Every VDA 5050 topic follows the same pattern. So one wildcard subscription hears from every vehicle on the floor, whoever built it.</p><h2 id="the-six-topics">The six topics</h2><table><thead><tr><th>Topic</th><th>Sent by</th><th>Read by</th><th>What it carries</th></tr></thead><tbody><tr><td><code>order</code></td><td>Master control</td><td>AGV</td><td>A route of nodes and edges, with actions</td></tr><tr><td><code>instantActions</code></td><td>Master control</td><td>AGV</td><td>Immediate commands: pause, resume, cancel, start charging</td></tr><tr><td><code>state</code></td><td>AGV</td><td>Master control</td><td>Full status: position, battery, order progress, errors</td></tr><tr><td><code>visualization</code></td><td>AGV</td><td>Map displays</td><td>Position and velocity only, sent more often than <code>state</code></td></tr><tr><td><code>connection</code></td><td>AGV, or the broker for it</td><td>Master control</td><td>Online and offline at the MQTT level</td></tr><tr><td><code>factsheet</code></td><td>AGV</td><td>Master control</td><td>What the vehicle can do: size, load types, supported actions</td></tr></tbody></table><p>Both <code>state</code> and <code>visualization</code> carry position. That is on purpose.</p><p><code>state</code> is the full picture. A vehicle sends it when something changes, and at least once every 30 seconds. <code>visualization</code> is a small message with just position and velocity, so it can go out far more often, typically once a second or faster.</p><p>Use <code>state</code> for anything master control acts on. Use <code>visualization</code> only to draw a smooth live map. Note that <code>visualization</code> is optional in the standard, so some vehicles never send it. Version 3.0 widens its job: it now carries the planned path too, so traffic control can read it rather than just a map display.</p><h3 id="how-topics-are-named">How topics are named</h3><pre class="language-text" code="&lt;interfaceName&gt;/&lt;majorVersion&gt;/&lt;manufacturer&gt;/&lt;serialNumber&gt;/&lt;topic&gt;
" language="text"><code __ignore-map="">&lt;interfaceName&gt;/&lt;majorVersion&gt;/&lt;manufacturer&gt;/&lt;serialNumber&gt;/&lt;topic&gt;
</code></pre><p>For example: <code>uagv/v2/AcmeRobotics/AGV-042/state</code></p><p><code>uagv</code> is the interface name the standard uses in its own examples, and most people read it as short for "universal AGV". The standard itself only calls it the name of the interface, and each site can set its own. But nearly every 2.x deployment uses <code>uagv</code>, including the vehicles you are likely to buy. Treat it as fixed unless the vehicle's manual says otherwise.</p><p>The same caveat applies to the levels around it. The standard mandates the topic names in the final segment, <code>order</code>, <code>state</code>, and so on. It calls the <a href="https://flowfuse.com/blog/2025/01/designing-topic-hierarchy-for-your-uns/">five-level structure</a> a suggestion for a local broker, because cloud brokers impose their own topic rules. On-premise fleets follow it anyway, so build against it and adapt only if your broker forces you to.</p><p>The version segment is the major version only. So <code>v2</code>, not <code>v2.0.0</code>. The full version number goes in the <code>version</code> field inside the payload.</p><p>Because the maker and serial number sit in the topic, master control can subscribe once to <code>uagv/v2/+/+/state</code> and hear from every vehicle. Restrict each vehicle to its own topic path, using an allowlist on your broker.</p><h3 id="a-note-on-version-30">A note on version 3.0</h3><p>This tutorial uses version 2.x names, because that is what most vehicles speak today. Version 3.0 renames a lot:</p><ul><li>The example topic prefix moves to <code>vda5050/v3/...</code></li><li><code>agvPosition</code> becomes <code>mobileRobotPosition</code></li><li><code>batteryState</code> becomes <code>powerSupply</code>, and <code>batteryCharge</code> becomes <code>stateOfCharge</code></li><li><code>positionInitialized</code> becomes <code>localized</code></li><li><code>safetyState.eStop</code> becomes <code>activeEmergencyStop</code>, and the <code>AUTOACK</code> value is gone</li><li><code>actionStates</code> splits into <code>actionStates</code>, <code>instantActionStates</code>, and <code>zoneActionStates</code>, each cleared by its own instant action</li><li>Edges drop <code>startNodeId</code> and <code>endNodeId</code>. Position in the sequence alone now says which nodes an edge connects</li><li>Errors gain two levels, <code>CRITICAL</code> and <code>URGENT</code></li><li>Every robot must support <code>startPause</code>, <code>stopPause</code>, and <code>cancelOrder</code></li><li><code>timestamp</code> moves from hundredths of a second to milliseconds</li><li>Version 3.0 adds two optional topics, <code>zoneSet</code> and <code>responses</code>, and a fourth blocking type, <code>SINGLE</code></li><li><code>CONNECTIONBROKEN</code> becomes <code>CONNECTION_BROKEN</code>, and <code>HIBERNATING</code> is added</li><li>It also adds the operating modes <code>STARTUP</code> and <code>INTERVENED</code></li><li>The wording changes from "AGV" to "mobile robot" throughout</li></ul><p>Version 3.0 also strips abbreviations out of parameter names across the whole document, which is a breaking change. The <a href="https://github.com/VDA5050/VDA5050/releases/tag/3.0.0" rel="nofollow">3.0.0 release notes</a> link a <a href="https://github.com/VDA5050/VDA5050/pull/465" rel="nofollow">table of every rename</a>, so check that before you port a 2.x integration.</p><p>If your vehicle ships with 3.0 support, swap the names. The topic structure and the ideas below stay the same.</p><h3 id="what-a-state-message-looks-like">What a state message looks like</h3><pre class="language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight" code="{
  "headerId": 42,
  "timestamp": "2026-08-10T09:15:00.000Z",
  "version": "2.1.0",
  "manufacturer": "AcmeRobotics",
  "serialNumber": "AGV-042",
  "orderId": "order-1001",
  "orderUpdateId": 0,
  "lastNodeId": "node7",
  "lastNodeSequenceId": 6,
  "nodeStates": [
    { "nodeId": "node8", "sequenceId": 8, "released": true }
  ],
  "edgeStates": [
    { "edgeId": "node7-8", "sequenceId": 7, "released": true }
  ],
  "agvPosition": {
    "x": 12.4,
    "y": 3.1,
    "theta": 0.0,
    "mapId": "floor1",
    "positionInitialized": true
  },
  "velocity": { "vx": 0.5, "vy": 0.0, "omega": 0.0 },
  "batteryState": { "batteryCharge": 76.5, "charging": false },
  "driving": true,
  "actionStates": [
    { "actionId": "drop-42", "actionStatus": "WAITING" }
  ],
  "operatingMode": "AUTOMATIC",
  "errors": [],
  "safetyState": { "eStop": "NONE", "fieldViolation": false }
}
" language="json" meta="" style=""><code __ignore-map=""><span class="line" line="1"><span class="sMK4o">{
</span></span><span class="line" line="2"><span class="sMK4o">  "</span><span class="spNyl">headerId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 42</span><span class="sMK4o">,
</span></span><span class="line" line="3"><span class="sMK4o">  "</span><span class="spNyl">timestamp</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">2026-08-10T09:15:00.000Z</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="4"><span class="sMK4o">  "</span><span class="spNyl">version</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">2.1.0</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="5"><span class="sMK4o">  "</span><span class="spNyl">manufacturer</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">AcmeRobotics</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="6"><span class="sMK4o">  "</span><span class="spNyl">serialNumber</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">AGV-042</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="7"><span class="sMK4o">  "</span><span class="spNyl">orderId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">order-1001</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="8"><span class="sMK4o">  "</span><span class="spNyl">orderUpdateId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 0</span><span class="sMK4o">,
</span></span><span class="line" line="9"><span class="sMK4o">  "</span><span class="spNyl">lastNodeId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">node7</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="10"><span class="sMK4o">  "</span><span class="spNyl">lastNodeSequenceId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 6</span><span class="sMK4o">,
</span></span><span class="line" line="11"><span class="sMK4o">  "</span><span class="spNyl">nodeStates</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> [
</span></span><span class="line" line="12"><span class="sMK4o">    {</span><span class="sMK4o"> "</span><span class="sBMFI">nodeId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">node8</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">sequenceId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 8</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">released</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> true</span><span class="sMK4o"> }
</span></span><span class="line" line="13"><span class="sMK4o">  ],
</span></span><span class="line" line="14"><span class="sMK4o">  "</span><span class="spNyl">edgeStates</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> [
</span></span><span class="line" line="15"><span class="sMK4o">    {</span><span class="sMK4o"> "</span><span class="sBMFI">edgeId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">node7-8</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">sequenceId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 7</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">released</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> true</span><span class="sMK4o"> }
</span></span><span class="line" line="16"><span class="sMK4o">  ],
</span></span><span class="line" line="17"><span class="sMK4o">  "</span><span class="spNyl">agvPosition</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> {
</span></span><span class="line" line="18"><span class="sMK4o">    "</span><span class="sBMFI">x</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 12.4</span><span class="sMK4o">,
</span></span><span class="line" line="19"><span class="sMK4o">    "</span><span class="sBMFI">y</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 3.1</span><span class="sMK4o">,
</span></span><span class="line" line="20"><span class="sMK4o">    "</span><span class="sBMFI">theta</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 0.0</span><span class="sMK4o">,
</span></span><span class="line" line="21"><span class="sMK4o">    "</span><span class="sBMFI">mapId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">floor1</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="22"><span class="sMK4o">    "</span><span class="sBMFI">positionInitialized</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> true
</span></span><span class="line" line="23"><span class="sMK4o">  },
</span></span><span class="line" line="24"><span class="sMK4o">  "</span><span class="spNyl">velocity</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> {</span><span class="sMK4o"> "</span><span class="sBMFI">vx</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 0.5</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">vy</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 0.0</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">omega</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 0.0</span><span class="sMK4o"> },
</span></span><span class="line" line="25"><span class="sMK4o">  "</span><span class="spNyl">batteryState</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> {</span><span class="sMK4o"> "</span><span class="sBMFI">batteryCharge</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI"> 76.5</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">charging</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> false</span><span class="sMK4o"> },
</span></span><span class="line" line="26"><span class="sMK4o">  "</span><span class="spNyl">driving</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> true,
</span></span><span class="line" line="27"><span class="sMK4o">  "</span><span class="spNyl">actionStates</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> [
</span></span><span class="line" line="28"><span class="sMK4o">    {</span><span class="sMK4o"> "</span><span class="sBMFI">actionId</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">drop-42</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">actionStatus</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">WAITING</span><span class="sMK4o">"</span><span class="sMK4o"> }
</span></span><span class="line" line="29"><span class="sMK4o">  ],
</span></span><span class="line" line="30"><span class="sMK4o">  "</span><span class="spNyl">operatingMode</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">AUTOMATIC</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="31"><span class="sMK4o">  "</span><span class="spNyl">errors</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> [],
</span></span><span class="line" line="32"><span class="sMK4o">  "</span><span class="spNyl">safetyState</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> {</span><span class="sMK4o"> "</span><span class="sBMFI">eStop</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">NONE</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o"> "</span><span class="sBMFI">fieldViolation</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o"> false</span><span class="sMK4o"> }
</span></span><span class="line" line="33"><span class="sMK4o">}
</span></span></code></pre><p>That vehicle is driving from <code>node7</code> to <code>node8</code>, with a drop waiting at the end of it. Three things to know before you write code against this.</p><p><strong>Some fields are always there.</strong> <code>orderId</code>, <code>orderUpdateId</code>, <code>lastNodeId</code>, <code>lastNodeSequenceId</code>, <code>nodeStates</code>, <code>edgeStates</code>, <code>driving</code>, <code>actionStates</code>, <code>batteryState</code>, <code>operatingMode</code>, <code>errors</code>, and <code>safetyState</code> are required. An idle vehicle sends empty <code>nodeStates</code> and <code>edgeStates</code> arrays. It does not drop the fields.</p><p><strong>Position is not, but read the exception carefully.</strong> <code>agvPosition</code> and <code>velocity</code> are optional. The standard only lets a vehicle omit <code>agvPosition</code> if it cannot localize itself at all, such as a line-guided AGV. A vehicle that can localize but hasn't finished yet still sends the field, with <code>positionInitialized</code> set to <code>false</code>.</p><p>So master control needs two checks, not one. Confirm <code>agvPosition</code> is there, then confirm <code>positionInitialized</code> is <code>true</code> before you trust the numbers. Code like <code>msg.payload.agvPosition.x</code> crashes on a line-guided vehicle. Code that skips the second check will route a truck using coordinates the truck itself doesn't stand behind.</p><p><strong>Watch the <a href="https://flowfuse.com/blog/2026/07/time-synchronization-edge-devices/">timestamp</a> precision.</strong> 2.x writes <code>timestamp</code> with hundredths of a second, while JavaScript's <code>toISOString()</code> gives you milliseconds. Vehicles accept it in practice, and 3.0 moves to milliseconds officially, but a strict schema validator flags it.</p><p>The standard ships <a href="https://github.com/VDA5050/VDA5050/tree/main/json_schemas" rel="nofollow">JSON schemas</a> for all six topics. Point a validator at them and you can check a payload before you send it, rather than finding out from the vehicle.</p><h2 id="build-it">Build it</h2><h3 id="what-you-need">What you need</h3><ul><li>A running FlowFuse instance on your edge device. If you do not have an account, <a href="https://app.flowfuse.com/account/create" rel="nofollow">sign up for a free trial</a> and set up your instance following the instructions in this <a href="https://flowfuse.com/docs/device-agent/quickstart/">guide</a>.</li><li>An MQTT broker your AGVs (or an AGV simulator) already publish to, or FlowFuse's <a href="https://flowfuse.com/docs/user/teambroker/">built-in team broker</a> if you're prototyping. If you're still <a href="https://flowfuse.com/blog/2024/01/unified-namespace-what-broker/">choosing a broker</a>, any one with retained messages, last will, and per-client topic permissions will do.</li><li>At least one vehicle or simulator publishing VDA 5050 topics, so you have real messages to work with.</li></ul><h3 id="step-1-connect-to-your-broker">Step 1: Connect to your broker</h3><ol><li>Drag an <strong>mqtt in</strong> node onto the canvas. Double-click it.</li><li>Click the pencil icon next to <strong>Server</strong> to add a broker.</li><li>Enter your broker's host and port. <a href="https://flowfuse.com/blog/2024/11/getting-the-most-out-of-mqtt-for-industrial-iot/">Use 8883 and tick <strong>Use TLS</strong></a> on the <strong>Connection</strong> tab. Only use plain port 1883 on an isolated test network.</li><li>On the same tab, set <strong>Keep alive</strong> to 15 seconds. The standard suggests around that, because the keep alive decides how fast the broker notices a vehicle has vanished. Node-RED defaults to 60, which leaves a dead AGV looking alive for up to a minute and a half.</li><li>If your broker needs a login, open the <strong>Security</strong> tab and enter the username and password.</li><li>Leave the topic empty for now. You'll fill it in next.</li></ol><p>The <a href="https://flowfuse.com/docs/user/mqtt-nodes/">FlowFuse MQTT nodes</a> replace steps 2 to 5 if you're pointing at the <a href="https://flowfuse.com/docs/user/teambroker/">FlowFuse broker</a>. They create the client and fill in the credentials themselves.</p><h3 id="step-2-subscribe-to-fleet-state">Step 2: Subscribe to fleet state</h3><ol><li>In the <strong>mqtt in</strong> node, set <strong>Topic</strong> to <code>uagv/v2/+/+/state</code>. Each <code>+</code> stands for one topic level. Here they cover manufacturer and serial number, so this one subscription picks up every vehicle.</li><li>Set <strong>QoS</strong> to 0. VDA 5050 asks for QoS 0 on <code>order</code>, <code>instantActions</code>, <code>state</code>, <code>factsheet</code>, and <code>visualization</code>, and QoS 1 only on <code>connection</code>. Setting a higher QoS on your side doesn't help anyway. MQTT delivers at the lower of the two values.</li><li>Set <strong>Output</strong> to "a parsed JSON object". You then get a JavaScript object instead of raw bytes. If a vehicle sends broken JSON, the node logs an error and drops the message.</li><li>Add a <strong>function</strong> node (the one from step 3 below) and a <strong>debug</strong> node after it.</li><li>Deploy. Check that the <strong>mqtt in</strong> node says "connected", then watch messages arrive in the debug sidebar.</li></ol><pre class="language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight" code="[{"id":"vda-mqtt-in","type":"mqtt in","z":"vda-flow","name":"Fleet state","topic":"uagv/v2/+/+/state","qos":"0","datatype":"json","broker":"vda-broker","nl":false,"rap":true,"rh":0,"inputs":0,"x":210,"y":160,"wires":[["vda-parse"]]},{"id":"vda-parse","type":"function","z":"vda-flow","name":"Identify vehicle","func":"const parts = msg.topic.split('/');\nif (parts.length !== 5) {\n    node.warn('Unexpected VDA 5050 topic: ' + msg.topic);\n    return null;\n}\n\nmsg.manufacturer = parts[2];\nmsg.serialNumber = parts[3];\n\nconst p = msg.payload;\nif (p.manufacturer !== msg.manufacturer || p.serialNumber !== msg.serialNumber) {\n    node.warn('Topic and payload disagree on ' + msg.topic);\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":160,"wires":[["vda-debug"]]},{"id":"vda-debug","type":"debug","z":"vda-flow","name":"State debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":650,"y":160,"wires":[]},{"id":"vda-broker","type":"mqtt-broker","name":"VDA 5050 broker","broker":"your-broker.example.com","port":"8883","clientid":"","autoConnect":true,"usetls":true,"verifyservercert":true,"protocolVersion":"4","keepalive":"15","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]
" language="json" meta="" style=""><code __ignore-map=""><span class="line" line="1"><span class="sMK4o">[{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-mqtt-in</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">mqtt in</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">z</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-flow</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">Fleet state</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">topic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">uagv/v2/+/+/state</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">qos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">datatype</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">json</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">broker</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">nl</span><span class="sMK4o">"</span><span class="sMK4o">:false,</span><span class="sMK4o">"</span><span class="spNyl">rap</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">rh</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">0</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">inputs</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">0</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">x</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">210</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">y</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">160</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">wires</span><span class="sMK4o">"</span><span class="sMK4o">:[[</span><span class="sMK4o">"</span><span class="sfazB">vda-parse</span><span class="sMK4o">"</span><span class="sMK4o">]]},{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-parse</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">function</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">z</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-flow</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">Identify vehicle</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">func</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">const parts = msg.topic.split('/');</span><span class="sTEyZ">\n</span><span class="sfazB">if (parts.length !== 5) {</span><span class="sTEyZ">\n</span><span class="sfazB">    node.warn('Unexpected VDA 5050 topic: ' + msg.topic);</span><span class="sTEyZ">\n</span><span class="sfazB">    return null;</span><span class="sTEyZ">\n</span><span class="sfazB">}</span><span class="sTEyZ">\n\n</span><span class="sfazB">msg.manufacturer = parts[2];</span><span class="sTEyZ">\n</span><span class="sfazB">msg.serialNumber = parts[3];</span><span class="sTEyZ">\n\n</span><span class="sfazB">const p = msg.payload;</span><span class="sTEyZ">\n</span><span class="sfazB">if (p.manufacturer !== msg.manufacturer || p.serialNumber !== msg.serialNumber) {</span><span class="sTEyZ">\n</span><span class="sfazB">    node.warn('Topic and payload disagree on ' + msg.topic);</span><span class="sTEyZ">\n</span><span class="sfazB">}</span><span class="sTEyZ">\n\n</span><span class="sfazB">return msg;</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">outputs</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">1</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">noerr</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">0</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">initialize</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">finalize</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">libs</span><span class="sMK4o">"</span><span class="sMK4o">:[],</span><span class="sMK4o">"</span><span class="spNyl">x</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">430</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">y</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">160</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">wires</span><span class="sMK4o">"</span><span class="sMK4o">:[[</span><span class="sMK4o">"</span><span class="sfazB">vda-debug</span><span class="sMK4o">"</span><span class="sMK4o">]]},{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-debug</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">debug</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">z</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-flow</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">State debug</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">active</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">tosidebar</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">console</span><span class="sMK4o">"</span><span class="sMK4o">:false,</span><span class="sMK4o">"</span><span class="spNyl">tostatus</span><span class="sMK4o">"</span><span class="sMK4o">:false,</span><span class="sMK4o">"</span><span class="spNyl">complete</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">payload</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">targetType</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">msg</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">statusVal</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">statusType</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">auto</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">x</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">650</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">y</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">160</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">wires</span><span class="sMK4o">"</span><span class="sMK4o">:[]},{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">mqtt-broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">VDA 5050 broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">broker</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">your-broker.example.com</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">port</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">8883</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">clientid</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">autoConnect</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">usetls</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">verifyservercert</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">protocolVersion</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">4</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">keepalive</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">15</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">cleansession</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">autoUnsubscribe</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">birthTopic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">birthQos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">birthPayload</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">birthMsg</span><span class="sMK4o">"</span><span class="sMK4o">:{},</span><span class="sMK4o">"</span><span class="spNyl">closeTopic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">closeQos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">closePayload</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">closeMsg</span><span class="sMK4o">"</span><span class="sMK4o">:{},</span><span class="sMK4o">"</span><span class="spNyl">willTopic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">willQos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">willPayload</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">willMsg</span><span class="sMK4o">"</span><span class="sMK4o">:{},</span><span class="sMK4o">"</span><span class="spNyl">sessionExpiry</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">}]
</span></span></code></pre><p>Flow exports never include passwords. After importing, open the broker node and enter your own host and login.</p><h3 id="step-3-tell-the-vehicles-apart">Step 3: Tell the vehicles apart</h3><p>The <code>state</code> message tells you what is happening. You also need to know who sent it.</p><p><code>manufacturer</code> and <code>serialNumber</code> appear twice: in the payload, and in the topic. Read them from the topic. Here's why.</p><p>The topic is the message's address. It is what your broker rules are written against, so it's the right value to route and store by.</p><p>Comparing the two is also a free sanity check. If a vehicle's payload disagrees with its topic, it is misconfigured. Better to see that in a log line than to find out when an order goes to the wrong truck.</p><p>Put a <strong>function</strong> node between the <strong>mqtt in</strong> node and whatever comes next:</p><pre class="language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight" code="const parts = msg.topic.split('/');
if (parts.length !== 5) {
    node.warn('Unexpected VDA 5050 topic: ' + msg.topic);
    return null;
}

msg.manufacturer = parts[2];
msg.serialNumber = parts[3];

const p = msg.payload;
if (p.manufacturer !== msg.manufacturer || p.serialNumber !== msg.serialNumber) {
    node.warn('Topic and payload disagree on ' + msg.topic);
}

return msg;
" language="javascript" meta="" style=""><code __ignore-map=""><span class="line" line="1"><span class="spNyl">const</span><span class="sTEyZ"> parts </span><span class="sMK4o">=</span><span class="sTEyZ"> msg</span><span class="sMK4o">.</span><span class="sTEyZ">topic</span><span class="sMK4o">.</span><span class="s2Zo4">split</span><span class="sTEyZ">(</span><span class="sMK4o">'</span><span class="sfazB">/</span><span class="sMK4o">'</span><span class="sTEyZ">)</span><span class="sMK4o">;
</span></span><span class="line" line="2"><span class="s7zQu">if</span><span class="sTEyZ"> (parts</span><span class="sMK4o">.</span><span class="sTEyZ">length </span><span class="sMK4o">!==</span><span class="sbssI"> 5</span><span class="sTEyZ">) </span><span class="sMK4o">{
</span></span><span class="line" line="3"><span class="sTEyZ">    node</span><span class="sMK4o">.</span><span class="s2Zo4">warn</span><span class="swJcz">(</span><span class="sMK4o">'</span><span class="sfazB">Unexpected VDA 5050 topic: </span><span class="sMK4o">'</span><span class="sMK4o"> +</span><span class="sTEyZ"> msg</span><span class="sMK4o">.</span><span class="sTEyZ">topic</span><span class="swJcz">)</span><span class="sMK4o">;
</span></span><span class="line" line="4"><span class="s7zQu">    return</span><span class="sMK4o"> null;
</span></span><span class="line" line="5"><span class="sMK4o">}
</span></span><span class="line" line="6"><span empty-line-placeholder>
</span></span><span class="line" line="7"><span class="sTEyZ">msg</span><span class="sMK4o">.</span><span class="sTEyZ">manufacturer </span><span class="sMK4o">=</span><span class="sTEyZ"> parts[</span><span class="sbssI">2</span><span class="sTEyZ">]</span><span class="sMK4o">;
</span></span><span class="line" line="8"><span class="sTEyZ">msg</span><span class="sMK4o">.</span><span class="sTEyZ">serialNumber </span><span class="sMK4o">=</span><span class="sTEyZ"> parts[</span><span class="sbssI">3</span><span class="sTEyZ">]</span><span class="sMK4o">;
</span></span><span class="line" line="9"><span empty-line-placeholder>
</span></span><span class="line" line="10"><span class="spNyl">const</span><span class="sTEyZ"> p </span><span class="sMK4o">=</span><span class="sTEyZ"> msg</span><span class="sMK4o">.</span><span class="sTEyZ">payload</span><span class="sMK4o">;
</span></span><span class="line" line="11"><span class="s7zQu">if</span><span class="sTEyZ"> (p</span><span class="sMK4o">.</span><span class="sTEyZ">manufacturer </span><span class="sMK4o">!==</span><span class="sTEyZ"> msg</span><span class="sMK4o">.</span><span class="sTEyZ">manufacturer </span><span class="sMK4o">||</span><span class="sTEyZ"> p</span><span class="sMK4o">.</span><span class="sTEyZ">serialNumber </span><span class="sMK4o">!==</span><span class="sTEyZ"> msg</span><span class="sMK4o">.</span><span class="sTEyZ">serialNumber) </span><span class="sMK4o">{
</span></span><span class="line" line="12"><span class="sTEyZ">    node</span><span class="sMK4o">.</span><span class="s2Zo4">warn</span><span class="swJcz">(</span><span class="sMK4o">'</span><span class="sfazB">Topic and payload disagree on </span><span class="sMK4o">'</span><span class="sMK4o"> +</span><span class="sTEyZ"> msg</span><span class="sMK4o">.</span><span class="sTEyZ">topic</span><span class="swJcz">)</span><span class="sMK4o">;
</span></span><span class="line" line="13"><span class="sMK4o">}
</span></span><span class="line" line="14"><span empty-line-placeholder>
</span></span><span class="line" line="15"><span class="s7zQu">return</span><span class="sTEyZ"> msg</span><span class="sMK4o">;
</span></span></code></pre><p>Now <code>msg.payload</code> holds the state object, and <code>msg.manufacturer</code> and <code>msg.serialNumber</code> tell you which AGV sent it.</p><h3 id="step-4-catch-vehicles-going-offline">Step 4: Catch vehicles going offline</h3><p>Repeat the same pattern for one more topic, pointing it at the broker you already set up.</p><p>Subscribe to <strong><code>uagv/v2/+/+/connection</code></strong> at QoS 1. This tells you when a vehicle drops off the broker. The payload has a <code>connectionState</code> field with one of three values in 2.x:</p><ul><li><code>ONLINE</code></li><li><code>OFFLINE</code> for a clean, deliberate disconnect</li><li><code>CONNECTIONBROKEN</code> for an unexpected drop</li></ul><p>The vehicle registers that last value as its MQTT last will when it connects. So if it vanishes without saying goodbye, the broker publishes it for the vehicle. Vehicles publish every <code>connection</code> message with the retained flag set, so a new subscriber picks up each vehicle's last known status straight away.</p><p>This is where the keep alive from step 1 earns its place. The broker only fires the last will once the heartbeat lapses, so a 60-second keep alive can hide a dead vehicle for well over a minute.</p><p>One warning. <code>connection</code> is a network check, not a health check. Version 3.0 states that outright in its topic table, and 2.1 works the same way without saying it as plainly. It tells you the link dropped. It tells you nothing about a vehicle that is still connected but faulted, stuck, or lost. For that, watch <code>errors</code>, <code>operatingMode</code>, and <code>safetyState</code> in <code>state</code>. Also treat any <code>state</code> message older than 30 seconds as stale, since that is the longest gap the standard allows.</p><h3 id="putting-it-on-a-screen">Putting it on a screen</h3><p>None of this is visible to anyone on the floor yet. You can build a screen from these same flows with <a href="https://flowfuse.com/docs/user/dashboards/">FlowFuse Dashboard</a>, <a href="https://flowfuse.com/blog/2024/03/dashboard-getting-started/">without writing any HTML</a>: a table of vehicles with battery level and current order, an alert when a vehicle drops off the network, and a live map of where everything is.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/images/cta/wenco-book-demo.png" alt="Wenco deploys new dashboard pages in days with FlowFuse - book a demo"/></a><h3 id="step-5-send-an-order">Step 5: Send an order</h3><p>Three rules decide whether the vehicle accepts your order at all. Get these wrong and it refuses.</p><p><strong>The first node must be where the vehicle already is.</strong> The standard says the AGV has to be standing on the first node, or inside its deviation range. Send an order that starts anywhere else and the vehicle rejects it. A rejected order shows up as a <code>validationError</code> warning in the vehicle's <code>state</code>, and the warning stays there until it accepts a valid order. Read <code>lastNodeId</code> and <code>agvPosition</code> from the vehicle's current state, and build the order from there.</p><p><strong><code>orderId</code> and <code>orderUpdateId</code> together must be new.</strong> Use a fresh <code>orderId</code> for each job. Start <code>orderUpdateId</code> at 0, and only raise it when you extend that same order. A 2.x vehicle checks the incoming <code>orderUpdateId</code> against the one it already holds, treating a lower one as deprecated and an equal one as already received. Version 3.0 draws the line more precisely: resending an identical message is fine, but reusing an <code>orderUpdateId</code> with different content is an error.</p><p><strong>The vehicle must support the actions you send.</strong> <code>pick</code> and <code>drop</code> are standard action types, but supporting them is optional. Ask for the vehicle's <code>factsheet</code> first, using the <code>factsheetRequest</code> instant action, and check its list of supported actions.</p><p>Then wire it up:</p><ol><li>Add an <strong>mqtt out</strong> node pointing at your broker. Leave <strong>Topic</strong> empty so the flow can set <code>msg.topic</code> per vehicle. Leave <strong>Retain</strong> off. The broker re-delivers a retained order every time the vehicle reconnects, which is how you move a truck at 3am by accident.</li><li>Feed it a payload matching the order schema: a <code>nodes</code> array and an <code>edges</code> array.</li><li>Trigger it with a dashboard button for manual dispatch, or from an <a href="https://flowfuse.com/blog/2022/12/create-http-trigger-with-authentication/"><strong>http in</strong> endpoint</a> if orders come from your WMS.</li></ol><p>Here is a real pick-and-drop order:</p><pre class="language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight" code="const manufacturer = 'AcmeRobotics';
const serialNumber = 'AGV-042';

msg.topic = `uagv/v2/${manufacturer}/${serialNumber}/order`;

// headerId counts per topic, so key the counter by topic and raise it
// by one for every message you send to that topic
const headerKey = `headerId:${msg.topic}`;
const headerId = (flow.get(headerKey) || 0) + 1;
flow.set(headerKey, headerId);

msg.payload = {
  headerId,
  timestamp: new Date().toISOString(),
  version: "2.1.0",
  manufacturer,
  serialNumber,
  orderId: `order-${Date.now()}`,
  orderUpdateId: 0,
  nodes: [
    {
      // The AGV must already be at this node, or within its deviation range
      nodeId: "station-1",
      sequenceId: 0,
      released: true,
      nodePosition: { x: 0, y: 0, mapId: "floor1" },
      actions: [{
        actionId: `pick-${headerId}`,
        actionType: "pick",
        blockingType: "HARD",
        actionParameters: [
          { key: "stationType", value: "floor" },
          { key: "loadType", value: "EPAL" }
        ]
      }]
    },
    {
      nodeId: "station-2",
      sequenceId: 2,
      released: true,
      nodePosition: { x: 12, y: 4, mapId: "floor1" },
      actions: [{
        actionId: `drop-${headerId}`,
        actionType: "drop",
        blockingType: "HARD",
        actionParameters: [
          { key: "stationType", value: "floor" },
          { key: "loadType", value: "EPAL" }
        ]
      }]
    }
  ],
  edges: [{
    edgeId: "station-1-2",
    sequenceId: 1,
    startNodeId: "station-1",
    endNodeId: "station-2",
    released: true,
    actions: []
  }]
};
return msg;
" language="javascript" meta="" style=""><code __ignore-map=""><span class="line" line="1"><span class="spNyl">const</span><span class="sTEyZ"> manufacturer </span><span class="sMK4o">=</span><span class="sMK4o"> '</span><span class="sfazB">AcmeRobotics</span><span class="sMK4o">'</span><span class="sMK4o">;
</span></span><span class="line" line="2"><span class="spNyl">const</span><span class="sTEyZ"> serialNumber </span><span class="sMK4o">=</span><span class="sMK4o"> '</span><span class="sfazB">AGV-042</span><span class="sMK4o">'</span><span class="sMK4o">;
</span></span><span class="line" line="3"><span empty-line-placeholder>
</span></span><span class="line" line="4"><span class="sTEyZ">msg</span><span class="sMK4o">.</span><span class="sTEyZ">topic </span><span class="sMK4o">=</span><span class="sMK4o"> `</span><span class="sfazB">uagv/v2/</span><span class="sMK4o">${</span><span class="sTEyZ">manufacturer</span><span class="sMK4o">}</span><span class="sfazB">/</span><span class="sMK4o">${</span><span class="sTEyZ">serialNumber</span><span class="sMK4o">}</span><span class="sfazB">/order</span><span class="sMK4o">`</span><span class="sMK4o">;
</span></span><span class="line" line="5"><span empty-line-placeholder>
</span></span><span class="line" line="6"><span class="sHwdD">// headerId counts per topic, so key the counter by topic and raise it
</span></span><span class="line" line="7"><span class="sHwdD">// by one for every message you send to that topic
</span></span><span class="line" line="8"><span class="spNyl">const</span><span class="sTEyZ"> headerKey </span><span class="sMK4o">=</span><span class="sMK4o"> `</span><span class="sfazB">headerId:</span><span class="sMK4o">${</span><span class="sTEyZ">msg</span><span class="sMK4o">.</span><span class="sTEyZ">topic</span><span class="sMK4o">}`</span><span class="sMK4o">;
</span></span><span class="line" line="9"><span class="spNyl">const</span><span class="sTEyZ"> headerId </span><span class="sMK4o">=</span><span class="sTEyZ"> (flow</span><span class="sMK4o">.</span><span class="s2Zo4">get</span><span class="sTEyZ">(headerKey) </span><span class="sMK4o">||</span><span class="sbssI"> 0</span><span class="sTEyZ">) </span><span class="sMK4o">+</span><span class="sbssI"> 1</span><span class="sMK4o">;
</span></span><span class="line" line="10"><span class="sTEyZ">flow</span><span class="sMK4o">.</span><span class="s2Zo4">set</span><span class="sTEyZ">(headerKey</span><span class="sMK4o">,</span><span class="sTEyZ"> headerId)</span><span class="sMK4o">;
</span></span><span class="line" line="11"><span empty-line-placeholder>
</span></span><span class="line" line="12"><span class="sTEyZ">msg</span><span class="sMK4o">.</span><span class="sTEyZ">payload </span><span class="sMK4o">=</span><span class="sMK4o"> {
</span></span><span class="line" line="13"><span class="sTEyZ">  headerId</span><span class="sMK4o">,
</span></span><span class="line" line="14"><span class="swJcz">  timestamp</span><span class="sMK4o">:</span><span class="sMK4o"> new</span><span class="s2Zo4"> Date</span><span class="sTEyZ">()</span><span class="sMK4o">.</span><span class="s2Zo4">toISOString</span><span class="sTEyZ">()</span><span class="sMK4o">,
</span></span><span class="line" line="15"><span class="swJcz">  version</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">2.1.0</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="16"><span class="sTEyZ">  manufacturer</span><span class="sMK4o">,
</span></span><span class="line" line="17"><span class="sTEyZ">  serialNumber</span><span class="sMK4o">,
</span></span><span class="line" line="18"><span class="swJcz">  orderId</span><span class="sMK4o">:</span><span class="sMK4o"> `</span><span class="sfazB">order-</span><span class="sMK4o">${</span><span class="sTEyZ">Date</span><span class="sMK4o">.</span><span class="s2Zo4">now</span><span class="sTEyZ">()</span><span class="sMK4o">}`</span><span class="sMK4o">,
</span></span><span class="line" line="19"><span class="swJcz">  orderUpdateId</span><span class="sMK4o">:</span><span class="sbssI"> 0</span><span class="sMK4o">,
</span></span><span class="line" line="20"><span class="swJcz">  nodes</span><span class="sMK4o">:</span><span class="sTEyZ"> [
</span></span><span class="line" line="21"><span class="sMK4o">    {
</span></span><span class="line" line="22"><span class="sHwdD">      // The AGV must already be at this node, or within its deviation range
</span></span><span class="line" line="23"><span class="swJcz">      nodeId</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">station-1</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="24"><span class="swJcz">      sequenceId</span><span class="sMK4o">:</span><span class="sbssI"> 0</span><span class="sMK4o">,
</span></span><span class="line" line="25"><span class="swJcz">      released</span><span class="sMK4o">:</span><span class="sfNiH"> true</span><span class="sMK4o">,
</span></span><span class="line" line="26"><span class="swJcz">      nodePosition</span><span class="sMK4o">:</span><span class="sMK4o"> {</span><span class="swJcz"> x</span><span class="sMK4o">:</span><span class="sbssI"> 0</span><span class="sMK4o">,</span><span class="swJcz"> y</span><span class="sMK4o">:</span><span class="sbssI"> 0</span><span class="sMK4o">,</span><span class="swJcz"> mapId</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">floor1</span><span class="sMK4o">"</span><span class="sMK4o"> },
</span></span><span class="line" line="27"><span class="swJcz">      actions</span><span class="sMK4o">:</span><span class="sTEyZ"> [</span><span class="sMK4o">{
</span></span><span class="line" line="28"><span class="swJcz">        actionId</span><span class="sMK4o">:</span><span class="sMK4o"> `</span><span class="sfazB">pick-</span><span class="sMK4o">${</span><span class="sTEyZ">headerId</span><span class="sMK4o">}`</span><span class="sMK4o">,
</span></span><span class="line" line="29"><span class="swJcz">        actionType</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">pick</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="30"><span class="swJcz">        blockingType</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">HARD</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="31"><span class="swJcz">        actionParameters</span><span class="sMK4o">:</span><span class="sTEyZ"> [
</span></span><span class="line" line="32"><span class="sMK4o">          {</span><span class="swJcz"> key</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">stationType</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="swJcz"> value</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">floor</span><span class="sMK4o">"</span><span class="sMK4o"> },
</span></span><span class="line" line="33"><span class="sMK4o">          {</span><span class="swJcz"> key</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">loadType</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="swJcz"> value</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">EPAL</span><span class="sMK4o">"</span><span class="sMK4o"> }
</span></span><span class="line" line="34"><span class="sTEyZ">        ]
</span></span><span class="line" line="35"><span class="sMK4o">      }</span><span class="sTEyZ">]
</span></span><span class="line" line="36"><span class="sMK4o">    },
</span></span><span class="line" line="37"><span class="sMK4o">    {
</span></span><span class="line" line="38"><span class="swJcz">      nodeId</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">station-2</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="39"><span class="swJcz">      sequenceId</span><span class="sMK4o">:</span><span class="sbssI"> 2</span><span class="sMK4o">,
</span></span><span class="line" line="40"><span class="swJcz">      released</span><span class="sMK4o">:</span><span class="sfNiH"> true</span><span class="sMK4o">,
</span></span><span class="line" line="41"><span class="swJcz">      nodePosition</span><span class="sMK4o">:</span><span class="sMK4o"> {</span><span class="swJcz"> x</span><span class="sMK4o">:</span><span class="sbssI"> 12</span><span class="sMK4o">,</span><span class="swJcz"> y</span><span class="sMK4o">:</span><span class="sbssI"> 4</span><span class="sMK4o">,</span><span class="swJcz"> mapId</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">floor1</span><span class="sMK4o">"</span><span class="sMK4o"> },
</span></span><span class="line" line="42"><span class="swJcz">      actions</span><span class="sMK4o">:</span><span class="sTEyZ"> [</span><span class="sMK4o">{
</span></span><span class="line" line="43"><span class="swJcz">        actionId</span><span class="sMK4o">:</span><span class="sMK4o"> `</span><span class="sfazB">drop-</span><span class="sMK4o">${</span><span class="sTEyZ">headerId</span><span class="sMK4o">}`</span><span class="sMK4o">,
</span></span><span class="line" line="44"><span class="swJcz">        actionType</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">drop</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="45"><span class="swJcz">        blockingType</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">HARD</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="46"><span class="swJcz">        actionParameters</span><span class="sMK4o">:</span><span class="sTEyZ"> [
</span></span><span class="line" line="47"><span class="sMK4o">          {</span><span class="swJcz"> key</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">stationType</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="swJcz"> value</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">floor</span><span class="sMK4o">"</span><span class="sMK4o"> },
</span></span><span class="line" line="48"><span class="sMK4o">          {</span><span class="swJcz"> key</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">loadType</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="swJcz"> value</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">EPAL</span><span class="sMK4o">"</span><span class="sMK4o"> }
</span></span><span class="line" line="49"><span class="sTEyZ">        ]
</span></span><span class="line" line="50"><span class="sMK4o">      }</span><span class="sTEyZ">]
</span></span><span class="line" line="51"><span class="sMK4o">    }
</span></span><span class="line" line="52"><span class="sTEyZ">  ]</span><span class="sMK4o">,
</span></span><span class="line" line="53"><span class="swJcz">  edges</span><span class="sMK4o">:</span><span class="sTEyZ"> [</span><span class="sMK4o">{
</span></span><span class="line" line="54"><span class="swJcz">    edgeId</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">station-1-2</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="55"><span class="swJcz">    sequenceId</span><span class="sMK4o">:</span><span class="sbssI"> 1</span><span class="sMK4o">,
</span></span><span class="line" line="56"><span class="swJcz">    startNodeId</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">station-1</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="57"><span class="swJcz">    endNodeId</span><span class="sMK4o">:</span><span class="sMK4o"> "</span><span class="sfazB">station-2</span><span class="sMK4o">"</span><span class="sMK4o">,
</span></span><span class="line" line="58"><span class="swJcz">    released</span><span class="sMK4o">:</span><span class="sfNiH"> true</span><span class="sMK4o">,
</span></span><span class="line" line="59"><span class="swJcz">    actions</span><span class="sMK4o">:</span><span class="sTEyZ"> []
</span></span><span class="line" line="60"><span class="sMK4o">  }</span><span class="sTEyZ">]
</span></span><span class="line" line="61"><span class="sMK4o">};
</span></span><span class="line" line="62"><span class="s7zQu">return</span><span class="sTEyZ"> msg</span><span class="sMK4o">;
</span></span></code></pre><p>Set <code>version</code> to the version your vehicle actually runs. Its <code>factsheet</code> and its own <code>state</code> messages both tell you.</p><p>Note the counter keyed by topic. <code>headerId</code> is defined per topic and rises by one per message, so a single shared counter across two vehicles leaves gaps in both their sequences.</p><p>Four more details matter. <code>sequenceId</code> counts across nodes and edges together, which is why the edge is <code>1</code>, sitting between nodes <code>0</code> and <code>2</code>. <code>released: true</code> marks the base, the part of the plan the vehicle should run now, as opposed to the horizon, which is work it knows about but hasn't been told to start. And <code>actionId</code> has to be unique, because that is how the vehicle reports progress back to you in <code>actionStates</code>.</p><p><code>blockingType</code> is the one worth reading twice. It decides whether the vehicle can drive, and whether other actions can run at the same time. <code>HARD</code> means the action runs alone, with no driving and no other actions. <code>SOFT</code> allows other actions but still stops the vehicle. <code>NONE</code> allows both. For a pick or drop you want <code>HARD</code>, and note that <code>SOFT</code> does not let the AGV keep driving, which is the one people get backwards. Version 3.0 adds a fourth, <code>SINGLE</code>, which allows driving but no other actions.</p><pre class="language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight" code="[{"id":"vda-order-trigger","type":"inject","z":"vda-flow","name":"Dispatch order","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":210,"y":320,"wires":[["vda-order-build"]]},{"id":"vda-order-build","type":"function","z":"vda-flow","name":"Build order payload","func":"const manufacturer = 'AcmeRobotics';\nconst serialNumber = 'AGV-042';\n\nmsg.topic = `uagv/v2/${manufacturer}/${serialNumber}/order`;\n\n// headerId counts per topic, so key the counter by topic\nconst headerKey = `headerId:${msg.topic}`;\nconst headerId = (flow.get(headerKey) || 0) + 1;\nflow.set(headerKey, headerId);\n\nmsg.payload = {\n  headerId,\n  timestamp: new Date().toISOString(),\n  version: \"2.1.0\",\n  manufacturer,\n  serialNumber,\n  orderId: `order-${Date.now()}`,\n  orderUpdateId: 0,\n  nodes: [\n    { nodeId: \"station-1\", sequenceId: 0, released: true, nodePosition: { x: 0, y: 0, mapId: \"floor1\" }, actions: [{ actionId: `pick-${headerId}`, actionType: \"pick\", blockingType: \"HARD\", actionParameters: [{ key: \"stationType\", value: \"floor\" }, { key: \"loadType\", value: \"EPAL\" }] }] },\n    { nodeId: \"station-2\", sequenceId: 2, released: true, nodePosition: { x: 12, y: 4, mapId: \"floor1\" }, actions: [{ actionId: `drop-${headerId}`, actionType: \"drop\", blockingType: \"HARD\", actionParameters: [{ key: \"stationType\", value: \"floor\" }, { key: \"loadType\", value: \"EPAL\" }] }] }\n  ],\n  edges: [\n    { edgeId: \"station-1-2\", sequenceId: 1, startNodeId: \"station-1\", endNodeId: \"station-2\", released: true, actions: [] }\n  ]\n};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":320,"wires":[["vda-order-out"]]},{"id":"vda-order-out","type":"mqtt out","z":"vda-flow","name":"Send order","topic":"","qos":"0","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"vda-broker","x":680,"y":320,"wires":[]},{"id":"vda-broker","type":"mqtt-broker","name":"VDA 5050 broker","broker":"your-broker.example.com","port":"8883","clientid":"","autoConnect":true,"usetls":true,"verifyservercert":true,"protocolVersion":"4","keepalive":"15","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]
" language="json" meta="" style=""><code __ignore-map=""><span class="line" line="1"><span class="sMK4o">[{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-order-trigger</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">inject</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">z</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-flow</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">Dispatch order</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">props</span><span class="sMK4o">"</span><span class="sMK4o">:[{</span><span class="sMK4o">"</span><span class="sBMFI">p</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">payload</span><span class="sMK4o">"</span><span class="sMK4o">}],</span><span class="sMK4o">"</span><span class="spNyl">repeat</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">crontab</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">once</span><span class="sMK4o">"</span><span class="sMK4o">:false,</span><span class="sMK4o">"</span><span class="spNyl">onceDelay</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">0.1</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">topic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">payload</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">payloadType</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">date</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">x</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">210</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">y</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">320</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">wires</span><span class="sMK4o">"</span><span class="sMK4o">:[[</span><span class="sMK4o">"</span><span class="sfazB">vda-order-build</span><span class="sMK4o">"</span><span class="sMK4o">]]},{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-order-build</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">function</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">z</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-flow</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">Build order payload</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">func</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">const manufacturer = 'AcmeRobotics';</span><span class="sTEyZ">\n</span><span class="sfazB">const serialNumber = 'AGV-042';</span><span class="sTEyZ">\n\n</span><span class="sfazB">msg.topic = `uagv/v2/${manufacturer}/${serialNumber}/order`;</span><span class="sTEyZ">\n\n</span><span class="sfazB">// headerId counts per topic, so key the counter by topic</span><span class="sTEyZ">\n</span><span class="sfazB">const headerKey = `headerId:${msg.topic}`;</span><span class="sTEyZ">\n</span><span class="sfazB">const headerId = (flow.get(headerKey) || 0) + 1;</span><span class="sTEyZ">\n</span><span class="sfazB">flow.set(headerKey, headerId);</span><span class="sTEyZ">\n\n</span><span class="sfazB">msg.payload = {</span><span class="sTEyZ">\n</span><span class="sfazB">  headerId,</span><span class="sTEyZ">\n</span><span class="sfazB">  timestamp: new Date().toISOString(),</span><span class="sTEyZ">\n</span><span class="sfazB">  version: </span><span class="sTEyZ">\"</span><span class="sfazB">2.1.0</span><span class="sTEyZ">\"</span><span class="sfazB">,</span><span class="sTEyZ">\n</span><span class="sfazB">  manufacturer,</span><span class="sTEyZ">\n</span><span class="sfazB">  serialNumber,</span><span class="sTEyZ">\n</span><span class="sfazB">  orderId: `order-${Date.now()}`,</span><span class="sTEyZ">\n</span><span class="sfazB">  orderUpdateId: 0,</span><span class="sTEyZ">\n</span><span class="sfazB">  nodes: [</span><span class="sTEyZ">\n</span><span class="sfazB">    { nodeId: </span><span class="sTEyZ">\"</span><span class="sfazB">station-1</span><span class="sTEyZ">\"</span><span class="sfazB">, sequenceId: 0, released: true, nodePosition: { x: 0, y: 0, mapId: </span><span class="sTEyZ">\"</span><span class="sfazB">floor1</span><span class="sTEyZ">\"</span><span class="sfazB"> }, actions: [{ actionId: `pick-${headerId}`, actionType: </span><span class="sTEyZ">\"</span><span class="sfazB">pick</span><span class="sTEyZ">\"</span><span class="sfazB">, blockingType: </span><span class="sTEyZ">\"</span><span class="sfazB">HARD</span><span class="sTEyZ">\"</span><span class="sfazB">, actionParameters: [{ key: </span><span class="sTEyZ">\"</span><span class="sfazB">stationType</span><span class="sTEyZ">\"</span><span class="sfazB">, value: </span><span class="sTEyZ">\"</span><span class="sfazB">floor</span><span class="sTEyZ">\"</span><span class="sfazB"> }, { key: </span><span class="sTEyZ">\"</span><span class="sfazB">loadType</span><span class="sTEyZ">\"</span><span class="sfazB">, value: </span><span class="sTEyZ">\"</span><span class="sfazB">EPAL</span><span class="sTEyZ">\"</span><span class="sfazB"> }] }] },</span><span class="sTEyZ">\n</span><span class="sfazB">    { nodeId: </span><span class="sTEyZ">\"</span><span class="sfazB">station-2</span><span class="sTEyZ">\"</span><span class="sfazB">, sequenceId: 2, released: true, nodePosition: { x: 12, y: 4, mapId: </span><span class="sTEyZ">\"</span><span class="sfazB">floor1</span><span class="sTEyZ">\"</span><span class="sfazB"> }, actions: [{ actionId: `drop-${headerId}`, actionType: </span><span class="sTEyZ">\"</span><span class="sfazB">drop</span><span class="sTEyZ">\"</span><span class="sfazB">, blockingType: </span><span class="sTEyZ">\"</span><span class="sfazB">HARD</span><span class="sTEyZ">\"</span><span class="sfazB">, actionParameters: [{ key: </span><span class="sTEyZ">\"</span><span class="sfazB">stationType</span><span class="sTEyZ">\"</span><span class="sfazB">, value: </span><span class="sTEyZ">\"</span><span class="sfazB">floor</span><span class="sTEyZ">\"</span><span class="sfazB"> }, { key: </span><span class="sTEyZ">\"</span><span class="sfazB">loadType</span><span class="sTEyZ">\"</span><span class="sfazB">, value: </span><span class="sTEyZ">\"</span><span class="sfazB">EPAL</span><span class="sTEyZ">\"</span><span class="sfazB"> }] }] }</span><span class="sTEyZ">\n</span><span class="sfazB">  ],</span><span class="sTEyZ">\n</span><span class="sfazB">  edges: [</span><span class="sTEyZ">\n</span><span class="sfazB">    { edgeId: </span><span class="sTEyZ">\"</span><span class="sfazB">station-1-2</span><span class="sTEyZ">\"</span><span class="sfazB">, sequenceId: 1, startNodeId: </span><span class="sTEyZ">\"</span><span class="sfazB">station-1</span><span class="sTEyZ">\"</span><span class="sfazB">, endNodeId: </span><span class="sTEyZ">\"</span><span class="sfazB">station-2</span><span class="sTEyZ">\"</span><span class="sfazB">, released: true, actions: [] }</span><span class="sTEyZ">\n</span><span class="sfazB">  ]</span><span class="sTEyZ">\n</span><span class="sfazB">};</span><span class="sTEyZ">\n</span><span class="sfazB">return msg;</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">outputs</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">1</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">noerr</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">0</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">initialize</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">finalize</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">libs</span><span class="sMK4o">"</span><span class="sMK4o">:[],</span><span class="sMK4o">"</span><span class="spNyl">x</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">440</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">y</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">320</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">wires</span><span class="sMK4o">"</span><span class="sMK4o">:[[</span><span class="sMK4o">"</span><span class="sfazB">vda-order-out</span><span class="sMK4o">"</span><span class="sMK4o">]]},{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-order-out</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">mqtt out</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">z</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-flow</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">Send order</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">topic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">qos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">retain</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">false</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">respTopic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">contentType</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">userProps</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">correl</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">expiry</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">broker</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">x</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">680</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">y</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sbssI">320</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">wires</span><span class="sMK4o">"</span><span class="sMK4o">:[]},{</span><span class="sMK4o">"</span><span class="spNyl">id</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">vda-broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">type</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">mqtt-broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">name</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">VDA 5050 broker</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">broker</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">your-broker.example.com</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">port</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">8883</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">clientid</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">autoConnect</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">usetls</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">verifyservercert</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">protocolVersion</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">4</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">keepalive</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">15</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">cleansession</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">autoUnsubscribe</span><span class="sMK4o">"</span><span class="sMK4o">:true,</span><span class="sMK4o">"</span><span class="spNyl">birthTopic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">birthQos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">birthPayload</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">birthMsg</span><span class="sMK4o">"</span><span class="sMK4o">:{},</span><span class="sMK4o">"</span><span class="spNyl">closeTopic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">closeQos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">closePayload</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">closeMsg</span><span class="sMK4o">"</span><span class="sMK4o">:{},</span><span class="sMK4o">"</span><span class="spNyl">willTopic</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">willQos</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">"</span><span class="sfazB">0</span><span class="sMK4o">"</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">willPayload</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">,</span><span class="sMK4o">"</span><span class="spNyl">willMsg</span><span class="sMK4o">"</span><span class="sMK4o">:{},</span><span class="sMK4o">"</span><span class="spNyl">sessionExpiry</span><span class="sMK4o">"</span><span class="sMK4o">:</span><span class="sMK4o">""</span><span class="sMK4o">}]
</span></span></code></pre><p>This snippet brings its own broker node so it imports on its own. If you paste it into the same tab as the flow from step 2, you'll end up with two. Point this flow at the one you already set up and delete the spare, or the two clients will fight over the same login.</p><p>The <strong>inject</strong> node keeps the import simple. Swap it for a <strong>ui-button</strong> once your dashboard exists.</p><h2 id="before-this-touches-real-agvs">Before this touches real AGVs</h2><p>A flow that works on a test rig is not a production system. Check these first.</p><ul><li><strong>Lock down the broker.</strong> Restrict each AGV to its own topic path. Give the wildcard subscription to master control only. Use an allowlist, not a blocklist.</li><li><strong><a href="https://flowfuse.com/blog/2023/04/securing-node-red-in-production/">Use TLS.</a></strong> Factory networks are shared. Fleet commands should not travel in clear text, and leave certificate checking on.</li><li><strong>Never retain <code>order</code> or <code>instantActions</code>.</strong> The broker replays retained commands to every vehicle that reconnects. <code>connection</code> and <code>factsheet</code> are the two topics that <em>should</em> be retained.</li><li><strong>Match the standard's QoS levels.</strong> QoS 0 for <code>order</code>, <code>instantActions</code>, <code>state</code>, <code>factsheet</code>, and <code>visualization</code>. QoS 1 for <code>connection</code>. If your site does something different, change it on both ends, since MQTT delivers at the lower of the two.</li><li><strong>Set the keep alive to around 15 seconds.</strong> It sets the floor on how fast you can detect a vehicle dropping off, so a long keep alive quietly undoes your offline alerting.</li><li><strong>Watch state freshness, not just <code>connection</code>.</strong> A vehicle can hold its connection open while stuck or faulted. Alert on <code>errors</code>, on <code>operatingMode</code> leaving <code>AUTOMATIC</code>, and on <code>state</code> messages older than 30 seconds.</li><li><strong><a href="https://flowfuse.com/blog/2025/11/industrial-data-validation-guide/">Validate orders before you send them.</a></strong> Check the first node against the vehicle's current position, keep <code>orderId</code> and <code>orderUpdateId</code> unique, and check every action type against the factsheet.</li><li><strong>Cap message size on the broker</strong> to what VDA 5050 payloads actually need. It limits the damage a misbehaving client can do.</li></ul><h2 id="whats-next">What's next</h2><p>You now have the basics: subscribe to fleet state, tell vehicles apart, spot vehicles going offline, and send orders. That's enough for a pilot with two or three AGVs.</p><p>The next thing most teams do is replace the button with <a href="https://flowfuse.com/blog/2025/06/connect-shop-floor-to-odoo-erp-flowfuse/">the WMS or ERP</a>, so orders arrive from whatever already decides what needs moving. After that comes order updates and cancellation, because a job that can't be extended or pulled back mid-route is not much use on a real floor. Both of those need the vehicle's <code>factsheet</code>, so it's worth requesting and storing it early. Master control can then check load capacity, size, and supported actions before it dispatches anything.</p><p>Two bigger pieces usually wait until the pilot has proved itself. <a href="https://flowfuse.com/blog/2026/02/mqtt-influxdb-tutorial/">Logging state history</a> gives you throughput and utilization numbers, which is normally what makes the case for expanding. Publishing that state into a <a href="https://flowfuse.com/blog/2024/11/building-uns-with-flowfuse/">Unified Namespace</a> puts it alongside the rest of your production data, so the systems that plan the work can see where the vehicles are. Traffic rules come last, and only once vehicles from different vendors start sharing aisles, because that is the point where a single master control system stops being a convenience and starts being the reason the floor works at all.</p><p>When the pilot becomes a deployment, FlowFuse adds the parts a real fleet system needs: remote device management for edge gateways, <a href="https://flowfuse.com/blog/2024/09/node-red-version-control-with-snapshots/">snapshots and instant rollback</a>, audit logs, <a href="https://flowfuse.com/blog/2024/10/how-to-build-automate-devops-pipelines-node-red-deployments/">DevOps Pipelines</a>, <a href="https://flowfuse.com/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse/">team access control</a>, and high availability.</p><style>html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}</style><p><strong>Run Every AGV From One System</strong></p><p>See how FlowFuse connects AGVs from any vendor over VDA 5050, takes orders from your WMS, and rolls the same master control setup out to every site you run.</p><p><a href="https://flowfuse.com/contact-us/">Contact Us</a></p>]]></content>
        <updated>2026-08-12T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/connect-agvs-vda-5050-mqtt/"/>
        
    </entry>
    <entry>
        <id>https://flowfuse.com/blog/2026/08/manufacturing-dashboard-examples/</id>
        <title>5 Manufacturing Dashboard Examples for Production, OEE &amp; Quality</title>
        <summary>Manufacturing dashboards give teams real-time visibility into production, OEE, downtime, quality, and calibration. Explore five dashboard examples and the key metrics that help manufacturers improve operations.</summary>
        <content type="html"><![CDATA[<p>A manufacturing dashboard brings machine data, production metrics, downtime, and quality information into one real-time view, so teams can understand what's happening on the shop floor and act on it.</p><p>This guide covers what manufacturing dashboards do, the metrics they should track, and five dashboard examples, for production, OEE, downtime, quality, and calibration, built with <a href="https://flowfuse.com/">FlowFuse</a>.</p><h2 id="what-is-a-manufacturing-dashboard">What Is a Manufacturing Dashboard?</h2><p>A manufacturing dashboard is a visual interface for monitoring production performance in real time. It pulls data from factory equipment and business systems (<a href="https://flowfuse.com/blog/2025/12/what-is-plc/">PLCs</a>, <a href="https://flowfuse.com/use-cases/scada/">SCADA</a>, <a href="https://flowfuse.com/blog/2025/06/what-is-mes/">MES</a>, <a href="https://flowfuse.com/blog/2025/06/connect-shop-floor-to-odoo-erp-flowfuse/">ERP</a>, <a href="https://flowfuse.com/blog/2025/08/getting-started-with-flowfuse-tables/">databases</a>, sensors, or operator input) into a single view built around production output, machine status, downtime, OEE, quality, and targets. FlowFuse's own <a href="https://flowfuse.com/platform/dashboard/">Dashboard platform</a> is built specifically for assembling these views without writing custom front-end code.</p><p>The key difference between a dashboard and a report is timing. A report tells you what happened after the shift ends. A dashboard shows you what's happening now, while there's still time to change the outcome.</p><p>That's also what separates a good dashboard from a cluttered one: it doesn't try to show everything. It shows the specific person using it what they need in order to act, which is exactly why dashboards have become so central to how manufacturers run production.</p><h2 id="why-dashboards-matter-in-manufacturing">Why Dashboards Matter in Manufacturing</h2><p>Production problems get expensive when they stay invisible. A machine that stops, a line falling behind target, or a defect that goes unnoticed can quietly erode throughput, cost, and delivery schedules before anyone catches it.</p><p>A shared dashboard closes that gap. Operators see production status as it happens, supervisors track performance across the line, and maintenance teams spot equipment issues sooner. The value isn't the dashboard itself; it's the time saved between a problem occurring and someone responding to it. That's the shift FlowFuse is built to support: turning raw factory data into faster decisions on the floor, whether the source is an MES system or a SCADA historian.</p><p>Knowing dashboards matter is one thing. Knowing what belongs on them is another, and that comes down to the metrics behind the view.</p><h2 id="key-metrics-every-manufacturing-dashboard-should-track">Key Metrics Every Manufacturing Dashboard Should Track</h2><p>The right KPIs depend on the role and the goal, but most production dashboards center on <a href="https://flowfuse.com/blog/2025/06/shop-floor-kpis-for-mes/">four categories: output, equipment performance, downtime, and quality</a>.</p><ul><li><strong>Production output:</strong> actual output against the planned target</li><li><strong>OEE:</strong> equipment effectiveness across availability, performance, and quality</li><li><strong>Downtime:</strong> lost production time and its biggest contributing causes</li><li><strong>Cycle time:</strong> whether machines and processes are running at expected speed</li><li><strong>Quality performance:</strong> defects, scrap, rework, and first-pass yield</li><li><strong>WIP levels:</strong> where bottlenecks are forming in the production flow</li></ul><p>These metrics exist to answer a small set of operational questions: Are we producing at the required rate? Are machines running effectively? Where is time being lost? Are we producing quality parts? If a dashboard can't answer those quickly, it's showing too much, or the wrong things.</p><p>What that looks like in practice varies by where the metrics are applied. Here's how these same building blocks show up across five common manufacturing dashboards.</p><a href="https://flowfuse.com/book-demo/"><img src="https://flowfuse.com/images/cta/wenco-book-demo.png" alt="Wenco deploys new dashboard pages in days with FlowFuse - book a demo"/></a><h2 id="manufacturing-dashboard-examples">Manufacturing Dashboard Examples</h2><p>Dashboards work best when they're designed around a specific decision, not a general audience. A production team needs visibility into output and downtime; quality and maintenance teams need a different lens entirely. The five examples below show common patterns, all built with FlowFuse using data from machines, production systems, databases, and industrial protocols, but for using it purpose it uses demo data</p><h3 id="_1-production-dashboard-andon-live">1. Production Dashboard (Andon Live)</h3><p>A production dashboard answers one question in real time: is the line hitting its target? FlowFuse's <strong>Andon Live Dashboard</strong> gives operators and supervisors a shop-floor view of actual output against target, shift progress, and current line status, so a gap can be caught and addressed before it grows.</p><p>The same live data is useful during a <a href="https://flowfuse.com/blog/2026/08/run-at-rate/">run at rate</a>, when a team needs to verify that the line can sustain its required output before launch.</p><p><img alt="FlowFuse Andon Live dashboard showing a target of 100 against an actual count of 84, a delta of 16, stoppage timers, and the current shift for Production Line 33" src="https://flowfuse.com/blog/2026/08/images/andon-live-dashboard.png"/><em>FlowFuse Andon Live dashboard showing a target of 100 against an actual count of 84, a delta of 16, stoppage timers, and the current shift for Production Line 33</em></p><p>It typically shows actual production count, target vs. actual output, shift progress, and stoppage information, the same building blocks behind FlowFuse's <a href="https://flowfuse.com/blog/2025/06/building-andon-task-manager-dashboard-with-ff/">Andon Task Manager</a>. Because every production environment is different, FlowFuse connects this same dashboard pattern to whatever data sources are already in place, including PLCs, MES systems, production counters, <a href="https://flowfuse.com/blog/2024/06/how-to-use-mqtt-in-node-red/">MQTT</a>, and <a href="https://flowfuse.com/blog/2025/07/reading-and-writing-plc-data-using-opc-ua/">OPC UA</a>.</p><p><strong>Ready to deploy:</strong> <a href="https://flowfuse.com/blueprints/manufacturing/andon-live/">Andon Live Dashboard</a></p><h3 id="_2-oee-dashboard">2. OEE Dashboard</h3><p>Where a production dashboard tells you whether output is on target, an OEE dashboard explains <em>why</em> it isn't. FlowFuse's <strong>OEE Dashboard</strong> combines production and downtime data into one view covering OEE, availability losses, performance losses, quality losses, and trend data over time.</p><p><img alt="FlowFuse OEE dashboard with gauges for OEE, performance, availability and quality above a downtime summary, production totals, and a table of underperforming machines" src="https://flowfuse.com/blog/2026/08/images/oee-dashboard--1-f77f847f.png"/><em>FlowFuse OEE dashboard with gauges for OEE, performance, availability and quality above a downtime summary, production totals, and a table of underperforming machines</em></p><p>That breakdown matters because a low OEE score can come from very different root causes, frequent stops, slow cycle times, or defect rates, and each one needs a different fix. Separating them lets teams target the actual source of the loss instead of <a href="https://flowfuse.com/blog/2026/05/fixing-oee-measurement-in-manufacturing/">chasing a misleading number</a>.</p><p><strong>Ready to deploy:</strong> <a href="https://flowfuse.com/blueprints/manufacturing/oee-dashboard/">OEE Dashboard</a></p><h3 id="_3-downtime-dashboard">3. Downtime Dashboard</h3><p>Availability losses are usually the biggest piece of that OEE picture, which is why they tend to warrant a dedicated view of their own. Downtime is the single biggest drain on production capacity, and the real question isn't just <em>when</em> machines stop, it's <em>why</em>. FlowFuse's <strong>Downtime Tracking Dashboard</strong> captures stop events as they happen and turns them into a live view of downtime duration, causes, and impact on availability, rather than <a href="https://flowfuse.com/blog/2026/06/event-driven-downtime-escalation-workflow/">something pieced together from manual spreadsheets after the fact</a>.</p><p><img alt="FlowFuse downtime tracking dashboard listing open stoppages by machine with start times, how long each has been open, and a button to close the event and log a reason" src="https://flowfuse.com/blog/2026/08/images/downtime-logger.png"/><em>FlowFuse downtime tracking dashboard listing open stoppages by machine with start times, how long each has been open, and a button to close the event and log a reason</em></p><p>That shift, from reviewing downtime after a shift to tracking it in real time, is what lets teams move from reacting to failures toward reducing what causes them.</p><p><strong>Build it:</strong> <a href="https://flowfuse.com/blog/2026/07/build-downtime-logger/">Build a Machine Downtime Tracking Application</a></p><h3 id="_4-quality-dashboard-defect-quality-monitoring">4. Quality Dashboard (Defect &amp; Quality Monitoring)</h3><p>Quality losses need the same treatment. A quality dashboard shows where defects are happening and what's driving them. FlowFuse's <strong>Defect &amp; Quality Monitoring Dashboard</strong> combines defect data, production information, and quality KPIs, including defect trends, defect categories, first-pass yield, cost of poor quality, and a Pareto breakdown of causes, into one view.</p><p><img alt="FlowFuse defect and quality monitoring dashboard with a Pareto chart of defect types, a root cause breakdown, severity and disposition splits, and SLA resolution times" src="https://flowfuse.com/blog/2026/08/images/flowfuse-defect-monitoring-dashboard.png"/><em>FlowFuse defect and quality monitoring dashboard with a Pareto chart of defect types, a root cause breakdown, severity and disposition splits, and SLA resolution times</em></p><p>The <a href="https://flowfuse.com/blog/2025/09/creating-pareto-chart/">Pareto view</a> tends to be the most useful part: it isolates the small number of issues responsible for most of the quality loss, so improvement effort goes where it actually pays off, instead of spreading thin across every defect type. Pairing it with <a href="https://flowfuse.com/blog/2025/07/quality-control-automation-spc-charts/">statistical process control</a> catches quality drift before it produces a defect at all.</p><p><strong>Build it:</strong> <a href="https://flowfuse.com/blog/2026/07/defect-and-quality-monitoring/">Build a Defect Tracking and Quality Monitoring Dashboard</a></p><h3 id="_5-calibration-dashboard">5. Calibration Dashboard</h3><p>Defects aren't always caused by the process itself; sometimes the measurement equipment used to catch them is the problem. Where measurement accuracy affects product quality and compliance, <a href="https://flowfuse.com/blog/2026/07/what-is-instrument-calibration/">instrument calibration</a> tracking can't run on spreadsheets. FlowFuse's <strong>Calibration Management Dashboard</strong> gives teams a live view of measurement equipment status (what's ready, what's due, what's overdue) along with calibration history and compliance status, cutting the risk of equipment running outside its required window.</p><p><img alt="FlowFuse calibration management dashboard showing 120 instruments split into valid, due soon and overdue, a 73.3% compliance rate, and a table of overdue tools by department" src="https://flowfuse.com/blog/2026/08/images/calibration-management-dashboard.png"/><em>FlowFuse calibration management dashboard showing 120 instruments split into valid, due soon and overdue, a 73.3% compliance rate, and a table of overdue tools by department</em></p><p><strong>Build it:</strong> <a href="https://flowfuse.com/blog/2026/07/calibration-management-dashboard/">Tracking Instrument Calibration with a Digital Dashboard</a></p><h2 id="manufacturing-dashboard-design-best-practices">Manufacturing Dashboard Design Best Practices</h2><p>Having the right dashboard type for the job is only half the equation. How it's designed determines whether anyone actually uses it. A manufacturing dashboard should make decisions easier, not add more information to review, and the best dashboards are designed around the people using them and the actions they need to take.</p><p>Key principles include:</p><ul><li><strong>Design for the user:</strong> operators, supervisors, and managers need different views based on their responsibilities</li><li><strong>Focus on actionable metrics:</strong> every KPI should help identify a problem, measure progress, or support a decision</li><li><strong>Keep important information visible:</strong> production status, downtime, and quality issues should be clear without searching through multiple screens</li><li><strong>Avoid unnecessary complexity:</strong> too many charts and metrics make important information harder to find</li><li><strong>Support drill-downs:</strong> start with a clear overview, then allow users to investigate the details behind an issue</li></ul><p>A successful manufacturing dashboard is not the one with the most data. It is the one that helps the right person understand the situation and act quickly.</p><p>One design decision worth calling out on its own is timing: not every dashboard should show the same moment in time.</p><h2 id="real-time-vs-historical-manufacturing-dashboards">Real-Time vs. Historical Manufacturing Dashboards</h2><p>Not every manufacturing decision requires the same type of dashboard:</p><ul><li><strong>Real-time dashboards</strong> are built for immediate action, showing what is happening on the shop floor right now, such as current production output, machine status, downtime events, and quality issues</li><li><strong>Historical dashboards</strong> are <a href="https://flowfuse.com/blog/2025/08/time-series-dashboard-flowfuse-postgresql/">built for analysis</a>, helping teams identify trends, compare performance over time, and understand recurring problems</li></ul><p>Manufacturers often need both. Real-time dashboards keep production running today, while historical dashboards help improve how production runs tomorrow.</p><p>Timing is one axis a dashboard can vary on. Who it's built for is another, and that's a separate design decision entirely.</p><h2 id="single-source-of-truth-vs-user-specific-dashboards">Single Source of Truth vs. User-Specific Dashboards</h2><p>Manufacturing dashboards can follow two common <a href="https://dashboard.flowfuse.com/getting-started#design-patterns" rel="nofollow">design patterns</a> depending on how they are used.</p><p>A <strong>single source of truth dashboard</strong> gives everyone the same operational view. This works well for Andon boards, production displays, and OEE dashboards, where teams need a shared understanding of factory performance.</p><p><img alt="Single source of truth pattern: a device populates both a ui-chart and a database, and the chart displays the same dashboard to all clients" src="https://flowfuse.com/blog/2026/08/images/design-pattern-single.png"/><em>Single source of truth pattern: a device populates both a ui-chart and a database, and the chart displays the same dashboard to all clients</em></p><p>A <strong>user-specific dashboard</strong> provides different information based on the user's role or workflow. Operators, for example, may see production status and tasks, while maintenance teams see equipment issues and service information. This pattern relies on the dashboard knowing who's looking at it, which is what FlowFuse's <a href="https://flows.nodered.org/node/@flowfuse/node-red-dashboard-2-user-addon" rel="nofollow">multi-user addon</a> is built to support.</p><p><img alt="User-specific pattern: opening the dashboard fires a ui-event that queries the database using the viewer's client ID, so the chart displays data for that user only" src="https://flowfuse.com/blog/2026/08/images/design-pattern-multi-user.png"/><em>User-specific pattern: opening the dashboard fires a ui-event that queries the database using the viewer's client ID, so the chart displays data for that user only</em></p><p>The right approach depends on the decision the dashboard needs to support. Some manufacturing applications use one shared view; others combine shared visibility with role-specific information. Either way, someone has to actually connect the underlying data and build the thing, which is where FlowFuse comes in.</p><h2 id="building-manufacturing-dashboards-with-flowfuse">Building Manufacturing Dashboards with FlowFuse</h2><p>The challenge in manufacturing is rarely a lack of data. Most factories already generate information from machines, PLCs, sensors, and business systems. The real challenge is connecting that data and turning it into something teams can use, whether that's a single shared view or a set of role-specific ones.</p><p>FlowFuse helps manufacturers build operational dashboards by connecting industrial data sources, processing production information, and creating applications for the shop floor. A typical workflow includes:</p><ul><li><strong>Connect data:</strong> bring in data from PLCs, machines, databases, and protocols such as MQTT, OPC UA, and <a href="https://flowfuse.com/blog/2023/05/integrating-modbus-with-node-red/">Modbus</a></li><li><strong>Process data:</strong> convert production events, downtime, and quality records into useful metrics</li><li><strong>Build dashboards:</strong> create views for operators, supervisors, and managers</li></ul><p>Once a dashboard is built, teams can manage and deploy it across multiple lines, or facilities without rebuilding it from scratch, to keep every deployment in sync. The goal is simple: turn factory data into <a href="https://flowfuse.com/platform/features/">reusable applications that improve operational visibility</a>.</p><h2 id="conclusion">Conclusion</h2><p>Manufacturing dashboards give teams a shared view of what is happening on the shop floor. They help operators respond faster, supervisors understand performance, and engineers identify opportunities for improvement.</p><p>From production tracking and OEE monitoring to downtime analysis, quality management, and calibration control, the right dashboard connects operational data with the decisions teams need to make, whether that decision needs a real-time or historical view, a shared display or a role-specific one.</p><p>The goal is not to create more screens. It is to create better visibility into production and give teams the information they need to keep improving. With <a href="https://flowfuse.com/platform/why-flowfuse/">FlowFuse</a>, manufacturers can connect existing factory data, build operational applications, and scale successful dashboards across machines, lines, and facilities.</p><p><strong>Build Your Manufacturing Dashboard</strong></p><p>Connect factory data and create real-time dashboards for production, OEE, downtime, and quality with FlowFuse.</p><p><a href="https://flowfuse.com/book-demo/">Book a Demo</a></p>]]></content>
        <updated>2026-08-05T00:00:00.000Z</updated>
        <link href="https://flowfuse.com/blog/2026/08/manufacturing-dashboard-examples/"/>
        
    </entry>
</feed>