BRM Dynamic Tags Reference

BricksMembers exposes a core set of dynamic tags and adds more tag families when you enable modules like Progress, Drip, Enrollments, Protected Downloads, Member Profiles, Content Fields, Quizzes module, Groups module, Submissions, Certificates, Member Chat, Instructor Frontend Builder, Payments, Content Bank, Video Tracking, and Events. The exact number depends on which modules are active and which context-specific variants you use.

The new Dynamic Tag Assistant inside Bricks Builder helps you find and build the right BRM tag without memorizing the full catalog.

The assistant also includes a Templates mode for inserting reviewed BricksMembers layouts. For the full two-mode workflow, see BricksMembers Assistant for Dynamic Tags and Templates.

This reference is aligned with the current dynamic-tag registry. It focuses on the tag families BRM actually resolves today, what they output, and where context-sensitive tags work.

What Are Dynamic Tags?

Dynamic tags are placeholders that get replaced with real data when the page loads.

Example:

Welcome, {user_display_name}! You're a {brm_user:levels} member.

Output:

Welcome, John Wick! You're a Premium Plus member.

Dynamic tags work in any Bricks text field: headings, paragraphs, buttons, custom HTML, and in many more places.

Target User Context in Query Loops

Most account-style BRM tags still resolve for the current logged-in user by default. Since BricksMembers 1.1.0, selected read-only learning tags can also resolve another user automatically when the template is inside a user-aware context, such as a Bricks user query loop, including one filtered by Users: Group Membership, or a BricksMembers profile page.

This applies to read-only progress tags, certificate summary tags, submission summary tags, video-watch tags, and the BRM Progress Bar when its User Context setting is left on Auto. Outside those contexts, they continue to use the current logged-in user.

When the resolved target user is different from the viewer, BricksMembers checks the target user’s privacy settings and the viewer’s group-role permissions before outputting the data. If the viewer is not allowed to see that category, the tag returns an empty value. Sensitive cross-user fields such as certificate download/PDF URLs, private submission content, reviewer feedback, upload URLs, private files, billing, invoices, gifts, and correct quiz answers are not exposed through this generic target-user context.

Using the BricksMembers Dynamic Tag Assistant

BricksMembers Dynamic Tag Assistant in action
BricksMembers Dynamic Tag Assistant in Bricks Builder

BricksMembers dynamic tags are powerful, but the catalog is large. There are more than 200 tags across progress, access, billing, downloads, quizzes, certificates, gifting, member profiles, instructor layouts, video tracking, and other modules. Remembering every tag name, modifier, loop context, and output type is not realistic when you are building in Bricks.

BricksMembers solves that with a builder-only Dynamic Tag Assistant inside Bricks. Use it as the practical starting point for this reference: it searches the BRM tag catalog, groups tags by feature, explains what each tag outputs, and helps you build the exact tag syntax you need instead of making you memorize or scan every possible tag.

The assistant is not just another long list of dynamic tags. It gives you a proper interface for finding the right tag, choosing the available options, and generating structured tags with the correct modifiers for the current use case.

To use it, open the Bricks builder on the page or template where the tag will be used. Click the floating BRM icon in the builder canvas, or use the keyboard shortcut Ctrl/Cmd + Shift + M. The same shortcut closes the assistant again when it is already open. Then search by feature, use case, or tag name. You can browse categories such as Progress, Downloads, Billing, Gifting, Instructor Builder, Certificates, Member Profiles, and Video Watch, choose the available options, and then insert or copy the generated tag into the Bricks field.

You can configure how the assistant opens from the BricksMembers settings page. Go to BricksMembers → Integrations → Bricks Builder to enable or disable the floating assistant button, choose the button corner and offset, enable or disable the keyboard shortcut, and change the shortcut modifier or letter if it conflicts with another builder extension.

The assistant only appears in the Bricks builder for users who can edit builder content. It is module-aware, so tags for downloads, quizzes, billing, gifting, instructor builder, member profiles, and other modules appear only when the related feature is available. It does not create new runtime behavior; the generated tag is still resolved by the normal dynamic tag system documented below.

It is especially useful for structured tags where a modifier matters, including progress boundaries, profile fields, protected downloads, checkout offers, quiz items, gift claim values, certificate placeholders, and video-watch values.

  • For protected downloads, it can generate metadata tags such as {brm_download:filename}, {brm_download:size}, and {brm_download:file_type}.
  • For billing lists, it helps you pick item tags such as {brm_billing:item:receipt_url}, provider {brm_billing:item:invoice_url}, or BRM PDF {brm_billing:item:invoice_download_url}.
  • For checkout pages, it includes checkout helper tags used around BRM Checkout Fields, such as {brm_checkout:tax_b2b_toggle_label}, {brm_checkout:tax_vat_id_hint}, and {brm_checkout:tax_reverse_charge_notice}.
  • For gifting and instructor layouts, it helps discover the available {brm_gift:*}, {brm_gift_transfer:*}, and {brm_instructor:*} tags that depend on the current loop or page context.

If a Bricks field expects a URL, choose a URL-style tag. If it expects plain text, choose a text tag. If it expects HTML, use only tags that intentionally output HTML, such as link or badge tags.

💡 Quick Tips: Hidden Gems

These small but powerful features make a huge difference in your designs:

Class Tags for Navigation & Styling

Perfect for query loops! Add these tags to the Style tab → CSS class field (not the General tab) to automatically style active, completed, or unlocked items.

  1. {brm_active} — Highlights the current page AND its parents in navigation menus. Perfect for course/module/lesson sidebars where you want the active lesson AND its parent module highlighted.
  2. {brm_completed} — Adds brm-completed class when a user finishes a lesson. Use it to show checkmarks, change colors, or hide “Start” buttons on completed content.
  3. {brm_unlocked} — Adds brm-unlocked class when content is available. Perfect for graying out locked lessons or disabling links to locked content.

Example: In a lesson sidebar query loop, add to Style tab → CSS class: lesson-link {brm_active} {brm_completed} {brm_unlocked}

Then style with CSS:

.lesson-link.brm-active {
  background: #FF8C42;
  color: white;
}
.lesson-link.brm-completed::after {
  content: "✓";
  color: green;
}
.lesson-link:not(.brm-unlocked) {
  opacity: 0.5;
  pointer-events: none;
}

Other Useful Tags You Might Miss

  1. {brm_user:has_level:5} — Returns 1 or 0. Perfect for Bricks conditions to show/hide content based on specific level IDs.
  2. {brm_progress:completed} — Returns 1 if current post is completed, 0 if not. Great for conditions and styling.
  3. {brm_progress:continue} — Returns a link to the next uncompleted post after the last completed one. Perfect for “Continue Learning” buttons on course pages.
  4. {brm_progress:completed_item:last} — Returns a link to the exact tracking-level post the user most recently completed. Perfect for “Last watched” or “Recently completed” links.
  5. {brm_structure:parent} — Shows the parent level name (e.g., “Module 1” when viewing a lesson). Perfect for breadcrumbs or context headers.
  6. {brm_structure:parent:toplevel} — Shows the top-level name (e.g., “Course 1” when viewing any child). Great for course context headers.
  7. {brm_video:image} — Works with ALL Bricks image modifiers! Use {brm_video:image:large}, {brm_video:image:url}, {brm_video:image:alt}, etc. Just like native Bricks image tags.

Base Tags Overview

Core tag families registered by default:

  1. {brm_user} – User levels and membership checks
  2. {brm_structure} – Navigation and breadcrumbs
  3. {brm_video} – Video metadata (URL, image, duration)
  4. {brm_active} – Active item class for navigation
  5. {brm_post} – Post required access levels (in query loops)

Additional tag families or utility tags added when modules are enabled:

  1. {brm_progress:*} and {brm_completed} – Progress data plus the completed CSS helper class (requires Progress module)
  2. {brm_drip:*} and {brm_unlocked} – Drip timing data plus the unlocked CSS helper class (requires Drip module)
  3. {brm_enrollment:*} and {brm_enrollments:*} – Enrollment status, dates, enroll/unenroll URLs, and user enrollment collections (requires Enrollments module)
  4. {brm_download} – Protected downloads (requires Downloads module)
  5. {brm_like:*} – Like system (requires Like module)
  6. {brm_user:id}, {brm_user:display_name}, {brm_user:email}, {brm_user:first_name}, {brm_user:last_name}, {brm_user:registered}, {brm_user:avatar}, {brm_user:last_login}, and {brm_user:field:*} – Account/profile user tags (requires Member Profiles module)
  7. {brm_cf:*} and {brm_cf_loop:*} – Native post/page Content Fields and Content Field loop-row values (requires Content Fields module)
  8. {brm_cert:*} – Certificates (requires Certificates module)
  9. {brm_quiz_title}, {brm_quiz_score_percent}, {brm_quiz_attempts_remaining}, {brm_quiz_q:*}, {brm_quiz_a:*}, {brm_quiz_pair:*}, and {brm_quiz_item:*} – Quiz and quiz-loop data (requires Quiz module)
  10. {brm_group:*} and {brm_group_pool:*} – Groups, group members, and owner seat pools (requires Groups module)
  11. {brm_gift:*} – Gift claim context (requires Gifting module, since 0.9.94)
  12. {brm_submission:*} – Assignment submissions (requires Submissions module)
  13. {brm_chat:*} – Member Chat room and message context (requires Member Chat module)
  14. {brm_instructor:*} – Instructor dashboard, manager, and editor context (requires Instructor Frontend Builder module)
  15. {brm_billing:*} – Billing and subscriptions (requires Payments module)
  16. {brm_checkout:*} – Checkout-page offer context and checkout tax helper text (requires the Payments module and BRM Checkout Context)
  17. {brm_bank_*} – Content Bank source and proxy context (requires Content Bank module)
  18. {brm_video_watch:*} – Learner watch-state data (requires Video Tracking module)
  19. {brm_event:*} and {brm_event_attendee:*} – Events and attendee row data (requires Events module)

Enrollment Tags

When the Enrollments module is enabled, BricksMembers adds enrollment-specific tags for the current effective enrollment anchor.

  • {brm_enrollment:status} — current effective status such as active or scheduled
  • {brm_enrollment:is_active} and {brm_enrollment:is_scheduled} — return 1 or 0
  • {brm_enrollment:current_started_at}, {brm_enrollment:scheduled_for}, and {brm_enrollment:expires_at} — enrollment timing fields
  • {brm_enrollment:source} — the current effective source, or multiple when more than one source is active
  • {brm_enrollment:enroll_url} and {brm_enrollment:unenroll_url} — simple self-service URLs for normal Bricks buttons
  • {brm_enrollments:count}, {brm_enrollments:post_ids}, {brm_enrollments:titles}, and {brm_enrollments:urls} — collection tags for the current user’s active enrollments

These tags are structure-aware. If the current post inherits its enrollment anchor from a course or parent item, the tags resolve against that effective anchor instead of blindly treating the current post as the enrolled item.

Checkout Tags

