~learn.

Side quest 35Electronic tolling

FASTag.

ADVANCED60 MIN READ6 PHASES · 45 MIN INTERVIEW+120 XP

Mission brief

Design India's electronic toll network: the tag, the lane, the switch, the banks and the settlement

Quest log0/7 stages · 0/9 checkpoints · 0/8 quick checks
(12 million) FASTag transactions a day on National Highway fee plazas, about ₹184 crore a day (MoRTH, FY 2025–26 to November 2025)
~120 lakh
FASTags issued; 40 issuer banks and 12 acquirer banks (MoRTH, November 2025)
11.73 crore
penetration and 8 crore+ users (NHAI and MoRTH, 2024–2026)
~98%
Annual Pass users within seven months of its launch on 15 August 2025 (NHAI, March 2026)
56 lakh+

Company names and logos are trademarks of their owners, shown only to identify each company. This course isn't affiliated with or endorsed by any of them.

watch it first · newThe whole design in a 16-minute animated lecture4 quiz checkpoints · ask the AI about any moment · captions, chapters and speed
Optional · timed run · 6 phases · 45 min

Want it harder? Hide the model answer and work each phase in a scratchpad against its time budget, then reveal and score yourself. Or simply read on: the checkpoints below work either way.

Intro · 5 min

How Do You Charge a Truck That Never Stops, From a Bank It Has Never Heard Of?

(An illustrative scene: Rajesh, his truck, his son and every fare and time below are invented.) It is 11:41 pm on a December night on NH-19 west of Kanpur. Rajesh Yadav, 46, owner and driver of a twelve-wheel truck carrying cement to Agra, rolls through a toll plaza without stopping. The barrier lifts; his phone buzzes: ₹845 debited. A second message follows: his FASTag is in low balance. His wallet is down to ₹160.

At 11:52 his son Ankit, at home in Kanpur, scans the UPI QR code printed on the tag and tops it up by ₹5,000. At 12:04 am Rajesh reaches the next plaza. The lane's display flashes amber: LOW BALANCE. The plaza's copy of the exception list was refreshed at 11:50, two minutes before Ankit paid. The toll clerk asks Rajesh to pay another way; he pays by UPI, at 1.25 times the fee, the UPI rate for a vehicle without a valid, functional FASTag, and drives on, angry.

At 12:31 am, at the third plaza, the antenna above the lane reads Rajesh's tag 37 times while the truck crawls behind a bus, and the barrier lifts once. The plaza's fibre link to its bank has been cut since midnight. His phone stays silent. At 9:14 the next morning, outside Agra, it buzzes: ₹845 debited, for a crossing nine hours earlier, settled through a bank Rajesh has never dealt with, routed through a switch he has never heard of, to a plaza operator that was paid the next day.

FASTag and NETC, from published numbers
  • ~120 lakh average daily ETC transactions and ~₹184 crore average daily collection via FASTag on National Highway fee plazas, FY 2025–26 up to November 2025 (MoRTH Year End Review, 30 December 2025)
  • 11.73 crore+ FASTags issued till November 2025; 40 issuer banks and 12 acquirer banks; NPCI is the central clearing house (MoRTH Year End Review, 2025)
  • ~98% penetration and 8 crore+ users (NHAI, January 2024; PIB, November 2025)
  • ₹61,408 crore in user fee collected at National Highway fee plazas in FY 2024–25, over 52,748 km of tolled length (MoRTH Year End Review, 2025)
  • ~1,150 fee plazas on National Highways and Expressways accept the FASTag Annual Pass; 50 lakh+ users and 26.55 crore pass transactions in its first six months, and about 28% of car transactions on the NH network now made with the pass (PIB, 6 February 2026)
  • ~41,500 vehicles through India's first barrier-free Multi-Lane Free Flow (MLFF) toll point, at Chorayasi (also spelled Choryasi) on NH-48 in Gujarat, on its first day (NHAI, 2 May 2026)

For context:
All lanes of National Highway fee plazas became "FASTag lanes" from midnight on 15–16 February 2021; FASTag fitment had been mandated for M and N category vehicles (four-wheelers carrying passengers or goods) from 1 January 2021 (MoRTH)
NPCI runs the National Electronic Toll Collection (NETC) network; IHMCL, a company promoted by NHAI, runs the tolling programme; NPCI publishes the NETC Procedural Guidelines, and IHMCL hosts the current version (2.1). Those guidelines, NPCI circulars, MoRTH and NHAI releases and RBI notes are the published parts. How each bank, each plaza's lane system and NPCI's own switch are built inside is not published, and everything labelled as our design or an assumption is illustrative
Since 15 November 2025, a vehicle entering an NH fee plaza without a valid, functional FASTag pays twice the fee in cash or 1.25 times by UPI (MoRTH, amended National Highways Fee Rules). The story treats a tag on the plaza's low-balance list as one that can't pay at that lane
Rajesh, his son, his truck, the plazas he passes and their fares are invented

This is the system we'll design today.

ExplainerThe whole quest: FASTag electronic tolling

About 120 lakh FASTag crossings a day pass National Highway fee plazas (~₹184 crore a day, FY 2025–26), from 11.73 crore tags issued by 40 banks, with 12 banks acquiring the plazas: only ~139 debits a second on average, so the hard parts are at the edges. The lane decides alone in about a second: it verifies the issuer's signature over the tag's chip ID and tag ID with keys certified by NPCI, checks a local exception list, and writes the crossing to durable storage before the barrier lifts. Dozens of reads collapse into one passage with one transaction number, which the acquirer uses to drop resent copies; two crossings implying over 120 km/h between plazas mark a cloned tag. The acquirer prices each crossing from the Mapper's vehicle class and sends it through the NETC Switch to the issuer; acquirers check status before retrying, and an unreachable issuer gets debit advice while the acquirer sees "deemed accepted". Exception lists flow out as a diff to every plaza every 10 minutes and a full list daily; the issuer is liable for 20 minutes after listing a tag, and the switch declines tags listed more than 60 minutes before the read (code 176). Crossings should reach the switch within 15 minutes and are processed up to 3 days late with the balance risk shifted to the plaza; NRCS nets every bank three times a day through RTGS, and plazas are paid by T+1. One active tag per vehicle is enforced at the Mapper's index by registration number. The edge cases are Rajesh's night, the Annual Pass (₹3,000 for a year or 200 crossings) and barrier-free Multi-Lane Free Flow at Chorayasi, ~41,500 vehicles on its first day.

The Interview Begins#

You're interviewing at a payments company that wants to become an acquirer for toll plazas. The interviewer puts two phone screenshots side by side. The first, at 12:31 am, shows nothing at all. The second, at 9:14 am, reads: "Rs. 845 debited from your FASTag for toll at plaza 4021, reader time 00:31:07."

Interviewer

"Nine hours between a truck going through a lane and its owner's bank hearing about it, and nobody lost money. Design the system that makes that possible: the tag, the lane, the plaza, the banks on both sides, the switch in the middle, the lists of bad tags, and the settlement."

Design a nationwide, interoperable electronic toll network

Vehicles carry a passive RFID sticker issued by one of many banks and linked to a prepaid wallet or bank account. Toll plazas are run by concessionaires and toll operators; each plaza is "acquired" by one bank, which calculates fares and presents transactions. A central network operator routes each transaction from the acquirer to the tag's issuer, keeps a registry of every tag, and clears and settles between banks. The lane must decide quickly whether to let a vehicle through, and must keep working when its link to the bank is down.

Requirements
  • Read a tag on a moving vehicle, authenticate it, classify the vehicle and decide in about a second
  • Look up any tag from any issuer: its vehicle class, registration number and status
  • Route every crossing from the plaza's acquirer to the tag's issuer and debit the linked account, once
  • Keep lists of tags that must not pass (low balance, hotlisted, blacklisted, closed) fresh at every lane
  • Accept transactions late from plazas that were offline, within defined windows and liabilities
  • Clear and settle between all banks several times a day, pay plazas by the next working day, and handle disputes
  • Enforce one active tag per vehicle across all issuers
Interviewer

"The payment rails under the wallet top-ups, UPI and cards, exist; assume them. Fare tables are given to you by the highway authority. I want the network: tag to lane to acquirer to switch to issuer, the lists, the late transactions, the money between banks, and identity."

People sometimes call FASTag "UPI for tolls", and the comparison is useful for the shape: NPCI runs both, many banks sit on both sides, and a central switch routes between them. It is misleading for the mechanics. A UPI payment is a user-initiated transfer that both sides see in seconds; we designed it in UPI (Bonus Problem 1). A toll payment is initiated by a reader at the roadside, without the payer's involvement, often from a lane with a flaky link, and the network is built to let the vehicle go first and settle the money afterwards.

Phase 1 · Stage 1 of 7 · 5 min budget · 3 min read

Phase 1: Requirements Clarification (5 minutes)#

You

"Before I draw boxes I need to know who decides what, and what happens when the network isn't there, because a toll lane can't ask the driver to wait for a server."

Your Questions#

Transcript
You

"Who are the parties?"

Interviewer

"NPCI's guidelines describe a four-party model: issuer, acquirer, NPCI and the plaza operator, plus the tag holder, system integrators and IHMCL/NHAI, who set the business and toll rules. The issuer is a bank that issues tags and debits the linked account. The acquirer is a bank that acquires plazas; 'a plaza can be acquired by a single bank at any point of time'. NPCI owns the NETC system: the NETC Switch, the NETC Mapper and the NETC Real-time Clearing and Settlement system, NRCS."

You

"What's in the Mapper?"

Interviewer

"The guidelines call it 'a repository of Vehicle Information, Vehicle Owner Information, NETC FASTag Details, Bank Information and Exception List'. Given a tag ID, it returns the vehicle class, the registration number, the issuer and the tag's exception status."

You

"How big is the flow?"

Interviewer

"MoRTH reported about 120 lakh ETC transactions a day on National Highway fee plazas in FY 2025–26 up to November 2025, and about ₹184 crore a day. 11.73 crore tags have been issued; 40 issuer banks and 12 acquirer banks take part. About 1,150 fee plazas are on National Highways and Expressways."

You

"Who calculates the fare?"

Interviewer

"For toll plazas, the acquirer, using the vehicle class from the Mapper, which overrides the plaza's own automatic vehicle classifier. Mismatches are settled later as adjustments. For parking and fuel, the merchant's system integrator calculates it."

You

"And if the plaza can't reach the bank?"

Interviewer

"The lane must still let a vehicle with a valid tag through, and send the transaction when the link is back. NPCI's rules say a transaction should reach the switch within 15 minutes of the vehicle passing; between 15 minutes and 3 days it is still processed, but liability for insufficient balance shifts; after 3 days the switch declines it."

