{
  "license": "CC BY 4.0",
  "recipe": {
    "slug": "product-session-journey-dropoff",
    "title": "Measure Product Journey Drop-Off by Session",
    "testedWith": "Apache DataFusion 45.2.0",
    "lastReviewed": "2026-07-28"
  },
  "contract": {
    "tableName": "product_journey_events",
    "schema": [
      {
        "name": "timestamp_utc",
        "type": "Timestamp",
        "description": "Milestone time in UTC."
      },
      {
        "name": "session_id",
        "type": "Utf8",
        "description": "Approved session identifier shared by journey events."
      },
      {
        "name": "step_name",
        "type": "Utf8",
        "description": "Controlled journey milestone."
      },
      {
        "name": "step_order",
        "type": "Int64",
        "description": "Stable one-based milestone order."
      },
      {
        "name": "acquisition_source",
        "type": "Utf8",
        "description": "Bounded acquisition source."
      },
      {
        "name": "environment",
        "type": "Utf8",
        "description": "Deployment environment."
      }
    ]
  },
  "query": "WITH step_counts AS (\n  SELECT\n    step_order,\n    step_name,\n    COUNT(*) AS sessions_reached\n  FROM product_journey_events\n  WHERE timestamp_utc >= now() - INTERVAL '30 days'\n    AND environment = 'production'\n  GROUP BY step_order, step_name\n)\nSELECT\n  step_order,\n  step_name,\n  sessions_reached,\n  100.0 * sessions_reached\n    / NULLIF(FIRST_VALUE(sessions_reached) OVER (ORDER BY step_order), 0)\n    AS journey_completion_pct,\n  100.0 * sessions_reached\n    / NULLIF(COALESCE(LAG(sessions_reached) OVER (ORDER BY step_order), sessions_reached), 0)\n    AS step_to_step_pct\nFROM step_counts\nORDER BY step_order;",
  "fixtureKind": "reproducible",
  "inputRows": [
    {
      "timestamp_utc": "2026-07-28T17:59:00.000Z",
      "session_id": "session-1",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:58:00.000Z",
      "session_id": "session-1",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:57:00.000Z",
      "session_id": "session-1",
      "step_name": "workspace_created",
      "step_order": 3,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:56:00.000Z",
      "session_id": "session-1",
      "step_name": "first_query_run",
      "step_order": 4,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:49:00.000Z",
      "session_id": "session-2",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:48:00.000Z",
      "session_id": "session-2",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:47:00.000Z",
      "session_id": "session-2",
      "step_name": "workspace_created",
      "step_order": 3,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:46:00.000Z",
      "session_id": "session-2",
      "step_name": "first_query_run",
      "step_order": 4,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:39:00.000Z",
      "session_id": "session-3",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:38:00.000Z",
      "session_id": "session-3",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:37:00.000Z",
      "session_id": "session-3",
      "step_name": "workspace_created",
      "step_order": 3,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:29:00.000Z",
      "session_id": "session-4",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "organic",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:28:00.000Z",
      "session_id": "session-4",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "organic",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:19:00.000Z",
      "session_id": "session-5",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "organic",
      "environment": "production"
    }
  ],
  "illustrativeInputRows": [
    {
      "timestamp_utc": "2026-07-28T17:59:00.000Z",
      "session_id": "session-1",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:58:00.000Z",
      "session_id": "session-1",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:57:00.000Z",
      "session_id": "session-1",
      "step_name": "workspace_created",
      "step_order": 3,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:56:00.000Z",
      "session_id": "session-1",
      "step_name": "first_query_run",
      "step_order": 4,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:49:00.000Z",
      "session_id": "session-2",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:48:00.000Z",
      "session_id": "session-2",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:47:00.000Z",
      "session_id": "session-2",
      "step_name": "workspace_created",
      "step_order": 3,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:46:00.000Z",
      "session_id": "session-2",
      "step_name": "first_query_run",
      "step_order": 4,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:39:00.000Z",
      "session_id": "session-3",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:38:00.000Z",
      "session_id": "session-3",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:37:00.000Z",
      "session_id": "session-3",
      "step_name": "workspace_created",
      "step_order": 3,
      "acquisition_source": "docs",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:29:00.000Z",
      "session_id": "session-4",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "organic",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:28:00.000Z",
      "session_id": "session-4",
      "step_name": "signup_completed",
      "step_order": 2,
      "acquisition_source": "organic",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:19:00.000Z",
      "session_id": "session-5",
      "step_name": "landing_viewed",
      "step_order": 1,
      "acquisition_source": "organic",
      "environment": "production"
    }
  ],
  "expectedOutput": {
    "columns": [
      "step_order",
      "step_name",
      "sessions_reached",
      "journey_completion_pct",
      "step_to_step_pct"
    ],
    "rows": [
      {
        "step_order": 1,
        "step_name": "landing_viewed",
        "sessions_reached": 5,
        "journey_completion_pct": 100,
        "step_to_step_pct": 100
      },
      {
        "step_order": 2,
        "step_name": "signup_completed",
        "sessions_reached": 4,
        "journey_completion_pct": 80,
        "step_to_step_pct": 80
      },
      {
        "step_order": 3,
        "step_name": "workspace_created",
        "sessions_reached": 3,
        "journey_completion_pct": 60,
        "step_to_step_pct": 75
      },
      {
        "step_order": 4,
        "step_name": "first_query_run",
        "sessions_reached": 2,
        "journey_completion_pct": 40,
        "step_to_step_pct": 66.66666667
      }
    ]
  },
  "notes": [
    "The included synthetic input rows generate the expected output when timestamps are shifted into the documented query window.",
    "Run this fixture in the public browser SQL playground; the selected query executes locally with DuckDB-Wasm.",
    "Adapt time windows, thresholds, identities, and business definitions before operational use."
  ]
}