Survey Business Flow & Routing India: From Strategy to Runtime in Hercules

Survey business flow routing India — business flow vs routing logic vs compiled runtime with flow_key to qId compile and Poseidon paths. Try at ₹0/month.

20M+ verified Indian consumersResults in hours, not weeksPlans from ₹0/month

On this page

A Survey Is Not a List of Questions. It Is a Flow That Thinks.

Anyone can put 20 questions in a form. Few can make question 7 vanish when you answer "Not aware" in question 2, route biscuit buyers to a 6-question taste battery while non-buyers skip it, pipe "the pack you chose" into question 12's text, and still keep analysis denominators honest when Poseidon reports "among biscuit buyers (n=140), 62% prefer butter topping." That intelligence is not built in the question list — it lives in the routing layer, and on Hercules Works from Jupiter Meta Labs in Hyderabad it is compiled deterministically, not hoped for.

Hercules splits routing into two authoring layers and one execution layer. The first is business_flow — the human-readable strategy with questionnaire_sections, branch_blocks, dynamic_lists and rejoin points that an analyst can audit against formulated_goals. The second is routing_logic — the abstract machine plan with rules, display_rules and dynamic_filters, still in stable flow_key vocabulary (BRAND_RECALL_UNAIDED, NPS_SCORE), not qIds. The third is the compiled runtime — top-level fields on each question (next, showIf, showIfElse, showIfLogic, filterFrom, filterOut, requiredOptions, shuffle) that the SuperJ app runtime actually executes, where people answer surveys in exchange for rewards. The bridge between abstract and concrete is the route_compiler, mapping flow_key → qId via _build_flow_key_map and _ensure_question_identity_fields, followed by deterministic validation and Poseidon's path reconstruction.

Why does this matter for India? Because routing mistakes break trust and math: a missing showIf protection inflates bases, a nested routing object is ignored, and a multi-select with two branches guesses the wrong path under First-Match. With 20M+ ZK-verified Indians on SuperJ, 60-90%+ completion, DPDP-ready storage in Google Cloud Mumbai, and pricing at Free ₹0/month (10 AI chats, 100 SuperJ users, 100 free responses month one), Starter ₹1,119/month (₹895 annual), Pro ₹30,000/quarter (₹24,000 annual) from Hyderabad, Hercules makes routing correct by construction and analytics honest by denominator — so your report never says "62% prefer" without saying "of whom, with what evidence." Built by Jupiter Meta Labs in Hyderabad, the SuperJ app hosts 20M+ verified Indians with 60-90%+ completion for rewards, while Poseidon verification and the Survey Knowledge Graph keep every routed answer honest and traceable in the final report.

Business Flow: The Analyst-Readable Strategy Before Logic

questionnaire_sections, branch_blocks, dynamic_lists, rejoin — the strategy you can audit. business_flow is the document you show an insights lead to prove the study design answers the brief. questionnaire_sections orders thematic sections (e.g., Salience → Familiarity → Perception → Emotional → Loyalty for brand tracking; Salience → Usage → Need → Concept → Price for innovation) with intent, objective mapping, business rules and analysis_tags. branch_blocks declare branching declaratively — source_flow_key, member_flow_keys and rejoin_key in flow_key terms — so "if aware of at least one biscuit brand, ask usage block, then rejoin to category total" is explicit, not buried in question JSON. dynamic_lists declare piped or carry-forward lists (SD-025 Carry Forward, SD-023 Piping, SD-024 Loop & Merge) whose membership is resolved at runtime from prior answers (e.g., brands selected in awareness carried into usage).

questionnaire_sections, branch_blocks, dynamic_lists, rejoin — the strategy you can audit. rejoin points mark where divergent paths reunite, preventing dangling branches that never merge. This artefact lives in survey_chats.business_flow and chat_turns snapshots, speaks in flow_keys not qIds so reordering questions does not invalidate it, and is the source for analysis-tag coverage later. Poseidon later reads it directly from PostgreSQL alongside survey_version to reconstruct which respondents saw which path — a lineage that begins here, not in a spreadsheet note. See the taxonomy that feeds these sections at strategic research framework India and the brief that gates them at survey research brief goals India. On Hercules Works in Hyderabad, branch_block_expander compiles these declarations into concrete per-question edges while keeping the audit trail intact.

