Use this article as a starting point when JSON-LD does not appear in the HTML source after deploying an edge worker, or when you see multiple Schema App data-source prefixes on the same page. It covers quick checks that apply to every CDN, then points you to the right guide for detailed troubleshooting.
For architecture and migration context, see Edge Rendering: What It Is, Why Use It, and How Schema App Delivers It.
TABLE OF CONTENTS
- Quick checks (all CDNs)
- Staging / pre-prod Cloudflare tests
- Staging / pre-prod Akamai tests
- Multiple Schema App sources on one page
- Where to go next
- Contact support
Quick checks (all CDNs)
Edge workers inject markup that already exists on Schema App's data CDN. They do not run the highlighter live at the edge. Before diving into CDN config, confirm:
- Markup is authored in Schema App for the URL.
- Crawler deployment is enabled (Highlighter templates) and crawls have completed.
- Cache is populated — the URL has markup on
data.schemaapp.com(or test/UAT equivalent). - Lookup URL matches — workers use origin + pathname (query/fragment stripped), not
<link rel="canonical">. Check scheme, host (wwwvs apex), and account ID (including sub-accounts for pre-prod). - Worker is deployed and attached to the correct Akamai property or Cloudflare route.
- Migration complete (if switching from JS) —
highlight.jsremoved from production; Robots-Only disabled if previously enabled.
Most common cause of missing markup: no cached data for that URL. Fix cache population first, then troubleshoot CDN config.
Staging / pre-prod Cloudflare tests
When validating Cloudflare SSR on a development or staging hostname (for example development.example.com), use a dedicated Schema App project for that host and prove cache population before debugging Worker variables.
- Separate project for the staging host. Create or use a sub-project whose pagesets/templates target the staging URLs (not production
www). Production cache keys will not match staging hostnames. - Set
SCHEMA_ACCOUNT_IDto the full path afterschemaapp.com/db/. For a sub-project such as…/db/ParentAccount/StagingProject, the Worker variable isParentAccount/StagingProject(not the parent account alone, and not only the short project name unless that is the true account id). - Confirm CDN cache for the staging URL. In Schema App Cache Tester (or Support), look up the exact staging URL under that account. Empty cache means the Worker will fail open and return unmodified HTML — this is expected, not a Cloudflare outage.
- Populate cache with Crawler (recommended). Enable Crawler deployment on the staging templates and wait for crawls to finish. If the staging site’s
robots.txtusesDisallow: /(common on pre-prod), allowlist Schema App’s crawler (SchemaBot) or temporarily relax disallow for the test paths so crawls can complete. Being able to open the page in a browser does not guarantee the crawler has written cache. - Optional short test via JavaScript cache. If you cannot crawl yet, a temporary JavaScript deployment (with
highlight.json the staging pages) can populate the highlighter cache path. Then set CloudflareSCHEMA_FETCH_HIGHLIGHTER_CACHE = "true"for the test only. Prefer switching to Crawler + main cache path for the lasting setup. - Attach the Worker to the staging zone/route (for example
*development.example.com/*). Cloudflare proxy alone does not inject markup. - Test with a matching User-Agent if
SCHEMA_BOTS_ONLY = "true". UseSchemaBotor another token fromSCHEMA_BOT_USER_AGENTS, and enableSCHEMA_DEBUG = truewithwrangler tailto distinguish “no markup in cache” from “pass-through / not a bot”.
For full Cloudflare install steps, see Server Side Rendering — Cloudflare Setup Instructions.
Staging / pre-prod Akamai tests
Akamai Edge SSR on a staging hostname follows the same “prove cache first” rule as Cloudflare. Staging hosts are often locked down with Akamai Access Denied / IP allowlists, so crawls (and Cache Tester generation) can fail even when the EdgeWorker is installed.
- Use a dedicated Schema App sub-project for the staging host (for example
ParentAccount/StagingProject). Pagesets and templates must target the staging URLs; production host cache keys will not match. - Set EdgeWorker variables for the staging property:
PMUSER_SCHEMAAPP_ACCOUNT_ID= full account path (for exampleParentAccount/StagingProject)PMUSER_SCHEMAAPP_CDN_BASE_URL= staging scheme + host only (for examplehttps://stg.example.com) — notdata.schemaapp.com
PMUSER_SCHEMAAPP_PROJECTSinstead (see the Akamai setup guide). - Confirm CDN cache for the exact staging URL in Cache Tester under that account (main path and, if used, Highlighter JS). Empty cache → EdgeWorker fails open and returns origin HTML unchanged. This is expected.
- Open the staging host to Schema App’s crawler before expecting cache. If the staging site returns Access Denied (Akamai 403) to public or SchemaBot requests, Schema App cannot crawl or generate markup for that URL. Ask the customer to allowlist:
- Schema App crawler IP:
52.45.62.191 - SchemaBot User-Agent:
Mozilla/5.0 (compatible; SchemaBot/1.2; +https://www.schemaapp.com/bot/)
- Schema App crawler IP:
- Enable Crawler deployment on the staging templates after access works, then wait for the crawl (or ask Schema App support to kick a single-URL generation once access is confirmed).
- Validate injection with a bot User-Agent once Cache Tester shows JSON-LD. Look for
data-source="SchemaApp-Akamai:…"in View Source. Optionally setPMUSER_SCHEMAAPP_DEBUG=trueand readX-SchemaApp-EW-Status(see the Akamai troubleshooting guide).
Note: Do not spend cycles on EdgeWorker Property Manager rules until Cache Tester returns markup for the staging URL under the staging account ID. Access Denied on the staging host blocks both normal crawls and one-off generation.
For full Akamai install steps, see Server Side Rendering — Akamai Setup Instructions and How-To: Troubleshoot Akamai Integration.
Multiple Schema App sources on one page
In View Source (or a bot User-Agent test), you may see more than one <script type="application/ld+json" data-source="…"> block from Schema App. Common prefixes:
- HighlightCrawl — cached markup from the main data CDN path (typical for Crawler deployment).
- JSCaching — cached markup from the Highlighter JS cache path (
…/__highlighter_js/…). Appears when JavaScript deployment (or “fetch from highlight JS cache”) has populated that path, and the edge worker is configured to fetch the highlighter cache (Cloudflare:SCHEMA_FETCH_HIGHLIGHTER_CACHE = "true"). - HighlightJS — client-side injection from
highlight.jsstill running in the browser (or a bot that executes JavaScript). This is not edge-injected HTML; it appears after the script runs. - Editor — single-URL Editor data items. Expected alongside Highlighter markup when both apply to the same page.
Why HighlightCrawl and JSCaching appear together: The edge worker can inject both CDN paths when highlighter-cache fetch is enabled and both caches have data for the same URL. This is the same pattern seen when a project still has JavaScript-generated cache (or a second pageset) while also using Crawler. Prefer one generation path for SSR.
Recommended end state for edge SSR:
- Highlighter templates on Crawler deployment; confirm crawls populate the main CDN path.
- Edge worker injects from the main cache only (Cloudflare: leave
SCHEMA_FETCH_HIGHLIGHTER_CACHEunset or"false"unless you intentionally need the JS cache path). - Remove
highlight.js/window.schema_highlighterfrom production pages (and related tag-manager tags). - If stale JSCaching remains after switching to Crawler, ask Schema App support/engineering to clear the highlighter-cache objects for the affected templates/URLs (same class of cleanup as dual pageset cases).
Schema App does not recommend combining client-side JavaScript deployment with edge SSR for production. See Can I keep JavaScript deployment with SSR? and the internal CSM guide Switching Customers to Server-Side Rendering.
Bot-only tip (Cloudflare): If SCHEMA_BOTS_ONLY is enabled, test with a User-Agent that is on your SCHEMA_BOT_USER_AGENTS list. Include SchemaBot and your primary search crawlers (for example Googlebot) so validation and production crawlers both receive injection.
Where to go next
| Your situation | Go to |
|---|---|
| Setting up or validating Akamai config | Server Side Rendering — Akamai Setup Instructions (setup, quick reference, troubleshooting) |
Akamai worker runs but markup missing — interpret X-Schemaapp-Ew-Status header value from a bot-emulated request | How-To: Troubleshoot Akamai Integration |
| Staging host Access Denied / empty Cache Tester | Section Staging / pre-prod Akamai tests above; allowlist article 33000260755 |
| Setting up or validating Cloudflare config | Server Side Rendering — Cloudflare Setup Instructions (setup, verifying the worker, troubleshooting) |
Multiple data-source prefixes (HighlightCrawl / JSCaching / HighlightJS) | Section above; then migration checklist in Edge Rendering + CSM switching guide |
Note: Unlike Akamai's default bot-only Property Manager setup, Cloudflare Workers run on attached routes — human visitors may receive injected markup when cache data exists unless SCHEMA_BOTS_ONLY is enabled. This is expected, not a worker failure. See Bot vs human traffic in the Edge Rendering article.Contact support
If you have confirmed cache is populated, the URL and account ID are correct, and the provider troubleshooting guides above do not resolve the issue, contact your Customer Success Manager or Schema App Support.
Helpful details to include:
- Schema App account ID and example URL
- CDN provider (Akamai or Cloudflare) and environment (staging vs production)
- Akamai:
X-Schemaapp-Ew-Statusheader value from a bot-emulated request - Cloudflare:
wrangler tailoutput withSCHEMA_DEBUG = true - Which
data-sourceprefixes you see (HighlightCrawl, JSCaching, HighlightJS, Editor) - Property Manager rule screenshots or Cloudflare route / Worker vars, if available
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article