Publishing to your Website


Click Push and your blog appears on your marketing site within seconds — with full SEO, social cards, structured data, and AI-crawler metadata built in.

TL;DR

  • What it is — the one-click handoff between Content Studio and your Lodgestory marketing site. The blog (body, images, metadata) lands on your own domain, indexed by Google and AI search, with all the SEO plumbing set up automatically.
  • Who it's for — content leads who need to understand what "Push" does end-to-end, and marketers who want to know how the site's SEO, Open Graph, structured data, sitemap, RSS, and AI-crawler surfaces are wired.
  • Top outcome — click Push in the editor → the post is live at /resources/blog/<slug> within seconds, fully indexable.

At a glance

Plan tiersBundled with Lodgestory CRM on Growth and above.
Who can use itOwners, Admins, Editors can Push. Owners and Admins configure the publish destination.
What you produceA live, SEO-complete blog post on your marketing site, reachable at /resources/blog/<slug>.
Limits you'll seePush is immediate — no scheduling today. The sitemap, RSS feed, and AI-crawler summary update within about an hour.
APIPublic blog API is partner-facing — five read-only endpoints under /api/public/blogs/*.

How to find it

Push a blog: open a blog in the editor → status dropdown set to ReadyPush button on the toolbar.

Configure your publish destination: settings → brand profile → set the publish URL for your marketing site. Use Test webhook to verify connectivity before your first real publish.

Public pages render on your own domain, not inside Content Studio or the CRM admin. URL pattern: https://<your-domain>/resources/blog (list) and https://<your-domain>/resources/blog/<slug> (detail).

Screenshot [SCREENSHOT: publishing-nav.png — editor toolbar with Push button highlighted; settings page with publish URL field visible]

What is Publishing to CRM?

The problem it solves

A content tool that publishes to its own vendor-hosted subdomain is a trap. You get a backlink to their domain, not yours. Your SEO authority goes to them. Your brand's RSS feed lives at their URL. When you leave the tool, the archive goes with them.

Content Studio avoids this by shipping content to your own marketing site. One click, and the blog is live on your own domain with full SEO, Open Graph, structured data, an up-to-date sitemap, an RSS feed, and an AI-crawler-friendly summary — all of which point to your site, not a vendor subdomain.

What you get

  • One-click publish. Push → live in seconds.
  • Your hosting, your SEO. Public pages render on your domain. Your canonical URL is yours.
  • Idempotent republish. Re-publishing an edited post updates the same page — no ghost duplicates.
  • Fresh content by default. Updates are visible immediately; there's no stale cache to bust.
  • SEO plumbing built in. Open Graph, Twitter summary cards, structured data, canonical URL, and a consistent set of meta tags — all composed automatically from your blog's fields.
  • AI-search ready. Explicit allow-list for AI crawlers; llms.txt summary file; structured data with speakable selectors for voice assistants.
  • Audit trail. Every publish is recorded so you can see what was sent and when.

How it's different

  • Self-hosted public pages. Not a vendor subdomain. Your canonical URL, your site, your SEO.
  • One-button publish with no manual work downstream. No uploading images separately; the post, its images, and its metadata arrive together.
  • Layered SEO. Not just <title> and <meta description> — full structured data with speakable selectors for voice assistants, Open Graph for social cards, a Twitter large-image card, and separate handling for AI crawlers.
  • Feeds for both humans and machines. Sitemap for search engines, RSS for readers, llms.txt for AI crawlers.

Customer scenarios

  1. "First-time publish." Editor → status ReadyPush. Live on your marketing site in about a second.
  2. "Second publish of the same post after edits." Edit in the editor → Save → Push again. The same public URL updates; no duplicate.
  3. "Rolling back a bad publish." Edit the content back to a safe version and publish again. If you need to hide the post entirely, contact support to unpublish.
  4. "Auditing what went where." Every publish is recorded in your audit trail. Ask support for a specific publish's record if needed.

How it fits with the rest of Lodgestory

  • Upstream: Editor (Push button), AI Content Generation (produced the draft), Media Generation (produced the hero image).
  • Downstream: your Lodgestory marketing site renders the page. Sitemap, RSS, and llms.txt pick it up automatically.
  • Adjacent: the Web Chat widget on the marketing page converts blog visitors into CRM contacts.

Screenshot [SCREENSHOT: publishing-public-page.png — published blog rendered at /resources/blog/<slug> with hero, metadata, cross-links]

Core concepts

TermWhat it means
PushThe one-click publish action. No confirmation modal today.
Publish destinationThe URL on your marketing site that receives the publish. Set once per brand profile.
Test webhookA dry-run button that sends a test payload to your publish destination without creating a public page. Confirms connectivity and credentials.
Published statusThe state of a blog that's live on your marketing site.
Canonical URLThe authoritative URL for the blog, used by search engines to de-duplicate. Always on your own domain.
Open GraphThe set of meta tags that control how your blog appears when shared on social platforms (Facebook, LinkedIn).
Twitter cardThe meta tags for Twitter/X previews. Lodgestory uses large-image cards.
Structured dataMachine-readable metadata (schema.org) embedded in the page. Search engines and voice assistants use it. Includes "speakable" selectors telling voice assistants which parts of the page to read aloud.
Sitemap/sitemap.xml on your domain. Lists every published blog for search-engine crawlers.
RSS/feed.xml on your domain. Standard RSS 2.0 feed of the latest 50 blogs, refreshed hourly.
llms.txt/llms.txt on your domain. A Markdown summary of your top content, designed for AI crawlers. Refreshed hourly.
Cross-linkAn internal link from one of your blogs to another. Inserted via the editor's Cross-link button.

Quick Start — publish your first blog

Step 1 — Set your publish destination

Settings → Brand profile → Publish URL. Paste the URL for your Lodgestory marketing site. Save.

Recommended: click Test webhook first. This sends a test payload; you should see a confirmation within a second. The test does not create a public page.

Screenshot [SCREENSHOT: publishing-qs-1-webhook.png]

Step 2 — Open a Ready blog

Dashboard → Blogs → click a row with status Ready.

Step 3 — Click Push

Toolbar → Push. No confirmation modal.

Screenshot [SCREENSHOT: publishing-qs-3-push.png]

Step 4 — Verify the live URL

Wait about a second, then open https://<your-domain>/resources/blog/<slug>. The post renders with all its metadata. Right-click → View page source and look for the <title>, Open Graph tags, and structured data block.

Screenshot [SCREENSHOT: publishing-qs-4-live.png]

Step 5 — Verify indexing surfaces

  • https://<your-domain>/sitemap.xml — the slug should appear.
  • https://<your-domain>/feed.xml — the RSS feed includes the post (may take up to an hour to refresh).
  • https://<your-domain>/llms.txt — the post appears in the top list (may take up to an hour to refresh).

Expected result: the blog's status in Content Studio flips to Published and the published date is set.

How it works

  1. You click Push in the editor.
  2. The blog, its images, and your brand profile metadata (company name, CTA text, CTA URL) are sent to your marketing site together as a single package.
  3. Your marketing site stores the post, replaces any existing images attached to it, and assigns status Published.
  4. The public page is live at /resources/blog/<slug> within seconds. Every request for that URL returns the latest version — there's no stale cache to bust.
  5. The sitemap, RSS feed, and llms.txt pick up the new blog. These refresh once an hour.
  6. Search engines and AI crawlers (Google, ChatGPT, Perplexity, Claude) discover the post through the sitemap and llms.txt, then index it using the Open Graph tags, Twitter card, structured data, and speakable selectors on the page.

Re-pushing an edited blog updates the same page — no duplicate is created. Images attached to the blog replace any previously published images for the same post.

flowchart LR
    A[Editor: Push] --> B[Your marketing site receives the post]
    B --> C[Public page live within seconds]
    C --> D[Sitemap / RSS / llms.txt refresh hourly]
    C --> E[Search engines + AI crawlers index the post]

Features in depth

Push from the editor

Editor → toolbar → Push. Publishes immediately with no confirmation modal. Status flips to Published. The publish date is stamped.

If something fails — bad publish destination, marketing site down, network blip — the editor shows the error details in a toast. Your draft is unchanged and you can retry.

Test webhook

Settings → brand profile → Test webhook. Sends a dry-run payload to your publish destination. Confirms connectivity and credentials. No public page is created.

Why it exists: verify your setup before your first real publish.

Idempotent republish

Push the same blog as many times as you need. Each push replaces the prior version at the same public URL. Images are fully replaced on every publish.

Caveat on slug changes: if you change the slug between publishes, the new slug replaces the old on your marketing site, but the old slug doesn't automatically redirect. If anyone linked to the old URL, they'll hit a 404. Best practice: treat slugs as immutable after the first publish.

Unpublish

No product-level unpublish button today. If you need to hide a post, contact support.

Automatic SEO metadata

Every published blog gets:

  • Title from your blog's title.
  • Description from your meta description (or the summary if meta description isn't set).
  • Keywords from your blog's keywords.
  • Author from the blog's author (defaults to "Lodgestory" if none is set).
  • Canonical URL — always your own domain.
  • Open Graphtype: article, published and modified timestamps, tags, category, and a 1200×630 feature image for social cards.
  • Twitter — large-image summary card with the feature image.

Structured data

Every published blog includes machine-readable metadata in schema.org format:

  • BlogPosting — headline, body summary, word count, category, keywords, published and modified dates, author, publisher, feature image.
  • Speakable — CSS selectors telling voice assistants which parts of the page to read aloud (headline, subheadings, and the blog summary).
  • Breadcrumb — Home → Blog → This Post.

This is what makes your blog eligible for rich results in Google, for voice-assistant summaries, and for appearance in AI-search answers.

Sitemap

https://<your-domain>/sitemap.xml lists every published blog with its slug and last-modified date. Updated automatically as you publish. Includes static pages alongside blogs.

RSS feed

https://<your-domain>/feed.xml serves a standard RSS 2.0 feed of the most recent 50 published blogs. Each entry includes title, summary, publish date, category, author, and the feature image. Refreshed hourly.

llms.txt for AI crawlers

https://<your-domain>/llms.txt is a Markdown summary of your content, designed for AI crawlers like ChatGPT, Perplexity, and Claude. Format:

# <Your site> — overview
...

## Blog posts
- [Title](slug) — summary
...

## Glossary
- Term — definition
...

Top 50 blog posts and top 50 glossary terms, refreshed hourly.

AI-crawler allow-list

The site's crawler directives explicitly allow the major AI crawlers — GPTBot, ChatGPT-User, ClaudeBot, Claude-Web, PerplexityBot, Google-Extended, CCBot — alongside standard search-engine crawlers. Admin paths and internals are explicitly disallowed.

Cross-link lookup

Your marketing site exposes a partner-facing "related blogs by keyword" lookup. Used by the CRM's glossary pages to surface related posts for each term. See the API section for details.

Roles & permissions

ActionOwnerAdminEditorViewer
Configure publish destinationYesYesNoNo
Test webhookYesYesYesNo
Push a blogYesYesYesNo
View public pagesAnyone (no auth)

Connections — cross-module workflows

flowchart LR
    A[Content Studio Editor] --> B[Push]
    B --> C[Your marketing site receives the post]
    C --> D[Public page live]
    C --> E[Sitemap.xml]
    C --> F[Feed.xml]
    C --> G[llms.txt]
    D -->|OG / structured data / Twitter card| H[Google / ChatGPT / Perplexity index]

What this module reads

  • The blog body, images, and metadata from Content Studio.
  • The publish destination URL from your brand profile.

What this module produces

  • A live public page on your marketing site.
  • An up-to-date sitemap, RSS feed, and llms.txt.

Limits you'll see

LimitValue
Push timingTypically live within seconds.
Public page freshnessNo cache — every request returns the latest content.
Sitemap, RSS, and llms.txt refreshWithin about one hour.
Image max size10 MB.
RSS feed entriesLatest 50 blogs.
llms.txt entriesTop 50 blogs and top 50 glossary terms.
Sitemap change frequencyWeekly.

Errors & FAQ

Common situations

SymptomWhat to do
"Push failed. Check your publish destination."Your publish URL is wrong or unreachable. Verify in Settings → Brand profile. Use Test webhook to confirm.
"Push timed out."Your marketing site took too long to respond. Retry; if it persists, contact support.
Push returns success but the page isn't visible.Rare. Contact support — the publish record is preserved for troubleshooting.
Public page returns 404.The blog's status may not be Published, or the slug may have been changed. Check the blog in Content Studio and re-push if needed.
Public page shows stale content.There's no server-side cache. A stale view is almost always a browser cache or your CDN. Hard refresh the page.
Images don't load on the public page.Image hosting or CDN config. Contact support.
RSS feed doesn't show a new post.The hourly refresh may not have happened yet. Wait.
llms.txt doesn't show a new post.Same hourly refresh. Wait.
Author is wrong on the public page.Author defaults to "Lodgestory" if the blog has no author set. Fill in author in Content Studio and re-push.

FAQ

  • How do I unpublish a blog? No product-level unpublish today. Contact support.
  • How do I rename the slug after publishing? Edit in Content Studio → Push. The new slug replaces the old on your marketing site, but the old slug doesn't redirect automatically. Avoid slug changes after the first publish, or contact support for a redirect.
  • Can I schedule a publish? Not today. Push is immediate.
  • Does anyone get notified on publish? No external notifications out of the box. Contact support if you need a Slack or email notification on publish.

API

Lodgestory's marketing site exposes a small public API for partners who want to read your published blogs — for example, to embed the blog list on a third-party site or to wire up a custom search experience. All endpoints are read-only, unauthenticated, and always return blogs that are currently Published.

Base URL: https://<your-domain>/api/public/blogs

List blogs

GET /api/public/blogs

Paginated list. Supports query parameters:

  • category — filter to a single category.
  • tag — filter to posts tagged with the given tag.
  • search — case-insensitive substring match on title and summary.
  • page — page number (default 1).
  • limit — page size (default 20).

Sitemap-ready list

GET /api/public/blogs/sitemap

Returns { slug, updatedAt }[] for every Published blog. Useful for building your own sitemap or index.

Categories

GET /api/public/blogs/categories

Returns distinct categories, alphabetical.

Related blogs by keywords

GET /api/public/blogs/by-keywords?keywords=a,b,c

Returns up to five blogs whose title or keywords match any of the comma-separated terms (case-insensitive substring match). Used by the CRM glossary pages to find related posts for each term.

Tip: keep your keyword lists curated. The substring match is intentionally simple — cms will match inside custom, for example.

Blog detail

GET /api/public/blogs/<slug>

Returns the full blog with all images. Returns null (404-like) if the blog is unpublished or missing.

Changelog

  • Apr 2026 — Public list, sitemap, categories, by-keywords, and detail endpoints.
  • Mar 2026llms.txt endpoint with top 50 blogs and top 50 glossary terms.
  • Mar 2026 — Speakable structured-data for voice assistants.
  • Feb 2026 — Explicit crawler allow-list for GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot.
  • Feb 2026 — RSS 2.0 feed at /feed.xml.
  • Jan 2026 — Idempotent republish keyed to the same post across edits.

Related modules & next steps