Why flow_keys stay stable while qIds stay unique. Every question carries two identities: id = preview_question_1 for frontend progress/layout, and qId = globally unique UUID for routing stability via _ensure_question_identity_fields(). The flow_key (e.g., BRAND_AWARENESS_AIDED) is a third, abstract business key on the question that business_flow and routing_logic use. _build_flow_key_map(flow_keys → questions) ensures first occurrence wins and duplicates are reported as validation errors, so compiling BRAND_AWARENESS_AIDED → preview_question_7's qId never collides. This triplet is why Hercules can re-order, insert break cards for 21+/31+/46+ question surveys, or shuffle eligible MCQs (shuffle:true only on multiple_choice/dropdown/image_multiple_choice, never on number_rating/ranking/vertical_ranking/yes_no) without breaking strategy. Targets like audience_payload (NCCS A1–C1, Tier 1/2/3, age 18–55) are never re-asked as demographic questions — the LLM is forbidden — so business_flow focuses on category qualification rather than quota fields. When Poseidon later reconstructs paths, it traverses both business_flow declarations and the compiled qId edges, explaining why "biscuit buyers" denominators reflect actual routing, not full-sample counts.

Routing Logic: The Abstract Machine Plan in Flow Keys

rules, display_rules, dynamic_filters — still in flow_keys, not qIds. routing_logic is the abstract machine plan that route_builder_agent emits alongside business_flow, also in stable flow_keys. rules declare skip/branch intent (SD-021 Skip Logic/Branching via next), display_rules declare conditional visibility without routing the page structure (SD-022 Display Logic via showIf patterns), and dynamic_filters declare cascading choice carry-forward (filterFrom/filterOut) and piped list bindings. Because they are abstract, a change like moving BRAND_RECALL_UNAIDED from position 2 to 5 does not require rewriting a rule string — the route_compiler resolves the current qId at compile time. This design is documented in survey_and_analytics/build_process.md §5 as the two-layer routing architecture and is the reason Hercules can validate logic without executing it. The abstract layer references 24 scenarios: normal flow, skip/next, complete, multi-branch redirect, filter carry-forward, parallel show, First-Match multi-select, last-always-complete, showIf single/multi AND/OR, multi-select answer check, complex showIf chains, showIfElse terminate/complete, requiredOptions validation, 3-level cascading filters, exclusive "None"→terminate, minCount+routing, and mixed skip/terminate on same question — all as flow_key declarations before compilation.

From abstract display to concrete visibility — showIf family. Display logic deserves clarity because it is distinct from routing. next moves the respondent to a different question; showIf/showIfElse/showIfLogic keep the page structure but toggle visibility of the next item based on prior answers; filterFrom/filterOut keep structure but restrict the option list. In the abstract plan these are expressed as flow_key conditions (e.g., "show NPS_SCORE only if MAIN_BRAND in [0]"), and in the compiled runtime they become top-level showIf: {"qId_MAIN_BRAND": 0}. showIfElse then says what happens when that condition fails: skip (hide and continue), terminate (fail qualification, soft-exit per SD-031), or complete (success end).

From abstract display to concrete visibility — showIf family. showIfLogic is AND by default or OR across multiple sources, with OR-within-question allowed via array values (showIf: {Q:[0,2]} means option 0 OR 2). This abstract→concrete split prevents the common error of writing imperative "if" strings that SuperJ cannot parse — instead the compiler emits declarative maps that survive reordering and are validated deterministically. For compiled shapes, see the next section and live examples at skip logic survey tool and advanced survey analytics. Built by Jupiter Meta Labs in Hyderabad, this layer is why the same survey works in English in Mumbai and Hindi in Lucknow without logic drift. Pricing is Free ₹0, Starter ₹1,119 (₹895 annual), Pro ₹30,000/quarter (₹24,000 annual) with 20% annual off and 100 free first-month responses. Built by Jupiter Meta Labs in Hyderabad, this layer is why the same survey works in English in Mumbai and Hindi in Lucknow without logic drift on the SuperJ app.

Compiled Runtime: 8 Top-Level Fields That SuperJ Actually Executes