When you build checkout pages with BRM Checkout Context, BRM also exposes checkout-page tags that help you build one reusable checkout template.

  • {brm_checkout:url_offer_key} returns the active offer key when the checkout context is using the URL Parameter offer source. Use it for helper text, debugging, or headings on reusable checkout pages.
  • Checkout buttons on pricing cards should use either a BRM Billing Offers loop URL such as /checkout/?offer={brm_billing:item:offer_key}, or a static URL with the known offer key such as /checkout/?offer=pro_monthly. BRM does not provide a separate dynamic tag that accepts an arbitrary offer ID and returns a checkout URL outside an offer context.
  • Checkout layouts can use localized helper tags around BRM Checkout Fields, such as {brm_checkout:tax_label}, {brm_checkout:total_label}, {brm_checkout:tax_b2b_toggle_label}, {brm_checkout:tax_vat_id_label}, {brm_checkout:tax_vat_id_hint}, {brm_checkout:tax_vat_id_valid}, {brm_checkout:tax_vat_id_invalid}, {brm_checkout:tax_vat_id_unavailable}, {brm_checkout:tax_reverse_charge_notice}, {brm_checkout:tax_address_incomplete}, and {brm_checkout:tax_previewing}.
  • Inside a BRM Checkout Context, offer-style {brm_billing:item:*} tags resolve the active checkout offer before BRM falls back to a normal billing loop. That means you can print offer labels, descriptions, billing model data, enabled checkout providers, and the default provider directly inside the checkout layout.

1. User Tags

All User Tag Modifiers

  • {brm_user}
    Level names (comma-separated)
    Example: Premium Member, Course Access
  • {brm_user:levels}
    Level names (comma-separated)
    Example: Premium Member, Course Access
  • {brm_user:levels:link}
    Level names as links
    Example: <a href="/upgrade">Premium</a>, ...
  • {brm_user:levels:list}
    Level names as HTML list
    Example: <ul><li>Premium</li>...</ul>
  • {brm_user:levels:link:list}
    Level names as linked list
    Example: <ul><li><a href="...">Premium</a></li>...</ul>
  • {brm_user:levels:badges}
    Level names as one badge per assigned level
    Example: <span class="brm-user-level-badge">Premium</span>
  • {brm_user:levels:link:badges}
    Linked level badges, one badge per assigned level
    Example: <span class="brm-user-level-badge"><a href="...">Premium</a></span>
  • {brm_user:levels_count}
    Number of levels
    Example: 3
  • {brm_user:has_level:5}
    Check if user has level ID 5
    Example: 1 or 0
  • {brm_user:has_level:123}
    Check any level ID
    Example: 1 or 0

User Account and Profile Tags (Member Profiles module)

Availability: Requires Member Profiles module

  • {brm_user:id}
    User ID
  • {brm_user:display_name}
    User display name
  • {brm_user:email}
    User email address
  • {brm_user:first_name}
    User first name
  • {brm_user:last_name}
    User last name
  • {brm_user:registered}
    Registration date/time (WordPress format)
  • {brm_user:registered:F j, Y}
    Registration date with custom PHP date format
  • {brm_user:avatar}
    Avatar URL (default 96px)
  • {brm_user:avatar:large}
    Avatar URL (256px)
  • {brm_user:avatar:96}
    Avatar URL (96px)
  • {brm_user:avatar:150x150}
    Avatar URL (custom dimensions)
  • {brm_user:last_login}
    Last login date/time (WordPress format)
  • {brm_user:last_login:F j, Y g:i a}
    Last login with custom PHP date format
  • {brm_user:field:field_key}
    Custom profile field value (replace field_key with your field key, e.g. phone_number, bio)
  • {brm_user:field:avatar:url}
    Image field: URL only
  • {brm_user:field:avatar:id}
    Image field: attachment ID
  • {brm_user:field:avatar:large}
    Image field: large size (or :medium, :thumbnail, :full)

User Context Detection: BricksMembers uses a smart cascade to determine which user’s data to display:

  1. Bricks user query loop – The looped user is always used (highest priority)
  2. Author archive – On /author/username/ pages, the author is used
  3. URL parameter or clean URL?user=123, /member/username/, or /profile/123/ resolves that user
  4. Current logged-in user – Default fallback

Configure which methods are active in BricksMembers → Settings → Profiles. This enables building public profile pages where all {brm_user:*} tags display the viewed user’s data, not the visitor’s. The Member Profiles module must already be enabled on BricksMembers → Modules.

Examples:

Welcome, {user_display_name}! You have {brm_user:levels_count} levels.
Your levels: {brm_user:levels}
{brm_user:levels:link:list}
Has Premium? {brm_user:has_level:5}
Last login: {brm_user:last_login}
Phone: {brm_user:field:phone_number}

Content Fields Tags

Availability: Requires Content Fields module. Dynamic tags are always available for defined Content Fields; you do not have to opt a field into Bricks filters or conditions for these tags to work.

  • {brm_cf:field_key}
    Native Content Field stored value for the current post or looped post.
  • {brm_cf:field_key:label}
    Choice label for select, button group, radio, and checkbox Content Fields when you want the readable label instead of the stored value.
  • {brm_cf:group_key.subfield_key}
    Nested group subfield value without needing a group query loop.
  • {brm_cf_loop:subfield_key}
    Current row value inside a Content Field group or repeater query loop.

Examples:

Duration: {brm_cf:course_duration}
Level value: {brm_cf:course_level}
Level label: {brm_cf:course_level:label}
Resource note: {brm_cf:resource_group.resource_note}

2. Progress Tags

Availability: Requires Progress Tracking module

User context: Progress tags use the current logged-in user by default. In Bricks user loops, including loops filtered by Users: Group Membership, and profile pages, read-only progress tags can resolve the loop/profile user instead. Cross-user progress only renders when the viewer passes the target user’s visibility and group-role permission checks.

All Progress Tag Modifiers

Format Modifiers:

  • {brm_progress}
    Percentage (no % sign)
    Example: 75
  • {brm_progress:percent}
    Percentage (no % sign)
    Example: 75
  • {brm_progress:completed}
    Is current post completed?
    Example: 1 or 0

Note: {brm_progress:completed} without a scope returns 1 if the current post is completed, 0 if not. With a scope (e.g., {brm_progress:completed:toplevel}), it returns the completed count. {brm_progress:total} and {brm_progress:percent} require a scope modifier (e.g., :toplevel, :structure, :parent).

Scope Modifiers (combine with format):

  • {brm_progress:structure}
    Current structure – average progress across all top-level posts in the structure
  • {brm_progress:toplevel}
    Top level of structure – progress of the top-level post (usually progress of the course). If you’re on a top-level post, shows that post’s progress (same as current)
  • {brm_progress:parentlevel}
    Direct parent of current post (e.g., module progress when viewing a lesson)
  • {brm_progress:parent}
    Parent level (alias for parentlevel)
  • {brm_progress:current}
    Current post itself (shows progress for the post you’re viewing, useful for posts with children like courses or modules)
  • {brm_progress:level_2}
    Specific level 2
  • {brm_progress:level_3}
    Specific level 3
  • {brm_progress:level_4}
    Specific level 4
  • {brm_progress:level_5}
    Specific level 5
  • {brm_progress:level_6}
    Specific level 6

Direct Structure/Post ID Modifiers (for use on pages without post context):

  • {brm_progress:structure_id:YOUR_STRUCTURE_ID:percent}
    Specify structure ID directly to show progress for the entire structure (no post context needed)
    Example: {brm_progress:structure_id:abc123:percent} returns progress percentage for structure “abc123”
    Use case: Dashboard pages where you know the structure ID and want to show overall structure progress
    Returns: 0 if structure ID is invalid or progress tracking is not configured for that structure
  • {brm_progress:post_id:123:percent}
    Specify a post ID to show progress for that specific post
    Example: {brm_progress:post_id:456:percent} shows progress percentage for post 456 specifically
    Use case: Showing progress for a specific course/module on a dashboard or overview page
    Important: The post must be ABOVE the progress tracking level (parent containers only, not tracked items themselves)
    Returns: 0 if post doesn’t exist, isn’t published, is at/below tracking level, or has no structure

Note: The structure_id modifier calculates progress across ALL courses in the specified structure (like :structure but without requiring post context). The post_id modifier shows progress for that specific post only (like :current but for a different post). Both work with all format modifiers (:percent, :completed, :total). To find the exact structure ID, open BricksMembers → Content & Structures and copy the Structure ID badge shown inside the structure card. The same badge also appears in the structure interface header after you open a structure. You can also copy the part after page=brm_structure_ from the browser URL exactly as shown.

Edge Cases:

  • Invalid Post ID: If the post doesn’t exist or isn’t published, returns 0
  • Post at/below tracking level: Progress is only tracked for posts ABOVE the tracking level (parent containers). If you specify a post at or below the tracking level, returns 0
  • Post without structure: If the post isn’t part of a structure, returns 0
  • Invalid Structure ID: If the structure doesn’t exist or progress tracking isn’t configured, returns 0

All Scope + Format Combinations:

  • {brm_progress:percent:structure}
    Structure percentage
  • {brm_progress:completed:structure}
    Structure completed count
  • {brm_progress:total:structure}
    Structure total count
  • {brm_progress:percent:toplevel}
    Top level percentage
  • {brm_progress:completed:toplevel}
    Top level completed count
  • {brm_progress:total:toplevel}
    Top level total count
  • {brm_progress:percent:parentlevel}
    Parent level percentage
  • {brm_progress:completed:parentlevel}
    Parent level completed count
  • {brm_progress:total:parentlevel}
    Parent level total count
  • {brm_progress:percent:current}
    Current level percentage
  • {brm_progress:completed:current}
    Current level completed count
  • {brm_progress:total:current}
    Current level total count
  • {brm_progress:percent:level_2}
    Level 2 percentage
  • {brm_progress:completed:level_2}
    Level 2 completed count
  • {brm_progress:total:level_2}
    Level 2 total count

Completion Date:

  • {brm_progress:completion_date}
    Date completed (if completed, uses WordPress date format; empty if not completed)

Continue (Next Post After Last Completed):

Automatically finds the last completed post within a boundary and returns a link to the next uncompleted post. Perfect for “Continue Learning” buttons on course overview pages or dashboards.

  • {brm_progress:continue}
    Complete HTML link to next uncompleted post (default format)
    Example: <a href="https://example.com/lesson-5" alt="Lesson 5: Advanced Topics">Lesson 5: Advanced Topics</a>
    Note: Without :url or :title modifiers, this returns a full clickable link.
  • {brm_progress:continue:url}
    URL only (for custom buttons)
    Example: https://example.com/lesson-5
  • {brm_progress:continue:title}
    Title only
    Example: Lesson 5: Advanced Topics
  • {brm_progress:continue:id}
    Post ID only (useful for query loop filters, meta queries, conditional logic)
    Example: 123

Continue with Boundary Modifiers:

Note: Without :url, :title, or :id modifiers, all continue tags return a complete HTML link. Add :url for just the URL, :title for just the title, or :id for just the post ID.

  • {brm_progress:continue:structure}
    Complete HTML link to next post across entire structure (auto-detects structure from current post)
    Example: <a href="...">Lesson 5</a>
    Note: Works on post pages within a structure. For dashboard pages without post context, use :structure_id:ID instead.
  • {brm_progress:continue:structure_id:YOUR_STRUCTURE_ID}
    Complete HTML link to next post across entire structure (use on dashboard pages)
    Example: <a href="...">Lesson 5</a>
    Note: Replace YOUR_STRUCTURE_ID with your actual structure ID. Find it in BricksMembers → Content & Structures by copying the Structure ID badge inside the structure card or in the structure interface header, or by opening the structure and copying the part after page=brm_structure_ from the browser URL exactly as shown.
  • {brm_progress:continue:structure_id:YOUR_STRUCTURE_ID:url}
    URL only for structure (dashboard pages)
    Example: https://example.com/lesson-5
  • {brm_progress:continue:structure_id:YOUR_STRUCTURE_ID:title}
    Title only for structure (dashboard pages)
    Example: Lesson 5: Advanced Topics
  • {brm_progress:continue:structure_id:YOUR_STRUCTURE_ID:id}
    Post ID only for structure (dashboard pages, useful for query filters)
    Example: 123
  • {brm_progress:continue:toplevel}
    Complete HTML link to next post within top-level boundary
    Example: <a href="...">Lesson 5</a>
  • {brm_progress:continue:parent}
    Complete HTML link to next post within parent-level boundary
    Example: <a href="...">Lesson 3</a>
  • {brm_progress:continue:level_2}
    Complete HTML link to next post within level 2 boundary
    Example: <a href="...">Lesson 4</a>
  • {brm_progress:continue:course}
    Complete HTML link to next post within course boundary (using level slug)
    Example: <a href="...">Lesson 1</a>
  • {brm_progress:continue:toplevel:url}
    URL only of next post within top-level
    Example: https://example.com/lesson-5
  • {brm_progress:continue:parent:title}
    Title only of next post within parent-level
    Example: Lesson 3: Basics

How It Works:

  1. Finds all posts within the specified boundary (or default scope)
  2. Identifies the last completed post by the current user
  3. Returns the next post after that completed one
  4. If no posts are completed, returns the first post in scope
  5. If all posts are completed, returns empty string

Use Cases:

  • Course overview page: “Continue Learning” button that takes users to their next lesson
  • Dashboard: Quick access to resume where they left off
  • Module pages: Continue within the current module

Examples:

<!-- Dashboard page (no post context) - use structure_id -->
<a href="{brm_progress:continue:structure_id:YOUR_STRUCTURE_ID:url}">Continue Learning →</a>

<!-- Post page within structure - use structure to auto-detect -->
<!-- Complete HTML link across entire structure -->
{brm_progress:continue:structure}

<!-- URL only for custom button -->
<a href="{brm_progress:continue:structure:url}">Continue Learning →</a>

<!-- Complete HTML link within top-level -->
{brm_progress:continue:toplevel}

<!-- URL only for custom button -->
<a href="{brm_progress:continue:toplevel:url}">Continue Learning →</a>

<!-- Title only -->
Continue: {brm_progress:continue:parent:title}

<!-- Post ID only (useful for query filters, meta queries) -->
Next lesson ID: {brm_progress:continue:id}

<!-- Default scope (requires post context) -->
Next up: {brm_progress:continue}

Completed Item (Most Recently Completed Post):

Returns the exact tracking-level post the user most recently completed, ordered by the stored completion timestamp. Use this for “Last watched”, “Recently completed”, or “Reopen the video you just finished” cards. Use {brm_progress:continue} when you want the next uncompleted item instead.

  • {brm_progress:completed_item:last}
    Complete HTML link to the most recently completed tracking item (default format)
  • {brm_progress:completed_item:last:url}
    URL only, useful for button link fields
  • {brm_progress:completed_item:last:title}
    Title only
  • {brm_progress:completed_item:last:id}
    Post ID only, useful for conditions and query filters that accept a dynamic ID
  • {brm_progress:completed_item:last:structure_id:YOUR_STRUCTURE_ID:url}
    URL of the most recently completed item in a specific structure, useful on dashboards without post context
  • {brm_progress:completed_item:last:toplevel:url}
    URL of the most recently completed item within the current top-level boundary
  • {brm_progress:completed_item:last:parent:title}
    Title of the most recently completed item within the current parent boundary
  • {brm_progress:completed_item:last:level_2:url}
    URL of the most recently completed item within level 2
  • {brm_progress:completed_item:last:course:url}
    URL of the most recently completed item within a level matched by slug, for example course

Important: Version 1 supports only the last selector. Unsupported selectors such as {brm_progress:completed_item:first} intentionally return an empty string.

Examples:

Last completed: {brm_progress:completed_item:last}

<!-- Dashboard page without post context -->
<a href="{brm_progress:completed_item:last:structure_id:YOUR_STRUCTURE_ID:url}">Reopen last completed lesson</a>

<!-- Post page or query loop with structure context -->
Last completed title: {brm_progress:completed_item:last:toplevel:title}

<!-- Post ID only -->
Last completed ID: {brm_progress:completed_item:last:structure:id}

Max Flag (include inaccessible content):

  • {brm_progress:percent:max}
    Percentage including inaccessible content
  • {brm_progress:completed:toplevel:max}
    Completed count including inaccessible content
  • {brm_progress:total:toplevel:max}
    Total count including inaccessible content

Examples:

{brm_progress:percent:structure}% complete
{brm_progress:completed:toplevel} of {brm_progress:total:toplevel} lessons done
Is this post completed? {brm_progress:completed}
Completed on: {brm_progress:completion_date}
Continue: <a href="{brm_progress:continue:toplevel:url}">{brm_progress:continue:toplevel:title}</a>
Last completed: <a href="{brm_progress:completed_item:last:toplevel:url}">{brm_progress:completed_item:last:toplevel:title}</a>
Including inaccessible: {brm_progress:percent:toplevel:max}%

3. Drip Tags

Availability: Requires Drip Content module

These drip tags work with all current drip rule target modes: structured BRM content, hand-picked Selected Posts rules, broad Post Type rules, and per-post drip overrides from the BricksMembers meta box.

All Drip Tag Modifiers

  • {brm_drip:unlocked}
    Is content unlocked for current user?
    Example: 1 or 0
  • {brm_drip:unlock_date}
    Unlock date (WordPress date format)
    Example: January 15, 2025
  • {brm_drip:days_left}
    Days until unlock
    Example: 5

Examples:

Unlocked? {brm_drip:unlocked}
Unlocks: {brm_drip:unlock_date}
Days left: {brm_drip:days_left}

Tip: If multiple drip rules could match a post, these tags use the same precedence as the drip engine itself. The most specific rule wins first, then the earliest unlock date inside that same specificity level.

4. Post Level Tags

Context: Use inside post query loops (e.g., course catalog, lesson list) to display which membership level each post requires. Shows the required access level(s) for the current loop post.

All Post Level Tag Modifiers

  • {brm_post:level}
    All required level names (comma-separated). Shows “Free” for posts with no level requirements.
    Example: Premium, Advanced or Free
  • {brm_post:level:first}
    First required level only (useful for badges)
    Example: Premium
  • {brm_post:level:ids:1,2,3}
    Show only levels matching these IDs. Omit non-matching levels.
    Example: If post requires levels 1 and 5, ids:1,2 shows only level 1

Example: In a course catalog query loop, add a badge: {brm_post:level:first} to show “Premium”, “Advanced”, or “Free” for each course.

Post Reading Time Tags

Use these tags when you need text-based reading time in plain text, cards, dashboards, or course overview metadata. Since version 1.3.0, reading-time tags can include saved BRM video duration with the :with_video, :include_video, or :video modifier, and can output compact duration labels with :human, :duration, or :time.

  • {brm_post:reading_time}
    Current post reading time with label
    Example: 4 min read
  • {brm_post:reading_time:minutes}
    Current post reading time as a raw number of minutes
    Example: 4
  • {brm_post:reading_time:human}
    Current post reading time as a compact duration label
    Example: 29mins or 1hr 30min
  • {brm_post:reading_time:with_video}
    Current post reading time plus saved brm_video_duration
  • {brm_post:reading_time:toplevel:minutes}
    Total reading time for the current top-level scope
  • {brm_post:reading_time:toplevel:human:with_video}
    Top-level total reading time plus saved video durations as a compact duration label
  • {brm_post:reading_time:toplevel:minutes:with_video}
    Top-level total reading time plus saved video durations

Scope and format modifiers: {brm_post:reading_time} supports :current, :structure, :children, :descendants, :toplevel, :parent, :parentlevel, :level_N, and post type slugs. Use :minutes or :raw for a raw number, and :human, :duration, or :time for compact labels such as 29mins or 1hr 30min.

Video duration note: The :with_video modifier uses the saved BRM Video Duration field on each counted post. It does not fetch fresh duration data from YouTube, Vimeo, Bunny, or other video providers while the page renders.

5. Structure Tags

All Structure Tag Modifiers

Navigation Modifiers:

  • {brm_structure:next_item}
    Next post title
    Example: Lesson 2: Advanced Topics
  • {brm_structure:next_item:link}
    Next post link
    Example: <a href="...">Lesson 2</a>
  • {brm_structure:next_item:url}
    Next post URL only
    Example: https://example.com/lesson-2
  • {brm_structure:previous_item}
    Previous post title
    Example: Lesson 1: Basics
  • {brm_structure:previous_item:link}
    Previous post link
    Example: <a href="...">Lesson 1</a>
  • {brm_structure:previous_item:url}
    Previous post URL only
    Example: https://example.com/lesson-1

Level Name Modifiers:

  • {brm_structure:level_name}
    Current post type name (capitalized)
    Example: Lesson (when viewing a lesson post)
  • {brm_structure:level_name:link}
    Current post type name as link
    Example: <a href="...">Lesson</a>

Parent Modifiers:

  • {brm_structure:parent}
    Parent post title
    Example: Module 1
  • {brm_structure:parent:url}
    Parent post URL
    Example: https://example.com/module-1
  • {brm_structure:parent:link}
    Parent link
    Example: <a href="...">Module 1</a>
  • {brm_structure:parent:toplevel}
    Top-level parent title
    Example: Course Name
  • {brm_structure:parent:toplevel:link}
    Top-level parent link
    Example: <a href="...">Course</a>
  • {brm_structure:parent:toplevel:url}
    Top-level parent URL
    Example: https://example.com/course
  • {brm_structure:parent:level_2}
    Level 2 parent title
    Example: Module 1
  • {brm_structure:parent:level_3}
    Level 3 parent title
    Example: Section 1
  • {brm_structure:parent:level_4}
    Level 4 parent title
    Example: (if exists)
  • {brm_structure:parent:level_5}
    Level 5 parent title
    Example: (if exists)
  • {brm_structure:parent_toplevel}
    Top-level parent (alias for parent:toplevel)
  • {brm_structure:parent_level_2}, parent_level_3, etc.
    Parent at specific level by index
  • {brm_structure:breadcrumbs}
    Ancestor posts trail (current post excluded by default)
    Example: Course › Module › Section
  • {brm_structure:breadcrumbs:current}
    Includes current post at the end
    Example: Course › Module › Section › Lesson
  • {brm_structure:breadcrumbs:link}
    Ancestor posts as clickable links
    Example: <a href="...">Course</a> › ...
  • {brm_structure:breadcrumbs:home}
    Prepends Home link to breadcrumb trail
    Example: Home › Course › Module › Section
  • {brm_structure:breadcrumbs:home:link:current}
    Full breadcrumbs with Home, links, and current post
    Example: <a href="/">Home</a> › <a href="...">Course</a> › Module › Section › Lesson
  • {brm_structure:breadcrumbs:depth:1}
    Immediate parent only (1 closest ancestor)
    Example: Section
  • {brm_structure:breadcrumbs:link:current:depth:2}
    2 closest parents + current with links
    Example: <a href="...">Module</a> › <a href="...">Section</a> › Lesson

