GoTeamUp → Suite: Field Sync (suite applier)
Plain-English summary
This is the DaySmart Business App (businessapp.io) side of the sync. It receives a single normalised change from the n8n engine, finds the matching contact, and updates the right field on that contact. It is the generic applier: it reacts to whatever {external_id, field, value} the engine sends, rather than being tied to one specific field.
How it works (step by step)
This is the suite automation with canonical name GoTeamUp → Suite: Field Sync. The Business App UI label matches the canonical name. It is Live.
The trigger and steps:
- Trigger: "A webhook is received": exposes three fields from the inbound JSON body:
external_id,field, andvalue. Inside the suite these are referenced as{.WorkflowStep.trigger.<field>}orTrigger[<field>]. - Find contact: searches for the contact whose External ID matches the inbound
external_id. The Search field value isTrigger[external_id]. (The engine sendsexternal_idas"teamup-" + <GoTeamUp customer id>.) - If / else branch: decides what value to set based on the inbound
value. See the gotcha below for the exact condition that matters. - Update contact: sets the target field. For the
marketing_preferencefield this is the contact field "Marketing email consent", set to Subscribed or Unsubscribed depending on the branch.
Pending screenshot verification: the exact internals of each suite step (precise condition operators, exact field selectors, and branch labels) are awaiting a screenshot from Jacko. Treat the step-by-step above as the intended design; confirm the precise wiring against the screenshot when it arrives.
Dependencies
- Upstream: called by the n8n engine
GoTeamUp → Suite: Field Sync(n8n), documented ingoteamup-suite-field-sync-n8n.md. That engine POSTs{external_id, field, value}to this automation's inbound webhook. - Credentials (names only): the suite inbound webhook URL is stored at
~/.openclaw/workspace/mvt/credentials/businessapp.envon the MAIN host (not on this VPS). The value is never recorded in these docs. - Contact field: for the one live field, the suite contact field "Marketing email consent" (Subscribed / Unsubscribed).
Failure modes and gotchas
The value is one of [yes] gotcha (real bug, fixed 21 Oct 2026)
The If / else condition must test value is one of [yes] ONLY. It must NOT test value is one of [yes, no].
Why: "is one of" is satisfied by ANY member of the list. If the list were [yes, no], then both yes and no would satisfy the condition, so every change would flow down the Yes (Subscribe) branch and the No (Unsubscribe) branch would never fire. Customers who opted out would silently stay subscribed.
Correct behaviour: test for yes alone. The Yes branch handles value == yes (Subscribe); the else branch handles everything else, which is no (Unsubscribe).
Contact must exist and carry the External ID
Find contact matches on External ID teamup-<id>. If a contact has no matching External ID set in the suite, the Find step will not locate them and the update cannot apply. New contacts must have their External ID populated for the sync to reach them.
Change log
- 2026-10-21: Documented. Automation LIVE. Fixed the If condition from
is one of [yes, no]tois one of [yes]so the Unsubscribe branch fires correctly. Exact step internals pending screenshot verification. - 2026-10-21: Suite automation renamed in the Business App UI from "Inbound Marketing Preference" to the canonical "GoTeamUp → Suite: Field Sync". Names now uniform across n8n, suite, and docs.