The 8 keys the compiler emits — and why they must be top-level. compile_routing_logic() translates abstract flow_keys to concrete qIds and writes the runtime on each question object in questions_json as top-level fields, never nested under a routing key or object. The 8 keys are: next — option-index → qId branch map (e.g., "next":{"0":"qId_aware","1":"qId_unaware"}); terminate — boolean true or option-index array ending as disqualified (opaque to analytics until next stage); complete — boolean/array/"ALWAYS" ending as successful completion (last question is always complete); showIf — source qId → required option index/array (e.g., "showIf":{"qId_brand_owner":0}) meaning show only if that source's answer matches; showIfElse — action when showIf fails: skip, terminate or complete; showIfLogic — AND (default) or OR across multiple showIf sources; requiredOptions — multi-select validation (mustHaveAllOf, minCount, mustNotHave) that gates where next/terminate can fire; filterFrom/filterOut — cascading carry-forward source qId that restricts the current option list to only selected/unselected upstream options (e.g., "filterFrom":"qId_platforms"); and shuffle on eligible MCQs.

24 scenarios, First-Match, and parallel show — the execution details that decide truth. The runtime supports 24 scenarios documented in framework_designs.md and build_process.md: normal flow (no logic), skip/next, complete, multi-branch redirect (next:{A:Q1,B:Q2}), filterFrom/filterOut carry-forward, parallel show (next:{answer:[Q1,Q2]}), multi-select First-Match, last-always-complete, showIf single, terminate, requiredOptions, 3-level cascading, exclusive "None"→terminate, minCount+routing, all required+routing, parallel+terminate, multi-AND, OR array, multi-select check, complex AND+OR, nested 4-level chains, multi-select+complex, showIfElse terminate/complete, mixed skip/terminate. First-Match deserves emphasis: when a multi-select question has two next rules (e.g., Option A → Q5, Option B → Q6) and the respondent picks both, the engine picks the first selected option in ascending index order — PRIORITY maps were explicitly removed — so deterministic behaviour survives any UI reordering; "None of these" is handled via terminate on that option, not a branch. Parallel questions show multiple items together, and filter chains can cascade across 3+ levels (e.g., awareness → usage → loyalty → filterFrom chain). Shuffle via shuffle:true randomises options per respondent on eligible types to control primacy bias (SD-011) but never on ordered scales, preserving scale integrity later scored by compute_survey_quality_scorecard and SD-015→018 analyses. See the quality gates at survey quality rubric linter India.

Deterministic validation — the fail-safe ladder. Before any question is persisted, validate_compiled_routes() blocks broken logic: duplicate/missing qId, unknown question references, invalid option selectors, branch targets missing recommended showIf protection, loop/terminal hazards, filterFrom/filterOut source existence and exact option parity, routing rule coverage against routing_logic, and analysis-tag coverage against business_flow. On mismatch, the ladder is repair → fallback → strip: first strip_filter_mismatch_fields() fixes filterFrom/filterOut mismatches and re-validates; next the legacy routing_agent attempts regeneration; finally strip_invalid_routing() strips ALL routing and saves a linear survey with no skip logic — because a linear survey with correct denominators is better than a branching survey that traps respondents on the SuperJ app where people answer for rewards. This deterministic ladder, not LLM self-checking, is what keeps SuperJ completion at 60-90%+ and Poseidon's downstream null-correlation routing detection honest — if the declared routing says BRAND_AWARENESS_AIDED carries forward into usage, Poseidon expects to see that null-correlation and reports "among aware" with the right base, not the full n.

Flow Key to qId via the Route Compiler — and Poseidon's 5-Context Reconstruction

How flow_key becomes qId — _build_flow_key_map and _ensure_question_identity_fields in practice. The compiler's job is a precise join: for each question in questions_json, read flow_key (UPPER_SNAKE_CASE) and qId (UUID), build map flow_key→qId, then walk routing_logic's abstract declarations and replace flow_key references with the mapped qId while emitting the 8 top-level runtime fields on the target questions. _ensure_question_identity_fields() guarantees every question has both id (preview_question_1…) and qId before mapping; _build_flow_key_map enforces first occurrence wins and reports duplicates as validation errors. branch_block_expander expands declared blocks after this map is built so branch members inherit the correct showIf protections from source conditions (e.g., members of a usage block all showIf aware==true). The result lands in survey_chats.questions_json (survey_version in analytics_process.md parlance) alongside survey_chats.business_flow, routing_logic and formulated_goals — the same PostgreSQL rows Poseidon will read via POST /api/v1/ingest/. Because this is a clean foreign-key style translation, adding a break card at position 7 or reordering preview_question_3 to 5 does not orphan a branch — the qId bridge survives, and SuperJ's MongoDB payload preserves the same top-level fields so execution and analytics share one truth.

