-
Notifications
You must be signed in to change notification settings - Fork 0
Training Build a Weather Lookup Screen V3 Watched Locations
Weather Lookup series · Part 3 of 3 · Level: Advanced. ← Part 1 — Build the Screen (beginner) · Part 2 — Store the Readings (intermediate). This is the capstone: a model relation, a scheduled loop, a conditional alert, input validation, and a chart.
Add-on to Training: Weather Lookup V2 — Store the Readings. Build V1 and V2 first — this picks up where V2 left off and assumes you have the working
Weather APIconnection, the deployedWeatherReadingmodel, and theWeather Lookupscreen with its history table.
What you'll learn: how to turn the manual, one-ZIP-at-a-time lookup into a hands-off monitoring system — define the places you care about in their own model, relate their readings back to them, and run a scheduled flow that loops every watched location, captures the weather, stores it, and raises an alert when a location is over its temperature threshold. You'll also add input validation so only real ZIPs get saved, and a trend chart so the stored history is something you can actually read.
You need: Administrator or Developer access type. V1 and V2 completed. Time: 60–75 minutes.
In V2 a user types a ZIP, the flow looks it up, upserts a WeatherReading (deduped by zip|date), and the screen shows the saved history in a table. It's persistent, but still manual — someone has to open the screen and type a ZIP for anything to get captured, and nothing happens with the numbers once they're stored.
ZIP ─▶ Source ─▶ Set Context ─▶ HTTP ─▶ reshape ─┬─▶ Response (weather → screen)
└─▶ Mutate (UPSERT WeatherReading, key = zip|date)
V3 adds four things:
- A
WatchedLocationmodel — the list of ZIPs you want monitored, each with its own alert threshold. - A relation so every
WeatherReadingpoints back to theWatchedLocationit came from. - A scheduled System flow that, with no one watching, queries the active watched locations, loops each one, fetches its weather, upserts the reading (linked to the location), and logs a heat alert when the temperature crosses the location's threshold.
- The supporting polish: ZIP validation on the watched-location form, and a temperature trend chart on the Weather screen.
(cron 6 AM)
Source ─▶ Get Active Locations ─▶ Extract Locations ─▶ Broadcast ─┐
│ (one message per location)
┌─────────────────────────────────────────────────────────────────┘
└▶ Stash Location ─▶ Get Weather ─▶ Build Reading ─┬─▶ Upsert Reading (WeatherReading + FK)
└─▶ Over Threshold? ──true──▶ Heat Alert (log)
A watched location is setup data — a short list a user maintains, not a transactional stream — so model it as a Master type.
-
Create the model. App Designer → Data Model → New Model: Name
WatchedLocation, ModuleTraining Module, TypeMaster. Add these fields:Field Type Notes zipString!the ZIP to watch — Required labelStringa friendly name, e.g. "Beverly Hills" alertThresholdFIntraise an alert when the captured temp is at or above this activeBooleanonly active locations get captured — lets you pause one without deleting it Save the model before you do anything else. (Lesson from the build: if you start adding a model on the Schema Designer canvas and then open a different model before saving, the canvas is one-model-at-a-time and your unsaved model is discarded. Save first, navigate second.)
-
Relate the two models. With both
WatchedLocationandWeatherReadingon the canvas, drag fromWeatherReading's connector handle ontoWatchedLocationand choose Many-To-One (many readings belong to one location). Fuuz creates:- on
WeatherReading: a foreign-key fieldwatchedLocationIdplus awatchedLocationreference, - on
WatchedLocation: a reverse collectionweatherReadings.
This is the same Many-To-One pattern from Relate Two Data Models —
WeatherReadingis the "many" side that carries the FK. - on
-
Save and deploy both. Saving the relation bumps
WeatherReadingto a new version (v2). Click the deploy/upload icon — Fuuz prompts "Deploy 2 data models?" because the relation touches both. Confirm. Both deploy together so the FK is usable by the flow and the API.

