{
  "_about": "Audit config for the fictional Acme Analytics example (HubSpot; SDRs on America/New_York, customer success on America/Chicago). Copy it into your working folder as the starting point for a real audit and replace every value; keys are explained in references/reading-the-crm.md. Source labels are team-chosen TYPE:detail strings mapped from the export with normalize_history.py --source-map. revision_caps apply to Export property history files; when transitions come from a warehouse history table landed continuously, set those objects to null so T01 prints INFO instead of a false cap warning.",
  "fields": {
    "lifecyclestage": {
      "object": "contacts",
      "ordered": [
        "subscriber",
        "lead",
        "marketingqualifiedlead",
        "salesqualifiedlead",
        "opportunity",
        "customer",
        "evangelist"
      ],
      "terminal": [],
      "unranked": [
        "other"
      ],
      "allowed_skips": [
        "subscriber>marketingqualifiedlead",
        "lead>salesqualifiedlead",
        "lead>opportunity",
        "marketingqualifiedlead>opportunity"
      ],
      "gates": {
        "customer": [
          "opportunity"
        ]
      },
      "max_dwell_days": {
        "marketingqualifiedlead": 5,
        "salesqualifiedlead": 14,
        "opportunity": 120
      },
      "loop_values": [
        "marketingqualifiedlead"
      ],
      "max_entries_90d": 2
    },
    "hs_lead_status": {
      "object": "contacts",
      "ordered": [],
      "terminal": [],
      "unranked": [
        "NEW",
        "ATTEMPTED_TO_CONTACT",
        "CONNECTED",
        "OPEN_DEAL",
        "UNQUALIFIED",
        "BAD_TIMING"
      ]
    },
    "hubspot_owner_id": {
      "object": "contacts",
      "ordered": [],
      "terminal": [],
      "unranked": []
    },
    "dealstage": {
      "object": "deals",
      "ordered": [
        "discovery",
        "evaluation",
        "proposal",
        "closedwon"
      ],
      "terminal": [
        "closedlost"
      ],
      "unranked": [],
      "allowed_skips": [],
      "gates": {},
      "max_dwell_days": {
        "discovery": 21,
        "evaluation": 30,
        "proposal": 21
      }
    }
  },
  "writers": {
    "lifecyclestage": {
      "*": [
        "WORKFLOW:lifecycle-correction"
      ],
      "subscriber": [
        "FORM:",
        "WORKFLOW:lifecycle-correction"
      ],
      "lead": [
        "FORM:",
        "IMPORT:",
        "CRM_UI:",
        "WORKFLOW:lifecycle-correction"
      ],
      "marketingqualifiedlead": [
        "WORKFLOW:mql-scoring",
        "WORKFLOW:lifecycle-correction"
      ],
      "salesqualifiedlead": [
        "CRM_UI:",
        "WORKFLOW:lifecycle-correction"
      ],
      "opportunity": [
        "AUTOMATION:deal-created",
        "WORKFLOW:lifecycle-correction"
      ],
      "customer": [
        "AUTOMATION:deal-won",
        "WORKFLOW:lifecycle-correction"
      ],
      "evangelist": [
        "CRM_UI:",
        "WORKFLOW:lifecycle-correction"
      ],
      "": [
        "WORKFLOW:lifecycle-correction"
      ]
    },
    "hs_lead_status": {
      "*": [
        "CRM_UI:",
        "WORKFLOW:lead-status"
      ]
    },
    "hubspot_owner_id": {
      "*": [
        "WORKFLOW:rotation",
        "CRM_UI:"
      ]
    },
    "dealstage": {
      "*": [
        "CRM_UI:"
      ]
    }
  },
  "manual_source_prefixes": [
    "CRM_UI:"
  ],
  "correction_source_prefixes": [
    "WORKFLOW:lifecycle-correction",
    "CRM_UI:revops_admin"
  ],
  "clear_set_seconds": 60,
  "pingpong_hours": 24,
  "revision_caps": {
    "contacts": 45,
    "companies": 20,
    "deals": 20,
    "tickets": 20,
    "leads": null
  },
  "conversions": [
    [
      "lifecyclestage",
      "marketingqualifiedlead",
      "salesqualifiedlead",
      30
    ],
    [
      "lifecyclestage",
      "salesqualifiedlead",
      "opportunity",
      30
    ],
    [
      "lifecyclestage",
      "opportunity",
      "customer",
      90
    ],
    [
      "dealstage",
      "discovery",
      "closedwon",
      90
    ]
  ],
  "calendars": {
    "sdr_us": {
      "timezone": "America/New_York",
      "hours": {
        "mon": [
          "09:00",
          "17:00"
        ],
        "tue": [
          "09:00",
          "17:00"
        ],
        "wed": [
          "09:00",
          "17:00"
        ],
        "thu": [
          "09:00",
          "17:00"
        ],
        "fri": [
          "09:00",
          "17:00"
        ]
      },
      "holidays": [
        "2026-09-07",
        "2026-11-26",
        "2026-12-25"
      ]
    },
    "cs_us": {
      "timezone": "America/Chicago",
      "hours": {
        "mon": [
          "08:00",
          "16:00"
        ],
        "tue": [
          "08:00",
          "16:00"
        ],
        "wed": [
          "08:00",
          "16:00"
        ],
        "thu": [
          "08:00",
          "16:00"
        ],
        "fri": [
          "08:00",
          "16:00"
        ]
      },
      "holidays": [
        "2026-09-07",
        "2026-11-26",
        "2026-12-25"
      ]
    }
  },
  "classes": {
    "hand_raise": {
      "calendar": "sdr_us",
      "start": "received_at",
      "stop": "first_response_at",
      "owner_start": "last_assigned_at",
      "target_business_minutes": 15,
      "target_compliance": 0.9,
      "max_unassigned_business_minutes": 15
    },
    "mql": {
      "calendar": "sdr_us",
      "start": "received_at",
      "stop": "disposition_at",
      "owner_start": "last_assigned_at",
      "target_business_minutes": 480,
      "target_compliance": 0.9,
      "max_unassigned_business_minutes": 60
    },
    "closed_won_to_cs": {
      "_note": "One requests file holds every class: for this handoff received_at is the closed-won time and disposition_at the customer success accept or return time.",
      "calendar": "cs_us",
      "start": "received_at",
      "stop": "disposition_at",
      "owner_start": "last_assigned_at",
      "target_business_minutes": 960,
      "target_compliance": 0.9,
      "max_unassigned_business_minutes": 480
    }
  },
  "thresholds": {
    "missing_start_fail_rate": 0.01,
    "ingest_lag_p90_minutes": 5,
    "owner_changes_warn": 2,
    "capped_fail_rate": 0.05
  }
}