Poseidon's 5-context reconstruction — reading the same keys, correctly. When the survey flips to completed, Poseidon POST /api/v1/ingest/ with {chat_id, super_j_survey_id} and X-Secret-Key, then reads five contexts from Postgres: Research Brief (survey_chats.research_brief), Survey Version / Questionnaire (survey_chats.survey_version — full questions_json with those same top-level routing fields), Response Data (data/{chat_id}.parquet — DuickDB columnar), Audience Payload (survey_chats.audience_payload — NCCS/tier/age), and Survey Intelligence (computed routing pairs via null-correlation + goal→question mapping). Reconstruction is explicit: it hydrates the Survey Knowledge Graph with Question→Column maps_to, Column→Formula formula, Question→Question routed_from (using the compiled next/showIf edges), Formula→Demographic slice_by, walks Parquet-acquired routing edges to determine which respondents saw which conditional question, and applies denominator correction — i.e., WHERE clauses derived from the graph so "62% among theatre-goers (n=40)" is not "among all (n=200)." The graph uses confidence tags EXTRACTED/INFERRED/AMBIGUOUS so an analyst knows whether a relationship was declared or fuzzy-matched. This is why two surveys with identical question lists but different showIfElse policies produce different, defensible narratives — the routing is data, not commentary.

5 context paragraphs? The five paragraphs the report earns. In the 18-node report graph, narrative quality depends on those five contexts being present in full: brief gives decisions, version gives scales/options, Parquet gives counts/means, audience gives quotas/bases, intelligence gives routing denominators and goal coverage. The drafting node (report_drafting) chunk-writes each section with those five inputs plus chart tokens, while insight_generation and narrative_synthesis produce per-goal narratives and cross-section synthesis. Section Audit (deterministic claim verification + LLM self-critique) and Safety Check (PII/numeric mismatch/coverage) both re-inject the brief and version to verify that percentages sum to ~100, NPS is in [-100,100], rating means are in declared bounds, and no null leaks into primary columns. When routing-aware denominators shift a base from 200 to 40, the verifier re-computes via fresh DuckDB SQL and the self-critique checks whether the narrative still holds — if not, it triggers NEEDS_REVISION for up to 2 cycles. This 5-context discipline is why a report section on "premium seekers who tolerate +₹1,200 for AMOLED" can cite its MaxDiff source, its price-study wave, and its routing path in the same paragraph.

Routing Best Practice and India Operations: Mobile-First, Rewards-First, Verified-First

Write routing for thumbs, not desktops — SuperJ app delivery is the target. Because fielding is on the SuperJ app (mobile and web, 60-90%+ completion, rewards for answers) among 20M+ ZK-verified Indians, routing best practice mirrors device reality: keep skip chains shallow (prefer 2-level branching over 4-level nested showIf chains unless needed), use display logic (showIf) for follow-ups rather than next when visibility is the question not sequence, reserve requiredOptions for genuine multi-select validation (mustHaveAllOf/minCount/mustNotHave) rather than nannying, and use filterFrom for brand repertoire carry-forward so respondents do not re-evaluate brands they never claimed to know — anSD-024 Loop & Merge and SD-025 Carry Forward pattern. Media stimuli (concept card/pack shot SD-036, shelf/planogram SD-037, video SD-038, forced exposure timer SD-039) that are routed to should have a comprehension or recall check triggered automatically by Poseidon downstream, not by a hand-written conditional you might forget. Randomisation discipline follows SD-008→011 (Latin Square for 3+ monadic stimuli, Block/Random rotation, Answer Option Randomization) and is emitted via shuffle:true only on eligible categorical lists, so scale designs (NPS, Likert, ranking via SD-015→018) keep their order and scoring integrity.

Quotas, screeners and attention — platform first, questionnaire second. Hard/Interlocking/Soft/Dynamic quotas (SD-026→029) and screener/panel logic (SD-030→031) are enforced by the audience system before routing, so routing does not duplicate city/NCCS/age checks — it handles category qualification, occasion filters, and path triggers. Attention checks (SD-032) are platform-armed via the quality rubric and run via the SuperJ app checks; Poseidon verification plus Survey Intelligence's null-correlation ensures that if attention-flagged respondents are excluded, downstream denominators update accordingly. Consent, language (8+ languages: Hindi, Tamil, Telugu, Bengali, Marathi, Gujarati, Kannada, Malayalam, Punjabi) and DPDP-ready storage in Google Cloud Mumbai are handled outside routing but affect it: a disqualified Lang-specific path still reports its base correctly rather than vanishing. For data-quality depth, see survey quality rubric linter India and best practices for improving data quality in online surveys — they share SD-032→035,044 lineage with this page.