Note: The breadcrumb separator is configurable in BricksMembers → Settings → General → Breadcrumb Separator (default: ). Breadcrumbs work dynamically with any structure depth (2-6 levels). The :depth:N modifier limits display to the N closest ancestor levels (e.g., depth:1 shows only the immediate parent).

  • {brm_structure:structure_id}
    Structure ID
    Example: 123
  • {brm_structure:index}
    Current post order (within post type, no boundary)
    Example: 5
  • {brm_structure:index:toplevel}
    Current post order within top level
    Example: 3
  • {brm_structure:index_max}
    Total posts of current post type (no boundary)
    Example: 20
  • {brm_structure:index_max:structure}
    Total posts across entire structure (unbounded)
    Example: 50
  • {brm_structure:index_max:toplevel}
    Total posts within top level boundary
    Example: 15
  • {brm_structure:index_max:parent}
    Total posts within parent boundary
    Example: 8
  • {brm_structure:index:structure}
    Current position across entire structure (unbounded)
    Example: 23
  • {brm_structure:index:toplevel}
    Current position within top-level boundary
    Example: 5
  • {brm_structure:index:parent}
    Current position within parent boundary
    Example: 3
  • {brm_structure:level_index}
    Current level index (1-based)
    Example: 2 (for level 2)

Boundary Modifiers (for navigation):

Boundary modifiers control where navigation searches for the next/previous item. All navigation tags support these boundaries:

  • {brm_structure:next_item:structure}
    Next across entire structure (unbounded – searches all posts in structure)
  • {brm_structure:next_item:toplevel}
    Next within top-level boundary (searches within top-level container only)
  • {brm_structure:next_item:parentlevel}
    Next within parent boundary
  • {brm_structure:next_item:parent}
    Next within parent (alias for parentlevel)
  • {brm_structure:next_item:level_2}
    Next within level 2 boundary
  • {brm_structure:next_item:level_3}
    Next within level 3 boundary
  • {brm_structure:next_item:level_4}
    Next within level 4 boundary
  • {brm_structure:next_item:level_5}
    Next within level 5 boundary
  • {brm_structure:previous_item:structure}
    Previous across entire structure (unbounded)
  • {brm_structure:previous_item:toplevel}
    Previous within top-level boundary
  • {brm_structure:previous_item:parentlevel}
    Previous within parent boundary
  • {brm_structure:previous_item:parent}
    Previous within parent (alias)
  • {brm_structure:previous_item:level_2}
    Previous within level 2 boundary
  • {brm_structure:previous_item:level_3}
    Previous within level 3 boundary
  • {brm_structure:previous_item:level_4}
    Previous within level 4 boundary
  • {brm_structure:previous_item:level_5}
    Previous within level 5 boundary

Combined Modifiers:

  • {brm_structure:next_item:link:toplevel}
    Next item link (top level scope)
  • {brm_structure:next_item:url:parentlevel}
    Next item URL (parent scope)
  • {brm_structure:previous_item:link:level_2}
    Previous item link (level 2 scope)

Examples:

{brm_structure:breadcrumbs:link}
Next: {brm_structure:next_item:link}
Previous: {brm_structure:previous_item:link:parentlevel}
{brm_structure:index} of {brm_structure:index_max}
Parent: {brm_structure:parent:toplevel:link}
Level: {brm_structure:level_name}

6. Video Tags

All video tags support boundary modifiers to display parent post data without query loops.

Important: Video tags support boundary modifiers to get video data from parent posts (toplevel, parent, level_N), but NOT :structure (since there’s no specific parent post for “entire structure”). If a boundary cannot be resolved, the tag falls back to the current post’s video data.

BRM Video Tag – All Modifiers

  • {brm_video}
    Current post saved BRM Video field value, such as a URL, provider ID, embed code, or custom value
    Example: 655736/ac29573c-a2b0-4b10-8d92-c1facb1f6615
  • {brm_video:embed}
    Resolved provider embed for URL fields, lightboxes, and iframe sources
    Example: https://player.mediadelivery.net/embed/655736/ac29573c-a2b0-4b10-8d92-c1facb1f6615
  • {brm_video:toplevel}
    Top-level parent video
    Example: Course video on lesson page
  • {brm_video:parentlevel}
    Parent video
    Example: Module video on lesson page
  • {brm_video:parent}
    Same as parentlevel
    Example: Parent video
  • {brm_video:level_1}
    Level 1 parent video
    Example: Top level
  • {brm_video:level_2}
    Level 2 parent video
    Example: Specific level
  • {brm_video:level_3}
    Level 3 parent video
    Example: Specific level
  • {brm_video:level_4}
    Level 4 parent video
    Example: Specific level
  • {brm_video:level_5}
    Level 5 parent video
    Example: Specific level
  • {brm_video:level_6}
    Level 6 parent video
    Example: Specific level

Note: The native BRM Video element does not need a dynamic tag for its source. It reads the saved video source automatically and resolves the provider embed internally. {brm_video} returns the saved field value for custom code, including explicit Bunny video IDs. Bare Bunny video IDs resolve through the selected Bunny provider and saved Bunny Library ID; when Bunny is the only enabled and connected provider, BRM can resolve a bare Bunny ID without a saved provider hint. Use {brm_video:embed} when a regular Bricks URL field, Lightbox Video field, or iframe source needs the complete provider embed. Use {brm_video:title}, {brm_video:provider}, and {brm_video:source_id} for forms, marketing CTAs, and partial-refresh workflows that need video metadata.

If the native BRM Video element is inside a Bricks query loop, use its Video source context control. Current post keeps the normal lesson-template behavior. Current query loop item makes each loop card read and track the loop item’s own BRM Video source. Since version 1.3.0, playback is allowed by default for anyone who can see the element; use the element’s Playback Access controls only when the player itself should be blocked. Playback Access can use selected user levels chosen directly in the element or the required levels assigned to the video post.

Video Source Tag

Use the source tag when you need the resolved provider key instead of the raw video value.

  • {brm_video:source}
    Current post video provider
    Example: gumlet, vimeo, youtube, cloudflare_stream, html5
  • {brm_video:source:toplevel}
    Top-level parent video provider
  • {brm_video:source:parentlevel}
    Parent video provider
  • {brm_video:source:parent}
    Same as parentlevel

Boundary modifiers: {brm_video:source} supports the same :toplevel, :parent, :parentlevel, and :level_N modifiers as {brm_video}.

Video Image Tag – All Modifiers

Basic Modifiers:

  • {brm_video:image}
    Current post thumbnail
    Example: Works in Bricks Image elements
  • {brm_video:image:url}
    Image URL only
    Example: https://example.com/thumb.jpg
  • {brm_video:image:id}
    Attachment ID
    Example: 123
  • {brm_video:image:link}
    Image wrapped in link
    Example: Clickable image

Size Modifiers:

  • {brm_video:image:thumbnail}
    Thumbnail size
  • {brm_video:image:medium}
    Medium size
  • {brm_video:image:large}
    Large size
  • {brm_video:image:full}
    Full size
  • {brm_video:image:custom-size}
    Any registered WordPress size

Boundary Modifiers:

  • {brm_video:image:toplevel}
    Top-level parent image
  • {brm_video:image:parentlevel}
    Parent image
  • {brm_video:image:parent}
    Parent image (alias)
  • {brm_video:image:level_1}
    Level 1 parent image
  • {brm_video:image:level_2}
    Level 2 parent image
  • {brm_video:image:level_3}
    Level 3 parent image
  • {brm_video:image:level_4}
    Level 4 parent image
  • {brm_video:image:level_5}
    Level 5 parent image
  • {brm_video:image:level_6}
    Level 6 parent image

Combined Modifiers (Boundary + Size/Output):

  • {brm_video:image:toplevel:large}
    Top-level image, large size
  • {brm_video:image:toplevel:url}
    Top-level image URL only
  • {brm_video:image:toplevel:id}
    Top-level image attachment ID
  • {brm_video:image:parentlevel:medium}
    Parent image, medium size
  • {brm_video:image:parentlevel:url}
    Parent image URL only
  • {brm_video:image:level_2:large}
    Level 2 image, large size
  • {brm_video:image:level_2:url}
    Level 2 image URL only
  • {brm_video:image:level_3:medium}
    Level 3 image, medium size

Advanced Image Modifiers:

  • {brm_video:image:plain}
    Strip HTML tags
  • {brm_video:image:@fallback:Default text}
    Fallback if no image
  • {brm_video:image:@fallback-image:456}
    Fallback image ID
  • {brm_video:image:@sanitize:false}
    Disable sanitization
  • {brm_video:image:100}
    Word limit (if <1000)
  • {brm_video:image:5000}
    Character limit (if >1000)

Video Duration Tag – All Modifiers

Format Modifiers:

  • {brm_video:duration}
    Auto format (H:MM:SS or M:SS)
    Example: 15:30 or 1:15:30
  • {brm_video:duration:auto}
    Same as default
    Example: Auto format
  • {brm_video:duration:seconds}
    Duration in seconds
    Example: 95
  • {brm_video:duration:mmss}
    MM:SS format
    Example: 1:35
  • {brm_video:duration:hms}
    H:MM:SS format
    Example: 0:01:35

Boundary Modifiers:

  • {brm_video:duration:toplevel}
    Top-level parent duration
  • {brm_video:duration:parentlevel}
    Parent duration
  • {brm_video:duration:parent}
    Parent duration (alias)
  • {brm_video:duration:level_1}
    Level 1 parent duration
  • {brm_video:duration:level_2}
    Level 2 parent duration
  • {brm_video:duration:level_3}
    Level 3 parent duration
  • {brm_video:duration:level_4}
    Level 4 parent duration
  • {brm_video:duration:level_5}
    Level 5 parent duration
  • {brm_video:duration:level_6}
    Level 6 parent duration

