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:

  1. Go to Entries in the side menu.

  2. Select the template you want to use.

  3. Click Create new entry in the top-right corner.

  4. Add content and click Create.

To edit an entry:

  1. Click the entry in the list.

  2. Make changes.

  3. Click Update.

5.png

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:

  1. Click the three-dot icon next to the Edit button.

  2. Select Duplicate.

This creates a new entry with the same values.

7.png

Deleting an entry

To delete an entry:

  1. Click the three-dot icon next to the Edit button.

  2. 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:

  1. Open the entry.

  2. Use the dropdown in the top-right corner to set or remove a status.

set-status.jpg

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 the page template.

  • Renders the parsed content.en.nodes field using BCMSContentManager.

  • 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.