Follow a single signal from arrival to outbound + back. The dashed feedback arrow back into Processing is the system's most important property: every outbound action becomes an inbound signal. That's what makes the audit trail honest.
A prospect likes a post on LinkedIn. Teamfluence detects it, fires a webhook at /api/webhooks/[workspaceId]/teamfluence. The handler verifies the request, extracts actor / verb / object / timestamp, looks up the contact by LinkedIn URL (creating one if not found), and resolves the company through the Dedup waterfall (LinkedIn URL → domain → canonical name).
Score derivation applies the per-workspace weight for liked_post (e.g. +3 points). Total signal_score updates. The contact's funnel stage is recomputed against WorkspaceConfig.scoring.thresholds. DNC / exclusion is checked — if set, outbound paths skip them but the signal still records (you want the engagement history even for unreachable contacts).
A new signals row is appended in Postgres (append-only). The contact's signal_score, signal_count, last_signal_at are updated in the same transaction. For Teamfluence signals, a HubSpot timeline event is also written (best-effort — if HubSpot is down, Postgres still succeeded). Dripify signals stop at Postgres by design.
On the SDR action list, the contact's row reorders by last_signal_at DESC and floats to the top. The Companies view aggregates company-level score. The funnel stage label updates (e.g. "Engaged" → "Highly Engaged" via the display-label override).
The seller clicks "Draft DM." The Drafter pulls the contact + recent signals, matches a persona via pickPersona(), resolves the fingerprint through three scopes, renders the prompt with persona + fingerprint + signal context, hits Anthropic, returns the draft. Seller reviews + sends.
The send appends a new signals row with verb sent_dm AND an outreach_log row recording fingerprint_version_id — critical for outcome attribution. When the prospect replies, Unipile fires replied_dm_initial. If they book a meeting, Calendly fires booked_meeting which triggers the Discovery Call stage transition. The funnel keeps moving; the score stays recomputable.