Combined Modifiers (Boundary + Format):

  • {brm_video:duration:toplevel:auto}
    Top-level duration, auto format
  • {brm_video:duration:toplevel:seconds}
    Top-level duration in seconds
  • {brm_video:duration:toplevel:mmss}
    Top-level duration, MM:SS
  • {brm_video:duration:toplevel:hms}
    Top-level duration, H:MM:SS
  • {brm_video:duration:parentlevel:auto}
    Parent duration, auto format
  • {brm_video:duration:parentlevel:seconds}
    Parent duration in seconds
  • {brm_video:duration:parentlevel:mmss}
    Parent duration, MM:SS
  • {brm_video:duration:parentlevel:hms}
    Parent duration, H:MM:SS
  • {brm_video:duration:level_2:auto}
    Level 2 duration, auto format
  • {brm_video:duration:level_2:seconds}
    Level 2 duration in seconds
  • {brm_video:duration:level_2:mmss}
    Level 2 duration, MM:SS
  • {brm_video:duration:level_2:hms}
    Level 2 duration, H:MM:SS
  • {brm_video:duration:level_3:mmss}
    Level 3 duration, MM:SS
  • {brm_video:duration:level_4:hms}
    Level 4 duration, H:MM:SS

Examples:

{brm_video}
{brm_video:embed}
{brm_video:image:toplevel:large}
Duration: {brm_video:duration:mmss}
Course Duration: {brm_video:duration:toplevel:hms}
Module Duration: {brm_video:duration:parentlevel:mmss}

7. Download Tags

Availability: Only when Protected Downloads module is enabled

All Download Tag Modifiers

Basic:

  • {brm_download}
    Download URL
    Example: https://example.com/...file.pdf
  • {brm_download:url}
    Explicit download URL alias
    Example: https://example.com/...file.pdf
  • {brm_download:link}
    HTML link with download title
    Example: <a href="...">Download Title</a>
  • {brm_download:filename}
    Stored filename
    Example: workbook.pdf
  • {brm_download:size}
    Formatted file size
    Example: 2.5 MB
  • {brm_download:file_type}
    Uppercase file extension label
    Example: PDF
  • {brm_download:id=123}
    URL for specific download ID (when not on a download post)
    Example: https://example.com/...file.pdf
  • {brm_download:id=123:link}
    HTML link for specific download ID

Assignment scopes (since version 1.1.12):

  • {brm_download:url:post}
    URL for the first download assigned to the current post or loop item
  • {brm_download:link:post=123}
    HTML link for the first download assigned to a specific post ID
  • {brm_download:filename:structure}
    Filename for the first download assigned to the current post’s structure
  • {brm_download:size:structure=course_slug}
    File size for the first download assigned to a specific structure ID

Assignment modifiers work with url, link, filename, size, file_type, and image tags. Dynamic tags return one scalar value, so assignment-scope tags use the first assigned download in assignment order. Use the Protected Download element in list mode or a brm_download query loop when you need to display multiple files.

Image (Bricks Image element compatible):

  • {brm_download:image}
    Image (works in Bricks Image elements)
  • {brm_download:image:url}
    Image URL only
  • {brm_download:image:id}
    Attachment ID
  • {brm_download:image:thumbnail}, :medium, :large, :full, or any registered WordPress size
  • {brm_download:image:link}
    Image wrapped in link to post
  • {brm_download:image:plain}
    Strip HTML tags
  • {brm_download:image:@fallback:No image}
    Fallback text if no image
  • {brm_download:image:@fallback-image:456}
    Fallback attachment ID
  • {brm_download:image:id=123}
    Image from specific download (in brm_download:image modifiers, use id=123 to target a download)

Examples:

{brm_download:link}
{brm_download:filename}
{brm_download:size}
{brm_download:file_type}
{brm_download:image:large}
{brm_download:id=123:link}
{brm_download:image:@fallback:No thumbnail}

8. Like Tags

Availability: Only when Like System module is enabled

All Like Tag Modifiers

  • {brm_like:count}
    Number of likes
    Example: 42
  • {brm_like:status}
    Current user’s like status
    Example: 1 (liked) or 0 (not liked)
  • {brm_like:liked_at}
    Formatted date when the current user liked the current post
    Example: April 28, 2026
  • {brm_like:liked_at}
    Raw stored like timestamp
    Example: 2026-04-28 09:00:00

User List Modifiers:

  • {brm_like:users}
    Comma-separated user list
    Example: John Doe, Jane Smith
  • {brm_like:users:link}
    User list with links
    Example: <a href="...">John</a>, ...

Note: Like tags are available in the Bricks dynamic tag picker and the BricksMembers Dynamic Tag Assistant when the Like module is enabled.

Examples:

{brm_like:count} likes
Liked by: {brm_like:users}
Liked by (with links): {brm_like:users:link}
Has current user liked? {brm_like:status} (1 or 0)

9. Billing Tags

Availability: Requires Payments module

Billing tags display subscription, payment, offer, and invoice data. Outside loops, BricksMembers resolves subscription-style tags in this order: current subscription loop item, single actionable subscription when the user has exactly one, current active subscription, then latest subscription. If there is no matching subscription, the billing tags output empty strings, except {brm_billing:cancel_at_period_end}, which outputs 0. Inside BRM User Subscriptions, BRM User Payments, BRM User Invoices, or BRM Billing Offers query loops, use {brm_billing:item:*}.

Subscription Tags (outside loop)

  • {brm_billing:status} — Raw subscription status slug such as active, trialing, past_due, paused, cancelled, expired, pending, paid, failed, or refunded
  • {brm_billing:provider} — Raw provider key such as stripe, paypal, square, woocommerce, fluentcart, surecart, or generic_webhook
  • {brm_billing:offer_key} — Stored offer key slug such as premium-monthly
  • {brm_billing:offer_label} — Human-readable offer label. If the offer config is gone, BRM falls back to the stored offer key
  • {brm_billing:period_start}, {brm_billing:period_end} — Dates formatted with the site’s WordPress date format, or empty if no date is stored
  • {brm_billing:trial_ends_at} — Trial end date in the site’s WordPress date format, or empty
  • {brm_billing:cancel_at_period_end}1 when the subscription is marked to end at the current period boundary, otherwise 0
  • {brm_billing:manage_url} — Safe validated manage-billing URL for the resolved subscription, or empty if BRM cannot expose one
  • {brm_billing:payment_method} — Readable saved payment method label for the resolved subscription, for example Visa ending in 4242 (since 0.9.94). Use {brm_billing:payment_method_brand}, {brm_billing:payment_method_last4}, and {brm_billing:payment_method_label} when you need the parts separately.
  • {brm_billing:last_amount}, {brm_billing:last_currency}, {brm_billing:last_payment_at} — Formatted last payment amount, uppercased currency code, and WordPress-formatted payment date from the subscription’s last recorded payment

Loop Item Tags (inside BRM User Subscriptions / Payments / Offers loops)

  • Inside BRM Billing Offers loops: {brm_billing:item:offer_key}, {brm_billing:item:offer_label}, {brm_billing:item:description}, {brm_billing:item:features}, {brm_billing:item:features_text}, {brm_billing:item:content}, {brm_billing:item:image}, {brm_billing:item:image:url}, {brm_billing:item:image:id}, {brm_billing:item:image_url}, {brm_billing:item:image_id}, {brm_billing:item:has_trial}, {brm_billing:item:trial_days}, {brm_billing:item:trial_label}, and {brm_billing:item:billing_model} return offer blueprint data. {brm_billing:item:image} is compatible with Bricks image controls and supports the same image modifiers as other BRM image tags. {brm_billing:item:checkout_providers} returns enabled native provider labels joined by commas, and {brm_billing:item:default_provider} returns the default provider label. Billing-state and payment-document fields are empty here, and {brm_billing:item:cancel_at_period_end} returns 0.
  • Inside BRM User Subscriptions loops: {brm_billing:item:status}, {brm_billing:item:provider}, {brm_billing:item:offer_key}, {brm_billing:item:offer_label}, {brm_billing:item:period_start}, {brm_billing:item:period_end}, {brm_billing:item:cancel_at_period_end}, {brm_billing:item:payment_method}, {brm_billing:item:payment_method_brand}, {brm_billing:item:payment_method_last4}, and {brm_billing:item:payment_method_label} come from the current subscription row. {brm_billing:item:amount}, {brm_billing:item:currency}, and {brm_billing:item:paid_at} come from that subscription’s last recorded payment.
  • Inside BRM User Payments loops: {brm_billing:item:amount}, {brm_billing:item:currency}, and {brm_billing:item:paid_at} come from the current payment row itself. {brm_billing:item:receipt_url} returns the provider receipt URL, {brm_billing:item:invoice_url} remains the provider-hosted invoice URL, and {brm_billing:item:invoice_download_url} returns the BRM invoice PDF URL when the payment has a related BRM invoice. {brm_billing:item:transfer_url} returns the native transfer URL for eligible one-time payment access. {brm_billing:item:status_badge} outputs an HTML badge span. The current runtime includes subscription-linked payment rows and standalone one-time payment rows for the current user.

Inside BRM User Invoices loops: use {brm_billing:item:id}, {brm_billing:item:status}, {brm_billing:item:amount}, {brm_billing:item:currency}, {brm_billing:item:paid_at}, {brm_billing:item:invoice_number}, {brm_billing:item:invoice_date}, {brm_billing:item:invoice_due_date}, {brm_billing:item:invoice_subtotal}, {brm_billing:item:invoice_tax}, {brm_billing:item:invoice_total}, {brm_billing:item:invoice_download_url}, and {brm_billing:item:status_badge}. {brm_billing:item:invoice_url} resolves to the same BRM invoice download URL inside this loop.

For the most flexible invoice page, use a Bricks query loop with BRM User Invoices and build the row with normal Bricks text and button elements. The older {brm_billing:invoice_url} tag still exists for a simple account-level list in content text and renders the current user’s BRM invoice download links as HTML anchors, or nothing when there are no invoices. In single dynamic-tag fields, invoice-only pages should use the invoice loop tags because {brm_billing:invoice_url} still follows subscription resolution first.

See Payments Module and Billing for full details.

10. Content Bank Tags

Availability: Requires Content Bank module

Content Bank tags let you tell whether the current post is a proxy, identify its source, and output a little bit of library metadata inside Bricks.

  • {brm_bank_is_proxy}1 when the current post is a Content Bank proxy, otherwise 0
  • {brm_bank_source_title} — Source post title for the current proxy context
  • {brm_bank_source_id} — Source post ID, or the current source ID when used on a source item context that resolves to itself
  • {brm_bank_usage_count} — Number of proxies currently using that source
  • {brm_bank_collections} — Comma-separated collection names for the current source

A practical use case is small admin-facing or editor-facing labels in Bricks templates like “Shared from: {brm_bank_source_title}”.

11. Video Watch Tags

Availability: Requires Video Tracking module and is meant for logged-in learner contexts on tracked posts

User context: Video-watch tags use the current logged-in user by default. Since version 1.1.0, they can also read another user’s video progress inside user loops, including loops filtered by Users: Group Membership, and profile pages when the viewer is allowed to see that user’s video-progress category.

