15 ting hvert Contentful enterprise-projekt får galt i de første 6 uger
Seks uger inde i hvert Contentful enterprise-build jeg har auditeret, mangler de samme 15 ting. Ingen af dem er spændende. Alle er blokerende. Det her er checklisten du ville ønske din sidste leverandør havde læst.
Sådan bruger du checklisten
Linking & navigation (de stille brydere)
Tre af de dyreste bugs i hvert Contentful enterprise-build er slet ikke bugs — det er manglende primitiver. De ligner content-problemer i de første seks uger, så dukker de op som 404-storme i uge syv.
- 1. Ingen dynamiske link-referencer. Redaktører indsætter hardkodede URL'er i rich text og CTA'er. Refactor en slug, og hvert link til den dør stille. Produktionssvar: en
Link-content-type der refererer target-entryen, ikke en streng. Løst i starteren med en typetlinkReference-resolver på tværs af hver block. - 2. Intet page-hierarki. Sider lever i en flad liste. Ingen parent/child-relation, ingen breadcrumb-udledning, ingen måde at spørge "hvad ligger under /products?". Produktionssvar: et selvrefererende
parent-felt på page-content-typen med dybde-bundet traversering. Løst i starteren via et enkeltgetPageTree(locale)-kald wired ind i nav og breadcrumbs. - 3. Ingen CMS-styret navigation. Header, footer, mega-menu — alt hardkodet ind i komponenter. Marketing vil tilføje et top-level-item; engineering shipper en release. Produktionssvar:
navigationMenu/navigationGroup/navigationItem-content-types med valgfrit mega-menu-medie. Løst i starteren — omstrukturér hele site-navigationen fra Contentful, ingen deploy.
Internationalisering (antagelsen der altid brister)
Hvert Contentful-projekt starter med ét locale og "vi tilføjer flere senere". Senere er altid et seks-ugers sprint, fordi fundamentet skal lande før noget reelt content kan oversættes.
- 4. Ingen locale-fallback-kæde. En dansk entry uden dansk tekst returnerer null i stedet for at falde tilbage til engelsk. Siden renderer tom. Produktionssvar: en fallback-kæde bagt ind i hver CMS-query, hvor fallbacken erklæres pr. locale i kode, ikke pr. felt af redaktører. Løst i starteren — hvert
cmsFetchpåfører kæden transparent. - 5. Ingen lokaliserede slugs. URL'er forbliver engelske på hvert marked. SEO lider i Danmark, Frankrig og Tyskland — exact-match lokal-sproglige slugs er et målbart ranking-signal. Produktionssvar: lokaliserede parent- og child-slug-felter, joinet pr. locale ved build. Løst i starteren med en lokaliseret URL-builder delt af sitemap, hreflang og language-switcheren.
- 6. Ingen CMS-styrede ordbøger. UI-strenge ("Read more", "Submit", "Cookies") lever i JSON-filer. Marketing vil A/B-teste "Få et tilbud" vs "Bed om priser"; engineering shipper en release. Produktionssvar: en
localizedDictionary-content-type med{token}-interpolation. Løst i starteren — hver UI-streng er redigerbar i Contentful.
SEO & redirects (de organiske trafik-dræbere)
SEO-checklisten er ikke spændende. Den er også ikke til forhandling. Hvert hul her koster målbar organisk trafik, og de fleste er usynlige indtil en Search Console-regressionsrapport lander seks måneder inde.
- 7. Ingen redirect-motor. Hver URL-ændring er en engineering-opgave. Marketing venter et sprint på at trække en kampagne-URL tilbage; SEO bløder imens. Produktionssvar: en
redirect-content-type med regex/wildcard-support, evalueret på proxy-edge. Løst i starteren — redaktører shipper et redirect på 30 sekunder, ingen deploy. - 8. Ingen auto slug-change-redirects. Redaktør omdøber en side; den gamle URL dør stille. Produktionssvar: en webhook på entry-update der differ slug-feltet og skriver et redirect-entry automatisk. Løst i starteren — slug-refactors er sikre som default.
- 9. Ingen JSON-LD, hreflang eller llms.txt. Rich results bliver sprunget over, locale-alternatives bliver ignoreret, AI-crawlere får intet. Produktionssvar: per-page JSON-LD, locale-aware
generateMetadatamed hreflang, og en/llms.txt-route med en AI-crawler-policy. Løst i starteren — discoverability på tværs af Google, Bing og LLM-crawlere kommer wired på forhånd.
Editor-oplevelse & cache-disciplin (tillids-dræberne)
Redaktører læser ikke din README. De klikker rundt i tredive sekunder, rammer noget der overrasker dem, og beslutter at CMS'et er i stykker. Tre ting bryder konsekvent de tredive sekunder.
- 10. Ingen Live Preview. Redaktører gemmer, skifter fane, hard-refresher, bander. Produktionssvar: Contentful Live Preview wired end-to-end med
preview-mode-token, draft-fetch og inspector-overlays på hver block. Løst i starteren — preview er på dag ét, ikke måned fire. - 11. Ingen tag-baseret ISR-invalidering. En content-ændring gør enten ingenting eller atombomber hele CDN'et. Produktionssvar:
revalidateTagpå et per-entry-type-tag, dispatchet fra en Contentful-webhook. Løst i starteren — webhooken bliver registreret automatisk vedpnpm setup. - 12. Ingen schema-drevne forms. Forms er hardkodet ind i komponenter. Marketing-kampagner venter på engineering. Produktionssvar: en
form-content-type med et typet field-schema og en enkelt renderer. Løst i starteren — redaktører shipper en ny lead-capture-form på en time, ikke et sprint.
Type-sikkerhed, sikkerhed & DX (den lange-hale-gæld)
De her tre brister ikke i uge seks. De brister i måned ni, når en junior-udvikler shipper en regression ingen fanger fordi kontrakten var implicit. På det tidspunkt er overfladen for stor til at retrofitte billigt.
- 13. Ingen type-sikre content-modeller. Strengt-typet CMS-adgang, runtime-fejl på felt-omdøbninger, nul compile-time-sikkerhed. Produktionssvar:
graphql-codegenmod live CDA-skemaet, regenereret ved hvertpnpm setup-kør, med en drift-detektor der fejler CI når typer og CMS divergerer. Løst i starteren. - 14. Ingen hærdet CSP. En default Next.js-CSP tillader alt; security review skubber den til bunden af backloggen. Produktionssvar: en striks
Content-Security-Policy-header med nonces, låst ned til Contentful, analytics-provideren og form-endpoints. Løst i starteren — passerer Mozilla Observatory A+ på dag ét. - 15. Ingen dokumenteret migrationssti. CMS-skemaet drifter. Seks måneder inde kan ingen spinde et nyt environment op der matcher production. Produktionssvar:
cf:migrate,cf:seed,cf:reset-kommandoer med idempotente migration-scripts tjekket ind i repoet. Løst i starteren — et nyt environment er fem minutter, ikke fem dage.
Selv-score
Vil du have denne slags vurdering på dit projekt?
Jeg læser hver e-mail inden for én arbejdsdag. Tag et projekt, et tilbud eller et system, du sidder fast i.
REST + GraphQL-hybrider til multi-locale CMS-drevne sites
Hvorfor hverken kun REST eller kun GraphQL er det rigtige valg til et enterprise multi-locale CMS-site, og hvordan du splitter efter ansvar i stedet. Inkluderer cirkulære referencer på fulde REST-payloads, bundle-omkostningen ved GraphQL på klienten, beslutningsmatricen pr. kaldsted, den samlede fetcher, granulære cache-tags, blok-som-fragment-mønsteret, locale-fallback i ét round-trip, Live Preview der overlever, Server Actions til CMA-skrivninger, Algolia Sync API-undtagelsen og migrationsrækkefølgen.
CMS-styret analyse: stop med at betale udviklere for hver tracking-ændring
Sådan strukturerer du dit CMS, så marketing kan tilføje tracking-hændelser uden udviklerindblanding. Spar sekscifrede DKK-beløb over sitets levetid.
Dynamiske CMS-links: hvorfor dit 'Link'-felt er en tidsbombe
De fleste CMS-implementeringer lader forfattere indsætte rå URL'er. Den dag, nogen omdøber en slug, 404'er halvdelen af din navigation i stilhed. Modellen der gør det umuligt — med en Contentful-gennemgang.