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 tiers | Bundled with Lodgestory CRM on Growth and above. |
| Who can use it | Owners, Admins, Editors can Push. Owners and Admins configure the publish destination. |
| What you produce | A live, SEO-complete blog post on your marketing site, reachable at /resources/blog/<slug>. |
| Limits you'll see | Push is immediate — no scheduling today. The sitemap, RSS feed, and AI-crawler summary update within about an hour. |
| API | Public 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 Ready → Push 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.txtsummary 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.txtfor AI crawlers.
Customer scenarios
- "First-time publish." Editor → status Ready → Push. Live on your marketing site in about a second.
- "Second publish of the same post after edits." Edit in the editor → Save → Push again. The same public URL updates; no duplicate.
- "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.
- "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.txtpick 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
| Term | What it means |
|---|---|
| Push | The one-click publish action. No confirmation modal today. |
| Publish destination | The URL on your marketing site that receives the publish. Set once per brand profile. |
| Test webhook | A dry-run button that sends a test payload to your publish destination without creating a public page. Confirms connectivity and credentials. |
| Published status | The state of a blog that's live on your marketing site. |
| Canonical URL | The authoritative URL for the blog, used by search engines to de-duplicate. Always on your own domain. |
| Open Graph | The set of meta tags that control how your blog appears when shared on social platforms (Facebook, LinkedIn). |
| Twitter card | The meta tags for Twitter/X previews. Lodgestory uses large-image cards. |
| Structured data | Machine-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-link | An 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
- You click Push in the editor.
- 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.
- Your marketing site stores the post, replaces any existing images attached to it, and assigns status Published.
- 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. - The sitemap, RSS feed, and
llms.txtpick up the new blog. These refresh once an hour. - 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 Graph —
type: 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
llms.txt for AI crawlershttps://<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
| Action | Owner | Admin | Editor | Viewer |
|---|---|---|---|---|
| Configure publish destination | Yes | Yes | No | No |
| Test webhook | Yes | Yes | Yes | No |
| Push a blog | Yes | Yes | Yes | No |
| View public pages | Anyone (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
| Limit | Value |
|---|---|
| Push timing | Typically live within seconds. |
| Public page freshness | No cache — every request returns the latest content. |
Sitemap, RSS, and llms.txt refresh | Within about one hour. |
| Image max size | 10 MB. |
| RSS feed entries | Latest 50 blogs. |
llms.txt entries | Top 50 blogs and top 50 glossary terms. |
| Sitemap change frequency | Weekly. |
Errors & FAQ
Common situations
| Symptom | What 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/blogsPaginated 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/sitemapReturns { slug, updatedAt }[] for every Published blog. Useful for building your own sitemap or index.
Categories
GET /api/public/blogs/categoriesReturns distinct categories, alphabetical.
Related blogs by keywords
GET /api/public/blogs/by-keywords?keywords=a,b,cReturns 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 2026 —
llms.txtendpoint 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
- Editor & Composition — where the Push button lives.
- AI Content Generation — produced the draft.
- Media Generation — produced the hero image.
- Sources & Scraping — seeded the draft.
- CRM Hub — the tenancy that hosts your marketing site.
Updated about 3 hours ago