Video-watch tags read stored watch state. Logged-out visitors may be able to watch a visible BRM Video element, but BricksMembers does not save guest watch state, so the watch tags remain empty or at their default zero-style values for guests.

Video watch tags use the effective watch state for the current post context. That means BRM can aggregate related child video posts into the lesson context instead of always treating a child video as a totally separate display context.

Inside a post query loop, video-watch tags can resolve against the loop item context. For a loop card that also contains the native BRM Video element, set that element’s Video source context to Current query loop item when the player should track the same post represented by the card.

  • {brm_video_watch:percent} — Watched percentage as a numeric string such as 67.5 or 100
  • {brm_video_watch:required_percent} — Required threshold as an integer string such as 80
  • {brm_video_watch:remaining_percent} — Remaining percentage needed to reach the threshold, rounded to two decimals and never below 0
  • {brm_video_watch:threshold_reached}1 when the watch threshold has been reached, otherwise 0
  • {brm_video_watch:completed}1 only when the runtime marks the video as fully watched. This is not the same as threshold reached
  • {brm_video_watch:last_position} — Actual last saved playback position in seconds, such as 325
  • {brm_video_watch:resume_position} — Since version 1.3.0, resume-safe playback position in seconds
  • {brm_video_watch:last_position_formatted} — Since version 1.3.0, actual last saved playback position as formatted time, such as 05min 25sec
  • {brm_video_watch:resume_position_formatted} — Since version 1.3.0, resume-safe playback position as formatted time, such as 01h 02min 03sec
  • {brm_video_watch:resume_available}1 when BRM considers the stored position a meaningful resume point, otherwise 0

See Video Tracking and the BRM Video Element for the full behavior details.

12. Certificate Tags

Availability: Only when Certificates module is enabled

User context: Certificate tags normally resolve from certificate context, such as a success page, verification page, display page, or BRM: User Certificates query loop. Since version 1.1.0, safe certificate summary output can also follow a resolved target user in user/profile/group-member contexts when the viewer has permission. Cross-user certificate download URLs and PDF URLs stay suppressed unless the template is already in an explicit certificate context.

Certificate tags display issued certificate data. They work on:

  • Success page — page shown after earning a certificate (e.g. after passing a quiz)
  • Verification page — custom Bricks page you set in template settings; visitors land there with ?brm_cert_hash=xxx
  • Certificate display pages — Bricks pages that embed or show the certificate
  • BRM: User Certificates query loop — inside the loop, tags resolve from each certificate

Certificate tags are registered from the certificate placeholder registry. That means the tag list below matches the current runtime, and the Open Badges tags only exist when the Open Badges module is enabled.

All Certificate Tag Modifiers

Student:

  • {brm_cert:student_name}, {brm_cert:student_first_name}, {brm_cert:student_last_name}
  • {brm_cert:student_email}, {brm_cert:student_username}, {brm_cert:student_avatar_url}

Certificate:

  • {brm_cert:scope_title}, {brm_cert:scope_url}, {brm_cert:scope_type}
  • {brm_cert:issued_date}, {brm_cert:expires_date}, {brm_cert:number} (alias: {brm_cert:certificate_number})
  • {brm_cert:score}, {brm_cert:template_title}, {brm_cert:status}
  • {brm_cert:status_label}, {brm_cert:revocation_reason}, {brm_cert:revoked_date}
  • {brm_cert:scope_featured_image_url}, {brm_cert:scope_video_image_url}

Site:

  • {brm_cert:site_name}, {brm_cert:site_logo_url}

Links (for buttons and images):

  • {brm_cert:verification_url} — Verify certificate link
  • {brm_cert:display_url} — View certificate
  • {brm_cert:download_url} — Download PDF
  • {brm_cert:pdf:url} — Inline/open PDF
  • {brm_cert:qr_url} — QR code image (use in Image element)

Open Badges (when Open Badges module is enabled):

  • {brm_cert:badge_image_url} — Badge image URL
  • {brm_cert:badge_assertion_url} — Badge assertion JSON-LD URL
  • {brm_cert:badge_url} — Badge page URL
  • {brm_cert:open_badges_enabled} — 1 if Open Badges enabled, 0 otherwise

Output note: Text-style certificate tags return escaped text. URL-style tags like {brm_cert:display_url} and {brm_cert:download_url} return URLs. Image-style tags such as {brm_cert:student_avatar_url}, {brm_cert:site_logo_url}, and {brm_cert:badge_image_url} also return URLs, so use them in link, image, or button URL fields rather than expecting a full HTML image tag.

Examples:

Congratulations, {brm_cert:student_name}!
Certificate #{brm_cert:number} for {brm_cert:scope_title}
<a href="{brm_cert:display_url}">View certificate</a>
<a href="{brm_cert:download_url}">Download PDF</a>
<img src="{brm_cert:qr_url}" alt="QR code" />

13. Quiz Tags

Availability: Only when Quiz module is enabled. Use on quiz pages, lesson pages with assigned quizzes, or inside brm_quiz_questions, brm_quiz_answers, brm_quiz_pairs, or brm_quiz_items query loops.

Quiz-level tags (use on quiz or lesson page):

  • {brm_quiz_title} — Quiz title
  • {brm_quiz_questions} — Raw questions JSON for advanced custom output
  • {brm_quiz_time_limit} — Time limit in seconds
  • {brm_quiz_passing_score} — Required passing %
  • {brm_quiz_max_attempts} — Max attempts (0 = unlimited)
  • {brm_quiz_question_count} — Total questions
  • {brm_quiz_current_question_index} — Current question position when a question context is active
  • {brm_quiz_score_percent}, {brm_quiz_best_score}, {brm_quiz_last_score} — User scores
  • {brm_quiz_passed} — 1 or 0
  • {brm_quiz_pass_fail} — passed, failed, or not_attempted
  • {brm_quiz_status} — not_started, in_progress, pending_review, passed, failed, exhausted
  • {brm_quiz_attempts_count}, {brm_quiz_attempts_remaining}

Quiz conditions: Use brm_quiz_has_time_limit for timer badges and brm_quiz_has_attempt_limit for attempts-left badges so untimed or unlimited quizzes do not show empty status UI.

Question type coverage: BRM currently registers 11 question type slugs. Atomic quiz templates usually do not need 11 separate answer layouts. Use choice cards for choice, multiple_choice, multiple_answer, true_false, and image_choice; use text answers for fill_blank, short_answer, and essay; use matching for matching; use ordering for ordering and sorting.

Inside brm_quiz_questions loop{brm_quiz_q:id}, {brm_quiz_q:text}, {brm_quiz_q:type}, {brm_quiz_q:points}, {brm_quiz_q:media}, {brm_quiz_q:index}, {brm_quiz_q:total}, {brm_quiz_q:explanation}, {brm_quiz_q:answer_count}, {brm_quiz_q:is_multiple}, {brm_quiz_q:is_text_input}, {brm_quiz_q:input_type}

Inside brm_quiz_answers loop{brm_quiz_a:id}, {brm_quiz_a:text}, {brm_quiz_a:index}, {brm_quiz_a:total}, {brm_quiz_a:image}, {brm_quiz_a:image_id}, {brm_quiz_a:question_id}, {brm_quiz_a:is_correct}, {brm_quiz_a:input_name}, {brm_quiz_a:input_value}, {brm_quiz_a:input_type}, {brm_quiz_a:match_target}

Inside brm_quiz_pairs loop (matching questions) — {brm_quiz_pair:left}, {brm_quiz_pair:right}, {brm_quiz_pair:left_id}, {brm_quiz_pair:right_id}, {brm_quiz_pair:left_image}, {brm_quiz_pair:left_image_id}, {brm_quiz_pair:right_image}, {brm_quiz_pair:right_image_id}, {brm_quiz_pair:index}, {brm_quiz_pair:total}

Inside brm_quiz_items loop (ordering/sorting questions) — {brm_quiz_item:id}, {brm_quiz_item:text}, {brm_quiz_item:image}, {brm_quiz_item:image_id}, {brm_quiz_item:index}, {brm_quiz_item:total}

Example: Score: {brm_quiz_score_percent}%. You need {brm_quiz_passing_score}% to pass.

14. Group Tags

Availability: Only when Groups module is enabled. Most group tags resolve from the current BRM group context, which can come from a group query row, a dashboard link with group context, or the user’s matching active group for the current post. If the user has only one matching active group, dashboard tags can resolve even when the page is not a BRM query loop. The invite-claim tags below instead resolve from the current invitation-claim request state. {brm_group:invite_handoff_pending} returns 1 only while a logged-out request has a server-side invite handoff. Prefer the native brm_group_invite_handoff_pending Bricks condition for normal element visibility. Group member tags resolve inside a User loop filtered by Users: Group Membership. Group member row tags were added in 0.9.94.

Admin preview: To preview group dashboard layouts before real purchases or groups exist, admins can append ?brm_group_demo=owner to the dashboard URL. Available modes are owner, leader, member, full, and no_seats. Demo context is ignored for users without group-management admin permission.

  • {brm_group:id} — Group ID
  • {brm_group:name} — Group name
  • {brm_group:type} — Group type (e.g. cohort, team)
  • {brm_group:role} — User’s group role slug, such as owner, leader, member, or a custom role
  • {brm_group:member_count} — Total active members
  • {brm_group:total_seats} — Total seats configured for the current group
  • {brm_group:used_seats} — Used seats for the current group
  • {brm_group:available_seats} — Remaining seats
  • {brm_group:seat_rule_id} — Seat rule associated with the current group
  • {brm_group:occupied_seats} — Used seats plus pending email-invite reservations
  • {brm_group:movable_seats} — Seats that can be moved out without reducing the group below occupied seats
  • {brm_group:reserved_seats} — Seats reserved by pending email invitations
  • {brm_group:seat_usage_percent} — Percent of seats used or reserved
  • {brm_group:pending_invite_count} — Pending invitation count for the current group
  • {brm_group:owner_user_id} — Group owner user ID
  • {brm_group:owner_name} — Group owner display name
  • {brm_group:owner_avatar_url} — Group owner avatar URL
  • {brm_group:status} — active, archived, or expired
  • {brm_group:member_joined_at} — Join date for the current user-group loop row
  • {brm_group:invite_claim_state} — Raw invite-claim state for the current request, or empty when no claim flow is active
  • {brm_group:invite_claim_error} — Raw invite-claim error code for the current request, or empty
  • {brm_group:invite_claim_message} — Human-readable message generated from the current invite claim state and error
  • {brm_group:invite_handoff_pending}1 when the current logged-out request has a pending server-side invite claim handoff, otherwise 0 (since 0.9.95)
  • {brm_group_pool:seat_rule_id} — Seat rule ID for the current owner seat-pool loop row
  • {brm_group_pool:label} — Human-readable seat-pool label
  • {brm_group_pool:purchased_seats} — Total seats purchased for this pool
  • {brm_group_pool:allocated_seats} — Seats currently allocated across the owner’s groups in this pool
  • {brm_group_pool:available_seats} — Purchased seats still available for creating or expanding owned groups
  • {brm_group_pool:group_count} — Number of owned groups using this seat pool
  • {brm_group_member:user_id} — User ID for the current group member row
  • {brm_group_member:display_name} — Display name for the current group member row
  • {brm_group_member:email} — Email for the current group member row
  • {brm_group_member:role} — Role for the current group member row
  • {brm_group_member:status} — Status for the current group member row
  • {brm_group_member:joined_at} — Join date for the current group member row
  • {brm_group_member:avatar_url} — Avatar URL for the current group member row

