Use this checklist to verify your Lynkow integration covers every feature. Each item links to the detailed guide. Skip items marked (optional) if not needed for your project.
FOR LLMs: This is the master checklist for integrating Lynkow. Follow each step in order. Full documentation at lynkow.com/docs. Machine-readable: /llms.txt and /llms-full.txt.
Reference - This guide is a tutorial. For exhaustive, always-current signatures and field lists, see the auto-generated reference:
SDK: SDK Reference
SDK Integration
1. SDK Setup
Install the SDK:
npm install lynkowCreate shared client in
lib/lynkow.tswithcreateClient({ siteId })Set
NEXT_PUBLIC_LYNKOW_SITE_IDin.env.localConfigure ISR cache:
fetchOptions: { next: { revalidate: 60 } }→ Guide: Quick Start
2. Pages & Site Configuration
Fetch site config with
lynkow.globals.siteConfig()for header/footerRender pages with
lynkow.pages.getBySlug()orgetByPath()Build navigation from
lynkow.pages.list()Handle 404 with
isLynkowError()+notFound()→ Guide: Pages & Site Configuration
3. Blog / Content
List articles with
lynkow.contents.list()+ paginationSingle article page with
lynkow.contents.getBySlug()Render HTML body with
dangerouslySetInnerHTMLDisplay author, categories, tags
Featured images with
featuredImageVariants(responsive) → Guide: Build a Blog with Next.js
4. Categories & Tags
Category pages with
lynkow.categories.getBySlug()Category tree with
lynkow.categories.tree()Tag filtering with
lynkow.contents.list({ tag: 'slug' })→ Guide: Build a Blog with Next.js
5. Catch-all Routes & Path Resolution
Implement
app/[...slug]/page.tsxwithlynkow.paths.resolve()Use
isContentResolve()/isCategoryResolve()type guardsStatic generation with
lynkow.paths.list()ingenerateStaticParams()Handle redirections with
lynkow.paths.matchRedirect()in middleware → Guide: Catch-all Routes & Path Resolution
6. Dynamic Forms
Fetch form schema with
lynkow.forms.getBySlug()Render fields dynamically from
form.schemaClient-side validation from
field.validationSubmit with
lynkow.forms.submit()(honeypot is automatic)Handle success vs pending (double opt-in)
(optional) reCAPTCHA v3 integration if
form.recaptchaEnabledConfigure Preview URL for localhost development (avoids 403) → Guide: Dynamic Forms
7. Customer Reviews
List reviews with
lynkow.reviews.list()Display star ratings and author info
Submit reviews with
lynkow.reviews.submit()Handle moderation (pending vs approved)
Check settings with
lynkow.reviews.settings()→ Guide: Customer Reviews
8. Media & Image Optimization
Use
featuredImageVariantspresets (thumbnail, card, medium, content, hero, og)Build responsive images with
lynkow.media.srcset()Single transforms with
lynkow.media.transform()(optional) Custom Next.js Image loader
(optional) Blur placeholder with tiny transform → Guide: Media & Image Optimization
9. Multi-language (optional)
Set default locale in client config
Per-request locale override:
{ locale: 'fr' }Build locale switcher from
content.structuredData.alternatesGenerate hreflang tags
Static generation per locale with
paths.list({ locale })(optional) Next.js middleware for locale detection → Guide: Multi-language (i18n)
10. Structured Content (optional)
Detect structured content:
content.customData !== nullFetch category schema for field type info
Render richtext fields with
dangerouslySetInnerHTMLHandle image, select, array, object field types → Guide: Structured Content
11. SEO — Meta Tags & Structured Data
generateMetadata()withmetaTitle,metaDescription,keywordsOpen Graph:
ogImage,ogImageVariantsCanonical URLs:
canonicalUrlwith fallbackJSON-LD: inject
content.structuredData.article.jsonLdFAQ JSON-LD: inject
content.structuredData.faq.jsonLdif present → Guide: SEO & Analytics (sections 1-4)
12. SEO — Sitemap, Robots, LLMs
XML Sitemap:
app/sitemap.xml/route.tswithlynkow.seo.sitemap()Robots.txt:
app/robots.txt/route.tswithlynkow.seo.robots()llms.txt:
app/llms.txt/route.tswithlynkow.seo.llmsTxt()llms-full.txt:
app/llms-full.txt/route.tswithlynkow.seo.llmsFullTxt()Per-article Markdown:
.mdroute withlynkow.seo.getMarkdown()Add
<link rel="alternate" href="/llms.txt">in layout<head>→ Guides: SEO & Analytics (sections 5-7) + LLM-Ready Content
13. Analytics
Initialize tracker:
lynkow.analytics.init()Track SPA navigation:
lynkow.analytics.trackPageview({ path })(optional) Custom events:
lynkow.analytics.trackEvent()GDPR: If EU site, do NOT init without consent — see step 14 → Guide: SEO & Analytics (sections 8-9)
14. GDPR Cookie Consent
Show consent banner:
lynkow.consent.show()Conditional analytics: disable until consent granted
Listen for changes:
lynkow.on('consent-changed', cb)Enable/disable tracking based on
categories.analytics(optional) Custom consent UI with
acceptAll(),rejectAll(),setCategories()→ Guide: SEO & Analytics (section 10)
15. Webhooks & Cache Revalidation
Create webhook in admin: Settings > Webhooks
Implement
app/api/revalidate/route.tshandlerVerify HMAC-SHA256 signature
Map events to
revalidatePath()/revalidateTag()Handle: content.published, content.updated, content.deleted, site_block.published → Guide: Webhooks & Cache Revalidation
16. Error Handling
Use
isLynkowError()type guard in catch blocksNOT_FOUND →
notFound()in Next.jsRATE_LIMITED → exponential backoff retry
VALIDATION_ERROR → display field errors from
details[](optional) React Error Boundary → Guide: Error Handling & Resilience
17. Visual Editor (optional)
Configure CSP headers:
frame-ancestors 'self' https://app.lynkow.comAdd
<LynkowVisualEditor cmsOrigin="...">provider in layoutMark editable fields with
data-lynkow-blockanddata-lynkow-fieldUse
useBlockData()hook for live previewSet Preview URL in admin: Settings > Site → Guide: Visual Editor
18. Draft Preview (optional)
Create preview entry route:
app/api/preview/route.tsCreate exit route:
app/api/preview/exit/route.tsFetch draft content via V1 API with Bearer token
Use
draftMode().isEnabledto branch rendering → Guide: Draft Preview
19. Search (optional)
Server-side:
lynkow.search.query('term')Client-side: autocomplete component
Expose search endpoint for LLMs → Guide: Instant Search
Commerce (optional)
Commerce endpoints need a publishable key in addition to the siteId. Copy it from the admin (Settings > Site Settings), it has the form lkw_pk_ followed by 24 characters, and pass it once to the client. Every commerce call the client makes then carries it:
const lynkow = createClient({ siteId, publishableKey: 'lkw_pk_...' })A commerce call sent without the key throws a LynkowError with code UNAUTHORIZED. Skip this whole section if your site does not sell or take bookings.
20. Commerce: Product Catalog (optional)
List products with
lynkow.products.list({ page, limit, kind, collection, category, search, sortBy, sortOrder })(paginated: readsdata+meta)Product page with
lynkow.products.getBySlug(idOrSlug)(accepts a slug or aprod_...id); mapNOT_FOUNDtonotFound()Display price from
priceCents / 100withcurrencyAccessible gallery from
product.gallery(carriesalt/caption), fall back totitlewhenaltis nullVariants from
product.variants(each carries its ownpriceCents); empty array means the product-level price is the selling priceCollections with
lynkow.productCollections.list(), thenproducts.list({ collection: slug })for a collection pageCategory tree with
lynkow.productCategories.tree()(nesting via each node'schildren; a parent slug also matches its sub-categories) → Guide: Product Catalog
21. Commerce: Reservations (optional)
Find bookable products with
lynkow.products.list({ kind: 'bookable' })(optional) List formulas with
lynkow.reservations.offerings(idOrSlug); when the array is non-empty,offeringIdbecomes required downstreamCheck open slots with
lynkow.reservations.availability(idOrSlug, { from, to, offeringId? })(datesYYYY-MM-DD, never cached)(optional) Let the buyer pick a resource with
lynkow.reservations.resources(idOrSlug); empty array means auto-assign, render no pickerCreate the booking with
lynkow.reservations.bookings.create(idOrSlug, { startsAt, partySize, guestName, guestEmail, offeringId?, resourceId? }); no account needed, returnsconfirmedimmediatelyOn
VALIDATION_ERROR(422), the slot may have filled after your availability read: re-fetch slots and let the buyer pick againHandle the auto anti-spam timing: a booking sent too fast throws
TOO_MANY_REQUESTS, one sent more than ~1 hour aftercreateClientthrowsBAD_REQUESTPayment is taken on site by default. Do NOT wire a checkout redirect into the default booking flow
(optional, per-site) Online deposit: use
lynkow.reservations.book()+lynkow.reservations.refreshPayment()ONLY when the deposit capability is enabled for your site (bookings.create()throwsCONFLICTon a deposit product) → Guide: Reservations and Deposits
22. Commerce: Customer Accounts (optional)
Two-step signup:
lynkow.customers.register({ email }), thenlynkow.customers.activation.confirm({ token, password, acceptsTerms, ... })from the emailed linkShow ONE uniform message on
register; never branch the UI on its outcome (that re-creates the account-enumeration signal the API removed)Login with
lynkow.customers.login({ email, password })Persist the returned
tokenyourself (e.g. an HttpOnly cookie) and seed it back viacreateClient({ customerToken }); the SDK holds it in memory onlyCurrent buyer and their bookings with
lynkow.customers.me()Logout with
lynkow.customers.logout(), orlogout({ everywhere: true })to revoke every server-side session(optional) Address book:
lynkow.customers.addresses.{create,list,update,remove}(optional) Marketing consent:
lynkow.customers.marketingConsent.{list,update}(opt-out always wins)(optional) Forgotten password:
lynkow.customers.passwordReset.{request,confirm}→ Guide: Customer Accounts
Admin Configuration Checklist
These steps are done in the Lynkow admin dashboard, not in code.
Site Setup
Site created with correct domain
Preview URL set (Settings > Site) — required for forms, reviews, visual editor, and localhost development
API Token created (Settings > API Tokens) — for webhooks and draft preview
Content
At least one category created
Site Blocks created (header, footer, pages)
Blog articles published
SEO
Sitemap settings configured (Settings > SEO)
Robots.txt rules set
llms.txt enabled with site description
(optional) Sitemap sources added for multi-site setup (Settings > SEO > Sitemap > External Sitemaps)
(optional) Redirections configured for URL changes (Settings > SEO > Redirects)
Analytics & Consent
Analytics enabled
Consent mode set: opt-in for EU sites, opt-out for non-EU
Cookie consent categories configured (necessary, analytics, marketing)
(optional) Third-party scripts assigned to consent categories
Webhooks
Webhook URL configured pointing to your
/api/revalidateendpointWebhook secret set for HMAC-SHA256 verification
Events selected: content.published, content.updated, content.deleted
Visual Editor
Preview URL set correctly (Settings > Site)
Site Blocks have schemas matching your
data-lynkow-blockslugs
Commerce (optional)
Publishable key copied from Settings > Site Settings (
lkw_pk_...) into your app configProducts published (standard and/or bookable)
For reservations: bookable products have offerings, availability windows, and any resource pool configured
Customer accounts enabled if buyers need to sign in and see their bookings
Online deposit / payment left OFF unless that capability is enabled for your site