navigator.productSub is a read-only string that returns either "20030107" or "20100101"(MDN). It looks like a date, but treat it as a fixed compatibility token.
Read the notes below before you rely on this property. Prefer feature detection when support is limited.
Syntax
Use navigator.productSub. Start with this line.
JavaScript
navigator.productSub
Call
What it does
navigator.productSub
Primary signature.
Built into the browser. Read navigator.productSub on Navigator — no import required.
Library declarations
JavaScript
navigator.productSub
Parameters
This member has no parameters beyond those shown in the signature.
Return Value
Return Value
Description
*
The current value of navigator.productSub.
JavaScript Examples
Example 1 — Read navigator.productSub
Log the value in the current browser (MDN demo style).
JavaScript
console.log("productSub: " + navigator.productSub);
// e.g. "productSub: 20030107"
Read the property. No arguments — just access navigator.productSub.
Get a string. Typically one of the two MDN tokens.
Looks like a date. Format is YYYYMMDD, but meaning is compatibility.
Read-only. You inspect the value; you do not assign to it.
Example 2 — Classify the Known Tokens
Label the value for learning — without treating it as a browser ID.
JavaScript
const s = navigator.productSub;
let note = "other / unexpected";
if (s === "20030107") note = "Chrome/Safari-style token (MDN)";
if (s === "20100101") note = "Firefox-style token (MDN)";
if (s === undefined) note = "legacy IE-style missing value";
console.log(s);
console.log(note);
console.log("Use for sniffing? false");
20030107
Chrome/Safari-style token (MDN)
Use for sniffing? false
How It Works
Read once. Store productSub in a variable.
Match MDN notes. Map the two known strings to historical families.
Stay humble. Labels are for learning — not production branching.
Close the loop. Explicitly mark sniffing as a bad idea.
Example 3 — Prefer Feature Detection
Test the capability instead of reading date-like tokens.
JavaScript
// ✗ brittle: if (navigator.productSub === "20100101") { … }
// ✓ reliable: test the API
if ("geolocation" in navigator) {
console.log("Geolocation API available");
} else {
console.log("Geolocation API missing");
}
console.log("productSub (info only): " + navigator.productSub);
Geolocation API available
productSub (info only): 20030107
How It Works
Skip sniffing. Tokens can be shared, spoofed, or change.
Test the feature."geolocation" in navigator answers the real question.
Fallback path. Handle missing APIs without guessing the browser.
Optional log. Keep productSub for learning only.
Compatibility
Browser Support
navigator.productSub is Baseline Widely available (MDN: since July 2015). Modern browsers return one of two fixed tokens; legacy IE returned undefined.
✓ Baseline · Widely available
Navigator.productSub
Read-only compatibility string: "20030107" (Chrome/Safari) or "20100101" (Firefox). Useful for learning — not for brand sniffing or dating the browser build.
98%Modern browser support
Google ChromeReturns "20030107"
Full support
Mozilla FirefoxReturns "20100101"
Full support
Apple SafariReturns "20030107"
Full support
Microsoft EdgeChromium-style token
Full support
OperaChromium-style token
Full support
Internet ExplorerReturned undefined (legacy)
Partial
productSubExcellent
Bottom line: Available in modern browsers. Read it for demos; decide features with capability checks, not date-like tokens.
Frequently Asked Questions
MDN: either the string "20030107" or "20100101". Chrome and Safari return "20030107"; Firefox returns "20100101". Internet Explorer returned undefined.
No. MDN marks it Baseline Widely available (since July 2015). It is not Deprecated, Experimental, or Non-standard — but it is a legacy compatibility value, not a useful build date.
Do not. Other browsers may change, spoof, or share similar labels. Prefer feature detection for real capabilities instead of sniffing productSub.
It looks like YYYYMMDD, but treat it as a fixed compatibility token, not a trustworthy product release date.
No. It is a read-only Navigator property. You read it; you do not assign a new value.
product always returns "Gecko" in conforming browsers. productSub returns one of two date-like strings that differ by engine family historically — still not reliable for modern sniffing.