If you have integrated one survey with several sample providers, you already know nobody agrees on what to call a complete. One wants a word in the path, another wants a number in a parameter, a third wants a separate URL per outcome. Underneath, they describe the same four events.

Why codes exist

A redirect can only carry what fits in a URL. Status codes are a compact way to put the outcome there, either in the path (/end/complete) or as a parameter (?status=10). Numbers stuck because older survey platforms made it easy to change one value in an otherwise fixed URL.

The outcomes underneath

  • Complete: qualified and finished.
  • Terminate: did not qualify.
  • Over quota: qualified after the relevant quota filled.
  • Quality terminate: removed for quality or security reasons.

Some platforms split these further, with separate codes for duplicates, closed surveys or abandonment. Those help reporting, but billing still rolls up into the four.

ResearchDart's encoding

Outcome Path form Numeric form
Complete /s/end/complete?rdid=… /s/end?st=10&rdid=…
Terminate /s/end/terminate?rdid=… /s/end?st=20&rdid=…
Over quota /s/end/overquota?rdid=… /s/end?st=30&rdid=…
Quality terminate /s/end/quality?rdid=… /s/end?st=40&rdid=…

When ResearchDart itself decides the outcome, for example at the entry link, it also records a reason. Quota and closure reasons (quota_full, project_closed) produce over quotas. Quality reasons produce quality terminates and map to GDQ removal codes: duplicate_respondent and duplicate_device to 4, geo_mismatch to 3, speeder to 6, automation to 1, anonymized_network and fraud_tool to 2.

The outcome decides billing. The reason explains it. Keep them separate.

Translating between systems

Map outcome names first, numbers second. A 30 on one platform and a 30 on another can mean different things. Write the mapping as outcomes, then fill in each platform's code.

Check every system in the chain keeps over quota apart from terminate. If one system only knows complete and terminate, the distinction is lost for everyone after it. Find out before launch, not during reconciliation.

Carry reasons in their own field. Inventing a new outcome for every reason makes invoices unreadable. Four outcomes plus a reason code is enough.

Decide which channel wins. When outcomes can arrive by redirect and by server call, agree which is authoritative. On ResearchDart the first outcome recorded is final. More in postbacks versus redirects.

Before launch

  1. List the four outcomes and the reasons you care about.
  2. Write each platform's code next to each outcome.
  3. Confirm over quota survives every hop.
  4. Run a test session through each outcome and compare what every system recorded.
  5. Keep the mapping where whoever handles reconciliation will find it.

Questions readers ask

What status code means complete?
It depends on the platform. On ResearchDart a complete is code 10, or the path /s/end/complete.
Is a quality terminate billed?
No. Quality terminates are recorded and reported separately so the supplier can see which respondents failed quality checks.
How do router reasons relate to GDQ codes?
Quality reasons map to GDQ removal codes, for example duplicate devices to code 4, speeders to code 6 and automation to code 1. Quota reasons produce over quotas and have no GDQ code.
Sample routing Allocations, signed links, outcomes, redirects and postbacks.