Findry
Get started
Platform

Annotations

Every significant Findry decision can drop a labeled vertical line on every Amplitude chart in your project — automatically, in real time, and without duplicating if it fires twice.

6 min

Contents
Amplitude deep dives
On this page

What triggers an annotation

Five callsites push an annotation to Amplitude. All five fire asynchronously (fire-and-forget) so they never block the action that triggered them.

  • Bet promoted from hypothesis — when a hypothesis is promoted to a Bet, Findry immediately pushes a "▲ Bet promoted" annotation at the current timestamp.
  • Bet status → shipped (manual) — when a PM manually marks the bet as shipped in the bet detail view.
  • Outcome ship date set — when a PM sets or updates the ship date on an Outcome, an annotation is pushed at that date.
  • Tracker auto-detects ship date — if a linked Jira / Linear ticket moves to "Done," Findry auto-sets the ship date and the annotation fires automatically.
  • Outcome verdict assigned — when the outcome-sweep cron assigns a verdict (hit / miss / inconclusive), or when a PM overrides the verdict manually. Annotation pushed at the measurement timestamp.
Outbound annotation flow from Findry to AmplitudeFINDRYDecisionsbet.promotedbet.shippedoutcome.verdictfire-and-forgetnever blocks callerAMPLITUDEChart annotations▲ Bet promoted▲ Bet shipped● Outcome verdictidempotent: re-firingPATCHes, never duplicatesDECISION → ANNOTATIONREAL-TIME · IDEMPOTENT
One direction only — Findry decisions push annotations onto Amplitude charts

How annotations look in Amplitude

Amplitude shows annotations as labeled vertical lines on every chart in the project — the same chart you're already watching for metric changes. You don't need to navigate anywhere; the markers appear automatically on the timeline.

Label formats:

  • Bet promoted: ▲ [Bet title]
  • Bet shipped: ▲ Shipped: [Bet title]
  • Outcome verdict: ● Outcome [verdict]: [Bet title] — for example, "● Outcome hit: Mobile checkout conversion"

Labels are set at annotation create time and updated if the bet title changes — the PATCH path handles updates via the same idempotent flow described below.

Toggle push on / off

Annotation push defaults ON at connect time. To disable it:

Settings → Integrations → Amplitude tile → Push annotations toggle

Toggling off stops future pushes immediately. Existing annotations in Amplitude are not deleted — they stay as historical context. Toggling back on resumes push; no back-fill of the gap period.

Every toggle change writes an amplitude.push_annotations_set event to the workspace audit log with the actor and new value.

Re-fires + idempotence

Each (bet, event_type) pair is tracked in an amplitude_annotation_pushes row. When a callsite fires:

  • If no row exists → POST /api/2/annotations → insert row with the new annotation ID.
  • If a row exists → PATCH /api/2/annotations/[id] → update the label and date if they changed.
  • If Amplitude returns 404 on PATCH (annotation was manually deleted in Amplitude) → re-create via POST → update the tracking row with the new ID.

The practical consequence: re-running a workflow step (editing a bet title, re-computing an outcome, toggling push off/on) never creates duplicate annotations in Amplitude. At most one annotation per (bet, event_type) exists at any time.

Audit trail

Every annotation push attempt writes to the workspace audit log. You can view it at Settings → Audit log — filter by actor or action.

  • amplitude.annotation_pushed — successful push or PATCH, includes annotation ID and bet ID.
  • amplitude.annotation_failed — push failed (network error, 4xx from Amplitude other than 404). Includes the error code and message. The bet workflow continues regardless; annotation failure is non-fatal.

Investigating a missing annotation

If you expect an annotation in Amplitude but don't see it: check the audit log for an amplitude.annotation_failed event around the time the bet event occurred. The event payload includes the Amplitude error code — a 401 means the API key was rotated without reconnecting Findry; a 429 means Amplitude rate-limited the push; a 5xx means Amplitude was temporarily down.

No inbound flow

Unlike the PostHog integration, there is no inbound data flowing from Amplitude into Findry. Amplitude doesn't ship a first-party survey product, so the PostHog Surveys → Findry Signals pattern has no Amplitude equivalent.

If your team uses a survey tool alongside Amplitude (Sprig, Typeform, Delighted, SurveyMonkey), Signals can still be created from survey responses via:

  • Manual entry — paste the response text directly into a Signal and link the source URL.
  • Webhook — if your survey tool can POST to a webhook, the Findry Signals API accepts inbound payloads. See the Signals guide for the webhook shape.
PreviousMetrics + mappingsUp nextCohorts + experiments