Functional Requirements#

Functional requirements
  • Issuance: an issuer verifies the vehicle, personalises and signs a tag, registers it in the Mapper, and only then lets it transact
  • The lane: read the tag, check its signature and its exception status, classify the vehicle, lift the barrier or send the vehicle to another payment mode; capture an image of every crossing
  • Payment: the acquirer looks up the tag in the Mapper, calculates the fare and sends a debit through the NETC Switch to the issuer, which debits the account and sends an SMS
  • Exception lists: issuers add and remove tags (low balance, hotlist, blacklist, closed); acquirers push the lists to plazas; plazas push them to lanes
  • Late transactions: an offline lane or plaza stores crossings and sends them later; the network accepts them inside defined windows
  • Clearing and settlement: NRCS nets every bank's position several times a day and settles through RTGS; acquirers pay plazas; adjustments, chargebacks and arbitration follow fixed timelines
  • Identity: one active tag per vehicle across all issuers; vehicle details validated against the national vehicle register (VAHAN)

Non-Functional Requirements#

Non-functional requirements
Availability
  • NETC system and every member's host available round the clock at 99.95% (NPCI guidelines)
  • A lane keeps letting valid tags through when any link behind it is down
Latency (design targets)
  • Lane decision < 1 s from first read; acquirer to switch to issuer and back p99 < 2 s
  • Every online transaction at the switch within 15 minutes of the read (NPCI rule)
Correctness
  • One debit per crossing, however many times the tag is read or the message is retried
  • A fresh exception-list diff in every plaza's folder every 10 minutes (IHMCL's acquirer SLA), and in every lane soon after (our target; NPCI leaves the plaza-to-lane interval to IHMCL/NHAI)
  • Every bank's net position sums to zero in every settlement cycle

Phase 2 · Stage 2 of 7 · 5 min budget · 4 min read

Phase 2: Back of the Envelope Estimation (5 minutes)#

You

"My published anchors are MoRTH's 120 lakh transactions and ₹184 crore a day, 11.73 crore tags, about 1,150 plazas, and NPCI's 15-minute, 3-day and settlement-cycle rules. Peaks, lanes per plaza, reads per tag and the size of the exception lists aren't published; those are assumptions, and I'll label them."

Your turn · checkpoint 1not answered

Before the numbers: how busy is a toll network, really?

120 lakh transactions a day: how many is that a second, on average? If the busiest hour carries three times the average rate, what is the peak? What is the average fare? And how does that compare with a busy payments network: where, if not in transactions per second, is the hard part?

Think it through, or jot it down. Then compare.

One strong answer

  • Average: 12,000,000 ÷ 86,400 ≈ 139 a second. At an assumed 3× in the busiest hour: ~420 a second, nationwide.
  • Average fare: ₹184 crore ÷ 120 lakh ≈ ₹153 a crossing.
  • Comparison: a few hundred debits a second is small for a central payment switch.
  • So the hard parts are elsewhere: the lane must decide in about a second, often without a working link; lists of bad tags must reach a thousand plazas quickly; the reader sees each tag many times; and the money must settle correctly for transactions that arrive minutes, hours or days late.

The Lane and the Plaza#

WorksheetOne plaza, one lane (assumptions labelled)
Value
Transactions a day, NH plazas (MoRTH) ~12 million
Fee plazas (NHAI) ~1,150
Average per plaza a day 12 million ÷ 1,150 ≈ ~10,400
Busy plaza (assumed 4× average) ~42,000 a day
Lanes per direction at a busy plaza (assumed) 8, so 16 lanes
Busiest-hour share of the day (assumed) 8% → ~3,400 crossings in the hour
Per lane in the busiest hour ~210, one every ~17 s
Tag reads per crossing (assumed, slow vehicle in the read zone) 20–50

Conclusion: per lane, the rate is tiny. What matters is that every crossing produces dozens of reads that must collapse into one transaction, and that the decision must come from data already in the lane when the link is slow or down.

The Central Switch and Mapper#

WorksheetNETC switch and Mapper load (assumptions labelled)
  • Debits: ~139 a second average, ~420 at an assumed busiest hour; design for ~2,000 a second to absorb backlogs from plazas reconnecting after an outage
  • Mapper lookups: NPCI's guidelines ask plazas to validate each tag with a request-details call before passing it, and the acquirer looks it up again to calculate the fare: assume ~3 lookups per crossing, so ~6,000 a second at the design target
  • Retries: NPCI's rules have acquirers re-check a transaction's status before re-sending it, after 60 to 180 seconds; under a partial outage, assume up to 2× the normal message rate
  • Registry size: 11.73 crore tags issued; at ~1 KB per tag record (assumed), ~120 GB, which fits in memory across a small cluster

Conclusion: a few thousand requests a second at the centre. The design problem is availability and correctness across forty issuers, twelve acquirers and a thousand plazas, not throughput.

Exception Lists and Settlement#

