Video Playlists in Bricks

A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

What You Can Build Today

  • A video post template with one tracked player for the current video.
  • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
  • Rows that link to the other videos in the same lesson, module, or course.
  • Active row styling with {brm_active}.
  • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
  • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
  • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

Recommended Content Structure

For a playlist-style course, model the content as real posts all the way down:

Course -> Module -> Lesson -> Video

The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

  • Course is the top-level product or learning path.
  • Module groups related lessons.
  • Lesson can be the learning topic, notes, assignment, transcript, or overview.
  • Video is the actual tracked media item that the player opens.

This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

Before You Start

  • Enable Progress Tracking if video completion should count toward course or lesson progress.
  • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
  • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
  • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
  • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

Pattern 1: Video Post Template

This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

Why This Is the Cleanest Pattern

  • The main player uses Video source context: Current post.
  • Watch-state writes belong to the current video post automatically.
  • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
  • {brm_active} can highlight the current video row.
  • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

Step 1: Add a Video Source to Each Video Post

Edit each video post and add the BricksMembers video fields:

  • BRM Video for the source URL, provider ID, or supported embed source.
  • Video Duration for playlist duration labels and learning-time totals.
  • Video Image for the player poster and playlist thumbnail.
  • Video Title when the media title should differ from the post title.
  • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

Step 2: Create the Bricks Single Template

  1. Open Bricks -> Templates.
  2. Create a new single template for the video post type or video structure level.
  3. Set the template conditions so it applies only to your video posts.
  4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

Step 3: Add the Main BRM Video Player

  1. Add the BRM Video element in the main player area.
  2. Set Video source context to Current post.
  3. Choose the display mode: Direct embed, Click to load, or Lightbox.
  4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
Shows the recommended video playlist structure from the tutorial.

Step 4: Add the Playlist Query Loop

Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

  1. Add a Block, Div, or Container for one playlist row.
  2. Enable Use Query Loop on that row.
  3. Set the query type to Posts.
  4. Set Post Type to the actual video post type or video structure level slug.
  5. Set Order By to Menu Order, and use ASC.
  6. Enable the BricksMembers boundary and access filters described below.

If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

Step 5: Choose the Correct Structure Boundary

Open the query loop settings and use the BricksMembers controls.

Playlist scopeUse this setup
Videos in the current lessonWithin Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post type
Videos in the current moduleWithin Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post type
Videos in the current courseWithin Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post type
Child videos on a lesson templateWithin Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post type

For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

Step 6: Add Access, Drip, and Progress Filters

The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

ControlGood defaultWhen to change it
Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

Step 7: Design the Playlist Row

Inside the playlist row loop, add the row content you want. Common pieces are:

  • Title: use Video Playlists in Bricks or {brm_video:title}.
  • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
  • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
  • Duration: use {brm_video:duration} for the direct video duration.
  • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
  • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
  • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

{brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

Step 8: Add Main Video Details

Above or below the main player, add the current video details with normal Bricks dynamic data:

  • Video Playlists in Bricks for the current video title.
  • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

    That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

    This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

    If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

    What You Can Build Today

    • A video post template with one tracked player for the current video.
    • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
    • Rows that link to the other videos in the same lesson, module, or course.
    • Active row styling with {brm_active}.
    • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
    • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
    • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

    The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

    Recommended Content Structure

    For a playlist-style course, model the content as real posts all the way down:

    Course -> Module -> Lesson -> Video

    The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

    • Course is the top-level product or learning path.
    • Module groups related lessons.
    • Lesson can be the learning topic, notes, assignment, transcript, or overview.
    • Video is the actual tracked media item that the player opens.

    This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

    Before You Start

    • Enable Progress Tracking if video completion should count toward course or lesson progress.
    • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
    • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
    • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
    • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

    If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

    Pattern 1: Video Post Template

    This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

    Why This Is the Cleanest Pattern

    • The main player uses Video source context: Current post.
    • Watch-state writes belong to the current video post automatically.
    • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
    • {brm_active} can highlight the current video row.
    • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

    No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

    Step 1: Add a Video Source to Each Video Post

    Edit each video post and add the BricksMembers video fields:

    • BRM Video for the source URL, provider ID, or supported embed source.
    • Video Duration for playlist duration labels and learning-time totals.
    • Video Image for the player poster and playlist thumbnail.
    • Video Title when the media title should differ from the post title.
    • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

    Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

    Step 2: Create the Bricks Single Template

    1. Open Bricks -> Templates.
    2. Create a new single template for the video post type or video structure level.
    3. Set the template conditions so it applies only to your video posts.
    4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

    A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

    Step 3: Add the Main BRM Video Player

    1. Add the BRM Video element in the main player area.
    2. Set Video source context to Current post.
    3. Choose the display mode: Direct embed, Click to load, or Lightbox.
    4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

    Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

    Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
    Shows the recommended video playlist structure from the tutorial.

    Step 4: Add the Playlist Query Loop

    Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

    1. Add a Block, Div, or Container for one playlist row.
    2. Enable Use Query Loop on that row.
    3. Set the query type to Posts.
    4. Set Post Type to the actual video post type or video structure level slug.
    5. Set Order By to Menu Order, and use ASC.
    6. Enable the BricksMembers boundary and access filters described below.

    If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

    Step 5: Choose the Correct Structure Boundary

    Open the query loop settings and use the BricksMembers controls.

    Playlist scopeUse this setup
    Videos in the current lessonWithin Structure Boundary: enabled
    Boundary Level: Parent Level
    Post Type: your video post type
    Videos in the current moduleWithin Structure Boundary: enabled
    Boundary Level: the module level, such as Level 2, depending on your structure
    Post Type: your video post type
    Videos in the current courseWithin Structure Boundary: enabled
    Boundary Level: Top Level
    Post Type: your video post type
    Child videos on a lesson templateWithin Structure Boundary: enabled
    Boundary Level: Current
    Post Type: your video post type

    For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

    If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

    Step 6: Add Access, Drip, and Progress Filters

    The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

    ControlGood defaultWhen to change it
    Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
    DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
    ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
    Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

    For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

    Step 7: Design the Playlist Row

    Inside the playlist row loop, add the row content you want. Common pieces are:

    • Title: use Video Playlists in Bricks or {brm_video:title}.
    • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
    • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
    • Duration: use {brm_video:duration} for the direct video duration.
    • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
    • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
    • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

    Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

    brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

    {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

    Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

    Step 8: Add Main Video Details

    Above or below the main player, add the current video details with normal Bricks dynamic data:

    • Video Playlists in Bricks for the current video title.
    • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

      That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

      This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

      If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

      What You Can Build Today

      • A video post template with one tracked player for the current video.
      • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
      • Rows that link to the other videos in the same lesson, module, or course.
      • Active row styling with {brm_active}.
      • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
      • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
      • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

      The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

      Recommended Content Structure

      For a playlist-style course, model the content as real posts all the way down:

      Course -> Module -> Lesson -> Video

      The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

      • Course is the top-level product or learning path.
      • Module groups related lessons.
      • Lesson can be the learning topic, notes, assignment, transcript, or overview.
      • Video is the actual tracked media item that the player opens.

      This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

      Before You Start

      • Enable Progress Tracking if video completion should count toward course or lesson progress.
      • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
      • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
      • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
      • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

      If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

      Pattern 1: Video Post Template

      This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

      Why This Is the Cleanest Pattern

      • The main player uses Video source context: Current post.
      • Watch-state writes belong to the current video post automatically.
      • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
      • {brm_active} can highlight the current video row.
      • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

      No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

      Step 1: Add a Video Source to Each Video Post

      Edit each video post and add the BricksMembers video fields:

      • BRM Video for the source URL, provider ID, or supported embed source.
      • Video Duration for playlist duration labels and learning-time totals.
      • Video Image for the player poster and playlist thumbnail.
      • Video Title when the media title should differ from the post title.
      • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

      Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

      Step 2: Create the Bricks Single Template

      1. Open Bricks -> Templates.
      2. Create a new single template for the video post type or video structure level.
      3. Set the template conditions so it applies only to your video posts.
      4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

      A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

      Step 3: Add the Main BRM Video Player

      1. Add the BRM Video element in the main player area.
      2. Set Video source context to Current post.
      3. Choose the display mode: Direct embed, Click to load, or Lightbox.
      4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

      Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

      Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
      Shows the recommended video playlist structure from the tutorial.

      Step 4: Add the Playlist Query Loop

      Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

      1. Add a Block, Div, or Container for one playlist row.
      2. Enable Use Query Loop on that row.
      3. Set the query type to Posts.
      4. Set Post Type to the actual video post type or video structure level slug.
      5. Set Order By to Menu Order, and use ASC.
      6. Enable the BricksMembers boundary and access filters described below.

      If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

      Step 5: Choose the Correct Structure Boundary

      Open the query loop settings and use the BricksMembers controls.

      Playlist scopeUse this setup
      Videos in the current lessonWithin Structure Boundary: enabled
      Boundary Level: Parent Level
      Post Type: your video post type
      Videos in the current moduleWithin Structure Boundary: enabled
      Boundary Level: the module level, such as Level 2, depending on your structure
      Post Type: your video post type
      Videos in the current courseWithin Structure Boundary: enabled
      Boundary Level: Top Level
      Post Type: your video post type
      Child videos on a lesson templateWithin Structure Boundary: enabled
      Boundary Level: Current
      Post Type: your video post type

      For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

      If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

      Step 6: Add Access, Drip, and Progress Filters

      The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

      ControlGood defaultWhen to change it
      Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
      DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
      ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
      Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

      For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

      Step 7: Design the Playlist Row

      Inside the playlist row loop, add the row content you want. Common pieces are:

      • Title: use Video Playlists in Bricks or {brm_video:title}.
      • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
      • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
      • Duration: use {brm_video:duration} for the direct video duration.
      • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
      • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
      • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

      Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

      brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

      {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

      Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

      Step 8: Add Main Video Details

      Above or below the main player, add the current video details with normal Bricks dynamic data:

      • Video Playlists in Bricks for the current video title.
      • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

        That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

        This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

        If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

        What You Can Build Today

        • A video post template with one tracked player for the current video.
        • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
        • Rows that link to the other videos in the same lesson, module, or course.
        • Active row styling with {brm_active}.
        • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
        • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
        • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

        The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

        Recommended Content Structure

        For a playlist-style course, model the content as real posts all the way down:

        Course -> Module -> Lesson -> Video

        The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

        • Course is the top-level product or learning path.
        • Module groups related lessons.
        • Lesson can be the learning topic, notes, assignment, transcript, or overview.
        • Video is the actual tracked media item that the player opens.

        This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

        Before You Start

        • Enable Progress Tracking if video completion should count toward course or lesson progress.
        • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
        • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
        • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
        • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

        If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

        Pattern 1: Video Post Template

        This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

        Why This Is the Cleanest Pattern

        • The main player uses Video source context: Current post.
        • Watch-state writes belong to the current video post automatically.
        • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
        • {brm_active} can highlight the current video row.
        • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

        No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

        Step 1: Add a Video Source to Each Video Post

        Edit each video post and add the BricksMembers video fields:

        • BRM Video for the source URL, provider ID, or supported embed source.
        • Video Duration for playlist duration labels and learning-time totals.
        • Video Image for the player poster and playlist thumbnail.
        • Video Title when the media title should differ from the post title.
        • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

        Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

        Step 2: Create the Bricks Single Template

        1. Open Bricks -> Templates.
        2. Create a new single template for the video post type or video structure level.
        3. Set the template conditions so it applies only to your video posts.
        4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

        A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

        Step 3: Add the Main BRM Video Player

        1. Add the BRM Video element in the main player area.
        2. Set Video source context to Current post.
        3. Choose the display mode: Direct embed, Click to load, or Lightbox.
        4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

        Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

        Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
        Shows the recommended video playlist structure from the tutorial.

        Step 4: Add the Playlist Query Loop

        Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

        1. Add a Block, Div, or Container for one playlist row.
        2. Enable Use Query Loop on that row.
        3. Set the query type to Posts.
        4. Set Post Type to the actual video post type or video structure level slug.
        5. Set Order By to Menu Order, and use ASC.
        6. Enable the BricksMembers boundary and access filters described below.

        If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

        Step 5: Choose the Correct Structure Boundary

        Open the query loop settings and use the BricksMembers controls.

        Playlist scopeUse this setup
        Videos in the current lessonWithin Structure Boundary: enabled
        Boundary Level: Parent Level
        Post Type: your video post type
        Videos in the current moduleWithin Structure Boundary: enabled
        Boundary Level: the module level, such as Level 2, depending on your structure
        Post Type: your video post type
        Videos in the current courseWithin Structure Boundary: enabled
        Boundary Level: Top Level
        Post Type: your video post type
        Child videos on a lesson templateWithin Structure Boundary: enabled
        Boundary Level: Current
        Post Type: your video post type

        For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

        If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

        Step 6: Add Access, Drip, and Progress Filters

        The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

        ControlGood defaultWhen to change it
        Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
        DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
        ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
        Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

        For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

        Step 7: Design the Playlist Row

        Inside the playlist row loop, add the row content you want. Common pieces are:

        • Title: use Video Playlists in Bricks or {brm_video:title}.
        • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
        • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
        • Duration: use {brm_video:duration} for the direct video duration.
        • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
        • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
        • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

        Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

        brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

        {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

        Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

        Step 8: Add Main Video Details

        Above or below the main player, add the current video details with normal Bricks dynamic data:

        • Video Playlists in Bricks for the current video title.
        • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

          That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

          This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

          If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

          What You Can Build Today

          • A video post template with one tracked player for the current video.
          • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
          • Rows that link to the other videos in the same lesson, module, or course.
          • Active row styling with {brm_active}.
          • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
          • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
          • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

          The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

          Recommended Content Structure

          For a playlist-style course, model the content as real posts all the way down:

          Course -> Module -> Lesson -> Video

          The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

          • Course is the top-level product or learning path.
          • Module groups related lessons.
          • Lesson can be the learning topic, notes, assignment, transcript, or overview.
          • Video is the actual tracked media item that the player opens.

          This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

          Before You Start

          • Enable Progress Tracking if video completion should count toward course or lesson progress.
          • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
          • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
          • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
          • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

          If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

          Pattern 1: Video Post Template

          This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

          Why This Is the Cleanest Pattern

          • The main player uses Video source context: Current post.
          • Watch-state writes belong to the current video post automatically.
          • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
          • {brm_active} can highlight the current video row.
          • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

          No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

          Step 1: Add a Video Source to Each Video Post

          Edit each video post and add the BricksMembers video fields:

          • BRM Video for the source URL, provider ID, or supported embed source.
          • Video Duration for playlist duration labels and learning-time totals.
          • Video Image for the player poster and playlist thumbnail.
          • Video Title when the media title should differ from the post title.
          • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

          Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

          Step 2: Create the Bricks Single Template

          1. Open Bricks -> Templates.
          2. Create a new single template for the video post type or video structure level.
          3. Set the template conditions so it applies only to your video posts.
          4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

          A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

          Step 3: Add the Main BRM Video Player

          1. Add the BRM Video element in the main player area.
          2. Set Video source context to Current post.
          3. Choose the display mode: Direct embed, Click to load, or Lightbox.
          4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

          Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

          Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
          Shows the recommended video playlist structure from the tutorial.

          Step 4: Add the Playlist Query Loop

          Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

          1. Add a Block, Div, or Container for one playlist row.
          2. Enable Use Query Loop on that row.
          3. Set the query type to Posts.
          4. Set Post Type to the actual video post type or video structure level slug.
          5. Set Order By to Menu Order, and use ASC.
          6. Enable the BricksMembers boundary and access filters described below.

          If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

          Step 5: Choose the Correct Structure Boundary

          Open the query loop settings and use the BricksMembers controls.

          Playlist scopeUse this setup
          Videos in the current lessonWithin Structure Boundary: enabled
          Boundary Level: Parent Level
          Post Type: your video post type
          Videos in the current moduleWithin Structure Boundary: enabled
          Boundary Level: the module level, such as Level 2, depending on your structure
          Post Type: your video post type
          Videos in the current courseWithin Structure Boundary: enabled
          Boundary Level: Top Level
          Post Type: your video post type
          Child videos on a lesson templateWithin Structure Boundary: enabled
          Boundary Level: Current
          Post Type: your video post type

          For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

          If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

          Step 6: Add Access, Drip, and Progress Filters

          The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

          ControlGood defaultWhen to change it
          Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
          DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
          ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
          Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

          For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

          Step 7: Design the Playlist Row

          Inside the playlist row loop, add the row content you want. Common pieces are:

          • Title: use Video Playlists in Bricks or {brm_video:title}.
          • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
          • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
          • Duration: use {brm_video:duration} for the direct video duration.
          • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
          • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
          • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

          Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

          brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

          {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

          Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

          Step 8: Add Main Video Details

          Above or below the main player, add the current video details with normal Bricks dynamic data:

          • Video Playlists in Bricks for the current video title.
          • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

            That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

            This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

            If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

            What You Can Build Today

            • A video post template with one tracked player for the current video.
            • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
            • Rows that link to the other videos in the same lesson, module, or course.
            • Active row styling with {brm_active}.
            • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
            • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
            • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

            The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

            Recommended Content Structure

            For a playlist-style course, model the content as real posts all the way down:

            Course -> Module -> Lesson -> Video

            The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

            • Course is the top-level product or learning path.
            • Module groups related lessons.
            • Lesson can be the learning topic, notes, assignment, transcript, or overview.
            • Video is the actual tracked media item that the player opens.

            This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

            Before You Start

            • Enable Progress Tracking if video completion should count toward course or lesson progress.
            • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
            • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
            • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
            • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

            If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

            Pattern 1: Video Post Template

            This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

            Why This Is the Cleanest Pattern

            • The main player uses Video source context: Current post.
            • Watch-state writes belong to the current video post automatically.
            • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
            • {brm_active} can highlight the current video row.
            • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

            No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

            Step 1: Add a Video Source to Each Video Post

            Edit each video post and add the BricksMembers video fields:

            • BRM Video for the source URL, provider ID, or supported embed source.
            • Video Duration for playlist duration labels and learning-time totals.
            • Video Image for the player poster and playlist thumbnail.
            • Video Title when the media title should differ from the post title.
            • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

            Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

            Step 2: Create the Bricks Single Template

            1. Open Bricks -> Templates.
            2. Create a new single template for the video post type or video structure level.
            3. Set the template conditions so it applies only to your video posts.
            4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

            A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

            Step 3: Add the Main BRM Video Player

            1. Add the BRM Video element in the main player area.
            2. Set Video source context to Current post.
            3. Choose the display mode: Direct embed, Click to load, or Lightbox.
            4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

            Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

            Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
            Shows the recommended video playlist structure from the tutorial.

            Step 4: Add the Playlist Query Loop

            Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

            1. Add a Block, Div, or Container for one playlist row.
            2. Enable Use Query Loop on that row.
            3. Set the query type to Posts.
            4. Set Post Type to the actual video post type or video structure level slug.
            5. Set Order By to Menu Order, and use ASC.
            6. Enable the BricksMembers boundary and access filters described below.

            If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

            Step 5: Choose the Correct Structure Boundary

            Open the query loop settings and use the BricksMembers controls.

            Playlist scopeUse this setup
            Videos in the current lessonWithin Structure Boundary: enabled
            Boundary Level: Parent Level
            Post Type: your video post type
            Videos in the current moduleWithin Structure Boundary: enabled
            Boundary Level: the module level, such as Level 2, depending on your structure
            Post Type: your video post type
            Videos in the current courseWithin Structure Boundary: enabled
            Boundary Level: Top Level
            Post Type: your video post type
            Child videos on a lesson templateWithin Structure Boundary: enabled
            Boundary Level: Current
            Post Type: your video post type

            For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

            If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

            Step 6: Add Access, Drip, and Progress Filters

            The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

            ControlGood defaultWhen to change it
            Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
            DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
            ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
            Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

            For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

            Step 7: Design the Playlist Row

            Inside the playlist row loop, add the row content you want. Common pieces are:

            • Title: use Video Playlists in Bricks or {brm_video:title}.
            • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
            • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
            • Duration: use {brm_video:duration} for the direct video duration.
            • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
            • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
            • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

            Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

            brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

            {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

            Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

            Step 8: Add Main Video Details

            Above or below the main player, add the current video details with normal Bricks dynamic data:

            • Video Playlists in Bricks for the current video title.
            • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

              That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

              This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

              If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

              What You Can Build Today

              • A video post template with one tracked player for the current video.
              • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
              • Rows that link to the other videos in the same lesson, module, or course.
              • Active row styling with {brm_active}.
              • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
              • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
              • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

              The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

              Recommended Content Structure

              For a playlist-style course, model the content as real posts all the way down:

              Course -> Module -> Lesson -> Video

              The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

              • Course is the top-level product or learning path.
              • Module groups related lessons.
              • Lesson can be the learning topic, notes, assignment, transcript, or overview.
              • Video is the actual tracked media item that the player opens.

              This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

              Before You Start

              • Enable Progress Tracking if video completion should count toward course or lesson progress.
              • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
              • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
              • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
              • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

              If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

              Pattern 1: Video Post Template

              This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

              Why This Is the Cleanest Pattern

              • The main player uses Video source context: Current post.
              • Watch-state writes belong to the current video post automatically.
              • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
              • {brm_active} can highlight the current video row.
              • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

              No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

              Step 1: Add a Video Source to Each Video Post

              Edit each video post and add the BricksMembers video fields:

              • BRM Video for the source URL, provider ID, or supported embed source.
              • Video Duration for playlist duration labels and learning-time totals.
              • Video Image for the player poster and playlist thumbnail.
              • Video Title when the media title should differ from the post title.
              • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

              Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

              Step 2: Create the Bricks Single Template

              1. Open Bricks -> Templates.
              2. Create a new single template for the video post type or video structure level.
              3. Set the template conditions so it applies only to your video posts.
              4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

              A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

              Step 3: Add the Main BRM Video Player

              1. Add the BRM Video element in the main player area.
              2. Set Video source context to Current post.
              3. Choose the display mode: Direct embed, Click to load, or Lightbox.
              4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

              Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

              Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
              Shows the recommended video playlist structure from the tutorial.

              Step 4: Add the Playlist Query Loop

              Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

              1. Add a Block, Div, or Container for one playlist row.
              2. Enable Use Query Loop on that row.
              3. Set the query type to Posts.
              4. Set Post Type to the actual video post type or video structure level slug.
              5. Set Order By to Menu Order, and use ASC.
              6. Enable the BricksMembers boundary and access filters described below.

              If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

              Step 5: Choose the Correct Structure Boundary

              Open the query loop settings and use the BricksMembers controls.

              Playlist scopeUse this setup
              Videos in the current lessonWithin Structure Boundary: enabled
              Boundary Level: Parent Level
              Post Type: your video post type
              Videos in the current moduleWithin Structure Boundary: enabled
              Boundary Level: the module level, such as Level 2, depending on your structure
              Post Type: your video post type
              Videos in the current courseWithin Structure Boundary: enabled
              Boundary Level: Top Level
              Post Type: your video post type
              Child videos on a lesson templateWithin Structure Boundary: enabled
              Boundary Level: Current
              Post Type: your video post type

              For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

              If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

              Step 6: Add Access, Drip, and Progress Filters

              The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

              ControlGood defaultWhen to change it
              Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
              DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
              ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
              Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

              For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

              Step 7: Design the Playlist Row

              Inside the playlist row loop, add the row content you want. Common pieces are:

              • Title: use Video Playlists in Bricks or {brm_video:title}.
              • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
              • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
              • Duration: use {brm_video:duration} for the direct video duration.
              • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
              • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
              • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

              Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

              brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

              {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

              Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

              Step 8: Add Main Video Details

              Above or below the main player, add the current video details with normal Bricks dynamic data:

              • Video Playlists in Bricks for the current video title.
              • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

                That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

                This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

                If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

                What You Can Build Today

                • A video post template with one tracked player for the current video.
                • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
                • Rows that link to the other videos in the same lesson, module, or course.
                • Active row styling with {brm_active}.
                • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
                • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
                • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

                The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

                Recommended Content Structure

                For a playlist-style course, model the content as real posts all the way down:

                Course -> Module -> Lesson -> Video

                The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

                • Course is the top-level product or learning path.
                • Module groups related lessons.
                • Lesson can be the learning topic, notes, assignment, transcript, or overview.
                • Video is the actual tracked media item that the player opens.

                This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

                Before You Start

                • Enable Progress Tracking if video completion should count toward course or lesson progress.
                • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
                • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
                • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
                • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

                If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

                Pattern 1: Video Post Template

                This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

                Why This Is the Cleanest Pattern

                • The main player uses Video source context: Current post.
                • Watch-state writes belong to the current video post automatically.
                • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
                • {brm_active} can highlight the current video row.
                • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

                No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

                Step 1: Add a Video Source to Each Video Post

                Edit each video post and add the BricksMembers video fields:

                • BRM Video for the source URL, provider ID, or supported embed source.
                • Video Duration for playlist duration labels and learning-time totals.
                • Video Image for the player poster and playlist thumbnail.
                • Video Title when the media title should differ from the post title.
                • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

                Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

                Step 2: Create the Bricks Single Template

                1. Open Bricks -> Templates.
                2. Create a new single template for the video post type or video structure level.
                3. Set the template conditions so it applies only to your video posts.
                4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

                A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

                Step 3: Add the Main BRM Video Player

                1. Add the BRM Video element in the main player area.
                2. Set Video source context to Current post.
                3. Choose the display mode: Direct embed, Click to load, or Lightbox.
                4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

                Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

                Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
                Shows the recommended video playlist structure from the tutorial.

                Step 4: Add the Playlist Query Loop

                Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

                1. Add a Block, Div, or Container for one playlist row.
                2. Enable Use Query Loop on that row.
                3. Set the query type to Posts.
                4. Set Post Type to the actual video post type or video structure level slug.
                5. Set Order By to Menu Order, and use ASC.
                6. Enable the BricksMembers boundary and access filters described below.

                If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

                Step 5: Choose the Correct Structure Boundary

                Open the query loop settings and use the BricksMembers controls.

                Playlist scopeUse this setup
                Videos in the current lessonWithin Structure Boundary: enabled
                Boundary Level: Parent Level
                Post Type: your video post type
                Videos in the current moduleWithin Structure Boundary: enabled
                Boundary Level: the module level, such as Level 2, depending on your structure
                Post Type: your video post type
                Videos in the current courseWithin Structure Boundary: enabled
                Boundary Level: Top Level
                Post Type: your video post type
                Child videos on a lesson templateWithin Structure Boundary: enabled
                Boundary Level: Current
                Post Type: your video post type

                For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

                If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

                Step 6: Add Access, Drip, and Progress Filters

                The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

                ControlGood defaultWhen to change it
                Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
                DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
                ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
                Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

                For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

                Step 7: Design the Playlist Row

                Inside the playlist row loop, add the row content you want. Common pieces are:

                • Title: use Video Playlists in Bricks or {brm_video:title}.
                • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
                • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
                • Duration: use {brm_video:duration} for the direct video duration.
                • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
                • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
                • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

                Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

                brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

                {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

                Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

                Step 8: Add Main Video Details

                Above or below the main player, add the current video details with normal Bricks dynamic data:

                • Video Playlists in Bricks for the current video title.
                • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

                  That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

                  This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

                  If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

                  What You Can Build Today

                  • A video post template with one tracked player for the current video.
                  • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
                  • Rows that link to the other videos in the same lesson, module, or course.
                  • Active row styling with {brm_active}.
                  • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
                  • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
                  • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

                  The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

                  Recommended Content Structure

                  For a playlist-style course, model the content as real posts all the way down:

                  Course -> Module -> Lesson -> Video

                  The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

                  • Course is the top-level product or learning path.
                  • Module groups related lessons.
                  • Lesson can be the learning topic, notes, assignment, transcript, or overview.
                  • Video is the actual tracked media item that the player opens.

                  This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

                  Before You Start

                  • Enable Progress Tracking if video completion should count toward course or lesson progress.
                  • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
                  • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
                  • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
                  • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

                  If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

                  Pattern 1: Video Post Template

                  This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

                  Why This Is the Cleanest Pattern

                  • The main player uses Video source context: Current post.
                  • Watch-state writes belong to the current video post automatically.
                  • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
                  • {brm_active} can highlight the current video row.
                  • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

                  No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

                  Step 1: Add a Video Source to Each Video Post

                  Edit each video post and add the BricksMembers video fields:

                  • BRM Video for the source URL, provider ID, or supported embed source.
                  • Video Duration for playlist duration labels and learning-time totals.
                  • Video Image for the player poster and playlist thumbnail.
                  • Video Title when the media title should differ from the post title.
                  • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

                  Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

                  Step 2: Create the Bricks Single Template

                  1. Open Bricks -> Templates.
                  2. Create a new single template for the video post type or video structure level.
                  3. Set the template conditions so it applies only to your video posts.
                  4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

                  A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

                  Step 3: Add the Main BRM Video Player

                  1. Add the BRM Video element in the main player area.
                  2. Set Video source context to Current post.
                  3. Choose the display mode: Direct embed, Click to load, or Lightbox.
                  4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

                  Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

                  Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
                  Shows the recommended video playlist structure from the tutorial.

                  Step 4: Add the Playlist Query Loop

                  Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

                  1. Add a Block, Div, or Container for one playlist row.
                  2. Enable Use Query Loop on that row.
                  3. Set the query type to Posts.
                  4. Set Post Type to the actual video post type or video structure level slug.
                  5. Set Order By to Menu Order, and use ASC.
                  6. Enable the BricksMembers boundary and access filters described below.

                  If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

                  Step 5: Choose the Correct Structure Boundary

                  Open the query loop settings and use the BricksMembers controls.

                  Playlist scopeUse this setup
                  Videos in the current lessonWithin Structure Boundary: enabled
                  Boundary Level: Parent Level
                  Post Type: your video post type
                  Videos in the current moduleWithin Structure Boundary: enabled
                  Boundary Level: the module level, such as Level 2, depending on your structure
                  Post Type: your video post type
                  Videos in the current courseWithin Structure Boundary: enabled
                  Boundary Level: Top Level
                  Post Type: your video post type
                  Child videos on a lesson templateWithin Structure Boundary: enabled
                  Boundary Level: Current
                  Post Type: your video post type

                  For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

                  If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

                  Step 6: Add Access, Drip, and Progress Filters

                  The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

                  ControlGood defaultWhen to change it
                  Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
                  DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
                  ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
                  Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

                  For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

                  Step 7: Design the Playlist Row

                  Inside the playlist row loop, add the row content you want. Common pieces are:

                  • Title: use Video Playlists in Bricks or {brm_video:title}.
                  • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
                  • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
                  • Duration: use {brm_video:duration} for the direct video duration.
                  • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
                  • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
                  • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

                  Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

                  brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

                  {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

                  Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

                  Step 8: Add Main Video Details

                  Above or below the main player, add the current video details with normal Bricks dynamic data:

                  • Video Playlists in Bricks for the current video title.
                  • A real course video playlist in Bricks does not need a separate playlist plugin. The clean BricksMembers setup is one main BRM Video player for the current video post, plus a Bricks Query Loop beside or below it that lists the other video posts in the same course, module, or lesson boundary.

                    That distinction matters. Putting a BRM Video element inside every query-loop row can be useful for video cards or inline galleries, but it is not the normal playlist-player pattern. For a playlist, the loop is the navigation. The player is the current video.

                    This guide shows the recommended native setup first: a Video post template with one tracked player and one playlist query loop. It also explains the lesson-template variation, where a lesson page lists child videos, and what would require custom AJAX or a future native helper.

                    If you need the background setup first, keep these guides open: Content Structures, Video Tracking and the BRM Video Element, Query Loop Filters, and the Dynamic Tags Reference.

                    What You Can Build Today

                    • A video post template with one tracked player for the current video.
                    • A playlist sidebar, list, grid, accordion, or slider built with a Bricks Query Loop.
                    • Rows that link to the other videos in the same lesson, module, or course.
                    • Active row styling with {brm_active}.
                    • Completion, watched, resume, locked, and unlocked indicators with BricksMembers tags and conditions.
                    • Access-aware and drip-aware playlist rows using BricksMembers Query Loop controls.
                    • Immediate threshold reactions from the BRM Video element, plus video-end auto-advance and previous/next behavior through Video Tracking and the BricksMembers structure navigation runtime.

                    The only part that is not a simple native Bricks-only setup today is this: keeping the visitor on a lesson URL while clicking child video rows and swapping one central tracked BRM Video player to a different child video post without navigating. That can be done safely only if the selected video is rendered server-side with the correct BricksMembers watch token, access checks, and post context. Do not solve that by only changing an iframe source in JavaScript, because that bypasses the BricksMembers video runtime.

                    Recommended Content Structure

                    For a playlist-style course, model the content as real posts all the way down:

                    Course -> Module -> Lesson -> Video

                    The exact names and slugs depend on your BricksMembers structure. The important part is that the Video item is a real post or real structure level item, not just a file hidden inside a parent layout. Each video post can then own its own video source, watch state, completion state, access rules, drip state, and permalink.

                    • Course is the top-level product or learning path.
                    • Module groups related lessons.
                    • Lesson can be the learning topic, notes, assignment, transcript, or overview.
                    • Video is the actual tracked media item that the player opens.

                    This structure makes playlists straightforward: the current video post powers the player, and the playlist query loop lists sibling video posts inside the same structure boundary.

                    Before You Start

                    • Enable Progress Tracking if video completion should count toward course or lesson progress.
                    • Enable Video Tracking so the BRM Video element can save watch percentage, threshold state, resume position, and completion events.
                    • Use the always-available BRM Post Navigation element or tags such as {brm_structure:next_item:url}, {brm_structure:next_item:link}, {brm_structure:previous_item:url}, and {brm_structure:previous_item:link} if you want previous/next links.
                    • Enable Drip Content only if some videos should remain locked until a date, delay, prerequisite, or parent unlock rule is satisfied.
                    • Create a BricksMembers content structure where the video items have a stable parent relationship to the lesson, module, or course they belong to.

                    If your structure level slug is video, query that post type in Bricks. If you named the level differently, use your actual registered post type slug. Do not guess a brm_ prefix unless your site really registered the post type that way.

                    Pattern 1: Video Post Template

                    This is the recommended setup for most sites. Each video has its own URL, and one Bricks single template renders every video post. The template contains the main player and the playlist list.

                    Why This Is the Cleanest Pattern

                    • The main player uses Video source context: Current post.
                    • Watch-state writes belong to the current video post automatically.
                    • Clicking a playlist row opens another video post, so the template re-renders with the correct player source and tracking context.
                    • {brm_active} can highlight the current video row.
                    • Access, drip, completion, and progress filters stay inside normal Bricks Query Loop controls.

                    No custom JavaScript is needed for the normal playlist experience. The browser navigates to the selected video post, and BricksMembers renders the correct tracked player for that post.

                    Step 1: Add a Video Source to Each Video Post

                    Edit each video post and add the BricksMembers video fields:

                    • BRM Video for the source URL, provider ID, or supported embed source.
                    • Video Duration for playlist duration labels and learning-time totals.
                    • Video Image for the player poster and playlist thumbnail.
                    • Video Title when the media title should differ from the post title.
                    • Video Chapters and Video Text Tracks JSON if the lesson uses chapters or captions.

                    Set any per-post Video Tracking overrides if one video needs a different required watch percentage, completion mode, or next-navigation behavior than your global defaults.

                    Step 2: Create the Bricks Single Template

                    1. Open Bricks -> Templates.
                    2. Create a new single template for the video post type or video structure level.
                    3. Set the template conditions so it applies only to your video posts.
                    4. Create a two-column layout, a media-plus-sidebar layout, or a stacked mobile layout.

                    A typical desktop layout has the player on the left and the playlist on the right. On mobile, stack the player first and the playlist underneath.

                    Step 3: Add the Main BRM Video Player

                    1. Add the BRM Video element in the main player area.
                    2. Set Video source context to Current post.
                    3. Choose the display mode: Direct embed, Click to load, or Lightbox.
                    4. Configure the placeholder, overlay, resume prompt, Events -> After Video Threshold Reached, and player controls.

                    Keep this player outside the playlist query loop. It should represent the current video post, not every row in the playlist.

                    Video Playlist Player Outside Loop in BricksMembers 64 Video Playlists
                    Shows the recommended video playlist structure from the tutorial.

                    Step 4: Add the Playlist Query Loop

                    Add a playlist wrapper for layout, then put the query loop on the repeated playlist row or card itself. In Bricks terms, the row is the repeated item. The outer sidebar or grid is only the layout container.

                    1. Add a Block, Div, or Container for one playlist row.
                    2. Enable Use Query Loop on that row.
                    3. Set the query type to Posts.
                    4. Set Post Type to the actual video post type or video structure level slug.
                    5. Set Order By to Menu Order, and use ASC.
                    6. Enable the BricksMembers boundary and access filters described below.

                    If you use pagination, AJAX pagination, load more, or live query filters, keep Bricks’ loop comments intact. Bricks uses those frontend comments for AJAX pagination, query filters, load more, and infinite scroll.

                    Step 5: Choose the Correct Structure Boundary

                    Open the query loop settings and use the BricksMembers controls.

                    Playlist scopeUse this setup
                    Videos in the current lessonWithin Structure Boundary: enabled
                    Boundary Level: Parent Level
                    Post Type: your video post type
                    Videos in the current moduleWithin Structure Boundary: enabled
                    Boundary Level: the module level, such as Level 2, depending on your structure
                    Post Type: your video post type
                    Videos in the current courseWithin Structure Boundary: enabled
                    Boundary Level: Top Level
                    Post Type: your video post type
                    Child videos on a lesson templateWithin Structure Boundary: enabled
                    Boundary Level: Current
                    Post Type: your video post type

                    For the recommended video post template, Parent Level is usually the right playlist boundary when the current video’s direct parent is the lesson. It lists the other videos under that same lesson. Use Top Level when you intentionally want the playlist to include every video in the course.

                    If you want a grouped playlist, use nested loops: module rows first, lesson rows inside the current module, and video rows inside the current lesson. Do not try to fake a grouped course outline with one flat loop if the design needs real module and lesson sections.

                    Step 6: Add Access, Drip, and Progress Filters

                    The playlist should usually reflect what the learner can actually open. Use these BricksMembers controls on the playlist row query loop:

                    ControlGood defaultWhen to change it
                    Matches Required Level(s)Match + EmptyUse Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists.
                    DripUnlockedLeave Off if you want locked rows to remain visible. Use Locked for a separate “Coming soon” list. Use Ancestor Unlocked or Ancestor Locked when the parent course/module drip status should decide the row.
                    ProgressOffUse Not Completed for an “Up next” list. Use Completed for a watched/completed list. Use Progress at least or Progress below only when you want aggregate Progress Tracking percentage filtering. This is not the same as the BRM Video watch threshold.
                    Order ByMenu Order, ASCUse Continue Learning Activity only for dashboard-style loops where recent activity matters more than the authored structure order. Use another native Bricks order only when the playlist is intentionally not structure-ordered.

                    For a full playlist, keep Progress off so completed videos stay visible. A playlist is usually a navigation surface, not only a “not completed” list.

                    Step 7: Design the Playlist Row

                    Inside the playlist row loop, add the row content you want. Common pieces are:

                    • Title: use {post_title} or {brm_video:title}.
                    • Link: set the row or button link to https://bricksmembers.com/docs/video-playlists-in-bricks/.
                    • Thumbnail: use {brm_video:image} in an Image element. Use {brm_video:image:url} only in raw URL fields.
                    • Duration: use {brm_video:duration} for the direct video duration.
                    • Watch percent: use {brm_video_watch:percent} for logged-in learner rows. In a video-post loop, the tag resolves against the loop item video post.
                    • Done indicator: use {brm_video_watch:any_completed} or the {brm_completed} class tag, depending on whether your indicator should accept video watch, manual progress completion, or both.
                    • Resume indicator: use {brm_video_watch:resume_available} and {brm_video_watch:last_position} where appropriate.

                    Add class-style tags in the row’s CSS class field so Bricks can style states per loop item:

                    brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

                    {brm_active} outputs brm-active when the loop item matches the current post or a parent in the current structure. That gives you the active playlist item without needing a custom playlist element. {brm_completed} and {brm_unlocked} can be used for finished and available states.

                    Then style those classes in Bricks or your theme CSS. For example, use a stronger border or background on .brm-active, a checkmark on .brm-completed, and a disabled style for rows that are not unlocked.

                    Step 8: Add Main Video Details

                    Above or below the main player, add the current video details with normal Bricks dynamic data:

                    • {post_title} for the current video title.
                    • {post_content} or the Bricks Post Content element for the current video body, notes, or transcript.
                    • {brm_video:duration} for the current video’s duration.
                    • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

                    Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

                    If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

                    Step 9: Configure Threshold Actions and Auto-Advance

                    There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

                    First configure the player in Bricks:

                    1. Select the main BRM Video element, not the playlist row.
                    2. Open Content -> Events.
                    3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
                    4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
                    5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
                    6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
                    7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

                    Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

                    1. Open BricksMembers -> Video Tracking.
                    2. In General, set the global Required Playback Percent and Completion Mode.
                    3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
                    4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
                    5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
                    6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

                    In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

                    Pattern 2: Lesson Template With Child Videos

                    Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

                    What Works Natively

                    On a lesson template, you can build a query loop of the child video posts:

                    Post Type: your video post type
                    Within Structure Boundary: enabled
                    Boundary Level: Current
                    Matches Required Level(s): Match + Empty
                    Drip: Unlocked or Off
                    Order By: Menu Order
                    Order: ASC

                    This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

                    The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

                    What Does Not Work as a Pure Bricks Setup

                    A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

                    A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

                    Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

                    Safe Advanced Version

                    If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

                    1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
                    2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
                    3. The server validates access, drip, and playback permissions for that selected video.
                    4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
                    5. The frontend swaps the returned player markup into the central player shell.

                    That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

                    When an Inline Loop Player Still Makes Sense

                    There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

                    • A grid of preview videos.
                    • A related videos section where every card can play independently.
                    • A compact library where inline playback is the design, not one central playlist player.

                    In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

                    Common Layout Recipes

                    Same-Lesson Playlist

                    Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

                    Template: Single Video
                    Main player: BRM Video, Current post
                    Playlist query post type: your video post type
                    Within Structure Boundary: enabled
                    Boundary Level: Parent Level
                    Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
                    Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

                    Module Playlist

                    Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

                    Template: Single Video
                    Main player: BRM Video, Current post
                    Playlist query post type: your video post type
                    Within Structure Boundary: enabled
                    Boundary Level: Level 2 or your module level
                    Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
                    Order By: Menu Order
                    Order: ASC

                    Course-Wide Playlist

                    Use this when the right sidebar should behave like a full course video outline.

                    Template: Single Video
                    Main player: BRM Video, Current post
                    Playlist query post type: your video post type
                    Within Structure Boundary: enabled
                    Boundary Level: Top Level
                    Matches Required Level(s): Match + Empty
                    Drip: Unlocked, or Off if locked videos should remain visible
                    Order By: Menu Order
                    Order: ASC

                    If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

                    Troubleshooting

                    The Main Player Does Not Change

                    Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

                    Tracking Writes to the Lesson Instead of the Video

                    The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

                    The Playlist Shows Videos From the Wrong Course

                    Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

                    The Active Row Does Not Highlight

                    Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

                    The Watch Threshold Is Reached but the Page Does Not Update

                    Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

                    The Video Ends but the Next Video Does Not Open

                    Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

                    Completed Videos Disappear

                    Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

                    Locked Videos Are Clickable

                    Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

                    The Loop Breaks AJAX Pagination or Filters

                    Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

                    Should BricksMembers Add a Native Playlist Element?

                    For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

                    The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

                    or the Bricks Post Content element for the current video body, notes, or transcript.
                  • {brm_video:duration} for the current video’s duration.
                  • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

                  Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

                  If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

                  Step 9: Configure Threshold Actions and Auto-Advance

                  There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

                  First configure the player in Bricks:

                  1. Select the main BRM Video element, not the playlist row.
                  2. Open Content -> Events.
                  3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
                  4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
                  5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
                  6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
                  7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

                  Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

                  1. Open BricksMembers -> Video Tracking.
                  2. In General, set the global Required Playback Percent and Completion Mode.
                  3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
                  4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
                  5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
                  6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

                  In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

                  Pattern 2: Lesson Template With Child Videos

                  Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

                  What Works Natively

                  On a lesson template, you can build a query loop of the child video posts:

                  Post Type: your video post type
                  Within Structure Boundary: enabled
                  Boundary Level: Current
                  Matches Required Level(s): Match + Empty
                  Drip: Unlocked or Off
                  Order By: Menu Order
                  Order: ASC

                  This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

                  The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

                  What Does Not Work as a Pure Bricks Setup

                  A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

                  A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

                  Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

                  Safe Advanced Version

                  If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

                  1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
                  2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
                  3. The server validates access, drip, and playback permissions for that selected video.
                  4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
                  5. The frontend swaps the returned player markup into the central player shell.

                  That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

                  When an Inline Loop Player Still Makes Sense

                  There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

                  • A grid of preview videos.
                  • A related videos section where every card can play independently.
                  • A compact library where inline playback is the design, not one central playlist player.

                  In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

                  Common Layout Recipes

                  Same-Lesson Playlist

                  Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

                  Template: Single Video
                  Main player: BRM Video, Current post
                  Playlist query post type: your video post type
                  Within Structure Boundary: enabled
                  Boundary Level: Parent Level
                  Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
                  Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

                  Module Playlist

                  Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

                  Template: Single Video
                  Main player: BRM Video, Current post
                  Playlist query post type: your video post type
                  Within Structure Boundary: enabled
                  Boundary Level: Level 2 or your module level
                  Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
                  Order By: Menu Order
                  Order: ASC

                  Course-Wide Playlist

                  Use this when the right sidebar should behave like a full course video outline.

                  Template: Single Video
                  Main player: BRM Video, Current post
                  Playlist query post type: your video post type
                  Within Structure Boundary: enabled
                  Boundary Level: Top Level
                  Matches Required Level(s): Match + Empty
                  Drip: Unlocked, or Off if locked videos should remain visible
                  Order By: Menu Order
                  Order: ASC

                  If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

                  Troubleshooting

                  The Main Player Does Not Change

                  Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

                  Tracking Writes to the Lesson Instead of the Video

                  The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

                  The Playlist Shows Videos From the Wrong Course

                  Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

                  The Active Row Does Not Highlight

                  Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

                  The Watch Threshold Is Reached but the Page Does Not Update

                  Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

                  The Video Ends but the Next Video Does Not Open

                  Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

                  Completed Videos Disappear

                  Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

                  Locked Videos Are Clickable

                  Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

                  The Loop Breaks AJAX Pagination or Filters

                  Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

                  Should BricksMembers Add a Native Playlist Element?

                  For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

                  The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

                  or the Bricks Post Content element for the current video body, notes, or transcript.
                • {brm_video:duration} for the current video’s duration.
                • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

                Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

                If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

                Step 9: Configure Threshold Actions and Auto-Advance

                There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

                First configure the player in Bricks:

                1. Select the main BRM Video element, not the playlist row.
                2. Open Content -> Events.
                3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
                4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
                5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
                6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
                7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

                Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

                1. Open BricksMembers -> Video Tracking.
                2. In General, set the global Required Playback Percent and Completion Mode.
                3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
                4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
                5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
                6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

                In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

                Pattern 2: Lesson Template With Child Videos

                Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

                What Works Natively

                On a lesson template, you can build a query loop of the child video posts:

                Post Type: your video post type
                Within Structure Boundary: enabled
                Boundary Level: Current
                Matches Required Level(s): Match + Empty
                Drip: Unlocked or Off
                Order By: Menu Order
                Order: ASC

                This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

                The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

                What Does Not Work as a Pure Bricks Setup

                A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

                A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

                Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

                Safe Advanced Version

                If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

                1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
                2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
                3. The server validates access, drip, and playback permissions for that selected video.
                4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
                5. The frontend swaps the returned player markup into the central player shell.

                That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

                When an Inline Loop Player Still Makes Sense

                There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

                • A grid of preview videos.
                • A related videos section where every card can play independently.
                • A compact library where inline playback is the design, not one central playlist player.

                In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

                Common Layout Recipes

                Same-Lesson Playlist

                Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

                Template: Single Video
                Main player: BRM Video, Current post
                Playlist query post type: your video post type
                Within Structure Boundary: enabled
                Boundary Level: Parent Level
                Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
                Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

                Module Playlist

                Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

                Template: Single Video
                Main player: BRM Video, Current post
                Playlist query post type: your video post type
                Within Structure Boundary: enabled
                Boundary Level: Level 2 or your module level
                Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
                Order By: Menu Order
                Order: ASC

                Course-Wide Playlist

                Use this when the right sidebar should behave like a full course video outline.

                Template: Single Video
                Main player: BRM Video, Current post
                Playlist query post type: your video post type
                Within Structure Boundary: enabled
                Boundary Level: Top Level
                Matches Required Level(s): Match + Empty
                Drip: Unlocked, or Off if locked videos should remain visible
                Order By: Menu Order
                Order: ASC

                If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

                Troubleshooting

                The Main Player Does Not Change

                Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

                Tracking Writes to the Lesson Instead of the Video

                The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

                The Playlist Shows Videos From the Wrong Course

                Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

                The Active Row Does Not Highlight

                Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

                The Watch Threshold Is Reached but the Page Does Not Update

                Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

                The Video Ends but the Next Video Does Not Open

                Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

                Completed Videos Disappear

                Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

                Locked Videos Are Clickable

                Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

                The Loop Breaks AJAX Pagination or Filters

                Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

                Should BricksMembers Add a Native Playlist Element?

                For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

                The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

                or the Bricks Post Content element for the current video body, notes, or transcript.
              • {brm_video:duration} for the current video’s duration.
              • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

              Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

              If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

              Step 9: Configure Threshold Actions and Auto-Advance

              There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

              First configure the player in Bricks:

              1. Select the main BRM Video element, not the playlist row.
              2. Open Content -> Events.
              3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
              4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
              5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
              6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
              7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

              Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

              1. Open BricksMembers -> Video Tracking.
              2. In General, set the global Required Playback Percent and Completion Mode.
              3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
              4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
              5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
              6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

              In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

              Pattern 2: Lesson Template With Child Videos

              Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

              What Works Natively

              On a lesson template, you can build a query loop of the child video posts:

              Post Type: your video post type
              Within Structure Boundary: enabled
              Boundary Level: Current
              Matches Required Level(s): Match + Empty
              Drip: Unlocked or Off
              Order By: Menu Order
              Order: ASC

              This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

              The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

              What Does Not Work as a Pure Bricks Setup

              A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

              A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

              Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

              Safe Advanced Version

              If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

              1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
              2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
              3. The server validates access, drip, and playback permissions for that selected video.
              4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
              5. The frontend swaps the returned player markup into the central player shell.

              That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

              When an Inline Loop Player Still Makes Sense

              There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

              • A grid of preview videos.
              • A related videos section where every card can play independently.
              • A compact library where inline playback is the design, not one central playlist player.

              In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

              Common Layout Recipes

              Same-Lesson Playlist

              Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

              Template: Single Video
              Main player: BRM Video, Current post
              Playlist query post type: your video post type
              Within Structure Boundary: enabled
              Boundary Level: Parent Level
              Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
              Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

              Module Playlist

              Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

              Template: Single Video
              Main player: BRM Video, Current post
              Playlist query post type: your video post type
              Within Structure Boundary: enabled
              Boundary Level: Level 2 or your module level
              Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
              Order By: Menu Order
              Order: ASC

              Course-Wide Playlist

              Use this when the right sidebar should behave like a full course video outline.

              Template: Single Video
              Main player: BRM Video, Current post
              Playlist query post type: your video post type
              Within Structure Boundary: enabled
              Boundary Level: Top Level
              Matches Required Level(s): Match + Empty
              Drip: Unlocked, or Off if locked videos should remain visible
              Order By: Menu Order
              Order: ASC

              If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

              Troubleshooting

              The Main Player Does Not Change

              Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

              Tracking Writes to the Lesson Instead of the Video

              The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

              The Playlist Shows Videos From the Wrong Course

              Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

              The Active Row Does Not Highlight

              Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

              The Watch Threshold Is Reached but the Page Does Not Update

              Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

              The Video Ends but the Next Video Does Not Open

              Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

              Completed Videos Disappear

              Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

              Locked Videos Are Clickable

              Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

              The Loop Breaks AJAX Pagination or Filters

              Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

              Should BricksMembers Add a Native Playlist Element?

              For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

              The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

              or the Bricks Post Content element for the current video body, notes, or transcript.
            • {brm_video:duration} for the current video’s duration.
            • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

            Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

            If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

            Step 9: Configure Threshold Actions and Auto-Advance

            There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

            First configure the player in Bricks:

            1. Select the main BRM Video element, not the playlist row.
            2. Open Content -> Events.
            3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
            4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
            5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
            6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
            7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

            Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

            1. Open BricksMembers -> Video Tracking.
            2. In General, set the global Required Playback Percent and Completion Mode.
            3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
            4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
            5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
            6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

            In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

            Pattern 2: Lesson Template With Child Videos

            Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

            What Works Natively

            On a lesson template, you can build a query loop of the child video posts:

            Post Type: your video post type
            Within Structure Boundary: enabled
            Boundary Level: Current
            Matches Required Level(s): Match + Empty
            Drip: Unlocked or Off
            Order By: Menu Order
            Order: ASC

            This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

            The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

            What Does Not Work as a Pure Bricks Setup

            A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

            A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

            Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

            Safe Advanced Version

            If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

            1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
            2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
            3. The server validates access, drip, and playback permissions for that selected video.
            4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
            5. The frontend swaps the returned player markup into the central player shell.

            That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

            When an Inline Loop Player Still Makes Sense

            There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

            • A grid of preview videos.
            • A related videos section where every card can play independently.
            • A compact library where inline playback is the design, not one central playlist player.

            In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

            Common Layout Recipes

            Same-Lesson Playlist

            Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

            Template: Single Video
            Main player: BRM Video, Current post
            Playlist query post type: your video post type
            Within Structure Boundary: enabled
            Boundary Level: Parent Level
            Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
            Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

            Module Playlist

            Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

            Template: Single Video
            Main player: BRM Video, Current post
            Playlist query post type: your video post type
            Within Structure Boundary: enabled
            Boundary Level: Level 2 or your module level
            Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
            Order By: Menu Order
            Order: ASC

            Course-Wide Playlist

            Use this when the right sidebar should behave like a full course video outline.

            Template: Single Video
            Main player: BRM Video, Current post
            Playlist query post type: your video post type
            Within Structure Boundary: enabled
            Boundary Level: Top Level
            Matches Required Level(s): Match + Empty
            Drip: Unlocked, or Off if locked videos should remain visible
            Order By: Menu Order
            Order: ASC

            If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

            Troubleshooting

            The Main Player Does Not Change

            Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

            Tracking Writes to the Lesson Instead of the Video

            The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

            The Playlist Shows Videos From the Wrong Course

            Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

            The Active Row Does Not Highlight

            Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

            The Watch Threshold Is Reached but the Page Does Not Update

            Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

            The Video Ends but the Next Video Does Not Open

            Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

            Completed Videos Disappear

            Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

            Locked Videos Are Clickable

            Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

            The Loop Breaks AJAX Pagination or Filters

            Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

            Should BricksMembers Add a Native Playlist Element?

            For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

            The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

            or the Bricks Post Content element for the current video body, notes, or transcript.
          • {brm_video:duration} for the current video’s duration.
          • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

          Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

          If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

          Step 9: Configure Threshold Actions and Auto-Advance

          There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

          First configure the player in Bricks:

          1. Select the main BRM Video element, not the playlist row.
          2. Open Content -> Events.
          3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
          4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
          5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
          6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
          7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

          Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

          1. Open BricksMembers -> Video Tracking.
          2. In General, set the global Required Playback Percent and Completion Mode.
          3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
          4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
          5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
          6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

          In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

          Pattern 2: Lesson Template With Child Videos

          Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

          What Works Natively

          On a lesson template, you can build a query loop of the child video posts:

          Post Type: your video post type
          Within Structure Boundary: enabled
          Boundary Level: Current
          Matches Required Level(s): Match + Empty
          Drip: Unlocked or Off
          Order By: Menu Order
          Order: ASC

          This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

          The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

          What Does Not Work as a Pure Bricks Setup

          A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

          A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

          Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

          Safe Advanced Version

          If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

          1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
          2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
          3. The server validates access, drip, and playback permissions for that selected video.
          4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
          5. The frontend swaps the returned player markup into the central player shell.

          That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

          When an Inline Loop Player Still Makes Sense

          There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

          • A grid of preview videos.
          • A related videos section where every card can play independently.
          • A compact library where inline playback is the design, not one central playlist player.

          In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

          Common Layout Recipes

          Same-Lesson Playlist

          Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

          Template: Single Video
          Main player: BRM Video, Current post
          Playlist query post type: your video post type
          Within Structure Boundary: enabled
          Boundary Level: Parent Level
          Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
          Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

          Module Playlist

          Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

          Template: Single Video
          Main player: BRM Video, Current post
          Playlist query post type: your video post type
          Within Structure Boundary: enabled
          Boundary Level: Level 2 or your module level
          Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
          Order By: Menu Order
          Order: ASC

          Course-Wide Playlist

          Use this when the right sidebar should behave like a full course video outline.

          Template: Single Video
          Main player: BRM Video, Current post
          Playlist query post type: your video post type
          Within Structure Boundary: enabled
          Boundary Level: Top Level
          Matches Required Level(s): Match + Empty
          Drip: Unlocked, or Off if locked videos should remain visible
          Order By: Menu Order
          Order: ASC

          If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

          Troubleshooting

          The Main Player Does Not Change

          Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

          Tracking Writes to the Lesson Instead of the Video

          The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

          The Playlist Shows Videos From the Wrong Course

          Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

          The Active Row Does Not Highlight

          Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

          The Watch Threshold Is Reached but the Page Does Not Update

          Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

          The Video Ends but the Next Video Does Not Open

          Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

          Completed Videos Disappear

          Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

          Locked Videos Are Clickable

          Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

          The Loop Breaks AJAX Pagination or Filters

          Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

          Should BricksMembers Add a Native Playlist Element?

          For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

          The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

          or the Bricks Post Content element for the current video body, notes, or transcript.
        • {brm_video:duration} for the current video’s duration.
        • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

        Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

        If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

        Step 9: Configure Threshold Actions and Auto-Advance

        There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

        First configure the player in Bricks:

        1. Select the main BRM Video element, not the playlist row.
        2. Open Content -> Events.
        3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
        4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
        5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
        6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
        7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

        Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

        1. Open BricksMembers -> Video Tracking.
        2. In General, set the global Required Playback Percent and Completion Mode.
        3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
        4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
        5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
        6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

        In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

        Pattern 2: Lesson Template With Child Videos

        Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

        What Works Natively

        On a lesson template, you can build a query loop of the child video posts:

        Post Type: your video post type
        Within Structure Boundary: enabled
        Boundary Level: Current
        Matches Required Level(s): Match + Empty
        Drip: Unlocked or Off
        Order By: Menu Order
        Order: ASC

        This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

        The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

        What Does Not Work as a Pure Bricks Setup

        A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

        A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

        Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

        Safe Advanced Version

        If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

        1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
        2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
        3. The server validates access, drip, and playback permissions for that selected video.
        4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
        5. The frontend swaps the returned player markup into the central player shell.

        That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

        When an Inline Loop Player Still Makes Sense

        There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

        • A grid of preview videos.
        • A related videos section where every card can play independently.
        • A compact library where inline playback is the design, not one central playlist player.

        In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

        Common Layout Recipes

        Same-Lesson Playlist

        Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

        Template: Single Video
        Main player: BRM Video, Current post
        Playlist query post type: your video post type
        Within Structure Boundary: enabled
        Boundary Level: Parent Level
        Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
        Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

        Module Playlist

        Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

        Template: Single Video
        Main player: BRM Video, Current post
        Playlist query post type: your video post type
        Within Structure Boundary: enabled
        Boundary Level: Level 2 or your module level
        Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
        Order By: Menu Order
        Order: ASC

        Course-Wide Playlist

        Use this when the right sidebar should behave like a full course video outline.

        Template: Single Video
        Main player: BRM Video, Current post
        Playlist query post type: your video post type
        Within Structure Boundary: enabled
        Boundary Level: Top Level
        Matches Required Level(s): Match + Empty
        Drip: Unlocked, or Off if locked videos should remain visible
        Order By: Menu Order
        Order: ASC

        If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

        Troubleshooting

        The Main Player Does Not Change

        Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

        Tracking Writes to the Lesson Instead of the Video

        The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

        The Playlist Shows Videos From the Wrong Course

        Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

        The Active Row Does Not Highlight

        Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

        The Watch Threshold Is Reached but the Page Does Not Update

        Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

        The Video Ends but the Next Video Does Not Open

        Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

        Completed Videos Disappear

        Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

        Locked Videos Are Clickable

        Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

        The Loop Breaks AJAX Pagination or Filters

        Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

        Should BricksMembers Add a Native Playlist Element?

        For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

        The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

        or the Bricks Post Content element for the current video body, notes, or transcript.
      • {brm_video:duration} for the current video’s duration.
      • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

      Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

      If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

      Step 9: Configure Threshold Actions and Auto-Advance

      There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

      First configure the player in Bricks:

      1. Select the main BRM Video element, not the playlist row.
      2. Open Content -> Events.
      3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
      4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
      5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
      6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
      7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

      Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

      1. Open BricksMembers -> Video Tracking.
      2. In General, set the global Required Playback Percent and Completion Mode.
      3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
      4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
      5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
      6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

      In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

      Pattern 2: Lesson Template With Child Videos

      Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

      What Works Natively

      On a lesson template, you can build a query loop of the child video posts:

      Post Type: your video post type
      Within Structure Boundary: enabled
      Boundary Level: Current
      Matches Required Level(s): Match + Empty
      Drip: Unlocked or Off
      Order By: Menu Order
      Order: ASC

      This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

      The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

      What Does Not Work as a Pure Bricks Setup

      A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

      A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

      Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

      Safe Advanced Version

      If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

      1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
      2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
      3. The server validates access, drip, and playback permissions for that selected video.
      4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
      5. The frontend swaps the returned player markup into the central player shell.

      That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

      When an Inline Loop Player Still Makes Sense

      There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

      • A grid of preview videos.
      • A related videos section where every card can play independently.
      • A compact library where inline playback is the design, not one central playlist player.

      In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

      Common Layout Recipes

      Same-Lesson Playlist

      Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

      Template: Single Video
      Main player: BRM Video, Current post
      Playlist query post type: your video post type
      Within Structure Boundary: enabled
      Boundary Level: Parent Level
      Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
      Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

      Module Playlist

      Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

      Template: Single Video
      Main player: BRM Video, Current post
      Playlist query post type: your video post type
      Within Structure Boundary: enabled
      Boundary Level: Level 2 or your module level
      Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
      Order By: Menu Order
      Order: ASC

      Course-Wide Playlist

      Use this when the right sidebar should behave like a full course video outline.

      Template: Single Video
      Main player: BRM Video, Current post
      Playlist query post type: your video post type
      Within Structure Boundary: enabled
      Boundary Level: Top Level
      Matches Required Level(s): Match + Empty
      Drip: Unlocked, or Off if locked videos should remain visible
      Order By: Menu Order
      Order: ASC

      If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

      Troubleshooting

      The Main Player Does Not Change

      Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

      Tracking Writes to the Lesson Instead of the Video

      The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

      The Playlist Shows Videos From the Wrong Course

      Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

      The Active Row Does Not Highlight

      Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

      The Watch Threshold Is Reached but the Page Does Not Update

      Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

      The Video Ends but the Next Video Does Not Open

      Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

      Completed Videos Disappear

      Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

      Locked Videos Are Clickable

      Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

      The Loop Breaks AJAX Pagination or Filters

      Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

      Should BricksMembers Add a Native Playlist Element?

      For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

      The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

      or the Bricks Post Content element for the current video body, notes, or transcript.
    • {brm_video:duration} for the current video’s duration.
    • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

    Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

    If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

    Step 9: Configure Threshold Actions and Auto-Advance

    There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

    First configure the player in Bricks:

    1. Select the main BRM Video element, not the playlist row.
    2. Open Content -> Events.
    3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
    4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
    5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
    6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
    7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

    Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

    1. Open BricksMembers -> Video Tracking.
    2. In General, set the global Required Playback Percent and Completion Mode.
    3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
    4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
    5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
    6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

    In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

    Pattern 2: Lesson Template With Child Videos

    Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

    What Works Natively

    On a lesson template, you can build a query loop of the child video posts:

    Post Type: your video post type
    Within Structure Boundary: enabled
    Boundary Level: Current
    Matches Required Level(s): Match + Empty
    Drip: Unlocked or Off
    Order By: Menu Order
    Order: ASC

    This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

    The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

    What Does Not Work as a Pure Bricks Setup

    A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

    A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

    Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

    Safe Advanced Version

    If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

    1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
    2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
    3. The server validates access, drip, and playback permissions for that selected video.
    4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
    5. The frontend swaps the returned player markup into the central player shell.

    That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

    When an Inline Loop Player Still Makes Sense

    There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

    • A grid of preview videos.
    • A related videos section where every card can play independently.
    • A compact library where inline playback is the design, not one central playlist player.

    In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

    Common Layout Recipes

    Same-Lesson Playlist

    Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

    Template: Single Video
    Main player: BRM Video, Current post
    Playlist query post type: your video post type
    Within Structure Boundary: enabled
    Boundary Level: Parent Level
    Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
    Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

    Module Playlist

    Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

    Template: Single Video
    Main player: BRM Video, Current post
    Playlist query post type: your video post type
    Within Structure Boundary: enabled
    Boundary Level: Level 2 or your module level
    Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
    Order By: Menu Order
    Order: ASC

    Course-Wide Playlist

    Use this when the right sidebar should behave like a full course video outline.

    Template: Single Video
    Main player: BRM Video, Current post
    Playlist query post type: your video post type
    Within Structure Boundary: enabled
    Boundary Level: Top Level
    Matches Required Level(s): Match + Empty
    Drip: Unlocked, or Off if locked videos should remain visible
    Order By: Menu Order
    Order: ASC

    If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

    Troubleshooting

    The Main Player Does Not Change

    Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

    Tracking Writes to the Lesson Instead of the Video

    The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

    The Playlist Shows Videos From the Wrong Course

    Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

    The Active Row Does Not Highlight

    Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

    The Watch Threshold Is Reached but the Page Does Not Update

    Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

    The Video Ends but the Next Video Does Not Open

    Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

    Completed Videos Disappear

    Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

    Locked Videos Are Clickable

    Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

    The Loop Breaks AJAX Pagination or Filters

    Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

    Should BricksMembers Add a Native Playlist Element?

    For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

    The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

    or the Bricks Post Content element for the current video body, notes, or transcript.
  • {brm_video:duration} for the current video’s duration.
  • {brm_video_watch:percent}, {brm_video_watch:required_percent}, and {brm_video_watch:remaining_percent} for watch-state helper text.

Since version 1.3.2, playlist and course/module headers can also show structure-level video watch summaries without a custom relationship field. Use {brm_video_watch:summary:percent} for average watched percentage, {brm_video_watch:summary:completed_count} and {brm_video_watch:summary:total_count} for completed/total video counts, or {brm_video_watch:summary:remaining_count} for remaining videos. These tags default to descendant video posts below the current structure item; add :children for direct children only or anchor the summary with :parentlevel, :toplevel, or :level_N.

If you need a single progress-based “Continue” button outside the playlist, use {brm_progress:continue:url} in the button link field. For previous/next movement around the current video, use the BRM Post Navigation element or tags such as {brm_structure:next_item:url} and {brm_structure:previous_item:url} instead. Do not build a one-item query loop just to create one continue link.

Step 9: Configure Threshold Actions and Auto-Advance

There are two separate settings surfaces here. The playlist query loop only lists video links. The main BRM Video element controls what this template does when the learner reaches the watch threshold. The Video Tracking settings control the global video-end auto-advance policy.

First configure the player in Bricks:

  1. Select the main BRM Video element, not the playlist row.
  2. Open Content -> Events.
  3. Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
  4. Choose Update matched wrappers (AJAX) when the same page should redraw progress bars, quiz/download areas, condition-based messages, or playlist row state after the threshold. Add the CSS Selector and/or Bricks Element IDs for the wrappers that should refresh. Enable Refresh Progress Bars or Refresh Quiz Elements only when those elements are on this page.
  5. Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
  6. Choose Redirect for a fixed next destination, quiz, or authored post/URL. Enter a Redirect URL or Redirect post ID, and use the delay/completion-wait controls if the redirect should wait for the tracking write. Do not use a raw iframe swap as playlist advance; the selected video must be rendered through the BRM Video runtime.
  7. Use Timed actions only for extra behavior beyond the normal threshold reaction. Timed actions can trigger on Threshold reached or Completed, then refresh, reload, redirect, report, or dispatch automation depending on the action settings.

Then configure video-end auto-advance if the video should open the next available structure item when the provider fires its ended event:

  1. Open BricksMembers -> Video Tracking.
  2. In General, set the global Required Playback Percent and Completion Mode.
  3. Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
  4. Use Gate BRM Next Navigation if the BRM Post Navigation element or another next destination resolved by BricksMembers should stay blocked until the required watch threshold is reached. Manually authored Bricks links are unchanged and need a video-threshold condition.
  5. If one video should differ from the global behavior, override its video watch policy from the Content & Structures editor or structure quick edit. The regular WordPress post edit metabox exposes required percent, completion mode, and gate-next overrides; the structure editor is where the auto-advance override is exposed.
  6. Test with a learner account that has the same access and drip state as the real audience. Video-end auto-advance only moves when a next item exists, is available, and resolves inside the configured structure boundary.

In short: use the BRM Video element for the immediate threshold reaction on this playlist template. Use Video Tracking defaults or structure-item overrides for provider-ended automatic movement to the next available item.

Pattern 2: Lesson Template With Child Videos

Some sites want the lesson URL to remain the main page while the lesson contains multiple child video posts. That structure can still use a playlist query loop, but the central-player behavior needs more care.

What Works Natively

On a lesson template, you can build a query loop of the child video posts:

Post Type: your video post type
Within Structure Boundary: enabled
Boundary Level: Current
Matches Required Level(s): Match + Empty
Drip: Unlocked or Off
Order By: Menu Order
Order: ASC

This gives you a lesson page that lists the videos beneath the lesson. Each row can show the video title, image, duration, completion state, and link to the video post.

The simplest native approach is to let each playlist row link to the actual video post with https://bricksmembers.com/docs/video-playlists-in-bricks/. The visitor leaves the lesson overview and opens the video post template from Pattern 1, where the central player is rendered correctly for that video.

What Does Not Work as a Pure Bricks Setup

A single BRM Video element on the lesson template with Video source context: Current post reads the lesson post. It does not magically switch to a clicked child video post.

A BRM Video element with Video source context: Current query loop item reads the loop item, but that player has to be inside the loop item. That is useful for inline video cards, not for one central player outside the playlist loop.

Changing only the iframe, video URL, or provider source with JavaScript is not enough. The BRM Video element also carries the selected post ID, access result, source hash, watch session data, resume state, and completion behavior. If those are not rendered for the selected child video post, tracking can write to the wrong item or fail completely.

Safe Advanced Version

If you truly need the lesson URL to stay fixed while a clicked child video loads into one central player, the safe version needs a server-rendered selected-video flow:

  1. The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
  2. Your server-side handler validates that the selected video belongs inside the intended structure boundary.
  3. The server validates access, drip, and playback permissions for that selected video.
  4. The server renders the BRM Video element for that selected video post, not just a raw embed URL.
  5. The frontend swaps the returned player markup into the central player shell.

That is possible as custom development, but it is not the same as a normal Bricks-only query loop. It is also the one area where a small native BricksMembers enhancement could still be useful: a selected-video player context or official playlist helper that server-renders the selected video post while preserving the BricksMembers tracking runtime.

When an Inline Loop Player Still Makes Sense

There is still a valid use for Video source context: Current query loop item. Use it when each repeated card should contain its own playable video, such as:

  • A grid of preview videos.
  • A related videos section where every card can play independently.
  • A compact library where inline playback is the design, not one central playlist player.

In that case, the BRM Video element belongs inside the query loop item and should use Current query loop item. For the playlist pattern in this guide, keep one main player outside the loop and use the loop as navigation.

Common Layout Recipes

Same-Lesson Playlist

Use this when a lesson contains multiple short video posts and the video template should show the other videos from that lesson.

Template: Single Video
Main player: BRM Video, Current post
Playlist query post type: your video post type
Within Structure Boundary: enabled
Boundary Level: Parent Level
Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
Row classes: brm-playlist-row {brm_active} {brm_completed} {brm_unlocked}

Module Playlist

Use this when the playlist should include every video inside the current module, even if those videos are grouped under different lesson posts.

Template: Single Video
Main player: BRM Video, Current post
Playlist query post type: your video post type
Within Structure Boundary: enabled
Boundary Level: Level 2 or your module level
Row link: https://bricksmembers.com/docs/video-playlists-in-bricks/
Order By: Menu Order
Order: ASC

Course-Wide Playlist

Use this when the right sidebar should behave like a full course video outline.

Template: Single Video
Main player: BRM Video, Current post
Playlist query post type: your video post type
Within Structure Boundary: enabled
Boundary Level: Top Level
Matches Required Level(s): Match + Empty
Drip: Unlocked, or Off if locked videos should remain visible
Order By: Menu Order
Order: ASC

If the course-wide playlist needs visible module and lesson group headings, use nested query loops instead of one flat list.

Troubleshooting

The Main Player Does Not Change

Check whether the playlist row actually links to the selected video post. In the recommended pattern, clicking a row should navigate to https://bricksmembers.com/docs/video-playlists-in-bricks/. The template then re-renders the main BRM Video element for that video post.

Tracking Writes to the Lesson Instead of the Video

The player is probably resolving the lesson as the current post. Use the video post template pattern, or render the selected child video post server-side. Do not swap only a raw embed URL into the lesson player.

The Playlist Shows Videos From the Wrong Course

Enable Within Structure Boundary and choose the correct Boundary Level. Use Parent Level for siblings under the same lesson, the module level for videos in the same module, or Top Level for videos inside the same course.

The Active Row Does Not Highlight

Add {brm_active} to the playlist row’s CSS class field, then style .brm-active. The tag outputs a class when the loop item matches the current page or a parent item in the current structure.

The Watch Threshold Is Reached but the Page Does Not Update

Select the main BRM Video element and check Content -> Events -> After Video Threshold Reached. If it is set to Do nothing, BricksMembers still stores the watch state, but the current page will not redraw immediately. Use Update matched wrappers (AJAX), Reload page with position, or Redirect depending on what should change.

The Video Ends but the Next Video Does Not Open

Check whether you configured the right behavior. After Video Threshold Reached is the player element’s threshold reaction. BricksMembers -> Video Tracking -> Auto-advance on video end is the provider-ended auto-advance policy. For video-end auto-advance, Progress Tracking must be active, the current video needs a next item inside the configured boundary, and access/drip rules must allow that next item.

Completed Videos Disappear

Check the playlist row query. If Progress is set to Not Completed, completed videos are intentionally removed. For a full playlist, leave Progress off and use completion tags or classes only for styling.

Locked Videos Are Clickable

Use Matches Required Level(s) and Drip filters to remove inaccessible rows, or keep locked rows visible but conditionally replace the row link with a locked state. If the playlist is a teaser, show locked rows intentionally and make the button open your access or upgrade flow.

The Loop Breaks AJAX Pagination or Filters

Make sure Bricks’ query-loop comments are not removed by an optimization plugin. Bricks uses those comments for AJAX pagination, live filters, load more, and infinite scroll.

Should BricksMembers Add a Native Playlist Element?

For the normal video-post template playlist, a separate playlist element is not required. Bricks already gives you the layout freedom, and BricksMembers already gives you the player, query filters, active class tag, progress tags, video-watch tags, access filters, drip filters, and navigation behavior.

The useful future enhancement would be narrower: a native selected-video player context for lesson templates, or an official playlist helper that can server-render a clicked child video post into one central player without leaving the lesson URL. That helper would need to preserve the selected video post ID, access checks, source hash, watch session token, resume state, and completion behavior. Until then, the video-post template pattern is the most native and reliable Bricks setup.

Get BricksMembers

Start Building Your Membership Site Today

Create, sell, and manage your content without limits. BricksMembers gives you everything you need to build membership and LMS sites with Bricks Builder.

Lifetime updates & bug fixes • Premium support • 0% transaction fees • 60-day money-back guarantee