15. Gift Claim Tags

Availability: Only when Gifting module is enabled. Gift-row tags resolve from the current native gift token in gift_token or brm_gift_token. Claim-result tags resolve from brm_gift_claim and brm_gift_claim_code query arguments. {brm_gift:claim_handoff_pending} returns 1 only while a logged-out request has a server-side gift claim handoff. Prefer the native brm_gift_claim_handoff_pending Bricks condition for normal element visibility. Gift-transfer tags resolve from brm_gift_source, brm_gift_object_type, and brm_gift_object_id query arguments. Added in 0.9.94; handoff pending was added in 0.9.95.

  • {brm_gift:sender_name} — Sender display name, with no sender email exposed on public claim pages
  • {brm_gift:offer_title} — Offer label from the Payments offer configuration
  • {brm_gift:offer_key} — Raw offer key
  • {brm_gift:message} — Optional personal message stored with the native gift
  • {brm_gift:expires_at} and {brm_gift:claimed_at} — Formatted claim dates
  • {brm_gift:status} and {brm_gift:status_label} — Raw and human-readable gift status
  • {brm_gift:claim_url} — Public claim route URL for the current gift token
  • {brm_gift:claim_state}, {brm_gift:claim_error}, and {brm_gift:claim_message} — Claim result state and human-readable result message
  • {brm_gift:claim_handoff_pending}1 when the current logged-out request has a pending server-side gift claim handoff, otherwise 0 (since 0.9.95)

Gift transfer context:

  • {brm_gift_transfer:source}, {brm_gift_transfer:object_type}, and {brm_gift_transfer:object_id} — Hidden-field values for the brm_transfer_gift_level Bricks form action
  • {brm_gift_transfer:title} — Transferable source object title
  • {brm_gift_transfer:amount} and {brm_gift_transfer:currency} — Source object amount and currency
  • {brm_gift_transfer:level_id} — Resolved BRM level ID for the selected source object
  • {brm_gift_transfer:status} and {brm_gift_transfer:status_label} — Transfer availability state for the selected source object

16. Submission Tags

Availability: Only when Submissions module is enabled. Use on assignment pages (user’s latest submission) or inside a brm_submission query loop (each submission).

User context: Submission summary tags use the current user on assignment pages by default. Since version 1.1.0, safe submission summary data can resolve the loop/profile user inside user loops, including loops filtered by Users: Group Membership, and profile pages when the viewer can see that user’s submissions category. Private submission content, reviewer feedback, files, and upload/download URLs are not exposed through generic target-user context.

  • {brm_submission:id} — Submission ID
  • {brm_submission:status} — submitted, approved, rejected, resubmit_requested
  • {brm_submission:score} — Score (when set)
  • {brm_submission:feedback} — Reviewer feedback
  • {brm_submission:attempt} — Attempt number
  • {brm_submission:date} — Formatted submission date
  • {brm_submission:reviewed_at} — Formatted review date
  • {brm_submission:count} — Total submissions for assignment/user
  • {brm_submission:due_at} — Due date (formatted)
  • {brm_submission:is_overdue} — 1 or 0
  • {brm_submission:days_until_due} — Days until due (negative if overdue)
  • {brm_submission:reviewer} — Reviewer display name
  • {brm_submission:type} — text, file, url, or mixed
  • {brm_submission:file_count} — Number of attached files
  • {brm_submission:content} — Submitted text/content
  • {brm_submission:url_list} — Submitted URL links
  • {brm_submission:first_url} — First submitted URL
  • {brm_submission:attachment_links} — Secure attachment download links
  • {brm_submission:attachment_names} — Attachment names
  • {brm_submission:first_attachment_url} — First secure attachment URL
  • {brm_submission:assignment_title} — Related assignment title
  • {brm_submission:assignment_url} — Related assignment URL

Example: Status: {brm_submission:status} — Feedback: {brm_submission:feedback}

For visibility logic, prefer native BricksMembers conditions over dynamic-tag comparisons: use brm_submission_has_response for text/URL response panels and brm_submission_has_attachments for attachment download buttons.

17. Member Chat Tags

Availability: Only when Member Chat is enabled. Room tags resolve from the current active room, and message tags resolve inside chat feed rows or any active message context. For the layout side of chat templates, see Member Chat & Community Rooms.

Room tags{brm_chat:room_id}, {brm_chat:room_name}, {brm_chat:room_description}, {brm_chat:room_scope}, {brm_chat:room_kind}, {brm_chat:room_unread_count}, {brm_chat:room_member_count}, {brm_chat:room_can_write}

Message tags{brm_chat:message_id}, {brm_chat:message_content}, {brm_chat:message_author_id}, {brm_chat:message_author_name}, {brm_chat:message_author_first_name}, {brm_chat:message_author_last_name}, {brm_chat:message_author_nickname}, {brm_chat:message_author_avatar_url}, {brm_chat:message_author_email}, {brm_chat:message_author_login}, {brm_chat:message_created_at}, {brm_chat:message_edited_at}, {brm_chat:message_status}, {brm_chat:message_is_mine}, {brm_chat:message_is_edited}, {brm_chat:message_is_deleted}, {brm_chat:message_can_manage}

Example: Room: {brm_chat:room_name} ({brm_chat:room_unread_count} unread)

Event Tags

Availability: Only when Events is enabled. Event tags resolve from the current brm_event post, an event post query loop, the single event template, or a Bricks Popup opened from the BRM Event Calendar with event post context.

Event tags{brm_event:id}, {brm_event:title}, {brm_event:excerpt}, {brm_event:content}, {brm_event:type}, {brm_event:type_label}, {brm_event:status}, {brm_event:start}, {brm_event:end}, {brm_event:date}, {brm_event:timezone}, {brm_event:provider}, {brm_event:capacity}, {brm_event:confirmed_count}, {brm_event:waitlisted_count}, {brm_event:remaining_seats}, {brm_event:registration_status}, {brm_event:join_url}, {brm_event:required_offer_key}, {brm_event:upsell_offer_key}, {brm_event:group_id}, and {brm_event:group_name}.

Attendee row tags{brm_event_attendee:status}, {brm_event_attendee:registered_at}, and {brm_event_attendee:seat_count}. Use these inside user loops configured with Event Attendee settings.

18. Instructor Frontend Builder Tags

Availability: Only when Instructor Frontend Builder is enabled. These tags resolve from the active instructor dashboard, manager, editor, or row context. For the full frontend-builder flow, see Instructor Frontend Builder for Course Creators.

Core scope and item context{brm_instructor:scope_id}, {brm_instructor:structure_id}, {brm_instructor:parent_id}, {brm_instructor:level_index}, {brm_instructor:item_id}

Editor and manager request context{brm_instructor:editor_title}, {brm_instructor:editor_content}, {brm_instructor:editor_excerpt}, {brm_instructor:editor_featured_image_id}, {brm_instructor:editor_video_url}, {brm_instructor:editor_video_duration}, {brm_instructor:editor_video_image_id}, {brm_instructor:manager_url}, {brm_instructor:manager_recompute_url}, {brm_instructor:recompute_required}, {brm_instructor:recompute_notice_message}, {brm_instructor:recompute_notice_type}, {brm_instructor:editor_url}, {brm_instructor:dashboard_url}

Scope summary and actions{brm_instructor:scope_title}, {brm_instructor:scope_status}, {brm_instructor:scope_status_label}, {brm_instructor:scope_edit_url}, {brm_instructor:scope_top_level_label}, {brm_instructor:scope_top_level_create_url}, {brm_instructor:scope_child_level_label}, {brm_instructor:scope_child_create_url}, {brm_instructor:scope_structure_name}, {brm_instructor:scope_item_count}, {brm_instructor:scope_draft_count}

Row and item helpers{brm_instructor:item_title}, {brm_instructor:item_content}, {brm_instructor:item_excerpt}, {brm_instructor:item_featured_image_id}, {brm_instructor:item_video_url}, {brm_instructor:item_video_duration}, {brm_instructor:item_video_image_id}, {brm_instructor:item_level_label}, {brm_instructor:item_depth}, {brm_instructor:item_is_child}, {brm_instructor:item_depth_class}, {brm_instructor:item_children_count}, {brm_instructor:item_status}, {brm_instructor:item_status_label}, {brm_instructor:is_first_sibling}, {brm_instructor:is_last_sibling}, {brm_instructor:item_can_have_children}, {brm_instructor:child_level_label}, {brm_instructor:child_level_index}, {brm_instructor:row_manager_url}, {brm_instructor:row_edit_url}, {brm_instructor:row_child_create_url}

Enabled structure tags{brm_instructor:enabled_structure_id}, {brm_instructor:enabled_structure_name}, {brm_instructor:enabled_structure_scope_label}, {brm_instructor:enabled_structure_levels_label}, {brm_instructor:enabled_structure_create_url}

Example: {brm_instructor:scope_title} — Edit item: {brm_instructor:row_edit_url}

19. Class Tags (for CSS styling)

These tags output a CSS class name or empty string. Add to Style tab → CSS class for automatic styling in query loops.

  • {brm_active}
    Outputs brm-active if loop item matches current page or is a parent
  • {brm_completed}
    Outputs brm-completed if loop post is completed (Progress module, post loops)
  • {brm_unlocked}
    Outputs brm-unlocked if loop post is unlocked (Drip module, post loops)

Active Item Tag Details

💡 One of the most useful tags for navigation menus! Highlights current page AND its parents.

{brm_active}

  • Outputs brm-active if the loop item matches the current page/term/user being viewed
  • Also matches parent posts in content structures (e.g., highlights the module when viewing a lesson)
  • Outputs empty string if not the current item or parent
  • Works with post, term, and user query loops
  • Perfect for navigation menus, breadcrumbs, taxonomy filters, and member directories
  • Performance: Zero database queries – uses already-loaded WordPress query data

All Active Tag Modifiers

  • {brm_active}
    Active class or empty
    Example: brm-active or “

Matching Logic:

For Posts:

  • Direct match: Loop post ID === Current post ID
  • Parent match: Loop post ID is a parent of current post (from content structure)

For Terms & Users:

  • Direct match only: Loop term/user ID === Current term/user ID

Use Cases:

1. Post Query Loops (Navigation Menus with Parent Highlighting)

Add this tag to the CSS class field of elements in a query loop:

{brm_active}

Example in Bricks:

  1. Create a query loop showing course modules
  2. Set CSS class of the QL element in the Bricks element controls header: module-item
  3. Set CSS class in Bricks elements’ style tab: {brm_active}
  4. Style .brm-active in your CSS:
.module-item.brm-active {
    background: var(--primary-color);
    font-weight: bold;
    border-left: 4px solid var(--accent-color);
}

Result:

  • When viewing a module page, that module will have the brm-active class
  • When viewing a lesson page, the lesson’s parent module will also have the brm-active class
  • Perfect for hierarchical navigation where you want to show which section the user is currently in

2. Term Query Loops (Category/Tag Filters)

  1. Create a query loop showing categories or tags
  2. Add a button element inside the loop
  3. Set CSS classes: filter-button {brm_active}
  4. Style the active filter:
.filter-button.brm-active {
    background: var(--primary-color);
    color: white;
}

Result: When viewing a category archive, that category’s filter button will be highlighted.

3. User Query Loops (Member Directories)

  1. Create a query loop showing users
  2. Add a card element inside the loop
  3. Set CSS classes: member-card {brm_active}
  4. Style the current user’s card:
.member-card.brm-active {
    border: 2px solid var(--primary-color);
    box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}

Result: When viewing a user’s profile/author page, their card in the member directory will be highlighted.

Works With:

  • Post loops: Course navigation, lesson lists, breadcrumbs
  • Term loops: Category filters, tag clouds, taxonomy navigation
  • User loops: Member directories, author lists, team pages

Tag Modifiers

Modifiers change how tags display data.

:link Modifier

Wraps output in a link.

Example:

{brm_structure:next_item:link}

Output:

<a href="/next-lesson/">Next Lesson Title</a>

Works with:

  • {brm_structure:next_item:link}
  • {brm_structure:previous_item:link}
  • {brm_download:link}

Scope Modifiers

What is “Scope”? Scope defines which content to calculate progress for. For example, :toplevel calculates progress within the top-level post (e.g., Course), :parent calculates within the parent post (e.g., Module), and :structure calculates across the entire structure. Use scope modifiers to show progress at different levels of your content hierarchy.

Define what content to include in calculations.

:structure – Current structure

{brm_progress:percent:structure}

:toplevel – Top level of structure

{brm_progress:percent:toplevel}

:parentlevel – Parent level of structure

{brm_progress:percent:parentlevel}

Boundary Modifiers

What is “Boundary”? Boundary defines the navigation window—it limits where “next” and “previous” navigation can go. For example, :toplevel keeps navigation within the top-level post (e.g., Course), so navigating from a lesson won’t jump to the next course. :parentlevel keeps navigation within the parent (e.g., Module), so navigating from a lesson won’t jump to the next module. Use boundary modifiers to control navigation flow within your content structure.

Define navigation boundaries.

:toplevel – Navigate across entire structure

{brm_structure:next_item:toplevel}

:parentlevel – Navigate within current parent

{brm_structure:next_item:parentlevel}

:level_2, :level_3, etc. – Navigate within specific level

{brm_structure:next_item:level_2}

Real-World Examples

Example 1: Welcome Message

Welcome back, {user_display_name}!

You're a {brm_user:levels} member.

You've completed {brm_progress:completed:toplevel} out of {brm_progress:total:toplevel} lessons ({brm_progress:percent:toplevel}%).

Output:

Welcome back, John Smith!

You're a Premium Member member.

You've completed 15 out of 20 lessons (75%).

Note: This example uses scope modifiers (:toplevel) to get progress within the top-level post (e.g., course). Without scope modifiers, {brm_progress:completed} returns 1 or 0 indicating if the current post is completed.

Example 2: Course Progress

Course Progress: {brm_progress:percent:structure}%

Completed: {brm_progress:completed:structure}/{brm_progress:total:structure}

Output:

Course Progress: 60%

Completed: 12/20

Example 3: Lesson Navigation

← {brm_structure:previous_item:parentlevel:link}

{brm_structure:next_item:parentlevel:link} →

Output:

← <a href="/lesson-1/">Lesson 1: Introduction</a>

<a href="/lesson-3/">Lesson 3: Advanced Topics</a> →

Example 4: Course Hero with Parent Video Data

Display course information on lesson pages without query loops:

<div class="lesson-hero" style="background-image: url({brm_video:image:toplevel:url});">
    <div class="hero-content">
        <h1>BRM Dynamic Tags Reference</h1>
        <p class="course-meta">
            Course: {brm_structure:parent:toplevel}
            Duration: {brm_video:duration:toplevel:hms}
        </p>
    </div>
</div>

Note: The example uses {brm_video:image:toplevel:url} to get the top-level parent’s video image URL, and {brm_structure:parent:toplevel} to get the top-level parent’s title.

Output on a lesson page:

<div class="lesson-hero" style="background-image: url(https://example.com/course-thumbnail.jpg);">
    <div class="hero-content">
        <h1>Lesson 3: Advanced Topics</h1>
        <p class="course-meta">
            Course: Complete WordPress Course
            Duration: 5:30:45
        </p>
    </div>
</div>

Note: The example uses {brm_video:image:toplevel:url} to get the top-level parent’s video image URL, and {brm_structure:parent:toplevel} to get the top-level parent’s title.

Why this is powerful:

  • No query loops needed
  • Zero extra database queries (uses Request Registry)
  • Clean, simple syntax
  • Perfect for displaying parent context on child pages

Example 5: Drip Status

{brm_drip:unlocked}

If unlocked:

1

If locked:

0

Use with conditions to show different content:

[If unlocked] Watch the lesson now!
[If locked] This lesson unlocks on {brm_drip:unlock_date}

Example 5: Completion Status

{brm_progress:completed}

If completed:

1

If not completed:

0

Use with conditions:

[If {brm_progress:completed} equals 1] ✓ You've completed this lesson
[If {brm_progress:completed} equals 0] Mark as complete when you're done

Note: {brm_completed} is a class tag (outputs brm-completed or empty string) for CSS styling in query loops, not a dynamic tag that returns 1/0. Use {brm_progress:completed} for conditions.

Using Tags in Bricks

In Text Elements

  1. Add a Text or Heading element
  2. Click the {x} icon to insert a dynamic tag
  3. Search for “brm” to see all BricksMembers tags
  4. Select a tag
  5. Add modifiers manually if needed (e.g., change {brm_progress:percent} to {brm_progress:percent:structure})

In Buttons

  1. Add a Button element
  2. For button text: Use dynamic tags (e.g., “Next: {brm_structure:next_item}”)
  3. For button link: Use {brm_structure:next_item:url} to get just the URL

Pro Tip: Use :url for button links (outputs just the URL), and :link for text fields (outputs a complete <a> tag).

In Conditions

Important: Dynamic tags are usually not needed in Bricks conditions because BricksMembers provides native conditions that are easier to use and more performant. Use the native BricksMembers conditions (found in the BricksMembers group) for common scenarios like checking user access, progress completion, and drip unlock status.

Dynamic tags in conditions should only be used for specific cases not covered by native BricksMembers conditions, such as custom comparisons or advanced logic that requires numeric values or specific tag outputs.

Using dynamic tags in conditions:

  1. Add any element
  2. Go to Conditions
  3. Add a condition: Dynamic Tag
  4. Enter a BricksMembers tag (e.g., {brm_progress})
  5. Set the comparison (e.g., “> 50”)

Example: Show an “Almost Done!” badge only if the course is more than 50% completed.

In Query Loops

Dynamic tags work in query loop templates.

Example: Show progress for each course in a query loop.

  1. Create a query loop of courses
  2. Inside the loop template, add: “Progress: {brm_progress:percent:toplevel}%” (or use :structure or :parent as needed)
  3. Use {brm_progress:completed_item:last:toplevel:id} when a query filter or condition needs the user’s most recently completed tracking item ID
  4. Each course card shows its own progress

Tag Availability

Some tags are only available when specific modules are enabled.

Always available:

  • {brm_user:*} membership-level tags such as {brm_user:levels} and {brm_user:levels_count}; account/profile tags such as {brm_user:id}, {brm_user:display_name}, {brm_user:email}, {brm_user:first_name}, {brm_user:last_name}, {brm_user:registered}, avatar, last-login, and custom-field tags require Member Profiles context
  • {brm_structure:*}
  • {brm_video:*}
  • {brm_active} (class tag)
  • {brm_post:level}, {brm_post:level:first}, {brm_post:level:ids:*} (post query loops)

Requires Member Profiles module: {brm_user:id}, {brm_user:display_name}, {brm_user:email}, {brm_user:first_name}, {brm_user:last_name}, {brm_user:registered}, {brm_user:avatar}, {brm_user:last_login}, {brm_user:field:*}

Requires Content Fields module: {brm_cf:*}, {brm_cf:group.subfield}, and {brm_cf_loop:*}

Requires Enrollments module:

  • {brm_enrollment:*}, {brm_enrollments:*}

Requires Progress Tracking module:

  • {brm_progress:*}
  • {brm_completed} (class tag for CSS styling)

Requires Drip Content module:

  • {brm_drip:*}
  • {brm_unlocked} (class tag for CSS styling)

Requires Protected Downloads module:

  • {brm_download}

Requires Like System module:

  • {brm_like:*}

Requires Certificates module:

  • {brm_cert:*}

Requires Quiz module:

  • Top-level underscore tags such as {brm_quiz_title}, {brm_quiz_score_percent}, and {brm_quiz_attempts_remaining}, plus loop-context families {brm_quiz_q:*}, {brm_quiz_a:*}, {brm_quiz_pair:*}, and {brm_quiz_item:*}

Requires Groups module:

  • {brm_group:*}

Requires Gifting module:

  • {brm_gift:*}

Requires Payments module:

  • {brm_billing:*}, {brm_checkout:*}

Requires Submissions module:

  • {brm_submission:*}

Requires Member Chat module:

  • {brm_chat:*}

Requires Instructor Frontend Builder module:

  • {brm_instructor:*}

Requires Content Bank module:

  • {brm_bank_*}

Requires Video Tracking module:

  • {brm_video_watch:*}

If a tag shows empty output, check that the required module or integration is enabled in the correct admin area, usually BricksMembers → Modules or BricksMembers → Integrations.

Common Questions

Q: Can I use tags outside of Bricks? A: No. These are Bricks-specific dynamic tags. BricksMembers only works with Bricks Builder!

Q: Can I combine multiple tags? A: Yes! Use as many tags as you want in a single text field.

Q: Can I use tags in custom HTML? A: Yes! Tags work in the Code element.

Q: Why is my tag showing empty output?

A: Check that:

  • The user is logged in (for user-specific tags), or a user is identified via URL parameter / author archive (when profile page detection is enabled)
  • The post is in a structure (for structure tags)
  • The tag syntax is correct (no typos)
  • The output of the tag matches the conditions (correct post type of template, etc.)

Q: Can I format tag output (e.g., add a % sign)? A: Yes! Just add it manually: {brm_progress:percent}%

Q: Can I use tags in ACF fields? A: Not directly. ACF fields don’t process Bricks dynamic tags. Use Bricks elements to display ACF data with BricksMembers tags.

Get BricksMembers

Start Building Your Membership Site Today

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

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