WorksheetLists, files and money (assumptions labelled)
  • Exception list size: not published. If ~10% of 11.73 crore tags are hotlisted, low balance, blacklisted or closed (assumed), that's ~1.2 crore entries; at ~16 bytes per entry (a 96-bit tag ID and a status code), ~190 MB as a full list
  • Changes: assume ~20 lakh status changes a day (top-ups and drains), ~14,000 every 10 minutes: a diff file of ~220 KB per plaza every 10 minutes, against a full list once a day
  • Settlement: NPCI's guidelines set 3 settlement cycles a day; 40 issuers and 12 acquirers net to one number per bank per cycle, whatever the transaction count
  • Plazas paid: clean transactions settled to the operator within T+1 working day (IHMCL's SLA)

Conclusion: sending full lists every few minutes to a thousand plazas is wasteful; diffs every few minutes plus a daily full list are cheap. Settlement is a netting job that runs a few times a day, not a stream.

Key Metrics Summary#

Metric Value
ETC transactions on NH plazas (MoRTH, FY 2025–26) ~120 lakh a day, ~139 a second on average
Collection via FASTag (MoRTH) ~₹184 crore a day, ~₹153 a crossing
Tags issued / issuers / acquirers (MoRTH, Nov 2025) 11.73 crore / 40 / 12
Fee plazas (NHAI) ~1,150
Design target at the switch (assumed) ~2,000 debits a second
Online window / late window (NPCI) 15 minutes / 3 days
Exception list refresh at plazas (IHMCL SLA) every 10 minutes (diff), daily (full)
Settlement cycles (NPCI) 3 a day, RTGS
Quick check2 questions · +5 XP each

Requirements and estimation

  1. Q1/2 MoRTH reported about 120 lakh FASTag transactions a day on National Highway plazas. Roughly how many is that a second on average?

    Answer & explanation

    Answer: B

    12,000,000 ÷ 86,400 ≈ 139. Even a 3× busiest hour is a few hundred a second.

  2. Q2/2 If the switch only sees a few hundred debits a second, what makes FASTag hard?

    Answer & explanation

    Answer: B

    The volume is small; the edges are many, slow and sometimes offline.

Phase 3 · Stage 3 of 7 · 10 min budget · 4 min read

Phase 3: High-Level Design (10 minutes)#

Your turn · checkpoint 2not answered

Sketch it first: Rajesh's 12:31 am crossing

At 12:31 am the reader above lane 5 sees Rajesh's tag 37 times. What decides that this is one crossing, and who checks the tag is genuine? The plaza's link to its acquirer is down: what lets the barrier lift, and where does the crossing wait? At 9:10 am the link comes back: which systems does the transaction pass through before Rajesh's phone buzzes, and who pays the plaza?

Think it through, or jot it down. Then compare.

One strong answer

  • One crossing: the lane controller groups reads of the same tag in the same lane into one passage, using the vehicle-presence loop to mark when a vehicle enters and leaves, and gives it one plaza transaction number. It verifies the tag's signature (an issuer's signature over the tag's chip ID and tag ID) with keys already stored at the plaza.
  • Offline: the lane checks the tag against its local copy of the exception list, finds it clean, lifts the barrier, and writes the crossing to a local store, to be sent when the link returns.
  • At 9:10: plaza server to the acquirer host, which looks up the tag in NPCI's Mapper, calculates the fare from the registered vehicle class, and sends a debit through the NETC Switch to Rajesh's issuer. The issuer debits his wallet and sends the SMS.
  • The money: it's past the 15-minute window but inside 3 days, so the switch processes it; had the wallet been empty, the issuer could have charged it back to the acquirer, and the plaza would have carried the loss. NRCS nets it into the next settlement cycle, and the acquirer pays the plaza operator by T+1.
You

"Three tiers with very different clocks. The lane lives in the second the vehicle is in it, and must decide alone. The plaza and acquirer live in minutes: they gather crossings, price them and present them. The switch, the Mapper and the banks live in a transaction's whole life: seconds for the debit, days for disputes, a few cycles a day for settlement. Lists of bad tags flow outwards from the centre to the lanes; crossings flow inwards from the lanes to the centre."

System Architecture#

DiagramNETC: lanes decide locally, banks settle centrally
%% title: NETC: lanes decide locally, banks settle centrally
flowchart TD
  subgraph L1["Layer 1 · The lane"]
    direction LR
    V@{ icon: "sd:truck", label: "Vehicle with FASTag<br/>passive RFID, signed data" }
    RDR@{ icon: "sd:scan", label: "RFID reader<br/>ISO 18000-6C" }
    CAM@{ icon: "sd:camera", label: "AVC, camera, ANPR<br/>class and image" }
    LC["Lane controller<br/>dedupe reads, verify, local lists"]:::hot
  end
  subgraph L2["Layer 2 · Plaza and acquirer"]
    direction LR
    PS@{ icon: "sd:server", label: "Plaza server<br/>store and forward" }
    ACQ["Acquirer host<br/>fare engine, list sync"]:::core
  end
  subgraph L3["Layer 3 · NPCI's NETC system"]
    direction LR
    MAP@{ icon: "sd:database", label: "NETC Mapper<br/>tags, class, exception lists" }
    SW["NETC Switch<br/>routes acquirer to issuer"]:::core
    NRCS@{ icon: "sd:bank", label: "NRCS<br/>clearing, settlement, disputes" }
  end
  subgraph L4["Layer 4 · Issuers and users"]
    direction LR
    ISS["Issuer host<br/>debit wallet, manage lists"]:::core
    USR@{ icon: "sd:phone", label: "Tag holder<br/>SMS, UPI top-up" }
  end
  V ==> RDR ==> LC
  CAM --> LC
  LC ==> PS ==> ACQ
  ACQ -->|"request details"| MAP
  ACQ ==>|"request pay"| SW
  SW ==> ISS
  ISS -.->|"add, remove exceptions"| MAP
  MAP -.->|"exception lists"| ACQ
  ACQ -.->|"diff every 10 min"| PS
  SW --> NRCS
  ISS --> USR
  class V client
  class RDR,CAM edge
  class PS service
  class MAP store
  class NRCS store
  class USR client

KEY INSIGHTS:

  • The lane decides; the centre settles. The barrier decision uses only what's already in the lane: the tag's signed data, the local exception list and the vehicle classifier. The debit can happen seconds or hours later
  • Lists flow out, crossings flow in. Issuers change a tag's status in the Mapper; acquirers pull the lists and push diffs to plazas; crossings travel back from lane to issuer through the acquirer and the switch
  • Liability is written down for every delay. Who pays when a transaction arrives late, or a tag was blocked minutes before the read, is a rule with a number in it, not a judgement call

Data Flow: Rajesh's First Plaza#

DiagramAn online crossing, from read to SMS
%% title: An online crossing, from read to SMS
sequenceDiagram
  autonumber
  participant L as Lane controller
  participant P as Plaza server
  participant A as Acquirer host
  participant M as NETC Mapper
  participant S as NETC Switch
  participant I as Issuer host
  L->>L: 31 reads of tag T, one passage, txn 4021-5-88123
  L->>L: signature valid · not in local exception list
  L->>P: crossing · tag T, class from AVC, image
  P->>A: request details for T
  A->>M: get tag details T
  M-->>A: class multi-axle truck · active · issuer bank B
  A-->>P: OK to pass
  P-->>L: lift barrier
  A->>A: fare from mapper class · ₹845
  A->>S: request pay · txn 4021-5-88123
  S->>I: debit request
  I->>I: debit wallet · balance ₹160
  I-->>S: debit response OK
  S-->>A: response pay OK
  I->>M: add T to low balance

MEANWHILE, IN PARALLEL:

  • The issuer sends Rajesh an SMS with the plaza, the fare, and the date and time, as NPCI's guidelines require
  • The switch hands the transaction to NRCS, which counts it in the next settlement cycle
  • Within ten minutes, the acquirers of the other plazas pull the Mapper's changes and push a diff to their plazas, with tag T now marked low balance
Quick check2 questions · +5 XP each

High-level design

  1. Q1/2 Which vehicle class decides the fare at an NH toll plaza?

    Answer & explanation

    Answer: B

    The guidelines say the Mapper class overrides the AVC class for the fare; disputes are settled afterwards.

  2. Q2/2 The plaza's link to its acquirer is down. What lets a valid tag through?

    Answer & explanation

    Answer: B

    The lane decides with local data; the debit follows when the link returns.

Phase 4 · Stage 4 of 7 · 20 min budget · 27 min read

Phase 4: Deep Dives (20 minutes)#

Deep Dive 1: The Lane Decides Alone (Week 4 Concepts: Multi-Tier Caching, Cache Invalidation; Week 9: Security Architecture)#

You

"The lane has about a second and can't trust the network. So it needs three things locally: a way to tell a genuine tag from a forged one, a fresh-enough list of tags that mustn't pass, and a rule for what to do when it isn't sure. Everything else can happen later."

This builds on Week 4, Day 5 · Multi-Tier Caching, Week 4, Day 2 · Cache Invalidation and Week 9, Day 5 · Security Architecture.

Your turn · checkpoint 3not answered

A tag the lane has never seen

A truck enters lane 5 with a tag issued by a bank in another state. The lane has never seen this tag and the link to the acquirer is slow: a request takes 3 seconds today. How does the lane know the tag wasn't copied from another vehicle's sticker or written by someone with a cheap RFID writer? What does it check, against what, in what order? And what does it do if the online check doesn't answer in time?

Think it through, or jot it down. Then compare.

One strong answer

  • Genuine: the tag carries its chip's factory-set TID, a 96-bit tag ID (EPC) and, in locked user memory, a signature by the issuer over a SHA-256 hash of TID and EPC. The lane holds NPCI's public key and the issuers' public-key certificates; it verifies the issuer key against NPCI's, then the signature against the tag's data. A tag written by a cheap writer has no valid signature; a copy onto another chip has the wrong TID.
  • Order: format and issuer ID first (cheap), then the local exception list, then the signature, then the online request-details check if it answers within the lane's budget.
  • Timeout: fall back to the local result. NPCI's guidelines ask plazas to use the online request-details check first and fall back to the exception-query API or the SFTP list files, switching back when the online check is healthy again.

What is published: NPCI's guidelines specify passive tags conforming to EPC Class 1 Gen 2, with an ISO 18000-6C air interface. The tag's EPC follows IHMCL's GS1 code: after a fixed 38-bit header come a 20-bit issuer ID ("up to 1048575 issuer ids"), an 8-bit issuer key index ("256 keys per Issuer ID"), a 20-bit vehicle ID and 10 bits reserved. The TID "should be unique and come from the chip manufacturer". At personalisation, the issuer signs the concatenated TID and EPC (SHA-256, then an ECC signature with the issuer's private key); the manufacturer writes the EPC, then a dummy registration number, the vehicle class and the signature into user memory, and locks both. Issuers' public keys are certified by NPCI, and the guidelines describe "NETC FASTag Static Data Authentication (TSDA)" as "the offline authentication method" used by the plaza server or lane controller. Acquirers "shall ensure Tag signature validation at all their acquired plazas" and must keep each plaza's list of issuer IDs updated within 7 days. Acquirers "shall ensure the toll plazas to use the request details API to validate the tag before allowing the vehicle to pass", with the exception-query API or SFTP files as fallbacks. A lane carries a reader, automatic vehicle classification (usually an infrared profiler), a camera and optionally weigh-in-motion; the guidelines recommend that no personal data be readable over the tag's radio interface.

DiagramThe lane's decision, from first read to barrier
%% title: The lane's decision, from first read to barrier
flowchart TD
  READ@{ icon: "sd:scan", label: "Reads: TID, EPC,<br/>user memory" }
  FMT{"Known issuer ID<br/>and format?"}
  LIST@{ icon: "sd:file", label: "Local exception list<br/>INIT daily + diffs" }
  SIG["Verify signature<br/>NPCI cert, issuer key"]:::core
  ONL{"Request details<br/>answers in budget?"}
  PASS["Lift barrier<br/>record crossing"]:::core
  OTHER["Other payment mode<br/>UPI or cash"]:::bad
  READ ==> FMT
  FMT ==>|"yes"| LIST
  FMT -->|"no"| OTHER
  LIST ==>|"clean"| SIG
  LIST -->|"blocked"| OTHER
  SIG ==>|"valid"| ONL
  SIG -->|"invalid"| OTHER
  ONL ==>|"active, or no answer"| PASS
  ONL -->|"blocked"| OTHER
  class READ edge
  class LIST cache
  • A three-tier cache of tag status. Tier 1 is the lane's in-memory list, tier 2 the plaza server's copy, tier 3 the Mapper behind the acquirer. The lane reads tier 1 always and asks tier 3 when it can; the Week 4 multi-tier pattern, with the twist that the bottom tier is the only one that can be wrong in the user's favour.
  • Fail open for valid tags, by rule. A gazette notification of 7 May 2018, quoted in NPCI's guidelines, says a vehicle with "a valid, functional NETC FASTag" and enough balance that can't pay because the plaza's ETC equipment malfunctions "shall be permitted to pass the fee plaza without payment of any user fee", with a zero-transaction receipt. So an ETC outage at the plaza costs the operator, not the driver. NPCI's guidelines apply the same principle when the lane loses its plaza server: the lane authenticates the tag, checks its exception list and lets the vehicle pass, and the crossing is sent later.
  • Signatures are the offline trust anchor. With the issuer key certified by NPCI and the signature locked into the tag, the lane can authenticate any of 11.73 crore tags without a lookup. Key rotation is built into the EPC: an 8-bit key index lets an issuer sign new tags with a new key while old tags stay valid.
  • The issuer checks again. The guidelines ask the issuer host to validate the signature from the TID, EPC and user memory in the transaction message, and to blacklist a tag whose signature is invalid. The lane catches forgeries at the roadside; the issuer catches a lane that didn't check.
pythondecide · 31 lines
# lane/decide.py

"""
The lane's barrier decision (illustrative). Uses only data already in the lane:
issuer IDs, the local exception list, NPCI and issuer public keys. The online
request-details check is used when it answers within the budget.
"""

import hashlib

BUDGET_S = 0.6                      # our choice: leaves time for the barrier to lift
BLOCKING = {"HOTLIST", "LOW_BALANCE", "BLACKLIST", "CLOSED"}


def decide(read, issuers: set, exceptions: dict, keys, online) -> str:
    iid = read.epc_issuer_id()                                    # 20-bit field of the EPC
    if iid not in issuers:
        return "OTHER_MODE"                                       # not a known NETC issuer
    status = exceptions.get(read.epc)
    if status in BLOCKING:
        return "OTHER_MODE"                                       # pay by UPI or cash
    issuer_key = keys.issuer_key(iid, read.epc_key_index())       # certified by NPCI's key
    digest = hashlib.sha256(bytes.fromhex(read.tid + read.epc)).digest()
    if issuer_key is None or not issuer_key.verify(read.user_mem.signature, digest):
        return "OTHER_MODE"                                       # forged or copied tag
    answer = online.request_details(read.epc, timeout_s=BUDGET_S)
    if answer is not None and answer.status in BLOCKING:
        return "OTHER_MODE"
    if status == "EXEMPT" or (answer is not None and answer.status == "EXEMPT"):
        return "PASS_EXEMPT"
    return "PASS"                                                 # online OK, or no answer in time

Deep Dive 2: Forty Reads, One Crossing, One Debit (Week 2 Concepts: Idempotency; Week 8: Event Ingestion)#

You

"The reader doesn't see 'a vehicle'. It sees a tag ID, again and again, for as long as the tag is in its field. A truck crawling behind a bus can be read dozens of times; a car can be read by the antenna of the next lane; a tag on a dashboard can be read in two lanes at once. Every one of those must become exactly one debit, and only for the vehicle that actually went through."

This builds on Week 2, Day 2 · Idempotency in Practice and Week 8, Day 1 · Event Ingestion.

Your turn · checkpoint 4not answered

Thirty-seven reads at 12:31 am

Rajesh's tag was read 37 times in lane 5 over 40 seconds. Two of those reads came from the antenna over lane 6, because his trailer was wide. Lane 5's barrier went up once. The plaza is offline, so all of this will be sent hours later, perhaps twice if the plaza server retries. Where does each duplicate get removed, by what key? And six hours later, the same tag ID appears at a plaza 400 km away, two minutes after a crossing here. What is that?

