1-in-3 sampling with repeat contact attempts

I could really use advice on this one. We have a design that works on paper and I am trying to move it into ODK without losing anything, but the state tracking is beyond what I have built before.

What the fieldwork looks like

The rules that make it hard

Three outcome families, each doing something different to the slot:

outcome address slot next door uses
interview completed done closed the next slot number
refusal, denied entry, language barrier, break-off dead stays open the same slot number again
nobody home, come back later still live, up to 3 attempts pending the next slot number

So a refusal does not consume a slot. If slot 3 refuses, the next household along the route becomes slot 3 again.

A pending slot provisionally holds its address. The interviewer does not wait — they carry on down the route and come back later. Several slots can be pending at once.

If a pending address uses all three attempts without success, that address dies and the slot reopens. But it cannot be refilled immediately: a replacement address only exists beyond the last main household, so every one of the 10 slots must have been attempted before any replacement can be used.

An example. Slots 1, 3–8 are done, slot 2 has failed three attempts, and 9 and 10 have never been touched. Even though 2 is the lowest open slot, the interviewer must do 9 and 10 first, and only then fill slot 2 with a replacement address.

One more constraint: last birthday depends on the current date, so re-listing a household on a later visit can select a different person. Whoever was selected on the first visit has to persist.

Every attempt is recorded, successful or not, with date, time and outcome.

Where it gets complicated

A slot is not an address. If all three attempts at slot 2 fail, that address is finished, but slot 2 stays open. It is later filled by a different address, a replacement, found by continuing the route past slot 10. So the slot number persists and the dwelling behind it can change.

Replacements cannot start early. Because replacement addresses are located beyond the last main household, every one of the 10 slots must have been attempted before any replacement can be used. So if slots 2, 9 and 10 are outstanding and slot 2 has already had three failed attempts, the interviewer must go to 9 and 10 first, and only then use a replacement address to fill slot 2.

The respondent selection cannot be recreated later. Last birthday depends on the current date, so listing the household again on a second visit can select a different person. Whoever was selected on the first visit has to persist.

Every attempt must be recorded, successful or not, with date, time and outcome.

The actual problem

An interviewer may work the same sampling point across several days. When they open the form at the next door, they need to know which slots are closed, which have a pending revisit and how many attempts each has used, whether all ten have been attempted yet, and therefore which slot number to use now.

Today this lives on a paper sheet and in the interviewer's memory. That is what I am trying to eliminate. With several pending revisits at once it is genuinely easy to get wrong, and a mistake corrupts the sample rather than just the paperwork.

What I would like the interviewer to see when they open the form:

Sampling point 042
Slots 1, 3, 4 completed. Slot 2 pending, 2 of 3 attempts used, respondent already selected. Slots 5 to 10 not started.
Next slot to use: 5

My questions

  1. Are Entities the right tool here, with one entity per slot holding status, attempt count and the selected respondent, updated by each submission? Are there known pitfalls with repeatedly updating the same entity from successive submissions?
  2. The "all ten slots attempted before any replacement" condition is a rule about the whole sampling point, not one slot. Can that be evaluated inside a form, for example by counting entities in a list that match a condition, or does it have to be precomputed server side?
  3. Is there any way to show a summary of several entities on one screen, so the interviewer sees the state of the sampling point rather than having to select one entity to inspect it?
  4. If two interviewers share a sampling point, can entity list updates be relied on to sync between devices, and what delay should I expect?
  5. Has anyone solved something similar without Entities, and would you recommend that route instead? I would rather use a simpler mechanism if one exists.

This seems quite complicated but with the odk entity features, the only limit is your imagination.Here is how I would approach this; I have modeled the sampling point using ODK Offline Entities, treating slots as persistent containers (1–10) while allowing physical addresses to change dynamically.

Key Entities & Setup

Pre-populate 10 Slot Entities per sampling point with the following attributes:

  • point_number (e.g., "042")
  • slot_number (1 to 10)
  • outcome (Open [default], Pending, Done)
  • visit_attempt (Integer, initialized to 0)
  • replacement_times (Integer, initialized to 0)
  • selected_pax (Text, initialized blank)
  • slotlabel (Dynamic display string: e.g., "Slot 2 - Pending (2/3) - Pax: John")

Core State & Lifecycle Rules

  1. Attempts & Refusals: Refusals and entry denials do not consume an attempt—they keep outcome = 'Open' and visit_attempt = 0 (and if you want update replacement_times to 1) at the same slot. "Nobody Home" sets outcome = 'Pending' and increments visit_attempt.
  2. Respondent Persistence: selected_pax is recorded on the first successful contact. On return visits (visit_attempt > 1), the household listing module is completely skipped, locking selected_pax to prevent algorithm drift caused by date changes.
  3. Address Failure & Replacement: If a household fails 3 attempts (visit_attempt = 3), the address dies. Upon submission, the slot resets: outcome = 'Open', visit_attempt = 0, and replacement_times increments by +1 (clearing selected_pax).
  4. Automated Slot Allocation Logic( a read-only calculation on a select_one slot number question - a follow up question after selecting a sampling point): To enforce the protocol requiring all 10 main slots to be attempted before using replacement addresses past Household 10, the form evaluates a 3-tier sequence:

Phase 1 (Main Slots): Select lowest slot_number where replacement_times = 0 and visit_attempt = 0.

Phase 2 (Pending Revisits):Once all 10 main slots have visit_attempt > 0, select lowest slot_number where outcome = 'Pending'.

Phase 3 (Replacements): Once main slots are attempted and pending revisits are clear, select lowest slot_number where replacement_times > 0 and outcome = 'Open'.

Operational Caveats & Assumptions

Device Finalization Mandate: ODK Collect updates local offline entities only after form finalization. Interviewers must finalize and submit standing at the door; saving drafts across multiple households will break local state tracking.

Multi-Interviewer Sync: If two interviewers share a sampling point offline, split their slot allocations statically (e.g., Interviewer A takes 1–5, Interviewer B takes 6–10). Cross-territory work requires going online to sync device states first to avoid collisions.

Unlimited vs. Capped Replacements: This model assumes infinite sequential replacement until a slot hits Done. If a methodologic replacement cap exists (e.g., max 2 replacements), add a constraint blocking selection when re

placement_times > MAX.

Let me know if this can work for you and where you needs further clarification.

Thank you very much. I was thinking of doing sth with entities, but since it was my first time I was a bit hesitant and I thought maybe there was a ODK manual ready for this. I did sth with entities and unti now it is going good.