Page vs Post vs Custom Object — how to choose
How to decide between a Page, a Post, and a Custom Object
SGEN gives you three distinct ways to publish content. Each has its own URL structure, archive behavior, draft handling, and relationship with custom fields. Picking the wrong one creates extra work — a product catalogue built in Blog will fight you at every step; a coffee-origin profile library built in Pages cannot scale to twenty entries without becoming a maintenance burden.
This guide answers the one question you face before clicking Add New anywhere in SGEN: which content type fits this piece of content?
What is this for?
These three content types live side by side in every SGEN site. Each serves a distinct role.
Pages hold evergreen, timeless content that visitors navigate to directly. Your About, Contact, Services, and legal pages all live here. A Page sits at a flat URL you control — /about, /contact, /holiday-gift-guide-2026 — and has no archive of its own. Pages are never grouped by date or category. Visitors find them through your nav or via direct links.
Blog Posts are time-stamped content on a chronological timeline — news, announcements, tutorials, product updates, seasonal stories. Every post lands automatically on the blog archive at /blog/, is grouped into categories, and can collect comments. A post's URL follows the permalink structure you choose in Blog Settings, typically encoding the category and slug: /blog/coffee-origins/apr-2026-ethiopia-yirgacheffe. Posts are built for volume — you expect to add more over time, and older ones age gracefully into the archive.
Custom Object types are structured, repeatable collections. You define a type once — giving it a slug, templates, and a permalink structure — then add as many entries as you like under that type. Each entry gets its own public URL under the type's prefix: /origins/ethiopia-yirgacheffe. Custom Objects are built for shape: every entry shares the same fields, the same URL pattern, and the same SG-Builder template.
The decision tree is short:
- Is the content timeless and standalone — one document at one URL? Page.
- Is it time-stamped and lives on a feed — part of a growing stream of dated stories? Blog Post.
- Is it one entry in a structured collection where every entry has the same fields? Custom Object.
The mock below shows what the SGEN admin sidebar looks like for a site using all three — Pages, Blog, and two Custom Object types registered for a coffee roasting business:
Good use cases
Example 1: your business — "About your business" → Page.
your business needs a page that tells visitors who they are, where they roast, and how to reach them. This content is evergreen — it changes once a year at most. It is a single document, not part of a series. Visitors will find it from the nav, not from a search for recent coffee news.
This is a Page. an editor clicks Pages → Add New, picks Start from scratch, titles it "About your business," and sets Status = Publish. The page lives at yourdomain.com/about. It never appears in any archive or blog feed. It has no category. Its position in the site nav is set manually under Appearance → Menu after publishing — the page does not insert itself into the nav automatically.
Example 2: your business — "Apr 2026 your premium product" → Blog Post.
an editor, your business's head roaster, writes a story about their April 2026 single-origin Ethiopian release — the farm, the tasting notes, the roast profile. This content is time-stamped. It belongs alongside other coffee stories. Six months from now visitors finding it via search will recognise it as an April 2026 piece. It fits the "Coffee Origins" category in your business's blog. It may get comments from enthusiasts.
This is a Blog Post. Ada clicks Blog → Add New, titles it "Apr 2026 your premium product," assigns it to the "Coffee Origins" category, adds tags "Single-Origin" and "Ethiopia," and sets Status = Publish. The post lands at yourdomain.com/blog/coffee-origins/apr-2026-ethiopia-yirgacheffe. It also appears automatically on the blog archive (/blog/) and in the "Coffee Origins" category archive. No extra configuration is needed.
A key difference from Pages: at least one blog category and one tag must exist before you can save a post. If the blog has never been used, go to Blog → Categories and Blog → Tags to create them before starting the first post. (Source: blog/01-create-and-manage-blog-posts.md.)
Example 3: your business — Coffee Origin profiles → Custom Object.
your business sources from 10 distinct origins: your premium product, Kenya AA, Colombia Huila, Guatemala Antigua, and more. Each origin has the same structured data — country, altitude, varietal, processing method, and a tasting-notes field. Each needs its own public page. These are not blog posts (not time-stamped), and they are not standalone Pages (there are 10 of them with the same shape, and more coming each season). your business needs a /origins/ section with an archive and individual detail pages.
This is a Custom Object. your business creates a "Coffee Origins" type with slug origins. They attach a Custom Field group named "Origin Metadata" with fields for country, altitude, varietal, and flavor profile. The 10 entries each get a URL like /origins/ethiopia-yirgacheffe/ and appear on the /origins/ archive. When your business adds an eleventh origin next season, they click Add New in the Origins panel — no template changes needed.
The /origins/ archive renders each origin as a card with its key structured fields. The "Origin Metadata" Custom Field group surfaces country, altitude, varietal, and flavor-profile inputs on every entry's edit screen. your business's content team fills in each entry without touching templates.
What NOT to use this for
Blog posts are sorted by publish date. Products do not have a meaningful chronological order, and the blog archive sorts newest-first — not by name, price, or availability. Use SGEN Ecommerce for purchasable products, or a Custom Object for a non-purchasable structured catalogue.
How this connects to other features
— Custom Fields attach structured author-side inputs to any content type. Pages, Blog, and Custom Objects can all have Custom Field groups assigned to them via the Locations checkboxes in the field group editor. Use Custom Fields when you need consistent structured data on multiple entries of the same type — especially on Custom Objects, where every entry shares the same shape. After a group is published and its Locations are set, authors see the extra fields on every matching edit screen and fill them in per entry. Values render on public pages via the [custom_field name=".."] shortcode. See Create a custom field group.
Before you start
- You are signed in to SGEN as an admin with access to Pages, Blog, and Custom Objects.
- You have a piece of content in mind and know roughly what it is: a standalone document, a time-stamped story, or one entry in a structured collection.
- If you are building a Custom Object type, you have decided on a slug (the URL prefix for all entries of this type). The slug is permanent once entries are published — treat it like a domain name.
- If you are using Custom Objects and need structured fields, you have sketched the field names and types before opening the entry edit screen for the first time. Field name slugs become permanent identifiers once author data exists under them.
- If you are publishing a blog post, at least one category and at least one tag must already exist. Create them under Blog → Categories and Blog → Tags if this is a new blog.
- If you plan to build SG-Builder templates for a Custom Object type, build the templates first and then create the type. If the templates are not ready, create the type as Draft and assign templates later.
Where to go
| Content type | Admin path | Primary action |
|---|---|---|
| Page | Pages → All Pages (/sg-admin/pages/) | Top-right Add New |
| Blog Post | Blog → All Posts (/sg-admin/blog/) | Top-right Add New |
| Custom Object type | Custom Objects (/sg-admin/custom-objects/) | Top-right + Create Type |
| Custom Object entry | [Your Type] → All [Type] (sidebar) | Top-right Add New |
Steps
Before clicking anything, answer these three questions in order:
Question 1: Is this content standalone and timeless? An About page, a Services page, a legal page, a campaign landing page, a Contact page. A single document at a single URL that does not belong to any series and will not age into an archive. If yes: Page.
Question 2: Is this content time-stamped and part of a growing feed? A product update, a how-to post, a company announcement, a seasonal origin story, an event write-up. Content where the publish date is meaningful and the piece belongs in a chronological archive alongside similar content. If yes: Blog Post.
Question 3: Is this content one entry in a structured collection where every entry has the same fields and URL pattern? A team profile, a coffee origin, a wholesale account record, a recipe, an FAQ article, a portfolio project. Multiple entries, same shape. If yes: Custom Object.
A useful tie-breaker: if you only have one entry now but expect more, go with the type that will serve you at scale. One team member today usually means five by next year. A Custom Object handles five with no extra configuration; retrofitting five Pages into a Custom Object later involves recreating each entry manually.
Before creating, confirm that the URL behavior of the content type matches what you need:
| Page | Blog Post | Custom Object | |
|---|---|---|---|
| URL pattern | /your-slug (flat, you set it) | /blog/category/post-slug | /type-slug/entry-slug |
| Auto-archive | None | /blog/ and category archives | /type-slug/ archive |
| Chronological sort | Not applicable | Yes — newest first | No — admin-controlled |
| Category grouping | None | Yes (built-in blog categories) | No — use Custom Fields |
| Custom field support | Yes — via Custom Field groups | Yes — via Custom Field groups | Yes — via Custom Field groups |
| Sitemap inclusion | Yes (when Published) | Yes (when Published) | Yes (when Published) |
| Homepage-capable | Yes — Set as Homepage on any Published Page | No | No |
| Template | Text Editor or SG-Builder | Site blog template | SG-Builder (per type) |
Draft preview caution. Draft Pages return a hard not-found response to any visitor — including logged-in admins — who navigates to the public URL while the page is in Draft status. The admin Preview link (visible on the Pages list row for a Draft page) generates a private preview that only works when you are logged in to the admin. Always use the admin Preview link to share or review draft content. Do not share the raw /yourdomain.com/draft-slug URL with anyone for review purposes, regardless of content type. The same caution applies to Draft Custom Object entries. Blog Post drafts behave slightly differently on the public side — use the admin Preview link for those too.For a Page:
- Go to Pages → All Pages.
- Click Add New (top-right). A modal appears asking how to start.
- Pick Start from scratch for a text page, or Use a template to clone an SG-Builder layout.
- Fill in: Title (required), edit the Permalink slug if needed, add Content, pick a Status, and choose a Template (Text Editor for simple content, SG-Builder for a rich visual layout).
- Optionally tick Is landing page to strip the site header and footer — use this for campaign-only pages, not for nav-linked pages like About.
- Click Create a Page. You land on the Edit screen. The page is immediately live if Status = Publish.
Full walkthrough: Create and manage pages.
For a Blog Post:
- Go to Blog → All Posts.
- Click Add New (top-right).
- Fill in: Title (required), edit the Permalink slug, add Content and optionally an Excerpt (shown on archive cards).
- In the right column, assign at least one Category and at least one Tag — both are required to save.
- Set Status and optionally a Thumbnail (cover image from the Media Library).
- Click Create a Post. The post appears on the blog archive and category archive immediately if Published.
Full walkthrough: Create and manage blog posts.
For a Custom Object type (first time only):
- Go to Custom Objects in the admin sidebar.
- Click + Create Type (top-right).
- Fill in: Title (the type name, e.g. "Coffee Origins"), the Slug auto-fills from the title (edit it directly if needed — this is the URL prefix for every entry).
- Set Items per page (for the archive) and Items per row (for grid layouts).
- Assign SG-Builder templates for Single, Archive, and Loop-Item. If templates are not ready, leave them blank and save as Draft.
- Choose a Permalink structure — "Post name" (
/origins/entry-slug/) is recommended for most types. - Set Status: Publish if the templates are ready, Draft if you need to pre-load entries first.
- Click Create Item. The type appears in the admin sidebar immediately.
Full walkthrough: Create and manage custom object types.
For a Custom Object entry (type already exists):
- Open the type's panel in the sidebar (e.g. Origins → Add New).
- Fill in the title and any Custom Field inputs attached to this type.
- Set Status = Publish when ready.
- Click Create Item. The entry appears on the type's public archive.
For any content type where you need consistent, structured author-side data — country of origin, altitude, tasting notes, author bio, equipment list, event date — attach a Custom Field group.
- Go to Custom Fields in the admin sidebar.
- Click Add New. Name the group.
- Add each field: give it a Label (shown to authors), an internal name (used in the shortcode), and a Type (Text, Number, Select, Textarea, Image, etc.).
- Under Locations, tick the content type where this group should appear: Page, Blog, and/or any Custom Object you have registered.
- Set Status = Publish and click Create Item.
The new fields appear on every matching edit screen immediately. Authors fill them in per entry. Values render on public pages via the [custom_field name=".."] shortcode. Place shortcodes in the post body, an SG-Builder HTML component, or your SG-Builder template:
[custom_field name="origin_country"]
[custom_field name="altitude"]
[custom_field name="varietal"]
[custom_field name="flavor_profile"]The shortcode key is the internal name (the slug you set, e.g. origin_country) — not the field Label. [custom_field name="Origin Country"] does not work.
Full walkthrough: Create a custom field group.
All three content types share the same two-state model: Draft (visible in admin only — public URL returns not-found) and Publish (live and publicly reachable). Pages and Blog Posts also support Private (visible only to logged-in admins on the public side) and Password Protected (public visitors see a password gate).
For Custom Object types specifically: the type's Status controls whether its public archive and all entry URLs are reachable. A Draft type still appears in the admin sidebar so your team can pre-load entries while SG-Builder templates are being built — none of those entries appear to visitors until the type is set to Publish.
The status badges below reflect a site mid-build: Pages and Blog are live; the Origins custom object type is still in Draft while the detail template is being finished. Roasters is published and fully live:
What success looks like
- The piece of content you created is reachable at the correct public URL when its status is Published. Navigating to the URL in a private or incognito window loads the content.
- For Pages: the URL is flat (
/about) and the page does not appear on any blog archive or feed. After publishing, it appears in the Pages admin list with a Published badge. - For Blog Posts: the post appears on the blog archive (
/blog/) and on the assigned category archive, sorted newest-first. The Published badge is visible on the Blog admin list row. - For Custom Objects: the entry appears on the type's archive page (
/origins/), the entry's detail page loads at/origins/entry-slug/, and any Custom Fields attached to the type are visible and fillable on the entry's edit screen. - Custom Fields render their author-entered values on the public page wherever the
[custom_field name=".."]shortcode is placed. - After saving any of the three content types, a green save banner confirms the write was committed. If no banner appears, the save did not register — reload the edit form and try again.
What to do if it does not work
I published a Page but the public URL returns not-found. Open the Edit screen for the page and confirm the Status dropdown shows Publish (not Draft, Private, or Password Protected). If Status is Publish and the URL still returns not-found, try a private or incognito browser window to rule out a browser cache. Adding ?cb=1 to the end of the URL can also bypass some cache layers.
I want to share a draft Page with a client for review but the URL doesn't work. Draft Pages return a hard not-found response on the public URL — that is the intended behavior. To share draft content for review, use the Preview link that appears on the Pages admin list row when a page is in Draft status. The preview is only accessible to users who are logged in to the admin.
My draft Blog Post is returning content instead of a not-found on the public URL. Blog Posts in Draft status currently behave differently from Draft Pages on the public side. Use the Preview link from the Blog admin list to review and share draft posts — do not share or rely on the live domain URL for draft blog content.
My Custom Object archive returns not-found. Confirm the type Status is Publish (not Draft). Also confirm that at least one entry under the type has Status Publish — the archive only lists published entries. A type with no published entries may render an empty page or return not-found depending on the Archive template.
My Custom Fields are not appearing on the edit screen. Open the Custom Field group in Custom Fields and confirm: (1) the correct content type is ticked under Locations — Page, Blog, or the specific Custom Object type by name — and (2) the field group Status is Publish. Draft field groups are hidden from all edit screens.
I chose the wrong content type and want to move content. There is no automatic migration between content types in SGEN. To move content: copy the text from the existing entry, create a new entry of the correct type, paste and fill in the content, set Status = Publish on the new entry, then trash the original. If the original URL has inbound links from other pages or email campaigns, add a Redirect from the old URL to the new one in the Redirects area.
My Custom Object type's slug conflicts with an existing Page slug. SGEN's slug collision check covers Custom Object types against each other, but does not check against the Pages or Blog slug namespace. If you create a Custom Object type with slug about and a Page already exists at /about, routing may behave unpredictably. Use distinct slugs that do not overlap with any existing Page or Blog URL on your site.
The Custom Object sidebar panel appeared but disappeared after a reload. The admin sidebar is cached in the browser session. Hard-reload the admin (Ctrl+Shift+R or Cmd+Shift+R) to pick up newly registered or trashed Custom Object types.
Side-by-side comparison
| Page | Blog Post | Custom Object | |
|---|---|---|---|
| URL pattern | /your-slug (flat) | /blog/category/post-slug | /type-slug/entry-slug |
| Archive | None | /blog/ auto-archive + category archives | /type-slug/ auto-archive |
| Chronological sort | No | Yes — newest first | No |
| Custom field support | Yes | Yes | Yes |
| Sitemap inclusion | Yes (Published) | Yes (Published) | Yes (Published) |
| Draft public URL | Hard not-found | Soft response (use admin preview link) | Hard not-found |
| Admin preview link | Yes | Yes | Yes |
| Homepage-capable | Yes | No | No |
| Template options | Text Editor or SG-Builder | Site blog template | SG-Builder per type |
| Category / taxonomy | No | Yes (built-in) | No — use Custom Fields |
| Designed for | One-off evergreen documents | Time-stamped stories on a feed | Repeatable structured collections |
Citations: pages/01-create-and-manage-pages.md · blog/01-create-and-manage-blog-posts.md · custom-objects/01-create-custom-object-types.md · custom-fields/01-create-a-custom-field-group.md.