Think it through, or jot it down. Then compare.

One strong answer

  • In the lane: group reads by (tag, lane) between the vehicle-presence loop's "enter" and "leave" events; one group is one passage with one plaza transaction number. Reads from lane 6's antenna during lane 5's passage are discarded, because no barrier opened in lane 6 for that tag and the classifier saw no matching vehicle there.
  • At the plaza and acquirer: the transaction number, plaza ID and reader time are the idempotency key. A resent file or a retried API call carries the same key; the acquirer drops the second copy. NPCI's guidelines list "multiple requests from same Plaza with same transaction number" as a duplicate check at the acquirer.
  • At the issuer: the issuer checks for requests from the same tag "within same time or at far Plaza location". Two crossings 400 km apart in two minutes means a speed of 12,000 km/h: the guidelines call crossings implying more than 120 km/h between plazas "near time", a sign of a cloned tag. One of them is fraudulent; the user can charge it back.

What is published: NPCI's guidelines list duplicate checks at the acquirer, "Multiple requests from same Plaza with same transaction number", and at the issuer, "Checks on requests from the same NETC FASTag ID within same time or at far Plaza location". The lane controller or plaza server "should have the ability to detect multiple NETC FASTag affixed on the same vehicle", and an induction loop "may be used at the NETC Lane to identify incoming & outgoing of a vehicle". Chargeback reasons include duplicate processing by one or several issuers; for dispute code 3002, "Duplicate transaction done at Toll Plaza", the issuer submits the original transaction's RRN, reader read time and merchant ID. A tag processed at two plazas in "near time", an implied speed above 120 km/h, is treated as cloned; NHAI/IHMCL keep a compensation fund for proven cloning fraud. In July 2026 a Kochi resident was charged ₹125 at a toll plaza in Guwahati while his car was parked at home; the report lists the routes to recover such a charge: the 1033 helpline, an IHMCL email address for false deductions, and a dispute with the issuer bank (Onmanorama, 19 July 2026).

DiagramRemoving duplicates at every hop, each with its own key
%% title: Removing duplicates at every hop, each with its own key
flowchart TD
  R@{ icon: "sd:scan", label: "37 reads<br/>tag T, lane 5" }
  G["Lane: group by tag and lane<br/>between loop enter and leave"]:::hot
  X["One passage<br/>plaza txn number"]:::core
  P@{ icon: "sd:server", label: "Plaza server<br/>outbox, resend on reconnect" }
  A{"Acquirer: seen plaza,<br/>txn number, read time?"}
  DROP["Drop duplicate"]:::bad
  S["Switch and issuer:<br/>same tag, far plaza, near time?"]:::core
  FR["Flag possible clone<br/>chargeback path"]:::bad
  R ==> G ==> X ==> P ==> A
  A -->|"yes"| DROP
  A ==>|"no"| S
  S -.->|"implied speed over 120 km/h"| FR
  class P service
  class R edge
  • Three keys, three scopes. In the lane, the key is (tag, lane, passage); at the acquirer, (plaza, transaction number, reader time); at the issuer, (tag, time, place). Each removes a different kind of duplicate: radio repeats, network retries, and the physically impossible.
  • The passage window comes from the road, not the radio. Grouping reads by a fixed time window fails in a jam, where one truck can sit in the field for minutes. Use the loop detector's enter and leave events, the classifier's vehicle profile and the barrier cycle to bound a passage.
  • Cross-lane reads lose. When the same tag is seen by two lanes' antennas, the lane whose loop, classifier and barrier saw a vehicle wins; the other lane's reads are discarded. That's also how a tag on a dashboard waved across two lanes is caught.
  • Impossible travel is a fraud signal, not a dedupe rule. Two genuine crossings can be minutes apart at neighbouring plazas. Only an implied speed that no vehicle could manage marks a clone; NPCI draws that line at 120 km/h.
pythonPassageBuilder · 37 lines
# lane/passages.py

"""
Collapsing raw reads into passages (illustrative). Reads are grouped by tag and
lane between the loop detector's enter and leave events; a passage gets one plaza
transaction number, the idempotency key for everything downstream.
"""

import itertools

_seq = itertools.count(1)


class PassageBuilder:
    def __init__(self, plaza_id: str, lane_id: int):
        self.plaza, self.lane = plaza_id, lane_id
        self.open = None                                  # the vehicle now in the loop

    def on_loop_enter(self, t: float):
        self.open = {"start": t, "reads": {}}

    def on_read(self, epc: str, tid: str, antenna_lane: int, t: float):
        if self.open is None or antenna_lane != self.lane:
            return                                        # stray read: no vehicle, or a neighbour's antenna
        self.open["reads"].setdefault((epc, tid), []).append(t)

    def on_loop_leave(self, t: float):
        p, self.open = self.open, None
        if not p or not p["reads"]:
            return None                                   # no tag read: camera and ANPR handle it
        if len(p["reads"]) > 1:
            return {"violation": "MULTIPLE_TAGS", "tags": list(p["reads"])}
        (epc, tid), times = next(iter(p["reads"].items()))
        return {
            "txn": f"{self.plaza}-{self.lane}-{next(_seq)}",  # minted once, carried everywhere
            "epc": epc, "tid": tid, "reader_time": min(times), "reads": len(times),
        }
Quick check4 questions · +5 XP each

The lane and its duplicates

  1. Q1/4 How can a lane with no network link tell a genuine tag from one written by a cheap RFID writer?

    Answer & explanation

    Answer: B

    Static data authentication works offline: public keys at the plaza, a signature locked in the tag.

  2. Q2/4 Why does copying a genuine tag's EPC and signature onto a blank chip fail the check?

    Answer & explanation

    Answer: B

    Binding the signature to the TID ties the signed data to one physical chip.

  3. Q3/4 A plaza server resends a file of 2,000 crossings after a reconnect. What stops 2,000 double debits?

    Answer & explanation

    Answer: B

    The transaction number minted in the lane is the idempotency key all the way to settlement.

  4. Q4/4 The same tag is charged at two plazas 300 km apart, 20 minutes apart. What does NPCI's rule call that?

    Answer & explanation

    Answer: B

    300 km in 20 minutes is 900 km/h; one of the two crossings can't be genuine.

Deep Dive 3: Four Parties and a Switch (Week 2 Concepts: Timeout Hell; Week 5: Consistency Models)#

You

"Between the acquirer and the issuer there's one hop through NPCI's switch, and it's always online. The interesting part is what happens when a party on either side is slow or down: the acquirer must not double-present, the issuer must not refuse what the switch has already settled, and the plaza must be paid either way."

This builds on Week 2, Day 1 · Timeout Hell and Week 5, Day 1 · Consistency Models.

Your turn · checkpoint 5not answered

A request pay with no answer

The acquirer sends request pay for Rajesh's first crossing and gets an HTTP 202 back but no final response. Ninety seconds later, still nothing. Should it resend? What happens if the first one actually went through? Separately, Rajesh's issuer has a two-hour outage at 3 am. The switch can't reach it. Do toll transactions fail? Who carries the risk, and how does the issuer catch up?

Think it through, or jot it down. Then compare.

One strong answer

  • Don't blindly resend. NPCI's guidelines say: before re-initiating, use the check-transaction API, and wait 180 seconds after a 202, 90 seconds after no ACK or a timeout, 60 seconds after a 4xx or 5xx. If the check finds the transaction, there's nothing to resend. An acquirer may re-initiate so that the transaction is processed within 72 hours of the reader read time.
  • Issuer down: the switch keeps sending debit advice messages to the issuer "till an acknowledgement is received or till the settlement cut off time", and reports the transaction to the acquirer as "Deemed Accepted". The acquirer and plaza are paid in settlement regardless.
  • Risk: the issuer must honour every transaction the switch processed, "irrespective of whether Issuer is able to debit" the account; if the debit fails at the issuer, it keeps the request queued for later processing. The issuer carries the credit risk, which is why it maintains low-balance lists.

What is published: NPCI's guidelines say processing "between acquirer host, NETC switch, and Issuer host is always online", over stateless XML APIs on HTTPS. "All transaction which are processed by the NETC system to the issuer will be considered as successful transactions for the clearing and settlement in subsequent settlement cycle. The Issuer must honour all such transactions irrespective of whether Issuer is able to debit the NETC FASTag holder's account." A failed debit stays queued at the issuer; an unreachable issuer gets debit advice until it acknowledges or the settlement cut-off, and the acquirer sees "Deemed Accepted". Acquirers retry only after a status check, 60 to 180 seconds depending on the error, within 72 hours of the read. The NETC system and every member host target 99.95% availability, with health-check APIs, active-site pings and disaster-recovery drills; IHMCL's SLA penalises NPCI ₹10 lakh to ₹25 lakh a month if switching availability falls below 99.5%. Issuers must wait 5 seconds after registering or updating a tag, and 1 second after an exception change, before the next operation on it.

DiagramOne debit across four parties, with the published failure rules
%% title: One debit across four parties, with the published failure rules
sequenceDiagram
  autonumber
  participant A as Acquirer host
  participant S as NETC Switch
  participant I as Issuer host
  A->>S: request pay · txn 4021-5-88123
  S-->>A: 202 accepted
  alt issuer answers
    S->>I: debit request
    I-->>S: debited, or queued for later
    S-->>A: response pay · success
  else issuer unreachable
    S->>I: debit advice, repeated until ACK or cut-off
    S-->>A: deemed accepted
  else no final response at the acquirer
    Note over A: wait 180 s after a 202 · then check transaction
    A->>S: check transaction 4021-5-88123
    S-->>A: found, success · nothing to resend
  end
  • The switch is a router plus a ledger. It doesn't hold balances; it routes by issuer ID (from the tag's EPC or the Mapper), records every transaction, and hands them to NRCS for settlement. Its consistency guarantee is simple: what it processed, it settles.
  • The issuer is the only party that knows the balance. So the issuer carries the credit risk of every transaction the switch forwards, and manages that risk by putting tags on the low-balance list early. A prepaid wallet with a minimum balance is the issuer's buffer.
  • Status check before retry is idempotency by lookup. If the API doesn't carry an idempotency guarantee you can rely on, ask whether the first attempt landed before trying again. NPCI writes the waits into the rules, so a retry storm can't form from every acquirer timing out at once.
  • Deemed accepted is eventual consistency with a deadline. The acquirer is told "success" before the issuer has debited; the issuer must catch up before the settlement cut-off. It's the right choice for a lane that has already lifted the barrier: the vehicle is gone, and the only open question is who pays whom.
