I just launched a LoRaWAN airtime calculator on this site. If you’re working with LoRa networks, you know that calculating transmission time isn’t exactly straightforward – so I built a tool that does it for you.

Why This Matters

In Europe (EU868), you’re legally required to stay within a 1% duty cycle. That means your device can only transmit for 36 seconds per hour on most channels. Exceed this, and you’re not just breaking regulations – you’re also risking collisions with other devices and potentially getting your gateway access revoked.

Understanding airtime helps you:

  • Stay compliant with regional regulations
  • Optimize battery life (less airtime = less power)
  • Avoid network congestion
  • Plan your transmission intervals properly

The Math Behind It

The airtime calculation isn’t trivial. It depends on several parameters:

Spreading Factor (SF): This is your range vs. speed trade-off. SF12 gives you maximum range but takes forever to transmit. SF7 is fast but won’t reach as far. Every step up in SF doubles your time on air.

Bandwidth (BW): In EU868, you’re typically working with 125 kHz. Higher bandwidth = shorter airtime, but you’re usually locked to 125 kHz anyway.

Coding Rate (CR): Error correction overhead. 4/5 means for every 4 bits of data, you’re sending 5 bits total. More correction = more robust transmission but longer airtime.

Payload Size: Your actual data plus LoRaWAN protocol overhead. Here’s the thing most calculators don’t tell you upfront: LoRaWAN adds 13 bytes of overhead (MHDR, FHDR, FPort, MIC). So if you’re sending 40 bytes of application data, you’re actually transmitting 53 bytes.

The Formula

The calculation has two main parts: preamble time and payload time.

Symbol Duration:

Ts = (2^SF) / BW

For SF12 at 125 kHz, that’s 32.768 ms per symbol.

Preamble Time:

Tpreamble = (npreamble + 4.25) × Ts

Standard LoRaWAN uses 8 preamble symbols.

Payload Symbols:

npayload = 8 + max(ceil((8×PL - 4×SF + 28 + 16×CRC - 20×IH) / (4×(SF - 2×DE))) × (CR + 4), 0)

Where:

  • PL = payload length (including LoRaWAN overhead)
  • CRC = 1 if enabled (usually is)
  • IH = 0 for explicit header (standard)
  • DE = 1 if Low Data Rate Optimization is on (auto-enabled when Ts > 16ms)
  • CR = coding rate (1-4 for 4/5 to 4/8)

Total Time on Air:

ToA = Tpreamble + (npayload × Ts)

Multi-Region Support

The calculator supports three major LoRaWAN regions:

EU868: 1% duty cycle limit. You get 36 seconds per hour per channel.

US915: No duty cycle restrictions, but 400ms dwell time limit per transmission. The US uses frequency hopping across 64 uplink channels instead of duty cycle management.

AS923: Similar to US915 with 400ms dwell time in most countries, though regulations vary by country in the Asia-Pacific region.

Real-World Example

Let’s say you’re sending 40 bytes of sensor data with SF12, BW125, CR 4/5:

  • Application payload: 40 bytes
  • LoRaWAN overhead: +13 bytes
  • Total payload: 53 bytes
  • Time on air: ~2,793 ms

With EU868’s 1% duty cycle, you’d need to wait ~279 seconds (4.6 minutes) before transmitting again. That limits you to about 12 transmissions per hour.

Want to transmit more often? Drop to SF7, and that same payload takes only ~41 ms – letting you transmit every 4 seconds if needed.

Implementation Notes

The calculator is pure JavaScript – no backend needed. It runs entirely in your browser and recalculates in real-time as you adjust parameters. The code follows Semtech’s reference implementation with adjustments for LoRaWAN’s protocol overhead.

If you spot any issues or have suggestions, let me know. The math is solid, but there’s always room for improvement in the UI/UX.

Check it out: LoRaWAN Airtime Calculator

Further Reading