When deploying NFC tags for an IoT project, use this systematic framework to select the optimal tag type and memory capacity.
Step 1: Calculate Required Memory
Base NDEF overhead:
TLV header: 2 bytes
NDEF record header: 3-6 bytes (depends on payload size)
Type field: 1-3 bytes
Terminator TLV: 1 byte
-----------------------------------
Minimum overhead: 7-12 bytes
Common payload sizes:
| Short URL |
20-40 bytes |
https://iot.co/a (prefix-compressed) |
| Full URL |
40-80 bytes |
https://company.com/product/12345 |
| Text (short) |
20-50 bytes |
“Tap to connect to Wi-Fi” |
| vCard contact |
80-150 bytes |
Name, phone, email, company |
| Wi-Fi credentials |
50-100 bytes |
SSID, password, security type |
| Smart Poster |
100-200 bytes |
URL + title + icon reference |
| JSON payload |
100-500 bytes |
Structured device configuration |
Formula:
Required memory = Overhead (12 bytes) + Payload size + Safety margin (20%)
Step 2: Memory Selection Matrix
| NTAG210 |
48 bytes |
100,000 |
$0.15 |
Ultra-short URLs only (e.g., iot.co/x) |
| NTAG213 |
144 bytes |
100,000 |
$0.20 |
Short URLs, simple text |
| NTAG215 |
504 bytes |
100,000 |
$0.35 |
Smart posters, contacts, Wi-Fi |
| NTAG216 |
888 bytes |
100,000 |
$0.50 |
JSON config, multiple records |
| NTAG424 DNA |
416 bytes |
200,000 |
$0.60 |
Secure applications (auth) |
| MIFARE DESFire |
2-8 KB |
500,000 |
$1.50 |
Complex applications, encryption |
Step 3: Application-Specific Selection
Use Case 1: Smart Poster at Bus Stop
Requirements: - URL to real-time bus schedule: https://transit.gov/stop/12345 (32 bytes) - Title text: “Bus 42 Schedule” (17 bytes) - Overhead: 12 bytes - Total: 61 bytes
Decision: NTAG213 (144 bytes) - Provides 2.4× margin, adequate for future URL changes Cost at scale (1000 stops): 1000 × $0.20 = $200
Use Case 2: Home Automation Scene Trigger
Requirements: - Trigger Home Assistant webhook: http://192.168.1.5:8123/api/webhook/abc123 (48 bytes) - No updates needed (one-time write) - Total: 60 bytes
Decision: NTAG213 (144 bytes) - Cheapest option that fits Recommendation: Lock tag after writing to prevent accidental overwrites Cost (10 tags around home): 10 × $0.20 = $2.00
Use Case 3: Product Authentication (Luxury Watches)
Requirements: - Product serial number: 16 bytes - Cryptographic signature verification - Anti-cloning essential - Read by mobile app for authenticity check
Decision: NTAG424 DNA (416 bytes) - Only option with cryptographic authentication Why not NTAG213? Can be trivially cloned, worthless for authentication Cost (10,000 watches/year): 10,000 × $0.60 = $6,000 Value protected: $50M in inventory
Use Case 4: Conference Badge with Multiple Records
Requirements: - Attendee URL: https://conf.io/a/8472 (25 bytes) - Attendee name + company: “Jane Smith, Acme Corp” (25 bytes) - Session schedule JSON: 150 bytes - VIP access flag: 20 bytes - Total: 220 bytes
Decision: NTAG215 (504 bytes) - Provides 2.3× margin for adding sessions during conference Alternative: NTAG216 if multiple sessions need embedding (888 bytes) Cost (2,000 attendees): 2,000 × $0.35 = $700
Use Case 5: Industrial Equipment Maintenance Log
Requirements: - Equipment ID: 20 bytes - Maintenance history (append-only log): 500-800 bytes - Update 50-100 times over 10-year lifespan
Decision: MIFARE DESFire 2K (2048 bytes) Why not NTAG216? Write cycle limit (100,000) OK, but 888 bytes insufficient for 10-year log Cost (500 machines): 500 × $1.50 = $750 Benefit: Eliminates paper logs, integrates with CMMS
Step 4: Write Cycle Considerations
Write cycle limits:
| NTAG213 |
100,000 |
1/day |
274 years |
| NTAG213 |
100,000 |
10/day |
27 years |
| NTAG213 |
100,000 |
100/day |
2.7 years |
| DESFire |
500,000 |
100/day |
13.7 years |
Decision rule:
- Read-mostly (updated <1/month): NTAG213-216 fine
- Occasional updates (1-10/day): NTAG213-216 fine
- Frequent updates (>50/day): Use DESFire or dynamic URL approach
Dynamic URL approach (recommended for frequently changing data):
Instead of updating tag content:
Tag contains: https://api.io/t/8472
Server provides: Real-time data at that URL
Benefits:
- Zero write cycles consumed
- Unlimited updates
- Analytics (track taps)
- Personalization (different data per user)
Tradeoff:
- Requires network connection
- Server dependency
Step 5: Security-Driven Selection
| None (public info) |
NTAG210/213 |
Cost-optimized |
| Write-protect |
NTAG213 with lock |
Prevent tampering |
| Password-protect |
NTAG213/215/216 |
Basic access control |
| Anti-cloning |
NTAG424 DNA |
Cryptographic auth |
| Encryption |
MIFARE DESFire |
AES-128 encrypted storage |
| High-security |
DESFire EV3 |
AES-256, FIPS 140-2 |
Cost vs Security Matrix:
Security Level →
Low Medium High Military
| | | |
$0.20 $0.35 $0.60 $2.50
NTAG213 NTAG216 NTAG424 DESFire EV3
Step 6: Final Checklist
Before purchasing tags, verify:
Common Mistakes to Avoid:
❌ Buying smallest tag to save $0.05 - Then data doesn’t fit ❌ Buying largest tag “just in case” - Wasting 2× on cost for unused memory ❌ Using NTAG213 for access control - Trivially cloneable ❌ Forgetting NDEF overhead - 70-byte payload needs 88-byte tag minimum ❌ Not testing iOS compatibility - Some tags work on Android but not iPhone ❌ Ordering from AliExpress without testing - 30% counterfeit rate for DESFire
Sample Order Strategy:
1. Order 10 samples of your chosen tag type
2. Program with actual NDEF data structure
3. Test on iOS and Android devices
4. Verify memory usage in deployed format
5. Test read range on target surfaces (wood, plastic, glass)
6. If successful, order full quantity
This approach saves money by catching issues before bulk purchase.