pythonpresent · 25 lines
# acquirer/present.py

"""
Presenting a crossing to the NETC Switch (illustrative). Before any retry the
acquirer checks whether the first attempt landed, with waits from NPCI's
guidelines, and gives up after 72 hours from the reader read time.
"""

import time

WAIT_S = {"202": 180, "NO_ACK": 90, "READ_TIMEOUT": 90, "CONNECT_TIMEOUT": 90, "HTTP_ERR": 60}
MAX_AGE_S = 72 * 3600


def present(switch, txn, now=time.time):
    outcome = switch.request_pay(txn)                       # same txn id every time
    while outcome.kind not in ("SUCCESS", "DEEMED_ACCEPTED", "DECLINED"):
        if now() - txn.reader_time > MAX_AGE_S:
            return "EXPIRED"                                # beyond 72 h: can no longer be presented
        time.sleep(WAIT_S[outcome.kind])
        found = switch.check_transaction(txn.id)
        if found is not None:
            return found.kind                               # it landed: never present it twice
        outcome = switch.request_pay(txn)
    return outcome.kind

Deep Dive 4: Low Balance, Hotlist and Blacklist: a Race Between Lists (Week 4 Concepts: Cache Invalidation; Week 5: Consistency Models)#

You

"Rajesh's second plaza is the whole problem in one minute. His issuer took him off the low-balance list at 11:53; the plaza's copy was from 11:50. Exception lists are a cache of the Mapper, spread across a thousand plazas, and every cache is stale for a while. The design question is who pays for that staleness, and how short you can make it."

This builds on Week 4, Day 2 · Cache Invalidation and Week 5, Day 1 · Consistency Models.

Your turn · checkpoint 6not answered

11:50, 11:52, 12:04

At 11:42 Rajesh's issuer adds his tag to the low-balance list. At 11:50 the second plaza receives a diff file containing that change. At 11:53, after Ankit's top-up, the issuer removes the tag from the list. At 12:04 Rajesh is in the lane. The online request-details check would have said "active", but this plaza's link is slow. What should the lane do? Now flip it: a tag whose wallet is empty was added to the hotlist at 11:00, but a plaza that missed two diff files passes it at 12:30 and presents the transaction. Should the switch accept it? Who loses the ₹845?

Think it through, or jot it down. Then compare.

One strong answer

  • Rajesh: the plaza's list says low balance and the online check didn't answer in time, so the lane sends him to another payment mode. It's the lane being conservative with stale data. Ask the online check first, give it a real budget, and push diffs often; a top-up removed from the list at 11:53 reaches every plaza by about 12:03 under a 10-minute SLA.
  • The empty wallet: under NPCI's rule from 17 January 2025, the switch declines a transaction on a tag that had been in an exception list for more than 60 minutes before the read and was still there 10 minutes after it, with reason code 176. The tag was hotlisted 90 minutes before the read, so the switch declines it, and the issuer owes nothing.
  • Who loses: not the issuer. The plaza passed a vehicle on a list more than an hour old, so the toll goes uncollected on the plaza's side. If the plaza missed the diffs because its acquirer didn't put them in the plaza's folder on time, IHMCL's SLA makes the acquirer bear the operator's loss; if the plaza failed to load files it had, the loss stays with the operator. The issuer is liable only inside a short grace window after it adds a tag to an exception list; the guidelines give 20 minutes.

What is published: NPCI's guidelines define the Mapper's exception lists. Low balance: the issuer adds a tag when the linked balance falls below a threshold and notifies the user. Hotlist: tags "in negative balance or with violation"; no new tag may be issued to a vehicle with a hotlisted tag. Blacklist: added by the issuer on written orders from RBI, NHAI/IHMCL, police, defence or other law enforcement, or with an FIR for a stolen vehicle, and removed only with the same authority's written approval. Exempted and invalid carriage cover vehicles exempt by law and vehicles used by people with disabilities. Closed/replaced (code 06) is final. A vehicle whose tag is low balance, hotlisted, blacklisted or closed is asked to pay another way. The issuer is "liable for the transactions up to 20 minutes" after adding a tag to a list; from 17 January 2025, transactions on tags "in exception for more than 60 minutes prior to the reader read time" and not removed within 10 minutes after it are declined by the switch with reason code 176 (another passage in the same guidelines gives 20 minutes for that check). Acquirers fetch the lists from the NETC system or as SFTP files and push them to plazas. IHMCL's SLA asks for a Blacklist_Diff file in each plaza's folder every 10 minutes and a full INIT file daily, and puts "All chargeback for low balance and blacklist" on an acquirer that misses them. Passes and exemptions travel in a separate discount (DIS) file. Issuers must offer top-ups through UPI and BBPS, print a UPI QR code on new tags, and offer AutoPay: RBI's circular of 22 August 2024 put auto-replenishment of FASTag, when "the balance falls below a threshold set by the customer", under its e-mandate framework without a pre-debit notification.

DiagramStatus changes flow out; staleness has a price at every hop
%% title: Status changes flow out; staleness has a price at every hop
flowchart TD
  ISS["Issuer host<br/>balance below threshold"]:::core
  MAP@{ icon: "sd:database", label: "NETC Mapper<br/>status change, timestamped" }
  ACQ["Acquirer host<br/>pull or SFTP"]:::core
  DIFF@{ icon: "sd:file", label: "Blacklist_Diff<br/>every 10 min" }
  INIT@{ icon: "sd:file", label: "INIT full list<br/>daily" }
  PS@{ icon: "sd:server", label: "Plaza server" }
  LANE["Lane's in-memory list"]:::hot
  ISS ==>|"add or remove"| MAP
  MAP ==> ACQ
  ACQ ==> DIFF ==> PS
  ACQ --> INIT --> PS
  PS ==> LANE
  class MAP store
  class DIFF,INIT queue
  class PS service
  • Version the list, not just the entries. Every change in the Mapper gets a sequence number; every diff file says "changes from n to m". A plaza that missed a diff knows it, and asks for a catch-up instead of silently running on a gap. That's what turns "missed two diffs" into an alert rather than a loss.
  • The liability windows are an SLA on invalidation. Twenty minutes of issuer liability says how long the network allows a block to take effect; the 60-minute rule says how stale a plaza is allowed to be before the loss is its own. Week 4's cache-invalidation trade-offs, priced in rupees.
  • The lane's list is small enough to hold whole. At an assumed ~1.2 crore entries, a hash set of 96-bit IDs and status codes fits in a few hundred megabytes. A Bloom filter in front of it makes "not on any list", the common case, a single memory probe.
  • Top-ups are the race to win. Ankit's ₹5,000 hit the issuer at 11:52 and the Mapper at 11:53. A design that lets the lane ask the Mapper directly for tags its list marks low balance would have let Rajesh through; that's why the request-details check sits above the local list in NPCI's priority order.
pythondecide · 24 lines
# switch/exception_rule.py

"""
The switch's decision on a transaction whose tag is in an exception list
(illustrative, following NPCI's published windows). Times are seconds; the
history comes from the Mapper's timestamped exception changes.
"""

DECLINE_IF_LISTED_BEFORE_S = 60 * 60     # in exception > 60 min before the read
UNLESS_REMOVED_WITHIN_S = 10 * 60        # ... and not removed within 10 min after it
ISSUER_GRACE_S = 20 * 60                 # issuer liable up to 20 min after adding


def decide(read_time: float, history) -> str:
    added = history.listed_since(at=read_time)          # None if the tag was clean at the read
    if added is None:
        return "FORWARD_TO_ISSUER"
    removed = history.removed_after(read_time)
    still_listed = removed is None or removed > read_time + UNLESS_REMOVED_WITHIN_S
    if read_time - added > DECLINE_IF_LISTED_BEFORE_S and still_listed:
        return "DECLINE_176"                            # plaza or acquirer carries the loss
    if read_time - added <= ISSUER_GRACE_S:
        return "FORWARD_ISSUER_LIABLE"
    return "FORWARD_ISSUER_MAY_CHARGE_BACK"             # our label: outside the grace window
Quick check3 questions · +5 XP each

The switch and the lists

  1. Q1/3 The acquirer got a 202 for request pay and no final answer. What does NPCI's guidance say to do?

    Answer & explanation

    Answer: B

    Status check before retry, with fixed waits, so a timeout never becomes a double debit.

  2. Q2/3 The switch can't reach an issuer for two hours. What happens to toll transactions on its tags?

    Answer & explanation

    Answer: B

    The vehicle is already through; settlement goes ahead and the issuer catches up.

  3. Q3/3 A tag was hotlisted 90 minutes before a read and is still hotlisted 10 minutes after. What does the switch do?

    Answer & explanation

    Answer: B

    NPCI's rule from 17 January 2025: in exception for more than 60 minutes before the read and not removed within 10 minutes after.

Deep Dive 5: Offline Plazas and Settlement Three Times a Day (Week 3 Concepts: Transactional Outbox, Audit Logs; Week 2: Distributed Cron)#

You

"The 12:31 crossing waited nine hours in a plaza server. Nothing was lost, because the lane wrote it to durable storage before lifting the barrier, and the network has explicit rules for how late is too late. Then the money moves on a schedule, three times a day, netted between banks, and the plaza is paid by the next working day."

This builds on Week 3, Day 2 · Transactional Outbox, Week 3, Day 5 · Audit Log System and Week 2, Day 5 · Distributed Cron.

Your turn · checkpoint 7not answered

Nine hours late

The third plaza's fibre was cut from midnight to 9:10 am. It holds 4,800 crossings. What must the lane have done before lifting each barrier? When the link returns, in what order are they sent, and how fast? Rajesh's 12:31 crossing reaches the switch at 9:12: what's different about it compared with one that arrives in 15 minutes? Then the money: the switch processed it at 9:12; when does Rajesh's issuer pay, when does the acquirer receive it, and when does the plaza operator?

Think it through, or jot it down. Then compare.

One strong answer

  • Before the barrier: write the crossing (transaction number, tag data, reader time, class, image reference) to durable local storage, an outbox. If the lane crashes after lifting the barrier, the crossing still exists.
  • On reconnect: send oldest first, at a controlled rate so 1,000 plazas reconnecting after a regional outage don't flood their acquirers; the acquirer's duplicate check makes resends harmless.
  • 9 hours late: inside 3 days, so the switch processes it. But it's past 15 minutes, so if Rajesh's wallet couldn't cover it at 9:12, the issuer could charge it back after a 15-day cooling period, with no re-presentment right for the acquirer: the plaza carries that risk. Beyond 3 days, the switch declines it outright.
  • The money: processed at 9:12 on a Tuesday, it falls in the 08:00–15:59 window, settled at 18:30 the same day in NPCI's published table. NRCS nets it with every other transaction between every pair of banks; RTGS moves one net amount per bank. The acquirer pays the plaza operator within T+1 working day.

