Skip to main content

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:

  1. Trigger: "A webhook is received": exposes three fields from the inbound JSON body: external_id, field, and value. Inside the suite these are referenced as {.WorkflowStep.trigger.<field>} or Trigger[<field>].
  2. Find contact: searches for the contact whose External ID matches the inbound external_id. The Search field value is Trigger[external_id]. (The engine sends external_id as "teamup-" + <GoTeamUp customer id>.)
  3. If / else branch: decides what value to set based on the inbound value. See the gotcha below for the exact condition that matters.
  4. Update contact: sets the target field. For the marketing_preference field 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 in goteamup-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.env on 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] to is 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.