{
  "schemaVersion": 1,
  "study": "cold-email-offer-relevance-experiment",
  "title": "Offer relevance experiment: study protocol",
  "status": "awaiting-real-data",
  "scope": "Collection template, not a dataset or completed field study. All null values are intentionally uncollected.",
  "unitOfObservation": "company",
  "requiredInputs": "Two real deliverable offers and capacity to fulfill either one.",
  "controls": "Assign at company level where coworkers may share messages; account for clustered contacts.",
  "primaryAnalysis": "Company-level qualified interest plus actual delivery effort; not replies alone.",
  "registration": {
    "owner": null,
    "protocolVersion": "1",
    "registeredAt": null,
    "population": null,
    "eligibilityRules": null,
    "primaryOutcomeDefinition": null,
    "denominator": null,
    "observationWindow": null,
    "targetSampleAndJustification": null,
    "assignmentProcedureAndSeed": null,
    "exclusionRules": null,
    "safetyStopConditions": null,
    "missingDataPolicy": null,
    "retentionAndAccessOwner": null
  },
  "collectionRules": [
    "Assign pseudonymous IDs; do not store mailbox passwords, access tokens or unnecessary identifiers.",
    "Freeze the outcome and exclusions before collection; retain exclusions with reasons.",
    "Do not use repeated observations as independent people. Record clustering by person, company or mailbox.",
    "Do not treat a software test, simulated reply or researcher-written example as participant or campaign evidence.",
    "Record complaints and opt-outs and follow the actual suppression workflow.",
    "For interviews obtain permission before recording and respect withdrawal.",
    "Publish aggregate or redacted evidence only after review; keep original private records outside the public website."
  ],
  "fieldDictionary": {
    "assignment_id": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "assignment id",
      "missingValue": null
    },
    "company_id": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "company id",
      "missingValue": null
    },
    "arm": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "arm",
      "missingValue": null
    },
    "offer_scope": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "offer scope",
      "missingValue": null
    },
    "eligible_contacts": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "eligible contacts",
      "missingValue": null
    },
    "qualified_interest": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "qualified interest",
      "missingValue": null
    },
    "delivery_hours": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "delivery hours",
      "missingValue": null
    },
    "delivered_offer": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "delivered offer",
      "missingValue": null
    }
  },
  "blankRecord": {
    "observation_id": null,
    "assignment_id": null,
    "company_id": null,
    "arm": null,
    "offer_scope": null,
    "eligible_contacts": null,
    "qualified_interest": null,
    "delivery_hours": null,
    "delivered_offer": null,
    "excluded": false,
    "exclusion_reason": null,
    "protocol_deviation": null
  },
  "records": [],
  "analysisStatus": "not-run",
  "results": null,
  "interpretationLimits": "If the offer and audience both change, call it a segment strategy comparison rather than an isolated offer effect. Publish results only after the evidence, method and limitations have been reviewed. This protocol provides no benchmark, expected lift or completed-study claim.",
  "procedure": [
    "Describe scope, recipient effort, delivery cost and eligibility for each offer. Use truthful examples of the deliverable.",
    "Assign companies rather than coworkers independently when spillover is likely. Keep message length and follow-up policy comparable.",
    "Before collection, write the primary outcome, observation window, exclusion rules and stopping conditions. Preserve excluded observations with a reason rather than quietly removing them.",
    "Pilot the procedure with fictional or owned test data, resolve ambiguous fields, and freeze a dated protocol version before the main run."
  ],
  "interviewPrompts": []
}