What is published: NPCI's guidelines say transactions "should reach NETC Switch within 15 minutes of transaction initiation"; between 15 minutes and 3 days the switch processes them, but the issuer may charge back for insufficient balance "after the cooling period (currently 15 days)" and the acquirer "will not have any re-presentment rights"; after 3 days the switch declines them. A lane cut off from its plaza server "should authenticate the NETC FASTag data, check the exception list and allow the authenticated vehicle to pass through". An early revision required plazas to send a "Zero transaction file every 15 minutes". IHMCL's SLA has acquirers send each toll transaction from the plaza's folder to NPCI within 5 minutes, send reconciliation files to the plaza by 6:00 am and pay clean transactions within T+1 working day. There is no separate clearing file: "Each processed transaction is considered directly for settlement by the NRCS system." Three cycles a day settle through RTGS on all 365 days except RBI holidays: 16:00–23:59 at 10:30 the next day, 00:00–07:59 at 12:30, 08:00–15:59 at 18:30. (The same document's IHMCL SLA annex still lists four switch cut-overs, at 10:00, 14:00, 17:30 and 23:00; we follow NPCI's settlement table, and NPCI says it may add cycles by circular.) A Settlement Guarantee Fund, 10% from members and 90% through bank lines of credit, covers a member's default, with loss sharing among the rest. Disputes run through NRCS: debit adjustments within 5 days, credit adjustments within 30, chargebacks within 40, then re-presentment, pre-arbitration, arbitration and, since 15 October 2024, an NPCI Review Panel, a Panel for Resolution of Disputes and RBI as appellate authority. Payment data, including vehicle images, is kept for 10 years.

DiagramA crossing's life, from the lane to settlement
%% title: A crossing's life, from the lane to settlement
stateDiagram-v2
  [*] --> READ: tag read, passage formed
  READ --> STORED: written to the lane outbox
  STORED --> PRESENTED_ONTIME: reaches switch within 15 min
  STORED --> PRESENTED_LATE: reaches switch in 15 min to 3 days
  STORED --> EXPIRED: not presented within 3 days
  PRESENTED_ONTIME --> SETTLED: next NRCS cycle
  PRESENTED_LATE --> SETTLED: next NRCS cycle
  PRESENTED_ONTIME --> DECLINED: code 176, tag long in exception
  PRESENTED_LATE --> DECLINED: code 176, tag long in exception
  SETTLED --> DISPUTED: chargeback or adjustment
  DISPUTED --> SETTLED: resolved, net amounts moved
  SETTLED --> [*]
  DECLINED --> [*]
  EXPIRED --> [*]
  class SETTLED ok
  class EXPIRED bad
  class DECLINED bad
  class PRESENTED_LATE queue
  • The outbox is the barrier's precondition. Write the crossing durably, then open. The order matters for the same reason as Week 3's transactional outbox: an action in the world (a barrier lifting) and a record of it must not be able to diverge.
  • A heartbeat makes silence visible. A zero-transaction file every 15 minutes means a plaza with no traffic is distinguishable from a plaza with no link. Without it, an outage looks like a quiet night until the morning reconciliation.
  • Late is priced, not refused. Fifteen minutes, three days and a 15-day cooling period draw the lines between "issuer's risk" and "plaza's risk". A network that refused late transactions would make every fibre cut a revenue loss; one that accepted them forever would make every wallet's balance meaningless.
  • Settlement is a scheduled netting job. Three windows a day, each a distributed-cron run over everything the switch processed: sum each pair of banks, net each bank to one figure, send one instruction per bank to RTGS. The sum of all positions must be zero; if it isn't, the job stops.
  • The guarantee fund turns credit risk into a known number. If an issuer can't pay its net debit, the fund pays the acquirers, and the defaulter, then the survivors, make it good. Plazas never wait on one bank's trouble.
  • Every dispute is a new record, never an edit. Adjustments, chargebacks and verdicts are new messages with their own references and deadlines, settled in later cycles. The original transaction stays as it was: Week 3's audit log, with money attached.
pythonnet_positions · 27 lines
# nrcs/net.py

"""
Netting one settlement window (illustrative). Every processed transaction moves
its amount from the issuer to the acquirer; each bank's net position is the sum.
The positions must sum to zero before one instruction per bank goes to RTGS.
"""

from collections import defaultdict
from decimal import Decimal


def net_positions(transactions) -> dict:
    pos = defaultdict(Decimal)
    for t in transactions:                       # every txn processed in this window
        pos[t.issuer] -= t.amount                # issuer pays
        pos[t.acquirer] += t.amount              # acquirer receives, then pays the plaza
        for party, fee in t.interchange():       # fees as published by NPCI, if any
            pos[party] += fee
    if sum(pos.values()) != 0:
        raise RuntimeError("window does not balance: stop and reconcile")
    return dict(pos)


def instructions(pos: dict, window: str) -> list:
    return [{"bank": b, "window": window, "debit" if v < 0 else "credit": abs(v)}
            for b, v in sorted(pos.items()) if v != 0]

Deep Dive 6: One Vehicle, One Tag, Across Forty Issuers (Week 5 Concepts: Conflict Resolution; Week 9: Tenant Isolation)#

You

"Each issuer keeps its own customers, but the invariant 'one active tag per vehicle' spans all forty. No issuer can enforce it alone. The Mapper is the only place where every tag for a registration number is visible, so that's where the rule has to be checked."

This builds on Week 5, Day 4 · Conflict Resolution and Week 9, Day 1 · Tenant Isolation.

Your turn · checkpoint 8not answered

Three tags, one truck

Rajesh's truck has an old tag from bank A (hotlisted, with ₹300 owed), a tag from bank B he bought online two years ago but never affixed, and the one on his windscreen from bank C. A fleet agent keeps bank B's tag in the glovebox and waves it at plazas for a car. What goes wrong at the plaza for each? What should happen when Rajesh asks bank D for a new tag tomorrow? And how do you clean up the millions of vehicles already in this state?

Think it through, or jot it down. Then compare.

One strong answer

  • What goes wrong: the loose tag in the glovebox ("tag-in-hand") pays the car's fare on a truck's sticker or vice versa, slows the lane while the clerk sorts it out, and produces false chargebacks; the hotlisted tag carries a debt; two active tags mean two ways to be charged.
  • Bank D: before issuing, look up the registration number in the Mapper. A hotlisted tag blocks a new issue until the dues are paid. All earlier tags must be closed; only the latest stays active. The vehicle's details must be validated against VAHAN before the tag is activated.
  • Clean-up: in 2024 NHAI ran this as "One Vehicle, One FASTag": only the latest tag stays active, older ones are deactivated or blacklisted, and tags without completed KYC are deactivated. NPCI's guidelines describe how issuers do it: show the customer every active tag on the registration number, take consent, keep the old tags in low balance for 15 days to absorb chargebacks, then close them; hotlisted dues are collected through a UPI QR before verification completes.

What is published: NHAI launched "One Vehicle, One FASTag" on 15 January 2024 after "reports of multiple FASTags being issued for a particular vehicle and FASTags being issued without KYC in violation of RBI's mandate"; only the latest tag would stay active, and tags with incomplete KYC would be deactivated or blacklisted after 31 January 2024. The deadline moved to 31 March 2024 because of Paytm FASTag users' difficulties (Onmanorama, citing PTI, 1 March 2024): RBI had directed on 16 February 2024 that Paytm Payments Bank accept no top-ups to wallets and FASTags after 15 March 2024, while balances stayed usable. NPCI's guidelines require that "Only the latest issued tag must stay active, and all the previous tags must be closed"; block migrating customers with hotlisted tags until dues are cleared; close tags issued on a chassis number that aren't updated with the registration number within 90 days; and require VAHAN verification, a linked mobile number, vehicle photos, re-KYV every 3 years, and a ₹10,000 penalty per data mismatch or badly affixed tag. NHAI charges double for a tag not fixed on the windscreen (July 2024) and has operators report loose tags for blacklisting (July 2025). From 1 February 2026, new car tags may be activated "only after validation of vehicle details from the VAHAN database", with no post-activation KYV. In April 2026 NHAI told issuers to validate the registration numbers on their tags and blacklist invalid ones, since MLFF enforcement depends on them.

DiagramIssuing a tag when the rule spans every bank
%% title: Issuing a tag when the rule spans every bank
flowchart TD
  REQ@{ icon: "sd:user", label: "Rajesh asks bank D<br/>for a new tag" }
  VAH@{ icon: "sd:id", label: "VAHAN check<br/>VRN, chassis, class" }
  LOOK["Mapper: all tags<br/>on this VRN"]:::core
  HOT{"Any tag hotlisted?"}
  DUES["Collect dues by UPI QR<br/>then continue"]:::bad
  CLOSE["Old tags: low balance 15 days,<br/>then closed, code 06"]:::service
  ISSUE["Register and activate<br/>new tag, the only active one"]:::hot
  REQ ==> VAH ==> LOOK ==> HOT
  HOT -->|"yes"| DUES
  DUES --> CLOSE
  HOT ==>|"no"| CLOSE
  CLOSE ==> ISSUE
  class REQ client
  class VAH external
  • A global uniqueness constraint needs a global index. Forty issuers are forty tenants with their own customer data, isolated from one another; the Mapper is the one shared index keyed by registration number. The new-tag check is a conditional write there: "register tag X for VRN V only if no other tag for V is active", the same pattern as a unique constraint across partitions.
  • Conflicts resolve to the newest, by policy. When two tags exist, the latest issued wins and the rest close: a last-writer-wins rule chosen by the regulator, not by clocks, and made safe by keeping the losers in low balance for 15 days so in-flight transactions and chargebacks can still settle.
  • Identity moved upstream. NPCI's guidelines let issuers activate a tag in real time and finish verifying it within T+3 days, blacklisting it otherwise. Since 1 February 2026, NHAI requires new car tags to be validated against VAHAN before activation. Checking at the door is cheaper than chasing millions of records afterwards.
  • Accurate registration numbers matter more once barriers go. At a barrier, a wrong number on a tag is harmless if the tag pays. Without a barrier, the number is how an unpaid crossing becomes a notice to the right owner, which is why NHAI ordered the April 2026 clean-up.
pythonBlocked · 25 lines
# mapper/register.py

"""
Registering a new tag under one-vehicle-one-tag (illustrative). The check and the
write happen in one conditional operation on the Mapper's VRN index, so two banks
can't both activate a tag for the same vehicle at the same moment.
"""