Why a separate model instead of just a list of ZIPs in the flow? Because the threshold travels with the location. Beverly Hills alerts at 80°F, Miami at 88°F — that's per-place configuration a non-developer can edit in a screen, not something hard-coded in a flow.
You need at least one active location for the flow to have something to do. The quickest way is the GraphQL API Explorer (Schema & GraphQL → API Explorer). Note the create payload wraps the fields under a create: key:
mutation SeedWatchedLocations {
createWatchedLocation(payload: [
{ create: { zip: "90210", label: "Beverly Hills", alertThresholdF: 80, active: true } },
{ create: { zip: "33139", label: "Miami Beach", alertThresholdF: 88, active: true } }
]) { id zip label alertThresholdF active }
}(Once you build the form in Part 4, you'll add locations through the UI instead.)
This is a System flow (backend, no screen), built in App Designer → Data Flow → New Flow: Module Training Module, Environment Backend, Type System. Name it Weather Auto-Capture.
The whole flow is one chain with a fan-out at the end. Drag each node from the Toolbox and wire output-port → input-port. Save early (File → Save names the flow) so you don't lose work.
-
Source (Toolbox → Debugging → Source). The entry point. No config — it's just the trigger the schedule (or the manual ▶ button) fires.
-
Get Active Locations (Fuuz → Query). Fetches the locations to process:
{ watchedLocation(where: {active: {_eq: true}}) { edges { node { id zip label alertThresholdF active } } } }API =
Application. -
Extract Locations (Scripts → JSONata). The query returns a connection; pull out the plain array of nodes so the next node can iterate it:
watchedLocation.edges.node -
Broadcast (Flow Control → Broadcast). This is the for-each. Given an array, it emits one message per element — so everything downstream runs once per location. No config; it iterates whatever array it receives.
-
Stash Location (Context → Set Context). The next node (the HTTP call) replaces the payload with the weather response, so the location's
id/zip/alertThresholdFwould be lost. Stash the whole location in context first:{ "loc": $ }Set Context writes
context.locand passes the payload through unchanged. -
Get Weather (Integration → HTTP). Connection =
Weather API(the wttr.in connection from V1), Method =Get. Toggle the Path to expression mode (</>) and read the ZIP back out of context:"/" & $state.context.loc.zip & "?format=j1" -
Build Reading (Scripts → JSONata). Reshape the wttr.in
j1response into a clean reading, pulling the location fields back from context and casting the API's string numbers:( $c := current_condition[0]; $a := nearest_area[0]; $loc := $state.context.loc; $date := $substringBefore($now(), "T"); { "key": $loc.zip & "|" & $date, "zip": $loc.zip, "date": $date, "watchedLocationId": $loc.id, "alertThresholdF": $loc.alertThresholdF, "tempF": $number($c.temp_F), "feelsLikeF": $number($c.FeelsLikeF), "humidity": $number($c.humidity), "windMph": $number($c.windspeedMiles), "windDir": $c.winddir16Point, "conditions": $c.weatherDesc[0].value, "location": $a.areaName[0].value, "region": $a.region[0].value } )Note it carries
watchedLocationId(so the reading links to its location) andalertThresholdF(so the threshold check downstream has it).alertThresholdFis not aWeatherReadingfield — it just rides along for the conditional and is dropped before the upsert.Build Reading fans out to two nodes — connect its output port to both Upsert Reading and Over Threshold?.
-
Upsert Reading (Fuuz → Mutate). Same dedup upsert as V2, now also writing the FK:
-
Mutation:
mutation ($payload:[WeatherReadingUpsertPayloadInput!]!){ upsertWeatherReading(payload:$payload){ id key } }
-
Variables Transform:
The
{ "payload": [{ "where": { "key": key }, "create": { "key": key, "zip": zip, "date": date, "watchedLocationId": watchedLocationId, "location": location, "region": region, "conditions": conditions, "windDir": windDir, "tempF": tempF, "feelsLikeF": feelsLikeF, "humidity": humidity, "windMph": windMph }, "update": { "watchedLocationId": watchedLocationId, "location": location, "region": region, "conditions": conditions, "windDir": windDir, "tempF": tempF, "feelsLikeF": feelsLikeF, "humidity": humidity, "windMph": windMph } }] }{where, create, update}shape is exactly whatWeatherReadingUpsertPayloadInputexpects (you can confirm the shape in the API Explorer's Documentation Explorer — the samecreate:-wrapped structure you saw when seeding locations).alertThresholdFis deliberately left out — it isn't a model field.
-
Mutation:
-
Over Threshold? (Conditionals → If Else). Condition:
(alertThresholdF != null) and (tempF >= alertThresholdF)The null guard means a location with no threshold set never alerts.
-
Heat Alert (Debugging → Log), wired off the True port. Level =
Warn, Message Transform:"HEAT ALERT: " & location & " (" & zip & ") is " & $string(tempF) & "F, over threshold of " & $string(alertThresholdF) & "F"This is intentionally a log, not a notification — it proves the branch fires without sending anything. Swapping the Log node for a System Email or Notification node is the natural next step (and is covered by Create a Notification Channel).
Save, then deploy (File → Deploy, or the upload icon). A System flow must be deployed before a schedule can run it.
Scroll to the Source node and click its orange trigger button to run the flow once. Watch the Console — it prints a per-node trace (input, output, context for every node). With two active locations you'll see the chain run twice past the Broadcast: Extract Locations outputs an array of 2, Broadcast emits each, Get Weather returns live current_condition/nearest_area, Build Reading produces { key: "90210|YYYY-MM-DD", … }, and Upsert Reading returns upsertWeatherReading records. If Get Weather errors, check the Path expression and the Weather API base URL; if Upsert Reading errors, re-check the variables shape against WeatherReadingUpsertPayloadInput.

The full node chain (saved layout): Source → Get Active Locations → Extract Locations → Broadcast → Stash Location → Get Weather → Build Reading → Upsert Reading / Over Threshold? → Heat Alert.

The Console after one run — each node logged twice (once per active ZIP): Get Weather, Build Reading, Over Threshold?, and Upsert Reading all fired for both 90210 and 33139.
The Console trace is your best debugging tool. Every node logs what it received and returned, so you can see exactly where
context.locis set, what the reshape produced, and whether the threshold branch went true or false.
A System flow doesn't run on its own — you attach a Flow Schedule.
- Open Orchestration → Data Flow Schedules Editor (or header Search "Flow Schedule").
- Click + to create a schedule: Name
Weather Auto-Capture Daily, Data Flow =Weather Auto-Capture, leave Active checked, Input SchemaAny. Save. - Select the new schedule (the magnifier in its row) to load Schedule Frequencies, then + to add one: Name
Every morning 6 AM, Schedule TypeCron, Schedule0 6 * * *. Save.
The frequency row shows a green Valid check and an Estimated Next Execution — that's your confirmation the cron parsed. From now on the flow runs every morning and builds history with nobody opening a screen. (Set the Timezone field on the frequency if you want 6 AM local rather than UTC.)

The schedule's frequency row — Every morning 6 AM, Active and Valid, with a Last Execution timestamp showing it has already fired.
See Schedule a Data Flow for the full tour of the schedules editor.
A watched location is worthless if someone fat-fingers the ZIP, so enforce a real 5-digit ZIP. The cleanest place is the model field itself — validation there protects every form bound to the model and the API, not just one screen.
- Open the
WatchedLocationmodel (App Designer → Workspace → Training Module → Data Models →WatchedLocation). - Click the
zipfield, then the Validation tab in the field properties. - In the JSON Schema editor, enter a pattern that requires exactly five digits:
(
{"type":"string","pattern":"^[0-9]{5}$"}Min Length/Max Lengthof 5 would also work, but the pattern is precise — digits only.) -
Save the model (this creates
WatchedLocationv2) and Deploy it. No data migration is needed — adding a validation pattern isn't a breaking change.
Verify it. In the API Explorer, try to create a bad one:
mutation { createWatchedLocation(payload: [
{ create: { zip: "abc", label: "Bad ZIP test", active: true } }
]) { id zip } }It's rejected: "data must match pattern \"^[0-9]{5}$\"" (the error's extensions.fuuz.validation block points at schemaPath "#/pattern"). A valid "90210" saves fine.

The mutation (center) and the rejection (right) — the pattern validation fires at the API, so it protects every form bound to the model.
Field-level vs element-level validation. Model-field validation (what we did) applies everywhere — the API, the flow's upserts, and any generated form. If you only want to validate one specific form, you can instead put the rule on that screen's
zipinput element. For a value users maintain in multiple places, the model is the right home.
To let users maintain the list through a UI, generate a form+table screen from the model and expose it with a route — see Generate a Screen from a Data Model and Expose a Screen with Routes and Menus. The model-level ZIP rule fires automatically on that form.
The V2 history table is accurate but hard to read at a glance. Add a chart to the Weather screen that plots tempF over date.
- Open the Weather Lookup screen in the screen designer (Workspace → Training Module → Screens →
Weather Lookup). - From the Elements palette, open Display and drag a Chart onto the canvas below the history table.
- With the chart selected, under Chart Configuration click "Click here to configure this Chart." A 5-step wizard opens:
- 1 · Chart Type — choose Line (under Single Series).
-
2 · Data Model — API
Application, Data ModelWeatherReading. -
3 · Configure Data — tick
datein the Label Field column (the X axis) andtempFin the Value Field column (the Y axis). The live preview renders as soon as both are set. -
4 · Filter & Sort — add a Sort By stage on
date, ASC, so the line reads left-to-right, and add the rolling-window filter below. (The chart shows all watched ZIPs as one trend; see "Why the chart can't filter to the ZIP you type" for why a per-entry filter doesn't work here.) -
5 · Configure Chart — Caption
Temperature Trend, X Axis LabelDate, Y Axis LabelTemp F. Save (the disk icon).
- Save the screen and Deploy it. (On deploy, Fuuz asks "create a route first?" — the Weather Lookup screen already has its V1 route, so cancel that prompt; the existing route still serves the updated screen.)
The chart renders the stored readings as a line — with the scheduled flow running daily, the trend fills in over time without anyone touching the screen.

The deployed screen. The weather result (and the "How this screen is wired" panel) sit at the top, with the history table and the Temperature Trend line chart below — the chart plots tempF over date from the stored WeatherReading history and refreshes after each lookup.
Arrange the layout to taste. Where the result, table, and chart sit is up to you — drag the containers in the designer to reorder them. A common, friendly arrangement (shown above) puts the weather result at the top so it's the first thing the user sees, with the history table and chart below. The wiring is identical regardless of order; only the container layout changes.

The finished screen in action: enter a ZIP, click Get Weather, and the weather result, the deduped history table, and the rolling Temperature Trend chart all refresh from the single lookup.
With the scheduled flow writing every day, an unfiltered chart grows forever and gets unreadable. Bound it to a rolling window so it always shows just the last 7 days, no matter when it's opened. In the wizard's Filter & Sort step:
- Click + RULE, set the field to
Dateand the operator toafter(this maps to adate >= …predicate). - On the value, click the
</>toggle to switch it from a date-picker to a JSONata expression, and enter:This is "now, minus 7 days, formatted as$substringBefore($fromMillis($toMillis($now()) - 7 * 86400000), "T")YYYY-MM-DD" — the same date format the flow stores.$toMillis($now())is the current epoch ms; subtract7 * 86400000(7 days);$fromMillis(...)turns it back into an ISO timestamp;$substringBefore(…, "T")keeps just the date. Because the value is an expression, it re-evaluates every time the screen loads — the window is always relative to today, never a hard-coded date. - For a 10-day window, change the
7to10. For a>=that includes exactly 7 days ago, theafteroperator (_gte) already does that.
Save the chart config (disk icon), then Save + Deploy the screen. The chart now self-trims to the last week as new readings arrive.
Two gotchas worth knowing. (1) The value must be an expression (
</>on) — a plain date-picker value can't be relative. If the expression field is left empty you'll see "Date cannot represent an invalid date-string" in the preview. (2) When you're done editing the expression, click the wizard's save icon — don't pressCtrl/Cmd+AthenDeletewhile focus is on the canvas instead of the editor, or you'll delete the selected chart element (recoverable with Undo).
Going further. For a richer, fully custom visualization (multiple locations on one chart, a threshold reference line, gauges), the fuuz-html-dashboards pattern — a backend flow that builds an HTML data-URI rendered in an embedded-webpage element — is the production approach.
A reasonable next thought: "the screen takes a ZIP — can the chart show only that ZIP's line?" You'd add a second Filter & Sort rule, Zip equals <the entered ZIP>, and wire Get Weather to reload the chart ($components.Chart1.fn.loadData()). It looks right, but the chart keeps showing every ZIP. Here's why, and it's worth understanding:
A chart's query filter runs server-side, where the screen's live form values don't exist. The chart fetches its data with a backend query, and the filter predicate is evaluated as part of that query. Server-side it can see server-evaluable things — a literal, $now(), $metadata.urlParameters — but not $components.Form1.formState.values.zip, which is client-side screen state. So the ZIP reference resolves to nothing, the predicate is dropped, and you get all rows. (You can prove the mechanism is fine by temporarily hard-coding the value to a literal like "90210" in the wizard — the preview filters perfectly. Swap it back to the $components expression and the filter silently does nothing.) This is the opposite of the V2 history table, whose markdown and rows do update on lookup — those are driven client-side by the flow response, not by a server-side chart query.
Contrast this with the rolling 7-day date filter above, which does work: $now() is evaluable on the server, so that predicate applies. The rule of thumb: a chart filter can only reference values the server can compute on its own.
To genuinely scope a chart to a value the user picks, you have two real options:
-
URL parameter. Filter on
$metadata.urlParameters.zip(server-readable) and have the screen carry the ZIP in the URL. The trade-off is the screen reloads to apply it, instead of the smooth in-place update. -
One line per ZIP (multi-series). Group the chart by
zipso every watched location gets its own colored line over the window — no entered value needed, and arguably more useful for a watched-locations screen.
For this training we keep the chart as the all-ZIPs, rolling-7-day overview (it still reloads after each lookup so today's new reading shows up), and use the history table for single-ZIP detail. The lesson — chart filters are server-side; screen-input values are client-side — is the takeaway.
| Concept | How V3 does it |
|---|---|
| One-to-many relation |
WatchedLocation 1—* WeatherReading via Many-To-One; FK watchedLocationId on the reading. |
| Iterate a list in a flow | Broadcast node = for-each; emits one message per array element. |
| Carry data across a node that replaces the payload |
Set Context ({ "loc": $ }) before the HTTP call, read back with $state.context.loc. |
| Per-item external call |
HTTP node with an expression Path ("/" & $state.context.loc.zip & "?format=j1"). |
| Write a linked record | Upsert with watchedLocationId in both create and update. |
| Conditional side-effect |
If Else on tempF >= alertThresholdF, True → Log (swap for a notification later). |
| Run with nobody watching |
Flow Schedule + Cron frequency (0 6 * * *) on the deployed System flow. |
| Keep bad data out | ZIP validation (^\d{5}$) on the field/form. |
| Make stored data readable | A trend chart of tempF over date. |
| Keep a growing chart bounded | A dynamic date filter — Date after a JSONata expression ($now() − 7 days), re-evaluated on every load. |
| Symptom | Fix |
|---|---|
| Your new model vanished | The Schema Designer canvas is one-model-at-a-time. Save before opening another model. |
| Location data gone after the HTTP node | HTTP replaces the payload — stash what you need in context first. |
createWatchedLocation rejects zip/label/… |
The create payload wraps fields under create: — { create: { zip: … } }, not { zip: … }. |
| Threshold alert never fires | Check the null guard and that alertThresholdF actually rode through from Build Reading; confirm via the Console trace. |
| Schedule created but never runs | The flow must be deployed (not just saved), and the schedule + its frequency must both be Active. |
| Chart won't filter to the entered ZIP | Chart query filters run server-side and can't read client $components form values. Use a literal, $now(), or $metadata.urlParameters — or scope via a URL parameter / one line per ZIP. See "Why the chart can't filter to the ZIP you type". |
You started with a one-shot lookup (Part 1), made it remember each result (Part 2), and turned it into a hands-off monitoring system here in Part 3. Along the way you used most of the platform's core building blocks: a connection, a screen, a data model, a relation, several flow node types (Query, Broadcast, Set Context, HTTP, JSONata, Mutate, If Else, Log), a flow schedule, field validation, and a chart. Point the same patterns at your own data and you can build a real operational app.
Part 1 — Build a Weather Lookup Screen · Part 2 — Store the Readings · Relate Two Data Models · Schedule a Data Flow · Create a Notification Channel
Getting Started (14)
- Access Field Level Help within the Fuuz Platform
- Field-Level Help
- Fuuz Platform 101: Low/No-Code Technology in Manufacturing
- Fuuz Platform Architecture
- Getting to Know the Fuuz Platform
- Logging into Fuuz – Cloud Access
- Manage what displays in Field Level Help throughout Fuuz
- Recovering Your Fuuz Account
- Sharing A Page
- Switching Between Apps in Fuuz
- Switching between Fuuz Environments (Build, QA, Production)
- Trouble Logging Into Fuuz
- Unique Email Plus Addressing
- Welcome To Industry Accelerators!
Training Guides (52)
Applications
- Brand and Configure Your Application
- Create an Application
- Deactivate (Retire) an Application
- Find Pages Beyond the Left Menu
- Install a Fuuz Package
- Navigate the Application Designer
- Retire an Application
Access & Users
- Approve Access Requests
- Approve Application Access Requests
- Configure the Internal Password Policy
- Create a Role
- Create an API Key
- Deactivate and Reactivate a User
- Grant Permissions with Policies
- Investigate Login Activity
- Invite a User to an Application
- Manage App Users
- Request Access to an Application
- Switch Applications, Roles, and Environments
- Understand Developer Access
- Understand Web Access
- Use the User Menu (Profile, Theme, and More)
Data Models & Schema
- Add a Custom Field
- Create a Data Model
- Create a Sequence
- Design Model Fields in the Schema Designer
- Relate Two Data Models
Screens
Weather Lookup Series — guided 3-part build
- Part 1 · Build the Screen (Beginner)
- Part 2 · Store the Readings (Intermediate)
- Part 3 · Watched Locations & Scheduled Capture (Advanced)
Data Flows & Integrations
- Call an External API with a Flow
- Connect to External Systems
- Create a Data Flow
- Create a Notification Channel
- Create a Webhook
- Save Queries, Scripts, and Data Mappings
- Schedule a Data Flow
- Use the Script Editor
Data, Reporting & Monitoring
- Browse Data with Data Explorer
- Build a Document (Report or Label)
- Check Component References
- Create Configuration Records (Modules, Units, Calendars, and More)
- Explore the GraphQL API
- Export Data
- Import Data into an Application
- Investigate Application Logs
- Save an Export Configuration
- Trace a Data Change
Enterprise & Organizations
Platform Concepts & Architecture (10)
- Bridging the Red and Blue Data Divide - How Fuuz Became the First Industrial Platform to Merge Operational and Business Intelligence
- Claude AI Skills for the Fuuz Platform
- Cool Things we built with Fuuz Episode 1 12.5.2025 (Public)
- Differences between MES and ERP from an ERP Consultant Eric Kimberling
- Fuuz can be your "Connected Worker Platform"
- Listen and Learn what MES is and what makes it unique
- Manufacturers struggle with Build versus Buy for their MES and what are the Core 4 Elements
- Stock Price Application
- Why All Manufacturers Build their MES System Part 1
- Why All Manufacturers Build their MES System Part 2
Screens & Application Design (17)
- Application Designer Guide
- Array Input
- Combobox
- Dynamic Field Configurations
- Fuuz Deployment Methodologies
- Fuuz Form Detail Screen Specification
- Historical Data Table Screen Design Standard
- JSON
- JSON Form Fields in Action Steps
- JSON Schema Inputs
- Master Data Table Screen Design Standard
- Mobile Screen Design Standard
- Screen Context Container
- Screen Generation (AI) Flow Template V1.5.1
- Setup Data Table Screen Design Standard
- Table Column Conditional Formatting
- Transform Data in a Column
Data Models & Schema (8)
Data Flows & Scripting (51)
Designing Flows
- Data Flow Design Standards
- Data Flow Logs
- Debugging and Testing our Fuuz Data Flows
- Flow Schedules
- Fuuz Data Flows enable DataOps at Scale, ETL, iPaaS and more
- How to Create APIs Using Data Flows in Fuuz
- How To General E-Commerce Integrations using Data Flows in Fuuz iPaaS
- How to Setup a daily file import using Fuuz Data Flows
- Managing Large Datasets in Fuuz: Data Flow Engine Performance Optimization
- The Power of Data Flows - Unlocking Industrial Intelligence with Fuuz
- Using Fuuz with FTP integrations and Data Flows iPaaS
Data Flow Nodes
- Data Flow Nodes Reference
- Debugging & Context Nodes
- Flow Control Nodes
- Fuuz Platform Nodes
- IIoT & Gateway Nodes
- Integration Nodes
- Notification Nodes
- Source & Trigger Nodes
- Transform Nodes
JSONata Reference
- Aggregation Functions
- Array Functions
- Boolean Functions
- Boolean Operators
- Comparison Operators
- Composition
- Construction
- Constructs
- Custom Fuuz Only JSONata Library
- Date Time Functions
- Date Time Processing
- Expressions
- Fuuz Bindings: $predicateFilter
- Higher Order Functions
- Jsonata Tutorial
- Numeric Functions
- Numeric Operators
- Object Functions
- Other Operators
- Path Operators
- Predicate Expressions
- Processing Model
- Regex
- Simple Queries
- Slow Transform Performance: JSONata vs JavaScript Optimization Guide
- Sorting Grouping and Aggregation
- String Functions
Scripting
Integrations & Connectors (30)
General & iPaaS
- API Keys
- Cloud Connectors - Complete Reference Guide
- Connecting a CRM with your ERP using Fuuz
- Connecting a Vending Machine to your ERP system using Fuuz
- Creating a Scheduled Integration & Sending a CSV File in an Email
- Debug a NetSuite SOAP API integration
- Fuuz Connections help you integrate your Systems and Devices
- Fuuz has lists of Connectors and Drivers you can use
- Fuuz has pre-built integration Connectors
- How to create a check an ODBC connection with another system
- How to Create a RESTful API Using the Fuuz Platform
- How to create a simple Integration and Store data in Fuuz
- How To Design or Configure Policies and Policy Groups for my App in Fuuz
- How to Integrate Fuuz with another product or another API
- How to Integrate with an HR system like ADP using Fuuz iPaaS
- How to use API Explorer and GraphQL to Query Data in Fuuz for Beginners
- How you Integrate your ERP with your MES
- Industry 3 and Industry 4 differences in ERP and MES Integrations
- Integrated Carrier Package
- Make REST-Based Calls With An API Key
- Policy Groups
- System connectivity validation - testing a connection when your 3rd party moves its hosting
- Using Fuuz as an iPaaS to Connect - to an API, Collect - Data from the API, Store - that data in Fuuz tables
Plex
- How to connect using Plex UX datasources from Fuuz iPaaS
- How to integrate with Plex Classic using Fuuz iPaaS
- How to Setup and Connect to Plex APIs
EDI
IIoT & Edge Gateway (18)
- Edge Connections: Complete Industrial Integration Reference
- Edge Gateway Flows
- Edge Gateway Installation Step-by-Step
- Edge to Cloud Infrastructure
- Gateway Deployment & Architecture
- Gateway System Requirements
- How IIoT fits into the Industrial Data "Stack"
Physical Device Connectors
- Connecting To Kepware OPCUA Server
- Fanuc Robot Connectivity using Edge Gateway
- HMI Template Standard - ISA-101 Compliant
- How to connect OPC/UA simulator to the Edge Gateway
- Modbus TCP
- MQTT
- Omron PLC/HMI NX102 Connectivity with Edge Gateway
Edge Data Connectors
Reporting, Documents & Dashboards (8)
- Building a Non-Conformance Report (NCR) Application in Fuuz
- Create responsive structured dashboard layouts using the Grid Container and Grid Cell components
- How to add visualizations (charts and graphs) to reports in Fuuz for Beginners
- How to build real-time reports in Fuuz from scratch for Beginners
- How to modify existing reports in Fuuz for Beginners
- Non-Conformance Report Accelerator
- Printing Documents
- Printing Documents From Fuuz
Administration & Access Control (27)
- Access Control
- Access Requests
- Access Requests: Overview
- Access Type Overview
- Access Types
- Add Users to Fuuz Apps
- App Admin Access
- App Management
- App Users
- Applications (Tenants)
- Authentication Events
- Change a User's Access Type
- Configurations
- Create Users and Set Access Type
- Enterprise Admin Overview
- Enterprise Users
- Enterprise Users vs Access Requests
- How To Login to your Fuuz Enterprise - Non Single Sign On
- How To Login to your Fuuz Enterprise - Single Sign On
- Identity Providers
- Notifications
- Notifications
- Organizations
- Roles
- Settings
- Switching my active Role within Fuuz
- Troubleshooting User Login Errors Due to Identity Provider Misconfiguration
Data Management (8)
Accelerators, Templates & Packages (8)
- Create a Quality Batch Golden Record Analysis Tool in Fuuz
- Fuuz Developer 101 Bootcamp - 2026 Schedule & Enrollment
- Fuuz Developer 101 Bootcamp - Program Overview
- Fuuz Industry Accelerators - Installation & Best Practices
- Fuuz Industry Accelerators - Overview
- How-To: Managing Green/Blue Deployments with Fuuz Package Management Zero-Downtime
- Model Agnostic Scheduling System APS
- Setting up In-House Fuuz
Design Standards (1)
How-To Guides (8)
- Connecting to Fuuz from a remote system to execute a Fuuz API
- Connecting to Fuuz from a remote system to execute a Fuuz API - Extended Features Part 2
- Data Mapping
- Document your Application using Atlassian Confluence and our Pre-Built App
- Fuuz Platform Capabilities
- How to add multiple data records to the Fuuz database with a single API call
- How to on Best Practices for Designing Flows in Fuuz
- Using the Transformation Explorer
FAQ & Troubleshooting (1)
Release Notes (117)
2026
- 2026.1 (January 2026)
- 2026.2 (February 2026)
- 2026.3 (March 2026)
- 2026.4 (April 2026)
- 2026.5 (May 2026)
- 2026.6 (June 2026)
2025
- 2025.1 (January 2025)
- 2025.10 (October 2025)
- 2025.11 (November 2025)
- 2025.12 (December 2025)
- 2025.2 (February 2025)
- 2025.4 (April 2025)
- 2025.5 (May 2025)
- 2025.6 (June 2025)
- 2025.7 (July 2025)
- 2025.8 (August 2025)
- 2025.9 (September 2025)
2024
- 2024.1 (January 2024)
- 2024.10 (October 2024)
- 2024.11 (November 2024)
- 2024.12 (December 2024)
- 2024.2 (February 2024)
- 2024.3 (March 2024)
- 2024.4 (April 2024)
- 2024.5 (May 2024)
- 2024.6 (June 2024)
- 2024.7 (July 2024)
- 2024.8 (August 2024)
- 2024.9 (September 2024)
2023
- 2023.5 (May 2023)
- 2023.1 (January 2023)
- 2023.10 (October 2023)
- 2023.11 (November 2023)
- 2023.12 (December 2023)
- 2023.2 (February 2023)
- 2023.3 (March 2023)
- 2023.4 (April 2023)
- 2023.6 (June 2023)
- 2023.7 (July 2023)
- 2023.8 (August 2023)
- 2023.9 (September 2023)
2022
- 2022 Q1 Fuuz Package Updates (03/11/2022)
- 2022 Q1 Fuuz Release Notes v3.87.0 (03/17/2022)
- 2022 Q1 MFGx Release Notes v3.78.0 (01/06/2022)
- 2022 Q1 MFGx Release Notes v3.79.0 (01/13/2022)
- 2022 Q1 MFGx Release Notes v3.80.0 (01/20/2022)
- 2022 Q1 MFGx Release Notes v3.81.0 (01/27/2022)
- 2022 Q1 MFGx Release Notes v3.82.0 (02/03/2022)
- 2022 Q1 MFGx Release Notes v3.83.0 (02/10/2022)
- 2022 Q1 MFGx Release Notes v3.85.0 (02/28/2022)
- 2022 Q2 Fuuz Release Notes v3.90.0 (04/14/2022)
- 2022 Q2 Fuuz Release Notes v3.91.0 (04/21/2022)
- 2022 Q2 Fuuz Release Notes v3.92.0 (04/28/2022)
- 2022 Q2 Fuuz Release Notes v3.93.0 (05/06/2022)
- 2022 Q2 Fuuz Release Notes v3.94.0 - v3.97.0 (June 13, 2022)
- 2022 Q2 Fuuz Release Notes v3.98.0 (06/16/2022)
- 2022 Q2 Fuuz Release Notes v3.99.0 (06/30/2022)
- 2022 Q3 Fuuz Release Notes v3.100.0 🎉 (07/06/2022)
- 2022 Q3 Fuuz Release Notes v3.101.0 (07/21/2022)
- 2022 Q3 Fuuz Release Notes v3.102.0 (08/11/2022)
- 2022 Q3 Fuuz Release Notes v3.103.0 (08/18/2022)
- 2022 Q4 Fuuz Release Notes v3.107.0 - v3.109.0 (10/27/2022)
2021
- 2021 Q1 MFGx Release Notes v3.29.0 (1/7/2021)
- 2021 Q1 MFGx Release Notes v3.30.0 (1/14/2021)
- 2021 Q1 MFGx Release Notes v3.34.0 (2/4/2021)
- 2021 Q1 MFGx Release Notes v3.37.0 (2/26/2021)
- 2021 Q1 MFGx Release Notes v3.38.0 (3/5/2021)
- 2021 Q1 MFGx Release Notes v3.40.0 (3/25/2021)
- 2021 Q1 MFGx.io Release Notes v3.32.0 (1/21/2021)
- 2021 Q1 MFGx.io Release Notes v3.33.0 (1/28/2021)
- 2021 Q2 MFGx Release Notes v3.41.0 (4/1/2021)
- 2021 Q2 MFGx Release Notes v3.42.0 (4/8/2021)
- 2021 Q2 MFGx Release Notes v3.43.0 (4/16/2021)
- 2021 Q2 MFGx Release Notes v3.44.0 (4/22/2021)
- 2021 Q2 MFGx Release Notes v3.45.0 (4/29/2021)
- 2021 Q2 MFGx Release Notes v3.47.0 (5/13/2021)
- 2021 Q2 MFGx Release Notes v3.48.0 (5/20/2021)
- 2021 Q2 MFGx Release Notes v3.48.0 (5/27/2021)
- 2021 Q2 MFGx Release Notes v3.50.0 (6/03/2021)
- 2021 Q2 MFGx Release Notes v3.51.0 (6/10/2021)
- 2021 Q2 MFGx Release Notes v3.52.0 (6/17/2021)
- 2021 Q2 MFGx Release Notes v3.54.0 (6/28/2021)
- 2021 Q3 Fuuz Release Notes v3.58.0 (7/22/2021)
- 2021 Q3 MFGx Release Notes v3.55.0 (7/1/2021)
- 2021 Q3 MFGx Release Notes v3.60.0 (8/5/2021)
- 2021 Q3 MFGx Release Notes v3.61.0 (8/17/2021)
- 2021 Q3 MFGx Release Notes v3.62.0 (8/19/2021)
- 2021 Q4 MFGx Release Notes v3.68.0 (10/8/2021)
- 2021 Q4 MFGx Release Notes v3.69.0 (10/14/2021)
- 2021 Q4 MFGx Release Notes v3.70.0 (10/21/2021)
- 2021 Q4 MFGx Release Notes v3.71.0 (10/28/2021)
- 2021 Q4 MFGx Release Notes v3.72.0 (11/04/2021)
- 2021 Q4 MFGx Release Notes v3.73.0 (11/11/2021)
- 2021 Q4 MFGx Release Notes v3.74.0 (11/19/2021)
- 2021 Q4 MFGx Release Notes v3.75.0 (12/02/2021)
- 2021 Q4 MFGx Release Notes v3.76.0 (12/09/2021)
- 2021 Q4 MFGx Release Notes v3.77.0: The Holiday Update (12/16/2021)
2020
- 2020 Q2 MFGx Release Notes v2.32.0 (4/9/2020)
- 2020 Q2 MFGx Release Notes v2.33.0 (4/16/2020)
- 2020 Q2 MFGx Release Notes v2.35.0 (4/30/2020)
- 2020 Q2 MFGx Release Notes v3.5.0 (6/18/2020)
- 2020 Q2 MFGx Release Notes v3.6.0 (6/25/2020)
- 2020 Q2 MFGx.io Release Notes v2.32.0 (4/9/2020)
- 2020 Q3 MFGx Release Notes v3.10.0 (7/23/2020)
- 2020 Q3 MFGx Release Notes v3.11.0 (7/30/2020)
- 2020 Q3 MFGx Release Notes v3.13.0 (8/13/2020)
- 2020 Q3 MFGx Release Notes v3.17.0 (9/21/2020)
- 2020 Q3 MFGx Release Notes v3.7.0 (7/6/2020)
- 2020 Q3 MFGx Release Notes v3.8.0 (7/9/2020)
- 2020 Q4 MFGx Release Notes v3.20.0 (10/13/2020)
- 2020 Q4 MFGx Release Notes v3.21.0 (10/15/2020)
- 2020 Q4 MFGx Release Notes v3.22.1 (10/22/2020)
- 2020 Q4 MFGx Release Notes v3.23.0 (11/5/2020)
- 2020 Q4 MFGx Release Notes v3.24.0 (11/12/2020)
- 2020 Q4 MFGx Release Notes v3.26.0 (12/3/2020)
- 2020 Q4 MFGx Release Notes v3.27.0 (12/10/2020)
- 2020 Q4 MFGx Release Notes v3.28.0 (12/17/2020)