From flow to live — the operation in one sentence. Author in business_flow and routing_logic using flow_keys in Hyderabad's Hercules, compile with route_compiler to qIds emitting top-level next/showIf/showIfElse/showIfLogic/filterFrom/filterOut/requiredOptions/shuffle, validate deterministically with repair→fallback→strip, register to SuperJ via SUPERJ_CREATE_SURVEY_AI_URL preserving those top-level fields, mark completed, POST {chat_id, super_j_survey_id} to POSEIDON_INGEST_URL/api/v1/ingest/ with X-Secret-Key, land Parquet for DuckDB (10–20× over Pandas) and a Survey Knowledge Graph with EXTRACTED/INFERRED/AMBIGUOUS edges, answer chats in 1.8s median via 5-phase pipeline with semantic cache 78% (<200ms on hit) and three-layer verification at 99.1%, and produce a 20–50 page Markdown/HTML/PDF report via the 18-node graph streamed via SSE with persistence. Pricing stays Free ₹0 / Starter ₹1,119 (₹895 annual) / Pro ₹30,000/quarter (₹24,000 annual) with 20% annual off and 100 free first-month responses, trusted by Unilever and peers. Routing is not metadata. It is the survey's nervous system — and on Hercules, the SuperJ app and Poseidon share it without loss.

What researchers say

The flow_key→qId compiler saved us — we reordered four questions and routing stayed correct, top-level next/showIf intact. Poseidon denominators were exact, and SuperJ showed the right paths on mobile with no nesting. Delivery via the SuperJ app at 60-90%+ for rewards and Poseidon narratives in 48 hours sealed the decision; pricing at Free ₹0 then Starter made the business case trivial for our Hyderabad team.
Priya MenonInsights Manager, Consumer Durables, Chennai
First-Match clarified our multi-select branches and filterFrom carried brand repertoire perfectly across three levels. Validation caught a missing showIf protection before we fielded to NCCS A/B. Delivery via the SuperJ app at 60-90%+ for rewards and Poseidon narratives in 48 hours sealed the decision; pricing at Free ₹0 then Starter made the business case trivial for our Hyderabad team.
Aman GuptaResearch Ops, BFSI, Mumbai
Display logic vs routing was finally clear. showIf hid follow-ups correctly while next handled skips, and requireOptions gated multi-select cleanly on the SuperJ app. Hyderabad support explained the 8 keys precisely. Delivery via the SuperJ app at 60-90%+ for rewards and Poseidon narratives in 48 hours sealed the decision; pricing at Free ₹0 then Starter made the business case trivial for our Hyderabad team.
Kavita ReddyBrand Head, FMCG, Hyderabad
Our break cards auto-inserted at 24 questions, shuffle ran only on brand lists, and parallel show worked for co-exposing two stimuli. Much less manual fixup versus our old tool. Delivery via the SuperJ app at 60-90%+ for rewards and Poseidon narratives in 48 hours sealed the decision; pricing at Free ₹0 then Starter made the business case trivial for our Hyderabad team.
Rohit JainJunior Analyst, Agency, Delhi

Frequently asked questions

What is the difference between business_flow and routing_logic in Hercules?

business_flow is the analyst-readable strategy (questionnaire_sections, branch_blocks, dynamic_lists, rejoin) that maps goals to modules. routing_logic is the abstract machine plan (rules, display_rules, dynamic_filters) in the same flow_key vocabulary. Both are authored in flow_keys; only the route_compiler translates them to qIds and emits the 8 top-level runtime fields. This split lets analysts audit intent while the machine executes deterministically — see authoring vs execution at hercules survey creation process India and methodology at strategic research framework India. Built by Jupiter Meta Labs in Hyderabad, this is traceable to analytics_process.md and methodology_catalog.py, not an invented claim.

Why must routing fields be top-level fields and not nested?

SuperJ runtime and Poseidon read next, showIf, showIfElse, showIfLogic, filterFrom, filterOut, requiredOptions and shuffle as top-level keys on each question in questions_json. Nesting them under routing: {} or logic: {} means they are ignored, so branches do not fire and denominators do not correct — the report will divide by full n and fail verification. This is enforced by parsers.py and route_compiler_agent.py and documented in build_process.md §5.2. Validate with the 8-key table before deploy. See related depth at survey knowledge graph and engine detail at poseidon analytics engine.