class Blocked(Exception):
    pass


def register(mapper, issuer: str, tag: dict, vahan) -> str:
    v = vahan.lookup(tag["vrn"], tag["chassis"])
    if v is None:
        raise Blocked("vehicle not found in VAHAN: verify the RC before activation")
    tag["class"] = v.vehicle_class
    existing = mapper.tags_for_vrn(tag["vrn"])
    if any(t.status == "HOTLIST" for t in existing):
        raise Blocked("dues on a hotlisted tag must be cleared first")
    with mapper.tx(index=("vrn", tag["vrn"])) as tx:          # serialises writes for this vehicle
        for t in tx.active_tags():
            tx.set_status(t.epc, "LOW_BALANCE", reason="OVOT", close_after_days=15)
        tx.insert(tag["epc"], tag, status="ACTIVE", issuer=issuer)
    return tag["epc"]
Quick check3 questions · +5 XP each

Settlement and identity

  1. Q1/3 A crossing reaches the switch 9 hours after the read. What changes compared with an on-time one?

    Answer & explanation

    Answer: B

    Between 15 minutes and 3 days, the plaza and acquirer carry the balance risk; after 3 days the switch declines.

  2. Q2/3 In an NRCS settlement window, what must be true of the banks' net positions?

    Answer & explanation

    Answer: B

    Netting moves one amount per bank; any imbalance means a bug.

  3. Q3/3 Rajesh's old tag is hotlisted with dues. What happens when he asks a new bank for a tag?

    Answer & explanation

    Answer: B

    One vehicle, one active tag; a hotlisted tag blocks a new one until it's cleared.

Phase 5 · Stage 5 of 7 · 5 min budget · 5 min read

Phase 5: Scaling and Edge Cases (5 minutes)#

Interviewer

"Walk me through Rajesh's night from the network's side, then tell me what the last two years changed: the Annual Pass and barrier-free tolling."

Rajesh's Night#

Rajesh's December night on NH-19, from the network's side (illustrative)
  • 11:41 pm · First plaza, online
    • 31 reads become one passage; request details says active; ₹845 debited through the switch; the issuer adds the tag to low balance
  • 11:50 pm · Diff files go out
    • Acquirers push the 10-minute diff to their plazas; the second plaza now has Rajesh as low balance
  • 11:52 pm · Top-up
    • Ankit pays ₹5,000 by UPI; at 11:53 the issuer removes the tag from the list in the Mapper
  • 12:04 am · Second plaza, stale list
    • The online check is slow; the local list still says low balance; Rajesh pays by UPI at the 1.25-times non-FASTag rate
  • 12:31 am · Third plaza, offline
    • 37 reads, one passage; signature and local list clean; barrier lifts; the crossing waits in the plaza's outbox
  • 9:10 am · Link restored
    • Oldest first; the acquirer prices it from the Mapper class and presents it; it's late but inside 3 days, so it's processed; SMS at 9:14
  • 6:30 pm · Settlement
    • NRCS nets the window; RTGS moves one amount per bank; the plaza is paid by the next working day

What Changed: the Annual Pass#

You

"The Annual Pass is a product change with a systems consequence: the tag no longer always means 'debit the wallet'. On the right plazas it means 'count a crossing and charge nothing'."

What is published: NHAI launched the FASTag Annual Pass on 15 August 2025, at about 1,150 National Highway and National Expressway fee plazas: a one-time ₹3,000 for one year or 200 toll plaza crossings, for non-commercial vehicles with a valid FASTag. It "gets activated within two hours on the existing FASTag linked to the vehicle" after payment through the Rajmargyatra app or NHAI's website; it is non-transferable and valid only at NH and NE fee plazas, while at state highway and other plazas "the FASTag will use the existing wallet balance". On the first day, about 1.4 lakh users activated it by 7 pm and pass users received SMS messages "for zero deduction of toll fee". NHAI reported 25 lakh users and 5.67 crore transactions by 15 October 2025; MoRTH reported 36.13 lakh passes sold and ₹1,084 crore collected by November 2025; NHAI reported 50 lakh+ users and 26.55 crore transactions by 6 February 2026, with about 28% of car transactions on the NH network now made with the pass, and 56 lakh+ users by March 2026, when the fee for FY 2026–27 was revised to ₹3,075 from 1 April 2026. A pass can be gifted through the app by entering another vehicle's number.

  • The pass is an entitlement on the tag, kept centrally. Our design: a pass registry keyed by tag and VRN (valid from, valid to, crossings used), owned by the programme rather than by any one issuer, with the pass bought once and honoured by every acquirer.
  • Plazas learn about passes the way they learn about exemptions. NPCI's guidelines already carry passes and exemptions in a discount (DIS) file that takes priority over the blacklist file. Our design pushes new passes in the same diffs, which is consistent with a published activation time of "within two hours" rather than seconds.
  • Count crossings centrally, idempotently. In our design, each pass crossing is still a transaction with a transaction number, presented through the switch for ₹0; the registry increments "crossings used" once per transaction number. The 200th crossing flips the pass to expired and the next diff removes it from the discount file.

Edge Cases#

Edge cases
Edge case 1: The tag isn't read at all

Problem: A damaged tag, a metallised windscreen or a faulty antenna; the vehicle stops at the barrier.

Solution: NPCI's guidelines ask plazas to keep handheld readers, then a manual entry of the tag's details (issuer ID, key index and serial, or the registration number) with an image, sent as a normal transaction. If a valid, funded tag can't be read because the plaza's ETC equipment failed, the 2018 gazette rule lets the vehicle pass free with a zero-transaction receipt. Issuers must replace faulty tags within 48 hours and watch for tags that keep needing manual entry.

Edge case 2: The vehicle class is wrong in the Mapper

Problem: A truck registered as a car pays a car's fare.

Solution: The fare follows the Mapper class; the plaza flags the mismatch from its classifier and image; the acquirer raises a debit adjustment through NRCS within 5 days, and the issuer must correct the Mapper class within 3 days of being told, or pay a penalty under IHMCL's SLA.

Edge case 3: An issuer bank is shut

Problem: A regulator stops an issuer from taking top-ups, as RBI did for Paytm Payments Bank from 15 March 2024.

Solution: Existing balances still pay; the Mapper keeps routing to the issuer until its tags drain; customers get new tags from other issuers under one-vehicle-one-tag, with the old tags closed. The guarantee fund covers a member that can't meet its settlement.

Edge case 4: Fraud by the plaza itself

Problem: Collections diverted at the plaza. In March 2025 NHAI debarred 14 fee collection agencies after a UP Special Task Force raid at a toll plaza in Mirzapur and forfeited performance securities worth over ₹100 crore.

Solution: Every ETC crossing, including declined and exempt ones, goes to the acquirer with an image (the guidelines require all lane transactions, "successful, fail, decline", to be sent), and plazas must record the full registration number and a plate image for vehicles without a working FASTag; compare camera counts with ETC and cash counts per lane per hour, and audit exemptions against the exempt list.

Quick check2 questions · +5 XP each

Scaling and edge cases

  1. Q1/2 How is a FASTag Annual Pass activated, according to NHAI?

    Answer & explanation

    Answer: B

    It's an entitlement attached to the tag already on the windscreen.

  2. Q2/2 An Annual Pass holder crosses a state highway plaza. What pays?

    Answer & explanation

    Answer: B

    Eligibility depends on the plaza, so the plaza needs to know its own type and the pass list.

Phase 6 · Stage 6 of 7 · 1 min

Phase 6: Monitoring and Operations#

You

"Four views: is every lane deciding with fresh data, is every plaza connected or at least heard from, is the switch healthy for every bank, and does the money balance?"

Monitoring Dashboard#

An acquirer's NETC operations view — 8:15 pm IST, a Friday before a long weekend (illustrative)
Plazas and lanes
Metric Now
Plazas acquired / reporting in last 15 min 112 / 110
Crossings presented 48/s
Lane decisions p95 (first read to barrier) 0.42 s
Request-details answered within lane budget 97.8%
Oldest crossing waiting in a plaza outbox 31 min (plaza 4087)
Exception diff age, worst plaza 9 min
Switch and issuers
  • Request pay p99: 640 ms; deemed accepted (issuer unreachable): 0.3%, all from one issuer
  • Declined, code 176: 0.04%; presented after 15 minutes: 1.1%
Money
  • Duplicates dropped at the acquirer today: 2,310; duplicate debits reaching issuers: 0
  • Last window's net positions sum: ₹0.00; clean transactions paid to plazas by T+1 yesterday: 100%

SLOs for a Toll Network#

SLOs for lanes, plazas, the switch and money
SLO 1: Lanes decide quickly with fresh data
  • Target: p95 lane decision < 1 s; every plaza's exception diff < 10 minutes old; full list refreshed daily
SLO 2: Crossings are presented on time
  • Target: > 99% of crossings at the switch within 15 minutes; 100% within 3 days; every plaza heard from (crossings or a zero file) every 15 minutes
SLO 3: The switch is available for every bank
  • Target: NETC switching availability ≥ 99.95% a month; deemed-accepted share < 1% per issuer
SLO 4: Money is exact
  • Target: zero duplicate debits; every settlement window nets to zero; clean transactions paid to plazas within T+1 working day; disputes answered within their published deadlines
Quick check2 questions · +5 XP each

Reading the dashboard

  1. Q1/2 One plaza's oldest outbox crossing is 31 minutes old and climbing, while it still sends a zero file. What's happening?

    Answer & explanation

    Answer: B

    Alert on outbox age per plaza, not just on silence.

  2. Q2/2 Deemed accepted rises to 0.3%, all from one issuer. What do you do?

    Answer & explanation

    Answer: B

    The vehicle and the plaza are protected; the risk is the issuer's catch-up before cut-off.

Final challenge · Stage 7 of 7 · 3 min

Final Challenge: No Barrier at All#

The interviewer leans back. "One more."

Interviewer

"Remove the barrier. In May 2026 NHAI switched on India's first Multi-Lane Free Flow toll point, at Chorayasi on NH-48, and about 41,500 vehicles went through on day one. Vehicles pass at highway speed across all lanes; RFID readers and number-plate cameras on a gantry identify them. Tell me what changes in your design: the lane, the lists, duplicates, the people who don't pay, and identity."

The free-flow brief
  • ~41,500 vehicles on day one at one gantry (NHAI); assume 60,000 a day on a busy one, 12 lanes, speeds up to 80 km/h
  • Identification by FASTag readers and ANPR cameras; no barrier, no clerk
  • If a FASTag is missing, invalid or short of balance, NHAI issues an e-notice: the normal fee is due within 72 hours, twice the fee after that; grievances within 72 hours; non-payment may lead to blacklisting of the FASTag and restrictions on vehicle services through VAHAN
  • Assume 2% of crossings have no readable or payable tag (an assumption)
