How to fix missing permissions policy on Headless / Custom (I build in code)
Add a Permissions-Policy HTTP response header to your store to explicitly restrict which browser features (camera, microphone, geolocation, etc.) pages and embedded third-party scripts are allowed to access.
Steps for Headless / Custom (I build in code)
- Node.js / Express: Use the 'helmet' npm package — call helmet.permittedCrossDomainPolicies() and manually set the header, or use the permissionsPolicy option. Alternatively: res.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()') in a global middleware.
- Next.js: Add the header in next.config.js under the headers() async function (see Next.js code snippet).
- Nuxt.js: Add the header in nuxt.config.js under routeRules or serverMiddleware, or via the Nitro server config.
- Apache / Nginx at origin: Use the config snippets below.
- CDN edge (Cloudflare Workers, Fastly, Vercel Edge): Inject the header in your edge function's response object.
- Verify with curl -I https://yourdomain.com | grep -i permissions-policy
What is missing permissions policy?
The Permissions-Policy header (formerly called Feature-Policy) is a short line of text your web server sends to every visitor's browser along with each page. It acts as a rulebook that tells the browser exactly which powerful device features — like the camera, microphone, GPS location, payment APIs, and more — your site is allowed to use, and which should be completely blocked. Without it, the browser applies its own default rules, and any third-party script or iframe embedded on your store could potentially request access to those features without your knowledge or consent.
Missing this header is flagged by OWASP as a Security Misconfiguration (A05:2021), meaning auditors, enterprise buyers, and PCI-DSS assessors will mark it as a finding that needs remediation. More practically: any malicious or compromised third-party script — an analytics tag, a chat widget, an ad pixel — could silently attempt to activate a shopper's camera or microphone; a Permissions-Policy header stops that cold. It also signals to Google and to privacy-conscious customers that your store follows security best practices, which protects conversion rates and brand trust. Some browser security warnings and privacy regulations (GDPR, CCPA) are increasingly tied to whether sites take proactive steps to limit unnecessary data collection capabilities.
See the complete Missing permissions policy guide for every platform and the full background.
Not sure if your Headless / Custom (I build in code) store has this?
Run a free SEOLZ scan — we’ll find missing permissions policy and every other issue across your whole site.
Scan my site free