If you build online courses, member lessons, or protected training libraries, a normal video embed is usually not enough. You do not just want to display a player. You want to know whether the learner actually watched enough of the lesson, whether the next step should unlock, and whether a quiz or download should stay hidden until the video is meaningfully consumed. That is exactly what Video Tracking in BricksMembers is for.
The Video Tracking module turns lesson videos into tracked learning steps. You can require a watch percentage, control completion behavior, prompt learners to resume where they stopped, reduce skipping ahead, connect supported video hosts, and render the whole experience with the native BRM Video element in Bricks Builder.
Why Video Tracking Matters for Online Courses
One of the biggest problems in online learning is that a lesson page can look complete even when the actual learning step was skipped. A learner can open a lesson, scroll a bit, and move on. If your course depends on videos, that creates a weak learning flow and makes progress tracking less meaningful.
BricksMembers Video Tracking solves that problem by connecting the video itself to the rest of your course experience. Instead of treating the video as passive content, you can make it part of your completion logic, your lesson progression, and your frontend design in Bricks.
What You Can Do With the Video Tracking Module
- Require a watch threshold so learners need to watch a percentage of the video before the lesson is treated as ready
- Control completion behavior by keeping completion manual, unlocking completion after the threshold, or auto-completing the lesson at the threshold
- Gate next navigation so learners cannot move to the next lesson until enough of the video has been watched
- Unlock quizzes and assessments or downloads based on actual watch progress instead of only page access
- Improve the playback experience with resume prompts, auto-resume, and optional skipping restrictions
- Connect hosted video platforms and browse videos from the picker instead of pasting everything manually
- Design tracked lesson videos in Bricks using the native BRM Video element
How Video Tracking Works in BricksMembers
The workflow is simple:
- Enable the Video Tracking module
- Choose your site-wide watch rules in BricksMembers → Video Tracking
- Connect your video hosts if you want to use the built-in picker
- Add a video source to the lesson or content post
- Render the lesson with the BRM Video element in Bricks
From there, BricksMembers tracks the learner’s watch state and lets the rest of your lesson UI react to it.
Step 1: Enable Video Tracking
- Go to BricksMembers → Modules
- Enable Video Tracking
- Confirm the change
- Open BricksMembers → Video Tracking
If the module is turned off, the settings page stays informational and the watch-state features do not run on the frontend.
Step 2: Choose Your Default Video Rules
The Video Tracking settings page controls the default behavior for tracked lesson videos across the site. This is where you decide what “enough watched” means for your project.
- Required playback percent decides how much of the video must be watched before the threshold is considered reached
- Gate next navigation until threshold lets you decide whether learners can move on before that watch threshold
- Completion mode lets you keep completion manual, unlock it after the threshold, or auto-complete the lesson
- Quiz unlock mode and Downloads unlock mode let you tie follow-up content to video progress
- Resume mode and Restrict skipping ahead help you shape the playback experience for training-style lessons
- Store thumbnails in WordPress helps when you want placeholder or poster images managed in the media library. This is especially useful for Bunny libraries where direct CDN thumbnail URLs may be blocked by library or CDN security settings.
These are defaults, not permanent locks. If a specific lesson needs different rules, you can override key settings per post.
Step 3: Connect Your Video Hosts
If you want a cleaner workflow than pasting URLs manually, connect your video providers in the Video Hosts tab of the same admin area. The current runtime supports Mux, Wistia, Gumlet, Bunny, YouTube, Vimeo, and Cloudflare Stream.
- Enable the provider you want to use
- Enter the required credentials or tokens for that provider
- Save the settings
- Use the built-in connection test if you want to verify the setup before editing lessons
Once connected, those providers become available in the BRM video picker inside the editor.
Be concrete about the connection requirements. Mux needs a Token ID and Token Secret. Wistia needs an API Token. Gumlet needs an API Key and can also store a Workspace ID. Bunny needs an Access Key and Library ID. YouTube uses a manual token setup: save the Client ID, Client Secret, Access Token, and Refresh Token, then use the exact Authorized Redirect URI shown in the provider’s Setup instructions block while generating the Google tokens. Vimeo uses a manually pasted Access Token with the public and private scopes. Cloudflare Stream needs a Cloudflare account ID and API token with Stream read access; customer code and signed URL TTL are optional. BRM does not open a Google, Vimeo, or Cloudflare connect flow from this page.
Step 4: Add a Video Source to the Lesson
Edit the lesson or content post and open the BricksMembers meta box. This is where you connect the actual video source that the frontend element will use. The BRM Video field stores the authored URL, provider value, or embed source. BRM stores the resolved provider separately so existing content stays compatible while the player can still read a normalized source.
For Bunny Stream, you can use a full Bunny embed URL, library_id/video_id, or a bare Bunny video ID when the Bunny provider is selected and your Bunny Library ID is saved in the Video Hosts tab. If Bunny is the only enabled and connected provider, BRM can also resolve a bare Bunny video ID automatically. Bare IDs otherwise resolve only through the explicit Bunny provider so they do not conflict with other providers that also use opaque IDs.
For Cloudflare Stream, use a Stream UID or a supported videodelivery.net / cloudflarestream.com Stream URL. BRM normalizes these sources as cloudflare_stream.
- BRM Video lets you paste a direct URL, provider-specific value, or embed source
- Browse lets you choose a video from a connected provider through the picker
- Video Duration lets you store duration metadata for the lesson
- Video Image gives you an optional poster or cover image
- Video Title, Video Chapters, and Video Text Tracks JSON store optional learning metadata for dynamic tags, timeline markers, native tracks, and transcript cue access. Enter chapters as lines like
0:00 Intro, or JSON like[{"time_seconds":0,"title":"Intro"}].
When Video Tracking is active, the same area also exposes per-post overrides for the required percentage, completion mode, and next-navigation gating. That is useful when one lesson should be more strict or more relaxed than your default site-wide rules.
The saved Video Duration field can also be included in course or module learning-time totals. In Bricks, use a scoped reading-time tag such as {brm_post:reading_time:toplevel:minutes:with_video} when you want a raw numeric total, or {brm_post:reading_time:toplevel:human:with_video} when you want compact output such as 29mins or 1hr 30min.
Step 5: Use the BRM Video Element in Bricks
Add the BRM Video element to your Bricks template or lesson layout. This is the frontend layer that displays the tracked video and reacts to the learner’s watch progress.
- Direct embed shows the player immediately
- Click to load shows a placeholder first and loads the player on interaction
- Lightbox opens the video in a lightbox flow
The element also includes placeholder controls for preview images, text, icons, overlays, and resume prompt styling, so the tracked player can fit naturally into your lesson design.
Since version 1.3.0, the element also includes playback speed, native Picture-in-Picture, focus-scoped keyboard shortcuts, off-screen/floating behavior, lazy loading, timed actions, threshold redirects, chapter timeline markers, and advanced watermark styling. Playback speed is per render and is not saved server-side. Keyboard and chapter-marker seeks respect the configured seek policy.
Use the advanced chapter and watermark controls only when the lesson design needs them. For chapters, choose Timeline markers only when the saved video has canonical chapter metadata and uses a native HTML5/HLS source. For watermarks, enable the basic watermark first, then turn on Customize watermark only when you need custom font size, weight, colors, opacity, spacing, rounded corners, or uppercase styling.
The element also has a Video source context control. Leave it on Current post for normal lesson templates. Choose Current query loop item when the BRM Video element is inside a Bricks query loop and each card should play and track the loop item’s own BRM video, such as related lesson video cards.
When using Current query loop item, the loop item must be the actual lesson or content post with its own BRM Video source. Playback is allowed by default for anyone who can see the element, so this works well for playlist cards and related video loops that are already controlled by Bricks conditions, redirects, or query filters.
Since version 1.3.0, logged-in users get tracked watch progress when the BRM Video element renders a playable video for them. Logged-out visitors can watch visible videos, but BricksMembers does not save guest watch state. If you want BricksMembers itself to block the player, use the element’s Playback Access group. Usually you can leave this on Always allow playback and protect the surrounding lesson content with your normal Bricks conditions, redirects, query filters, or layout rules.
The Playback Access group can block playback for logged-out users, selected BRM gates, or all BRM access gates. Selected gates include selected user levels, post required levels, enrollment, prerequisites, and drip. Selected user levels works like the Bricks condition for assigned levels: you choose one or more levels in the element, and the viewer must have at least one of them. Post required levels reads the required-level setting from the video post itself. When playback is blocked, the element can show an overlay message or render nothing. You can also configure After playback blocked to update matched wrappers by AJAX, which is useful when you want custom messages elsewhere on the page to refresh immediately.
What Happens When a Learner Reaches the Watch Threshold
This is where Video Tracking becomes especially useful. The BRM Video element includes an After Video Threshold Reached control, so the page can react immediately when the learner has watched enough. It is important to understand that the threshold being reached and the page visibly changing are two separate things. The watch state is always stored, but the visible UI change only happens if you configure an action here or if the page naturally re-renders later.
- Do nothing means the watch state is still saved, but nothing on the page changes right away. Use this when you only need the stored watch data for later checks, not an instant visual reaction
- Update matched wrappers (AJAX) refreshes the wrappers you target so quiz areas, progress blocks, or condition-based sections can redraw without a full page reload. It only updates the wrappers you tell it to refresh; it does not automatically guess which part of the layout should change
- Reload page with position triggers a full page reload, then restores scroll position or jumps to the selector you configured. This is the safest option when multiple parts of the page depend on updated watch state and you do not want partial-refresh edge cases
- Redirect sends the learner to a configured URL or post after optional completion confirmation and delay. Use it for flows like going to a quiz after 90% watched or after completion
This makes it possible to reveal the next lesson button, unlock a quiz, refresh a progress bar, or show a protected download right after the required watch percentage is reached.
A Good Default Setup for Most Course Creators
If you are setting this up for the first time, a practical starting point is:
- Require a meaningful watch percentage instead of expecting 100% on every lesson
- Use manual completion unlock if you still want learners to confirm they are done
- Enable next-navigation gating only on lessons where sequence actually matters
- Use resume prompts or auto-resume for longer lessons and trainings
- Test one lesson end to end before rolling the setup across the whole site
That approach gives you a stricter and more useful learning flow without making every lesson feel heavy-handed.
Video Watch Dynamic Tags You Can Use in Bricks
BricksMembers also gives you dynamic tags for watch progress, so you can display progress-aware helper text directly inside the lesson design. These tags are meant for logged-in learner contexts on tracked posts. They read the effective watch state for the current post context, which means a lesson can aggregate related child video posts instead of treating each child video as a completely separate display context.
Since version 1.1.0, read-only video-watch tags and the BRM Progress Bar video mode can also resolve a target user inside Bricks user query loops, including loops filtered by Users: Group Membership, and BricksMembers profile pages. This only affects display. Video watch writes still belong to the current viewer, and cross-user display requires the target user’s privacy settings and group-role permissions to allow video progress visibility.
The BRM Progress Bar in Video mode defaults to the stored watched-coverage state from BricksMembers, and the video-watch dynamic tags read that same stored state. If you want the bar to follow the temporary player position instead, set the Progress Bar’s Video Progress Value control to Live playback position. During playback, stored-progress displays update after successful watch-state sync responses.
When the current lesson/post has its own BRM Video source, watched coverage is read from that current post. BricksMembers only aggregates related video posts for lesson contexts that do not have a direct BRM Video source.
{brm_video_watch:percent}returns the watched percentage as a numeric string, for example67.5or100. This is not rounded to a whole number by default{brm_video_watch:required_percent}returns the required threshold as an integer string, for example80{brm_video_watch:remaining_percent}returns the remaining percentage needed to hit the threshold, rounded to two decimals and never below0. If the learner already passed the threshold, this tag returns0{brm_video_watch:threshold_reached}returns1when the required watch threshold has been reached and0when it has not{brm_video_watch:completed}returns1only when the runtime marks the video as fully watched. This is not the same as threshold reached. A learner can havethreshold_reached = 1whilecompleted = 0{brm_video_watch:last_position}returns the actual last saved playback position in seconds, for example325for 5 minutes and 25 seconds- Since version 1.3.0,
{brm_video_watch:resume_position}returns the resume-safe playback position in seconds. This can be higher thanlast_positionwhen BRM has a saved max watched position - Since version 1.3.0,
{brm_video_watch:last_position_formatted}and{brm_video_watch:resume_position_formatted}return formatted watch times like05min 25secor01h 02min 03sec {brm_video_watch:resume_available}returns1only when there is a meaningful resume point. In the current runtime, that means the stored last position is at least 5 seconds in and not within the last 5 seconds of the video. Otherwise it returns0
A practical example is a helper message like Watch {brm_video_watch:required_percent}% to unlock the quiz. You have watched {brm_video_watch:percent}% so far. If the learner watched 67.5% of a lesson with an 80% threshold, that sentence will render as Watch 80% to unlock the quiz. You have watched 67.5% so far.
Also note the difference between the watch tags: percent is the current numeric progress, threshold_reached is the yes/no unlock state, and completed is the fully watched flag. Those are related, but they are not interchangeable.
If your video lesson also uses Progress Tracking, you can link dashboards or course catalog cards to the exact lesson the learner most recently completed with {brm_progress:completed_item:last:toplevel:url} and {brm_progress:completed_item:last:toplevel:title}. Use {brm_progress:continue:toplevel:url} for the next uncompleted lesson instead.
Common Use Cases
- Course lessons where a quiz should only appear after the learner has watched enough of the lesson video
- Training libraries where the next lesson should stay blocked until the current lesson is actually consumed
- Member dashboards that show real watch progress instead of only generic completion states
- Protected resources where a download should unlock after the learner reaches the watch threshold
- Long video lessons where resume prompts make the learning experience much smoother
Troubleshooting
- Tracking is not starting — Confirm the Video Tracking module is enabled and the post actually has a video source
- The Browse button is missing — Connect and enable at least one supported video provider first
- The threshold never unlocks anything — Recheck the required percentage, post-level overrides, and the After Video Threshold Reached action on the BRM Video element
- Playback progress moves but watched coverage stays at 0% — Check the browser Network tab for
brm_get_video_watch_stateandbrm_sync_video_watch_state. Logged-out visitors do not send tracking requests. Logged-in playable renders send awatch_token; if the request is missing that token or returnsInvalid video tracking session, the page is not using the current BRM Video render config. Analytics messages such asUser excluded from trackingusually come from AnalyticsWP pageview tracking and are separate from BRM video watch tracking. - Bunny provider thumbnails show as broken images — Make sure the Bunny Access Key and Library ID are saved in the Video Hosts tab, then enable Store thumbnails in WordPress so BRM can fetch the provider thumbnail server-side and use the local media-library copy. BRM does not guess Bunny CDN thumbnail hosts because restricted Bunny libraries can block those guessed URLs. If you use Custom image with an ACF or Bricks dynamic tag, the tag resolves against the video post being rendered, including query-loop video items.
- Next lesson navigation stays blocked — Review your global and per-post navigation gating settings
- Resume behavior feels wrong — Revisit the global resume mode and skip restriction settings in BricksMembers → Video Tracking