Working with Entries
Each entry in BCMS is a single record based on a template.
The structure of an entry depends on the properties defined in its template. These properties appear in the meta
section of every entry. In addition to meta
, each entry includes a content
section for rich text and widgets.
For example, if you have a Blog template, you might define properties like author
, category
, tags
, and publish date
in the meta
. In each entry’s content
, you’ll write the actual blog post and add widgets such as images or code snippets.
BCMS supports nearly 100 languages, allowing you to provide content in multiple locales. Each entry stores both meta
and content
per language.
Creating and editing an entry
To create an entry:
Go to Entries in the side menu.
Select the template you want to use.
Click Create new entry in the top-right corner.
Add content and click Create.
To edit an entry:
Click the entry in the list.
Make changes.
Click Update.

You can also create entries programmatically using the SDK:
await bcms.entry.create('blog', { statuses: [{ lng: 'en', id: 'published' }], meta: [ { lng: 'en', data: { title: 'Hello world', slug: 'hello-world', }, }, ], content: [ { lng: 'en', nodes: [ { type: 'paragraph', children: [{ text: 'This is my first blog post.' }], }, ], }, ], });
as well as update them:
await bcms.entry.update('blog', 'entry_id', { lng: 'en', status: 'draft', meta: { title: 'Updated title', }, content: [ { type: 'paragraph', children: [{ text: 'Updated content goes here.' }], }, ], });
If you need to add a new field like author
, edit the template itself. Learn more in the Templates documentation.
Getting all entries from a template
You can retrieve all entries from a specific template using the SDK. This is useful when rendering a list of blog posts, products, or pages.
const blogPosts = await bcms.entry.getAll('blog');
This returns an array of all entries from the blog
template. You can then filter or sort them as needed, or render their content where you need it.
Duplicating an entry
To duplicate an entry:
Click the three-dot icon next to the Edit button.
Select Duplicate.
This creates a new entry with the same values.

Deleting an entry
To delete an entry:
Click the three-dot icon next to the Edit button.
Select Delete.
Before deleting, check where the entry is used. Deleting it may break links or widgets that depend on it.
Once deleted, entries go to Trash.
You can also delete entries in code:
await bcms.entry.deleteById('entry_id', 'blog');
Setting the entry status
You can assign custom statuses to entries, such as Draft
, Ready for Review
, or Published
. These statuses help you manage content in your codebase - use them to filter entries or control what appears on your website.
To set a status:
Open the entry.
Use the dropdown in the top-right corner to set or remove a status.

You can filter entries by status in code:
const drafts = await bcms.entry.getAllByStatus('blog', 'draft');
Statuses are useful for managing previews, staging environments, and controlling what gets rendered on production.
Rendering entry content on the front end
Each entry has a content
field that stores an array of structured content blocks. Use the <BCMSContentManager />
component to render this content automatically.
In BCMS, the content of each entry can include structured blocks such as paragraphs, headings, images, and widgets. Widgets are reusable components - like image blocks, sliders, testimonials, or videos - that you can define and render dynamically in your frontend.
To render entry content (including widgets) in your website or app, use the <BCMSContentManager />
component provided by @thebcms/components-react
.
Using <BCMSContentManager />
The BCMSContentManager
component takes the content
of an entry and renders each content block correctly: text, media, paragraph, list... or widget. For widgets, you must provide your custom React components using the widgetComponents
prop.
Here’s a minimal, type-safe example of rendering an entry that includes a testimonials
widget:
import { bcms } from '@root/client'; import { BCMSContentManager } from '@thebcms/components-react'; import TestimonialsWidget from '@/components/widgets/testimonials'; export default async function AboutPage() { const page = await bcms.entry.getById('about-us', 'page'); return ( <BCMSContentManager items={page.content.en} clientConfig={bcms.getConfig()} widgetComponents={{ testimonials: TestimonialsWidget, }} /> ); }
This example:
Fetches an entry with slug
about-us
from thepage
template.Renders the parsed
content.en.nodes
field usingBCMSContentManager
.Maps the
testimonials
widget to a custom React component.
If you skip the widgetComponents
prop or forget to handle a widget, BCMS will insert a hidden warning element so it’s easy to catch unhandled widgets, during development.
To learn how to build your own widgets and handle their props, visit the Working with widgets page.