When building WhatsApp Flows using a routing_model, you may encounter this error:

INVALID_ROUTING_MODEL

No entry screen found in the routing model. Expected a screen with no inbound edges as the entry screen.

This error appears when no screen qualifies as a valid starting point for the user journey — i.e., there’s no screen with zero inbound routes.

What’s an Entry Screen?

In any flow with a routing_model, the entry screen is the screen where the conversation starts.

Technically:

It’s the screen that:

  • Is listed in the routing_model.

  • Does not appear as a target of any other screen.

The routing model forms a directed graph. The entry screen is the root node — it has no inbound edges.

Problem Example

{
  "routing_model": {
    "FIRST_SCREEN": [
      { "target": "SECOND_SCREEN" }
    ],
    "SECOND_SCREEN": [
      { "target": "FIRST_SCREEN" }
    ]
  },
  "screens": [
    { "id": "FIRST_SCREEN", ... },
    { "id": "SECOND_SCREEN", ... }
  ]
}

Issue:

  • FIRST_SCREEN → SECOND_SCREEN

  • SECOND_SCREEN → FIRST_SCREEN

  • There is no screen with zero incoming connections

  • WhatsApp has no idea where the flow starts

Fixed Example

Break the loop and define a proper starting point:

{
  "routing_model": {
    "FIRST_SCREEN": [
      { "target": "SECOND_SCREEN" }
    ],
    "SECOND_SCREEN": []
  },
  "screens": [
    { "id": "FIRST_SCREEN", ... },
    { "id": "SECOND_SCREEN", ... }
  ]
}

Now:

  • FIRST_SCREEN has no inbound link → entry screen.

  • SECOND_SCREEN is routed to from FIRST_SCREEN → all good.

  • Flow can start at FIRST_SCREEN as expected.

How to Fix This Error

Step

What to Do

Identify all screen IDs in routing_model

List both sources and targets

Find screen(s) with no inbound edges

These are potential entry screens

If none found, you likely have a circular flow or broken graph


Fix by removing cycles or adding a starting node

One screen must not be referenced as a target by any other screen

Example: Valid vs Invalid

Invalid (Loop):

"routing_model": {
  "A": [{ "target": "B" }],
  "B": [{ "target": "C" }],
  "C": [{ "target": "A" }]
}

No entry point. Every screen is a target.

Valid (Tree):

"routing_model": {
  "A": [{ "target": "B" }, { "target": "C" }],
  "B": [],
  "C": []
}

A has no inbound edges → becomes the entry screen.

For more troubleshooting insights related to WhatsApp Business API, check out heltar.com/blogs.