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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope | Use this setup |
|---|---|
| Videos in the current lesson | Within Structure Boundary: enabled Boundary Level: Parent Level Post Type: your video post type |
| Videos in the current module | Within 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 course | Within Structure Boundary: enabled Boundary Level: Top Level Post Type: your video post type |
| Child videos on a lesson template | Within 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:
| Control | Good default | When to change it |
|---|---|---|
| Matches Required Level(s) | Match + Empty | Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. |
| Drip | Unlocked | Leave 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. |
| Progress | Off | Use 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 By | Menu Order, ASC | Use 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 Bricksor{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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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 Bricksor{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}outputsbrm-activewhen 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 Bricksfor the current video title.or the Bricks Post Content element for the current video body, notes, or transcript.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 -> VideoThe 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 abrm_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
- Open Bricks -> Templates.
- Create a new single template for the video post type or video structure level.
- Set the template conditions so it applies only to your video posts.
- 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
- Add the BRM Video element in the main player area.
- Set Video source context to Current post.
- Choose the display mode: Direct embed, Click to load, or Lightbox.
- 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.
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.
- Add a Block, Div, or Container for one playlist row.
- Enable Use Query Loop on that row.
- Set the query type to Posts.
- Set Post Type to the actual video post type or video structure level slug.
- Set Order By to Menu Order, and use ASC.
- 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 scope Use this setup Videos in the current lesson Within Structure Boundary: enabled
Boundary Level: Parent Level
Post Type: your video post typeVideos in the current module Within Structure Boundary: enabled
Boundary Level: the module level, such as Level 2, depending on your structure
Post Type: your video post typeVideos in the current course Within Structure Boundary: enabled
Boundary Level: Top Level
Post Type: your video post typeChild videos on a lesson template Within Structure Boundary: enabled
Boundary Level: Current
Post Type: your video post typeFor 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:
Control Good default When to change it Matches Required Level(s) Match + Empty Use Match if every playlist row must require a level. Use No Match or No Match + Empty only for teaser or upsell lists. Drip Unlocked Leave 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. Progress Off Use 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 By Menu Order, ASC Use 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}outputsbrm-activewhen 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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:childrenfor 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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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: ASCThis 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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: ASCCourse-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: ASCIf 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.
{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:
- Select the main BRM Video element, not the playlist row.
- Open Content -> Events.
- Set After Video Threshold Reached. Use Do nothing if storing the watch state is enough and the page does not need to react immediately.
- 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.
- Choose Reload page with position when several areas depend on updated watch state and a full render is safer than a partial refresh.
- 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.
- 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:
- Open BricksMembers -> Video Tracking.
- In General, set the global Required Playback Percent and Completion Mode.
- Set Auto-advance on video end to Open next lesson if video end, not threshold reached, should move the learner automatically.
- 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.
- 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.
- 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:
- The playlist row passes the selected child video post ID, for example through a URL parameter or AJAX request.
- Your server-side handler validates that the selected video belongs inside the intended structure boundary.
- The server validates access, drip, and playback permissions for that selected video.
- The server renders the BRM Video element for that selected video post, not just a raw embed URL.
- 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.