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.
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.
- ~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.
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."
"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."
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
"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: Requirements Clarification (5 minutes)#
"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#
"Who are the parties?"
"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."
"What's in the Mapper?"
"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."
"How big is the flow?"
"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."
"Who calculates the fare?"
"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."
"And if the plaza can't reach the bank?"
"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#
- 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#
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: Back of the Envelope Estimation (5 minutes)#
"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."
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?
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#
| 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#
- 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#
- 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 |
Requirements and estimation
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.
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: High-Level Design (10 minutes)#
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?
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.
"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#
%% 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 clientKEY 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#
%% 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
High-level design
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.
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: Deep Dives (20 minutes)#
Deep Dive 1: The Lane Decides Alone (Week 4 Concepts: Multi-Tier Caching, Cache Invalidation; Week 9: Security Architecture)#
"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.
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?
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.
%% 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.
# 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 timeDeep Dive 2: Forty Reads, One Crossing, One Debit (Week 2 Concepts: Idempotency; Week 8: Event Ingestion)#
"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.
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?
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).
%% 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.
# 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),
}The lane and its duplicates
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.
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.
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.
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)#
"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.
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?
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.
%% 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.
# 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.kindDeep Dive 4: Low Balance, Hotlist and Blacklist: a Race Between Lists (Week 4 Concepts: Cache Invalidation; Week 5: Consistency Models)#
"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.
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?
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.
%% 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.
# 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 windowThe switch and the lists
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.
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.
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)#
"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.
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?
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.
%% 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.
# 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)#
"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.
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?
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.
%% 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.
# 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"]Settlement and identity
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.
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.
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: Scaling and Edge Cases (5 minutes)#
"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#
- 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#
"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 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.
Scaling and edge cases
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.
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: Monitoring and Operations#
"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#
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#
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
Reading the dashboard
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.
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: No Barrier at All#
The interviewer leans back. "One more."
"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."
- ~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)
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.
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).
Final challenge · Quest check
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.
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.
Interview Conclusion#
"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."
"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."
"The single most important decision?"
"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#
- 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#
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:
- 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:
- 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:
- 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:
- Book
PIB (MoRTH) — Year End Review 2025 (40 issuers, 12 acquirers; 11.73 crore tags; ~₹184 crore and ~120 lakh ETC transactions a day in FY 2025–26 till November; FASTag lanes from 15–16 February 2021 and M and N vehicles from 1 January 2021; user fee by year, ₹61,408.15 crore over 52,748 km in FY 2024–25; 36.13 lakh Annual Passes, ₹1,084 crore), 30 December 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2209837
- Paper
NHAI — 'One Vehicle One FASTag' initiative, 15 January 2024: https://nhai.gov.in/nhai/sites/default/files/2024-01/Press_Release-One_Vehical_One_FASTag_0.pdf
- Read
PIB (MoRTH) — Double toll for non-affixed FASTag, 18 July 2024: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2034064
- Read
PIB (MoRTH) — New Toll Collection System (GNSS pilots on NH-275 and NH-709), Rajya Sabha reply, 24 July 2024: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2036273
- Paper
MoRTH — S.O. 3856(E), National Highways Fee Amendment Rules, 2024 (GNSS, ANPR or FASTag; GNSS lanes; zero fee up to 20 km), 9 September 2024: https://acma.in/uploads/otherdocmanager/Final_S.O.3856(E)_GNSS_On_Board_Unit_9Sept24.pdf
- Read
PIB (MoRTH) — NHAI debars 14 fee collection agencies (Mirzapur raid; ₹100 crore+ securities forfeited), 20 March 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2113332
- Read
PIB (MoRTH) — Clarification on satellite-based tolling from 1 May 2025 (no nationwide decision; ANPR-FASTag barrier-less tolling at selected plazas), 18 April 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2122632
- Read
PIB (MoRTH) — Reporting 'Loose FASTag' for blacklisting, 11 July 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2143962
- Read
PIB (MoRTH) — FASTag Annual Pass implemented (15 August 2025; ~1,150 plazas; ₹3,000 for a year or 200 crossings; ~1.4 lakh users on day one), 15 August 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2156992
- Paper
NHAI — Agreement for India's first MLFF tolling system (IHMCL and ICICI Bank; Choryasi and Gharaunda; ~25 plazas planned), 30 August 2025: https://nhai.gov.in/nhai/sites/default/files/2025-09/NHAIPressRelease-NHAI-Gujarat.pdf
- Read
PIB (MoRTH) — Annual Pass crosses 25 lakh users (5.67 crore transactions; NH and NE plazas only; non-transferable), 15 October 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2179426
- Read
PIB (MoRTH) — Gift a FASTag Annual Pass, 18 October 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2180638
- Read
PIB — Redefining India's Highways (~98%, 8 crore+ users; cash 2× and UPI 1.25× for non-FASTag users from 15 November 2025), 11 November 2025: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2188705
- Paper
NHAI — KYV discontinued for cars on new FASTags from 1 February 2026, 1 January 2026: https://nhai.gov.in/nhai/sites/default/files/2026-01/NHAI_Press_Release-01-01-2026-Eng.pdf
- Read
PIB (MoRTH) — One Year, Many Journeys Made Easier (40 lakh+ passes; UPI at 1.25×; MLFF at Choryasi scheduled for 2026), 14 January 2026: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2214528
- Read
PIB (MoRTH) — Annual Pass crosses 50 lakh users (26.55 crore transactions; ~28% of car transactions now on the pass), 6 February 2026: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2224484
- Read
PIB (MoRTH) — Annual Pass fee revised to ₹3,075 from 1 April 2026 (56 lakh+ users), 15 March 2026: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2240305
- Read
PIB (MoRTH) — NHAI directs validation of FASTag registration numbers, 15 April 2026: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2252275
- Read
PIB (MoRTH) — India's first MLFF tolling system launched at Chorayasi (~41,500 vehicles on day one; e-notice rules), 2 May 2026: https://www.pib.gov.in/PressReleasePage.aspx?PRID=2257491
Reserve Bank of India:
- Read
RBI — Paytm Payments Bank Ltd under Section 35A (no FASTag top-ups after 15 March 2024), 16 February 2024: https://www.rbi.org.in/scripts/BS_PressReleaseDisplay.aspx?prid=57345
- Read
RBI — Processing of e-mandates for recurring transactions (FASTag auto-replenishment without pre-debit notification), 22 August 2024: https://www.rbi.org.in/scripts/FS_Notification.aspx?Id=12722
Reporting:
- Read
Onmanorama (PTI) — 'One Vehicle, One FASTag' deadline extended to March end, 1 March 2024: https://www.onmanorama.com/news/business/2024/03/01/one-vehicle-one-fastag-deadline-extended.html
- Read
Onmanorama — What if your FASTag wrongly debits highway toll charges (₹125 charged in Guwahati to a car parked in Kochi), 19 July 2026: https://www.onmanorama.com/news/kerala/2026/07/19/fastag-fraud-recovery.html
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:
- Side quest
UPI (Bonus Problem 1 in this series): NPCI's other big switch, where the payer starts the payment and both sides see the result in seconds
(opens in new tab) - Side quest
Visa and Mastercard (Bonus Problem 4): authorisation now, clearing and settlement later, chargebacks and arbitration
(opens in new tab) - Side quest
Razorpay (Bonus Problem 18): settlement and reconciliation from a payment aggregator's side
(opens in new tab) - Side quest
IRCTC (Bonus Problem 11): another national public system where identity rules and a central registry shape the design
(opens in new tab)
Foundational concepts (this course):
- Lesson
Week 2, Day 1 — Timeout Hell
(opens in new tab) - Lesson
Week 2, Day 2 — Idempotency in Practice
(opens in new tab) - Lesson
Week 2, Day 5 — Distributed Cron
(opens in new tab) - Lesson
Week 3, Day 2 — Transactional Outbox
(opens in new tab) - Lesson
Week 3, Day 5 — Audit Log System
(opens in new tab) - Lesson
Week 4, Day 2 — Cache Invalidation
(opens in new tab) - Lesson
Week 4, Day 5 — Multi-Tier Caching
(opens in new tab) - Lesson
Week 5, Day 1 — Consistency Models
(opens in new tab) - Lesson
Week 5, Day 4 — Conflict Resolution
(opens in new tab) - Lesson
Week 8, Day 1 — Event Ingestion
(opens in new tab) - Lesson
Week 9, Day 1 — Tenant Isolation
(opens in new tab) - Lesson
Week 9, Day 5 — Security Architecture
(opens in new tab)
"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.
- 0/7stages cleared
Follow-up drills
0 of 11 practisedYou presented FASTag. Now the interviewer pushes back. Answer each follow-up out loud or in the box, then reveal a strong answer.
“120 lakh crossings a day across the country. How big does the central switch have to be?”
Pushes on · where the load actually is
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.



