# Plan numbers

> A short number for every plan, accepted wherever its code is, so a caller that speaks in numeric plan ids needs no mapping table.

Source: https://useroutegate.com/docs/concepts/plan-numbers

Every plan in the catalogue has a plan number: 3 to 8 digits, never starting with `0`, unique across the catalogue. It is `numeric_alias` on the wire.

```json
{
  "code": "MTN-VTU",
  "numeric_alias": "1001",
  "network": "mtn",
  "service": "airtime",
  "name": "MTN Airtime"
}
```

## Where it works

A plan number names the plan anywhere its code does:

- `product_code` on [Vend data](/docs/api/public/vendData), [Vend airtime](/docs/api/public/vendAirtime), [Vend electricity](/docs/api/public/vendElectricity) and [Vend cable TV](/docs/api/public/vendCable).
- `serviceid`, `service_id` and `product_code` on [Vend by product code](/docs/api/public/vend), which is the route to use when your platform already sends numeric plan ids.
- Every plan in [List products](/docs/api/public/listProducts) and [List pricing plans](/docs/api/public/getPublicPricingPlans) carries it, and the price list in the dashboard and on the [pricing page](/pricing) shows it beside the code.

The transaction records the plan's code in `product_code`, whichever of the two you sent, so your reports and webhooks always read the same way.

## Codes and numbers share one namespace

Routegate never gives a plan a number that another plan uses as its code, and never gives two plans one number, so whatever you send names exactly one plan. Numbers rarely change, but when one does the old number stops working at once, so read them from the API rather than copying them into your code, the same way you read prices.

## Test mode

Plan numbers are the same in test and live. A test key vends against the same catalogue, so a number that works in test works in live.