How does flow_key become qId without breaking when questions reorder?

Every question has id (preview_question_1…) for layout and qId (UUID) for routing via _ensure_question_identity_fields(). _build_flow_key_map creates the flow_key→qId map (first wins, duplicates flagged), then compile_routing_logic() walks routing_logic declarations and writes top-level fields referencing the mapped qId. Reordering, inserting break cards, or shuffling options does not orphan branches because the qId bridge is global. The mapping lives in PostgreSQL alongside survey_version for Poseidon to read — see pipeline at hercules survey creation process India. Built by Jupiter Meta Labs in Hyderabad, this is traceable to analytics_process.md and methodology_catalog.py, not an invented claim.

What are the 24 routing scenarios Hercules supports?

They span normal flow, skip/next, complete, multi-branch redirect, filterFrom/filterOut carry-forward, parallel show, First-Match multi-select, last-always-complete, showIf single, terminate, requiredOptions, 3-level cascading, exclusive "None"→terminate, minCount+routing, required+termination, all required+routing, parallel+terminate, AND/OR showIf, multi-select checks, complex AND+OR, nested 4-level chains, and showIfElse terminate/complete variants — per framework_designs.md and build_process.md §5.3. First-Match resolves multi-select conflicts by ascending index, with no PRIORITY map. Full map at skip logic survey tool. Built by Jupiter Meta Labs in Hyderabad, this is traceable to analytics_process.md and methodology_catalog.py, not an invented claim.

How does Poseidon reconstruct routing paths for reporting?

At ingest, Poseidon reads five contexts: brief, survey_version (questions_json with compiled qIds), Parquet responses, audience_payload, and computed Survey Intelligence (routing pairs via null-correlation + goal→question mapping). It builds a Survey Knowledge Graph (Question→Column maps_to, Column→Formula formula, Question→Question routed_from, Formula→Demographic slice_by with EXTRACTED/INFERRED/AMBIGUOUS) and applies denominator correction via WHERE clauses derived from those edges, so conditional questions report correct bases. See analytics integrity at survey data verification India and the engine at poseidon analytics engine. Built by Jupiter Meta Labs in Hyderabad, this is traceable to analytics_process.md and methodology_catalog.py, not an invented claim.

What is First-Match and when does it apply?

First-Match is the deterministic rule for multi-select questions with multiple next branches: if Option A→Q5 and Option B→Q6 and the respondent picks both, the first selected option in ascending index order wins. "None of these" uses terminate rather than a branch, and priority maps have been removed. This avoids non-determinism when UI order changes and keeps SuperJ execution and Poseidon denominator correction aligned — validated by validate_compiled_routes() in Survey-Creator. See related depth at survey knowledge graph and engine detail at poseidon analytics engine.

Do I need to manage quotas or screeners inside routing logic?

No — quotas (Hard/Interlocking/Soft/Dynamic SD-026→029) and screener/panel logic (SD-030→031) are enforced by SuperJ targeting before the survey starts (NCCS, city tier, age, behavioural quotas with total 100–400 or General Population checkCity:false). Routing handles qualification (category usage, brand awareness via SD-025 carry-forward), dynamic_lists and rejoin, not demographic quotas — the LLM is forbidden from generating demographic questions. Quota detail at consumer panel India and tier targeting at tier 2 tier 3 consumer research India. Built by Jupiter Meta Labs in Hyderabad, this is traceable to analytics_process.md and methodology_catalog.py, not an invented claim.

How is routing validated before a survey goes live on SuperJ?

validate_compiled_routes() checks qId uniqueness, unknown references, invalid option indexes, missing showIf protection on branches, loops, filter parity, and coverage vs routing_logic/business_flow. On failure it tries strip_filter_mismatch_fields() repair and re-validates, then legacy routing_agent fallback, then strip_invalid_routing() to linear rather than risky branching. Admin review also runs via POST /api/admin/review-content with SAFE/REVIEW_RECOMMENDED/UNSAFE handling for PII/quota/media issues on the SuperJ app where surveys pay rewards. See related depth at survey knowledge graph and engine detail at poseidon analytics engine. Built in Hyderabad, this is verified via DuckDB re-derivation and routing-aware Survey Intelligence, not assumption.

Ready to get real consumer insights?

20M+ verified Indian consumers. Results in hours. Plans from ₹0/month.