Filtering options within routers

:bullseye: What is your goal?

Fix my problem with the filtering system

:thinking: What is the problem?

Ive ran across a problem on my make scenario ( a lead screening system) , where after the collect responses, openai, parse json step, it goes onto a router with 3 diffrent options. when i dont use filters it goes to all 3(only meant to go for one based on condtions score either ≥80, between 40-79, and <40.) but when i implemnt the filters it just stops right at the json step

:test_tube: What have you tried so far?

ive tried to enter them but i cant find varibles or it just plain dosnt work.

:camera_with_flash: Screenshots: scenario setup, module configuration, errors


1 Like

Right now, nothing is “wrong” with the router itself. When you have no filters, Make sends the bundle down all 3 routes, which is why everything fires.

As soon as you add filters, Make will only continue down routes where the filter evaluates to true.

In your case, it is stopping after the JSON step because none of the route filters match, so the execution simply ends without an error. To fix it, make sure your OpenAI > Parse JSON step actually exposes a single numeric field like score, then click Run once so that the field appears in the filter mapping panel.

On the router, create 3 routes that all use that same parsed score output: the first route filter should be score >= 80, the second route should have 2 conditions combined with AND (score >= 40 and score <= 79), and the third route should be score < 40.

Also, confirm that the JSON parser maps score as a number (not text), because numeric operators like “greater than or equal to” require a numeric field.

Once those 3 filters are set correctly and you have run the scenario at least once, so the variables are visible, one and only one route will run per lead instead of all 3 or none.

Let me know how it goes!

Hey Angus,

firstly, you don’t need Parse JSON after the openAI module, toggle advanced settings and change the output format to a parsed JSON directly.

Second, make sure this action variable is actually a number type variable. And if it’s not, use parseNumber() to change it to one.

2 Likes

Thanks Karmic, ive implemented those steps and i think that that was part of the reason why it wasnt working as i was using action instead of score. but it still does stop once at the router step after the json. take a look at the outputs of this run:
OpenAI output:
“result”: {
“score”: 75,
“action”: “BookCall”,
“reason”: “Good ICP fit, budget available, decision authority confirmed, clear need, timeline within 3 months”
},
“conversationId”: “conv_693a32298544819094379ba254b1267e002e2004a84f6165”,
“raw_result”: “{\“score\”: 75, \“action\”: \“BookCall\”, \“reason\”: \“Good ICP fit, budget available, decision authority confirmed, clear need, timeline within 3 months\”}”,
“id”: “resp_002e2004a84f616500693a322a35b8819099e9cc3edd85472e”,
“object”: “response”,
“created_at”: “2025-12-11T02:53:30.000Z”,
“status”: “completed”,
“background”: false,
“billing”: {
“payer”: “developer”
},
“error”: null,
“incomplete_details”: null,
“instructions”: null,
“max_output_tokens”: 100,
“max_tool_calls”: null,
“model”: “gpt-4.1-mini-2025-04-14”,
“output”: [
{
“id”: “msg_002e2004a84f616500693a322b7b508190862f105f8aa2da4d”,
“type”: “message”,
“status”: “completed”,
“content”: [
{
“type”: “output_text”,
“annotations”: ,
“logprobs”: ,
“text”: “{\“score\”: 75, \“action\”: \“BookCall\”, \“reason\”: \“Good ICP fit, budget available, decision authority confirmed, clear need, timeline within 3 months\”}”
}
],
“role”: “assistant”
}
],
“parallel_tool_calls”: true,
“previous_response_id”: null,
“prompt_cache_key”: null,
“prompt_cache_retention”: null,
“reasoning”: {
“effort”: null,
“summary”: null
},
“safety_identifier”: null,
“service_tier”: “default”,
“store”: true,
“temperature”: 1,
“text”: {
“format”: {
“type”: “json_object”
},
“verbosity”: “medium”
},
“tool_choice”: “auto”,
“tools”: ,
“top_logprobs”: 0,
“top_p”: 1,
“truncation”: “auto”,
“usage”: {
“input_tokens”: 145,
“input_tokens_details”: {
“cached_tokens”: 0
},
“output_tokens”: 38,
“output_tokens_details”: {
“reasoning_tokens”: 0
},
“total_tokens”: 183
},
“user”: null,
“metadata”: {}
}
]
Parse JSON output:

[
{
“result”: {
“score”: 75,
“action”: “BookCall”,
“reason”: “Good ICP fit, budget available, decision authority confirmed, clear need, timeline within 3 months”
},
“conversationId”: “conv_693a32298544819094379ba254b1267e002e2004a84f6165”,
“raw_result”: “{\“score\”: 75, \“action\”: \“BookCall\”, \“reason\”: \“Good ICP fit, budget available, decision authority confirmed, clear need, timeline within 3 months\”}”,
“id”: “resp_002e2004a84f616500693a322a35b8819099e9cc3edd85472e”,
“object”: “response”,
“created_at”: “2025-12-11T02:53:30.000Z”,
“status”: “completed”,
“background”: false,
“billing”: {
“payer”: “developer”
},
“error”: null,
“incomplete_details”: null,
“instructions”: null,
“max_output_tokens”: 100,
“max_tool_calls”: null,
“model”: “gpt-4.1-mini-2025-04-14”,
“output”: [
{
“id”: “msg_002e2004a84f616500693a322b7b508190862f105f8aa2da4d”,
“type”: “message”,
“status”: “completed”,
“content”: [
{
“type”: “output_text”,
“annotations”: ,
“logprobs”: ,
“text”: “{\“score\”: 75, \“action\”: \“BookCall\”, \“reason\”: \“Good ICP fit, budget available, decision authority confirmed, clear need, timeline within 3 months\”}”
}
],
“role”: “assistant”
}
],
“parallel_tool_calls”: true,
“previous_response_id”: null,
“prompt_cache_key”: null,
“prompt_cache_retention”: null,
“reasoning”: {
“effort”: null,
“summary”: null
},
“safety_identifier”: null,
“service_tier”: “default”,
“store”: true,
“temperature”: 1,
“text”: {
“format”: {
“type”: “json_object”
},
“verbosity”: “medium”
},
“tool_choice”: “auto”,
“tools”: ,
“top_logprobs”: 0,
“top_p”: 1,
“truncation”: “auto”,
“usage”: {
“input_tokens”: 145,
“input_tokens_details”: {
“cached_tokens”: 0
},
“output_tokens”: 38,
“output_tokens_details”: {
“reasoning_tokens”: 0
},
“total_tokens”: 183
},
“user”: null,
“metadata”: {}
}
]
and here are the photos of what the filter blocked

1 Like

Right now, the router is just looking at the wrong value. In the parsed JSON, the score lives inside result, so the real path is result.score, not a top level score.

In Make, open each router filter, delete the existing 8. score token, and re-select it from the picker as 8 > Bundle 1 > result > score.

Then rebuild the 3 filters using that exact field: one route with result.score < 40, one with result.score >= 40 and result.score <= 79 joined by AND, and one with result.score >= 80.

Check that Make shows the type as a number; if it insists on treating it as text, wrap it as number (8.result.score) in the condition.

After that, a score of 75 will go down the middle route and the router will stop blocking at that step.

Let me know how it goes!

2 Likes

Thanks Karmic finally got it working :tada:

1 Like