Your turn · checkpoint 9not answered

What do you change for free flow?

Decide what the "lane" becomes, how reads at speed across lanes become one crossing per vehicle, what happens to a vehicle on the low-balance list, how an e-notice reaches the right owner, what you do with a tag whose registered number doesn't match the plate the camera read, and what you measure.

Think it through, or jot it down. Then compare.

One strong answer

  • No decision to make in real time. Without a barrier, nothing has to be decided in a second. The gantry records every vehicle: tag reads (if any), plate images, position across lanes, time. The "lane controller" becomes a trip builder that runs after the fact.
  • One crossing per vehicle: fuse reads and plates by position and time across all lanes; a tag seen by three readers and a plate seen by two cameras within the same metres and milliseconds is one vehicle. The transaction number is minted per fused crossing, so all the downstream idempotency still holds.
  • Low balance: the crossing still happens; present it to the switch. If the issuer can't debit, it becomes an e-notice instead of a cash lane: normal fee in 72 hours, double after, with a grievance window. The exception lists stop deciding who passes; they decide who gets a notice.
  • The right owner: the plate read and VAHAN give the owner; the tag gives the account. When the tag's registered number and the plate disagree, don't charge the tag: issue the notice on the plate, and report the tag. That's why NHAI ordered issuers in April 2026 to validate tag registration numbers and blacklist bad ones.
  • Measure: fused-crossing accuracy (crossings with tag and plate agreeing), share of crossings needing notices, notice payment within 72 hours, grievance rate, and cameras or readers down per gantry.

What is published: IHMCL signed the agreement with ICICI Bank for the Chorayasi MLFF system on 30 August 2025, with a second for Gharaunda on NH-44 in Haryana, and NHAI said it planned MLFF at around 25 fee plazas in that financial year; NHAI described MLFF as transactions "through reading of FASTag and Vehicle Registration Number (VRN) by High performance RFID Readers and ANPR Cameras". The e-notice rules above are from NHAI's launch release of 2 May 2026. MoRTH clarified in April 2025 that no decision had been taken to replace FASTag with satellite-based tolling nationwide from 1 May 2025, and that the "ANPR-FASTag-based Barrier-Less Tolling System" would be implemented at selected plazas. Satellite tolling is legal and piloted, not rolled out: MoRTH's amendment of 9 September 2024 (S.O. 3856(E)) added a GNSS on-board unit, an ANPR device or FASTag "or any combination thereof" as ways of collecting fees, allowed exclusive GNSS lanes (double fee for vehicles entering without a working unit), and set a zero fee for up to 20 km of journey in each direction a day under GNSS-based collection, for vehicles other than National Permit vehicles. GNSS pilots were run on the Bengaluru–Mysore section of NH-275 and the Panipat–Hisar section of NH-709 (MoRTH, Rajya Sabha reply, 24 July 2024).

Quick check2 questions · +5 XP each

Final challenge · Quest check

  1. Q1/2 At a free-flow gantry, why does the lane no longer need a one-second decision?

    Answer & explanation

    Answer: B

    Removing the barrier turns a real-time decision into a batch reconciliation.

  2. Q2/2 A tag's registered number doesn't match the plate the camera read. What should the system do?

    Answer & explanation

    Answer: B

    Without a barrier, identity is enforcement; NHAI ordered issuers to validate tag VRNs for exactly this reason.

Wrap-up · 8 min

Interview Conclusion#

Transcript
Interviewer

"Why not just make every lane ask the issuer in real time, like a card payment? You'd never pass a vehicle on a stale list."

You

"Because the lane can't wait and can't trust its link. A card terminal can make a customer stand there for four seconds or show an error; a toll lane with a truck in it and forty vehicles behind can't. So the decision has to come from data already in the lane, signed tags and a local list, and the network has to be built to settle afterwards: transaction numbers that make retries harmless, a switch that settles whatever it processed, issuers that carry the credit risk and manage it with lists, and written windows that say who pays when something arrives late. That's what lets a plaza lose its link for nine hours without losing a rupee."

Interviewer

"The single most important decision?"

You

"Writing liability into time. Fifteen minutes, three days, twenty minutes after a tag is listed, sixty minutes before a read: each window says whose money is at risk for each kind of delay. Once every party knows that, they can each build for availability on their own side, and the network as a whole stays correct."

Summary: Concepts Applied from 10-Week Course#

Concepts from the 10-week course in an electronic toll network
  • Week 2: Failure-first design
    • Timeout hell — status check before retry, with fixed waits per error
    • Idempotency — a transaction number minted in the lane and carried to settlement
    • Distributed cron — three settlement windows a day
  • Week 3: Messaging and async processing
    • Transactional outbox — the crossing is stored before the barrier lifts
    • Audit logs — disputes and adjustments as new records with deadlines
  • Week 4: Caching
    • Multi-tier caching — lane list, plaza list, Mapper
    • Cache invalidation — 10-minute diffs, daily full lists, liability windows for staleness
  • Week 5: Consistency and coordination
    • Consistency models — deemed acceptance and settlement of whatever the switch processed
    • Conflict resolution — one vehicle, one tag: the newest wins, the rest close after 15 days
  • Week 8: Analytics pipelines
    • Event ingestion — dozens of reads collapsed into one passage
  • Week 9: Security
    • Tenant isolation — forty issuers, one shared index
    • Security architecture — tag data signed by issuer keys certified by NPCI, verified offline
  • Week 10: Production readiness
    • SLOs for lanes, plazas, the switch and money; plaza heartbeats

Why FASTag Matters#

Why this is a different kind of hard problem
Payment initiated by the roadside, not the payer
  • A card or UPI payment starts with the payer and waits for an answer. A toll payment starts with an antenna, completes without the payer, and is often settled hours later. The system is built around letting the vehicle go first
Liability is part of the protocol
  • Fifteen minutes, three days, twenty and sixty minutes: NETC writes down who carries the risk of every kind of delay and staleness. That's what lets a thousand plazas, twelve acquirers and forty issuers each build for availability on their own
Small volume, many edges
  • About 139 transactions a second on average is small. A thousand roadside sites with variable links, forty issuers, twelve acquirers and a national list of bad tags are not. The difficulty is in the edges, not the centre
The barrier is going away
  • The Annual Pass made the tag an entitlement as well as a payment method; free-flow gantries make the number plate, and the accuracy of the registry behind it, the enforcement mechanism. Identity work done for "one vehicle, one tag" is what makes barrier-free tolling possible

"Let the lane decide with what it already holds, mint one number per crossing, and write down who pays for every minute of delay."

Self-Assessment Checklist#

After studying this case study, you should be able to:

The lane:

The lane0/3 ready
  • Explain how a lane authenticates a tag offline using signed static data and keys certified by a central authority
  • Design the lane's decision order across local lists, signatures and an online check with a time budget
  • Collapse many RFID reads into one passage, and remove duplicates at each later hop with the right key

The network:

The network0/3 ready
  • Walk through a crossing from reader to plaza, acquirer, Mapper, switch and issuer, and explain who calculates the fare
  • Explain deemed acceptance, status-check-before-retry and why the issuer carries the credit risk
  • Propagate exception lists to a thousand sites with diffs and full lists, and price staleness with liability windows

Money and identity:

Money and identity0/3 ready
  • Handle late transactions from offline plazas with published windows, and explain who pays at each delay
  • Net a settlement window between many banks and explain the role of a settlement guarantee fund
  • Enforce one active tag per vehicle across many issuers, and explain why identity matters more without barriers

Sources#

NPCI and IHMCL:

  • Book

    NPCI — Procedural Guidelines, National Electronic Toll Collection Network, version 2.1, hosted by IHMCL (four-party model; Switch, Mapper, NRCS; tag standards, EPC layout and static data authentication; request details first; transaction flow, 15-minute, 3-day and 72-hour windows, retry waits, deemed acceptance; exception lists, 20- and 60-minute rules, reason code 176; duplicate checks and the 120 km/h near-time rule; three settlement cycles, netting, guarantee fund, disputes and dispute code 3002; one tag per vehicle, VAHAN, re-KYV; 99.95% availability; IHMCL SLAs for list files, processing, reconciliation and T+1 payment; the 2018 gazette rule on unread tags), document history to "29th February 2025": https://ihmcl.co.in/wp-content/uploads/2025/12/NETC_PG_V2.1.pdf

  • Paper

    NPCI — NETC Procedural Guidelines, version 1.9, 10 March 2023 (for comparison): https://ihmcl.co.in/wp-content/uploads/2023/02/NETC_PG_V1.9_.pdf

MoRTH, NHAI and PIB:

Reserve Bank of India:

Reporting:

Design note: the internals of lanes, plazas, acquirers, NPCI's switch and Mapper, and issuers, the code, thresholds, dashboards and every number labelled as an assumption are an illustrative design, not the systems of NPCI, IHMCL, NHAI, any bank or any toll operator. Peak factors, lanes per plaza, reads per crossing, exception-list sizes, lookups per crossing, the final challenge's figures and the Annual Pass registry are assumptions. Rajesh Yadav, his son, his truck and the plazas, times and fares in his story are invented. NPCI's rules change by circular; check current instructions before relying on any window or fee.

Further Reading#

Related systems to study:

Foundational concepts (this course):

"Let the lane decide with what it already holds, mint one number per crossing, and write down who pays for every minute of delay."

this lesson in shorts · 4

play them all →

One idea from this lesson in about a minute each, made for your phone.

End of Side quest 35 · FASTag
Clear the questFinish FASTag.Stages clear as you read them. Marking complete unlocks after ~9 more min of reading.
  • 0/7stages cleared

Follow-up drills

0 of 11 practised

You presented FASTag. Now the interviewer pushes back. Answer each follow-up out loud or in the box, then reveal a strong answer.

Follow-up 1 / 11 · scale & numbers

“120 lakh crossings a day across the country. How big does the central switch have to be?”

Pushes on · where the load actually is

Revealing marks it practised.
design sheet · 6 diagrams · pdfRevise the whole design in ten minutesThe numbers, architecture, sequence, class and state diagrams, decisions and failure modes of this quest on a few printable pages.open the sheet →

New lessons by email

New lessons, side quests and case files as they ship, at most once a week. No spam, unsubscribe anytime.

Discussion · …

Public: everyone reading this lesson sees comments. Be kind and keep it on the material.

Sign in to ask a question or answer one. Reading stays open to everyone.
loading the discussion…