Masked calling on parcel labels replaces the recipient's phone number with a shared masked number and a short code for that shipment. A courier dials the number, enters the code, and reaches the recipient; neither side sees the other's real number. When the shipment is delivered, you switch the code off, so the box in the bin exposes nothing.
Add masked numbers to your labels: Open the Edesy masking portal. Switch a number to extension routing and create codes from your label-printing step.
The problem with phone numbers on boxes
A shipping label is read by warehouse pickers, sorting hubs, line-haul drivers, last-mile couriers, building guards and neighbours. After delivery the box goes in the bin with the label still on it. Each of those is a chance for a phone number to be copied and misused, for spam, harassment or social-engineering calls that sound convincing because the caller knows what was ordered.
How it works
Label: "Call +91 80XX XXX XXX, code 48219357#"
Courier dials -> enters 48219357# -> recipient's phone rings, showing the masked number- When you create the shipment, your system creates an extension with the recipient's number as the target and the AWB or order ID as the reference.
- The label prints the masked number and code (and optionally a QR with the
tel:link). - Anyone who needs to reach the recipient dials and enters the code.
- Edesy connects the call. Both sides see the masked number.
- When the shipment closes, your system deactivates the code.
Extension codes vs session masking for deliveries
| Extension codes on the label | Session masking | |
|---|---|---|
| Who can call | Anyone holding the label | Only the two paired numbers |
| Known in advance | Only the recipient | Both the agent and the recipient |
| Third-party couriers | Works; nothing to integrate | Needs the courier's agent number |
| Recipient calls back | Not through the code | Yes, both ways |
| Expiry | You deactivate the code | Built-in session expiry and max calls |
| Best for | Labels printed before dispatch, mixed couriers | Your own fleet, app-assigned riders |
Many logistics setups use both: sessions for their own riders, extension codes on labels for everything else. See number masking for delivery and logistics fleets for the session side.
Setting it up
- Get a number. Buy an Indian number in the Edesy voice portal after KYC and enroll it in masking. Switch it to extension routing.
- Create an extension when the label is generated:
POST https://voice-api.edesy.in/v1/masking/extensions
{ "target_number": "9876543210", "reference": "AWB1234567890", "label": "Order 58213" }- Print the number and the returned
codeon the label. For a QR, usedial_links[].tel_uri. - Close the code when your shipment status reaches delivered, returned or cancelled, after any grace period you want:
PATCH https://voice-api.edesy.in/v1/masking/extensions/{id}
{ "status": "inactive" }Or delete it. Past call logs keep the code, so you can still audit calls on that shipment.
Label design
| Element | Recommendation |
|---|---|
| Phone field | "Call +91 80XX XXX XXX, code XXXXXXXX#" |
| QR (optional) | tel: link from dial_links; handy for couriers' phones |
| Code length | 8 or more digits if you have many active shipments |
| Recipient name | First name or initials, if your process allows |
| Address | Unchanged; couriers still need it |
If you supply your own codes, make them random. Sequential codes (or codes derived from the AWB) are easy to guess.
Lifecycle rules that work
- Create at label print, not at order time, so cancelled orders don't leave active codes.
- Keep active through out-for-delivery and a short window after delivery for follow-ups.
- Deactivate on delivered, returned to origin or cancelled.
- Reactivate for a re-delivery attempt by setting the status back to active.
Your event webhook receives call.incoming, call.connected, call.missed and call.ended for extension calls,
with the code and your reference. Use them to log delivery contact attempts against the shipment: useful
evidence when a customer says nobody called.
What the courier and recipient hear
The courier hears a prompt to enter the code, then ringback. Wrong codes get up to three attempts. An inactive code plays "This code is not active." The recipient sees an incoming call from the masked number. It helps to tell customers in the order confirmation that the courier may call from that number.
Limits
- One target per code. If the recipient doesn't answer, there is no fallback number.
- The recipient can't call the courier back through the code; they see only the masked number.
- There's no SMS or WhatsApp masking; this is for voice calls.
Costs
| Item | Price (excl. 18% GST) |
|---|---|
| Masked call | Rs 1.50/min, 60-second pulse, 1-minute minimum |
| Billed time | Only after the recipient answers |
| Prompt, ringing, unanswered calls | Not billed |
| Number rental | Rs 499/month (mobile or 92-series), Rs 449 (landline) |
Example: a 1-minute delivery call is Rs 1.50 before GST. One number serves all your active codes; add numbers if you need more simultaneous calls.
More on extension code number masking, the extension codes feature page, number masking pricing, the number masking hub and the number masking docs.