> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc.cufinder.io/llms.txt
> Use this file to discover all available pages before exploring further.

# How detection works

> Snapshots, deltas, and the emit logic behind every signal.

Every CUFinder signal is produced by the same underlying mechanism: we capture data over time, compare consecutive snapshots, and emit a signal whenever a meaningful change occurs.

## The detection pipeline

<Steps>
  <Step title="Crawl and snapshot">
    Company pages, job postings, employee profiles, and funding records are captured on a recurring schedule and stored as point-in-time snapshots.
  </Step>

  <Step title="Compare consecutive snapshots">
    Each new crawl is diffed against the previous one. Fields like `employee_count`, `job_count`, `name`, `description`, `locations`, and `funding rounds` are checked for change.
  </Step>

  <Step title="Evaluate trigger conditions">
    Each signal has a precise, deterministic trigger. Some fire on a single field change; others require a threshold, a rolling baseline, or a multi-day window.
  </Step>

  <Step title="Assign magnitude">
    Quantitative changes are sorted into magnitude buckets so you can prioritize. See [Magnitude buckets](/buying-signals/concepts/magnitude-buckets).
  </Step>

  <Step title="Store metadata">
    Many signals persist extra context in a `meta` object, the function that was hired for, the country expanded into, the keyword that was added, so the signal is immediately actionable.
  </Step>
</Steps>

## Three kinds of trigger logic

<AccordionGroup>
  <Accordion title="Single-change triggers" icon="toggle-right">
    The simplest signals fire on any change to a tracked field. `name_change` fires when the name string differs. `employee_growth` fires when headcount rises by at least one. These are sensitive, so they are best filtered by magnitude.
  </Accordion>

  <Accordion title="Threshold and baseline triggers" icon="chart-bar">
    Many signals compare the current crawl against a rolling baseline. `followers_spike` fires at 3× the previous six-crawl average. `jobs_open_spike` fires at 2× the previous four-crawl average. Thresholds filter out ordinary movement so only anomalies surface.
  </Accordion>

  <Accordion title="Windowed and composite triggers" icon="stack-2">
    The highest-value signals look across time and across other signals. `office_consolidation` waits for three closures in 90 days. `acquired_signal` requires a new parent plus a name or description change within 60 days. Composite signals are built entirely from other signals firing together.
  </Accordion>
</AccordionGroup>

## Confidence and scrutiny

Not every change is equally trustworthy. Some signals are emitted with extra scrutiny or lower confidence because the underlying data is noisy.

<Warning>
  `followers_decrease` is often a Professional Network-side correction rather than a real decline, so it is emitted with extra scrutiny. `founded_year_change` is usually a data correction, so it carries a confidence of 0.5 and requires confirmation before you act on it.
</Warning>

## Attribution

People signals are attributed to the right company automatically. When a person's `current_company` changes, `employee_joined` is attributed to the company they moved to, while `employee_departed` is attributed to the company they left. This keeps every people signal anchored to the correct account.

<Card title="Understand magnitude next" icon="ruler-2" href="/buying-signals/concepts/magnitude-buckets" horizontal>
  See how quantitative changes are bucketed into low, moderate, high, and hyper.
</Card>
