{
  "schemaVersion": 1,
  "study": "cold-email-cta-experiment",
  "title": "Call-to-action experiment: study protocol",
  "status": "awaiting-real-data",
  "scope": "Collection template, not a dataset or completed field study. All null values are intentionally uncollected.",
  "unitOfObservation": "prospect",
  "requiredInputs": "Eligible contacts and two exact truthful CTAs with the same offer.",
  "controls": "Hold the rest of the message and sending policy fixed; preserve assignment on reply.",
  "primaryAnalysis": "Qualified interest per assigned prospect; meetings are a separate downstream outcome.",
  "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
    },
    "cta_text": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "cta text",
      "missingValue": null
    },
    "body_version": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "body version",
      "missingValue": null
    },
    "assigned_at": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "assigned at",
      "missingValue": null
    },
    "cutoff_at": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "cutoff at",
      "missingValue": null
    },
    "qualified_reply": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "qualified reply",
      "missingValue": null
    },
    "booked_meeting": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "booked meeting",
      "missingValue": null
    },
    "optout": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "optout",
      "missingValue": null
    }
  },
  "blankRecord": {
    "observation_id": null,
    "assignment_id": null,
    "company_id": null,
    "arm": null,
    "cta_text": null,
    "body_version": null,
    "assigned_at": null,
    "cutoff_at": null,
    "qualified_reply": null,
    "booked_meeting": null,
    "optout": null,
    "excluded": false,
    "exclusion_reason": null,
    "protocol_deviation": null
  },
  "records": [],
  "analysisStatus": "not-run",
  "results": null,
  "interpretationLimits": "Changing the offer together with the CTA prevents attribution. Do not present the result as a universal best CTA. Publish results only after the evidence, method and limitations have been reviewed. This protocol provides no benchmark, expected lift or completed-study claim.",
  "procedure": [
    "Write both exact CTAs and a shared body. Define positive reply and meeting separately before assignment.",
    "Randomly allocate prospects and keep sender, schedule, offer and follow-ups constant. Preserve assignment after any response.",
    "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": []
}
