A member dashboard is the central hub where your users see their membership status, track their progress, and access their content. In this tutorial, you’ll learn how to build a professional dashboard using Bricks Builder’s query loops and BricksMembers’ dynamic tags.
What you’ll build:
- Showing the user’s current membership levels
- Progress bars for each course
- List of unlocked/locked content
- Recent completions timeline
- Quick access to continue learning
Prerequisites:
- Bricks Builder installed and activated
- BricksMembers installed with at least one user level created
- Progress Tracking enabled (for progress features)
- Some content created with required levels assigned
Time to complete: 30-45 minutes
Understanding the Building Blocks
Before we start building, let’s understand the two main tools we’ll use:
Dynamic Tags
Dynamic tags display information that changes based on the current user or post. BricksMembers provides 9 base tags with over 100 modifiers.
Example:
{brm_user:levels}– Shows the user’s membership levels{brm_progress:percent}– Shows progress percentage{brm_drip:unlock_date}– Shows when content unlocks{brm_user:avatar}– Profile photo (Member Profiles module){brm_user:last_login}– Last login date (Member Profiles module){brm_post:level:first}– Access level badge in post loops (e.g., “Premium”, “Free”)
How to use them:
- Select any text element in Bricks
- Click the flash-icon next to the text field
- Search for “BricksMembers” tags
- Insert the tag
Query Loops
Query loops display lists of content (posts, courses, lessons, etc.) with filters. Think of them as “show me all lessons where the user has access.”
How query loops work:
- Query – Fetch posts from the database (e.g., “get all lessons”)
- Filter – Apply BricksMembers filters (e.g., “only unlocked lessons”)
- Display – Show each post using a template you build directly inside the Query Loop element in Bricks Builder
BricksMembers provides 8 query loop filters:
- User Level Match – Filter by access (match, no match, empty)
- Users: Include Levels – For User Query Loops: only include users with certain levels
- Drip Filter – Filter by drip status (unlocked, locked, time ready)
- Progress Filter – Filter by completion (completed, not completed)
- Structure Boundary – Limit to specific structure scope
- Posts: Filter by Required Level – Filter post loops by required access level(s)
- Like Status – Show only if a post is liked or not
- Minimum Likes – Show only posts with a minimum amount of likes
Step 1: Create the Dashboard Page
First, let’s create a new page for the dashboard.
- Go to Pages → Add New
- Title: “My Dashboard”
- Click Edit with Bricks
Step 2: Add the Welcome Section
Let’s start with a personalized welcome message.
Add a Container
- Click + to add a new element
- Search for Section
- It will automatically add a Container inside the section
Add Welcome Heading
- Inside the container, add a Heading element
- Set the tag to H1
- For the text, click the flash-icon for the dynamic tags list
- Search for User First Name (User tag)
- Your heading should now show:
{wp_user_first_name} - Add text before it: “Welcome back,
{user_display_name}!”
Result: The heading will show “Welcome back, John!” for a user named John.
Add Membership Status
- Add another Heading (H3) below
- Text: “Your Membership:”
- Add a Text element below
- Click the flash-icon for the dynamic tags list
- Search for BricksMembers
- Insert
{brm_user:levels} - Style it to your liking – tag like styling with
list-style: none,background-colorandborder-radiusis recommended
Result: Shows “Premium Member, Free Member” (or whatever levels the user has).
Optional: Add Profile Photo and Last Login (Member Profiles module)
If you have the Member Profiles module enabled (BricksMembers → Settings → Modules), you can enrich the welcome section:
- Profile photo – Add an Image element and set the source to
{brm_user:avatar}(or:large,:96for different sizes) - Last active – Add a Text element with
{brm_user:last_login}(e.g., “Last active: …”) - Custom fields – Use
{brm_user:field:field_key}for any custom profile field (e.g., bio, job title)
For profile editing, add a Bricks form with BRM Update Profile and BRM Update Custom Fields actions. See User Profiles, Custom Fields & Member Directories for full setup.
Step 3: Display Course Progress
Now let’s show the user’s progress across all their courses. This is where query loops come in!
Create a Query Loop for Courses
- Add a new Section below the welcome section
- Add a Heading (H2): “Your Courses” inside the sections’ container
- Below the heading, add a Block element (use grid or flex to structure the courses in a list or columns)
- Inside the Block element, add a Div element
- In the Content tab of the Div element, enable Query Loop at the top
- Configure the query:
- Query type: Posts
- Post type: Select your course post type (e.g., “course”)
- Posts per page: 10 (or choose any number that fits your site)
- Order by: Menu Order
- Order: ASC
Add BricksMembers Filters
Now let’s filter to show only courses the user has access to.
- Scroll down to BricksMembers Query Filters section
- User Level Match: Select Match (only show courses the user can access)
- Leave other filters off for now
What this does: The query loop will only show courses where the user’s levels match the course’s required levels.
Design the Course Card
Now let’s design how each course appears in the loop.
- Inside the query loop div, add a Heading (H3)
- Click the flash-icon and insert
{post_title}to show the course title - Optionally add a Text element with
{brm_post:level:first}to show an access level badge (“Premium”, “Free”, etc.) on each course card - Add a BRM Progress Bar element below the heading
- Configure the progress bar:
- Progress Mode: Auto (Smart Detection)
- Progress Level: Current Level (shows progress for this specific course page. Top Level also works, but Current Level is more explicit when you’re already on the course page)
- Bar Height: 20px
- Colors: Match your brand
- Show Progress Text: Yes
- Show Details: Yes (shows “3 of 10 completed”)
- Add a Button element below the progress bar
- Button text: “Continue Learning”
- Button link:
{brm_progress:continue:toplevel:url}(automatically links to the next uncompleted lesson within this course) - Add conditional logic to the button: Dynamic Data →
{brm_progress:continue:toplevel:url}→ is not empty
Note: The {brm_progress:continue:toplevel:url} tag automatically finds the last completed lesson within this course and links to the next uncompleted one. If no lessons are completed, it links to the first lesson. If all lessons are completed, the url won’t appear – that’s why the conditional logic is important to let the whole button disappear. Alternatively, you can use {post_url} if you prefer to link to the course overview page instead.
Optionally: Add a button with conditional logic: Dynamic Data → {brm_progress:continue:toplevel:url} → is empty, button text “Open Course”, and {post_url} in the url field to link to the course instead of next lesson if the course is completed and the button clearly stating that.
Result: You now have a grid of course cards, each showing:
- Course title (and optionally a level badge via
{brm_post:level:first}) - Progress bar (e.g., “30% – 3 of 10 completed”)
- Continue button
Style the Grid
- Select the Block element that wraps the Query Loop Div.
- Set Display: Grid
- Grid template columns:
repeat(auto-fill, minmax(300px, 1fr)) - Gap: 20px
- Alternatively: Use ACSS classes .variable-grid and .gap–s, .gap–m or so if AutomaticCSS is installed and set the –min variable to 300px or 30rem in the Custom CSS field.
Result: Courses display in a responsive grid that adapts to screen size.
Step 4: Show Unlocked Content
Let’s add a section showing all content the user has unlocked recently. This requires the Drip Content module to be enabled on the BricksMembers Settings page under Modules.
Create a Query Loop for Lessons
- Add a new Section below the courses section
- Add a Heading (H2): “Recently Unlocked”
- Add a Block element again as a wrapper
- Add a Div element with Query Loop enabled
- Configure the query:
- Query type: Posts
- Post type: Select your lesson post type (e.g., “lesson”)
- Posts per page: 5
Add Drip Filter
- Scroll down to BricksMembers Query Filters in the Content tab
- User Level Match: Match
- Drip Filter: Unlocked (only show unlocked content)
- Order By: Drip Unlocked (Recent First)
What this does: Shows only lessons that are both accessible (user has the right level) AND unlocked (drip conditions met).
Design the Lesson List
- Inside the query loop, add a Container
- Add a Heading (H4):
{post_title} - Add a Text element: “Unlocked on {brm_drip:unlock_date}”
- Add a Button: “Start Lesson” → Link:
{post_url} - Style the container as you like
Result: A list of recently unlocked lessons with unlocked dates.
Step 5: Show Completed Content
Let’s add a section for completed lessons (requires Progress Tracking enabled).
Create a Query Loop for Completed Lessons
- Add a new Section
- Add a Heading (H2): “Recently Completed”
- Add a Block as wrapper
- Add a Div with Use query loop enabled
- Configure the query:
- Query type: Posts
- Post type: lesson
- Posts per page: 5
Add Progress Filter
BricksMembers Query Filters:
- User Level Match: Match
- Progress: Completed
- Order By: Progress Completed (Recent First)
What this does: Shows only lessons the user has marked as complete.
Design the Completed List
- Add a Container inside the loop
- Add an Icon element (checkmark icon)
- Add a Heading (H4):
{post_title} - Add a Text element: “Completed on {brm_progress:completion-date}”
- Style as you like
- Style the wrapper element with flex box to show the posts below each other as a list
Result: A timeline of completed lessons with completion dates.
Step 6: Add Overall Progress Stats
Let’s add some quick stats at the top of the dashboard showing overall progress across the entire structure (all courses combined).
Create a Stats Grid
- At the top of the page (below the welcome section), add a Container
- Set Display: Grid
- Grid template columns:
repeat(3, 1fr) - Gap: 20px
- Or use AutomaticCSS utility classes
Add Stat Cards
Since we’re on a dashboard page (not a course page), we need to specify which structure to calculate progress for. Use the structure_id modifier to directly specify your structure ID. This calculates progress across ALL courses in that structure:
Card 1: Total Progress
- Add a Container
- Add a Heading (H2):
{brm_progress:structure_id:YOUR_STRUCTURE_ID:percent}% - Add text: “Overall Progress”
- Style as you like
Note: Replace YOUR_STRUCTURE_ID with your actual structure ID. You can find this in the BricksMembers Content Structure page on any post within that structure.
Important: The structure_id modifier will return 0 if the structure ID is invalid, the structure has no levels configured, or progress tracking is not configured for that structure. Make sure progress tracking is enabled and properly configured for your structure before using this modifier.
Card 2: Completed Lessons
- Add a Container
- Add a Heading (H2):
{brm_progress:structure_id:YOUR_STRUCTURE_ID:completed} - Add text: “Lessons Completed”
- Style as you like
Card 3: Total Lessons
- Add a Container
- Add a Heading (H2):
{brm_progress:structure_id:YOUR_STRUCTURE_ID:total} - Add text: “Total Lessons”
- Style as you like
Tip: Give all 3 cards the same classes to unify styling.
What this does: The structure_id modifier directly specifies which structure to calculate progress for, without needing post context. It calculates progress across ALL courses in that structure (aggregated totals).
Result: Three stat cards showing overall progress metrics across the entire structure.
Step 7: Add Continue Learning Section
Let’s add a prominent “Continue Learning” section that shows the next incomplete lesson using the {brm_progress:continue} dynamic tag. This tag automatically finds the last completed post and links to the next uncompleted one.
This is the simplest approach – just add a button with the dynamic tag! It automatically finds the last completed post and links to the next uncompleted one.
- Add a Container (make it prominent with a colored background)
- Add a Heading (H2): “Continue Where You Left Off”
- Add a Text element: “Next up: {brm_progress:continue:structure_id:YOUR_STRUCTURE_ID:title}”
- Add a large Button: “Continue Learning →”
- Button link:
{brm_progress:continue:structure_id:YOUR_STRUCTURE_ID:url} - Important: Replace
YOUR_STRUCTURE_IDwith your actual structure ID. You can find it in BricksMembers Settings → Structures, or use{brm_structure:structure_id}on any post within the structure. - Style it prominently
What this does: Automatically finds the last completed post across the entire structure and links to the next uncompleted one. If no posts are completed, it shows the first post. If all are completed, the url in the button won’t appear. So use conditional logic again, as we did with the continuation inside courses to show the button conditionally.
Why use structure_id? On a dashboard page (not a post within a structure), there’s no post context to determine which structure to use. The structure_id modifier tells the tag which structure to search within. On a post page within a content structure, you can use {brm_progress:continue:structure} instead.
Note: The {brm_progress:continue} tag is the recommended approach because it automatically determines the correct “next” lesson based on completion order. While it’s technically possible to achieve similar results with a query loop (using BricksMembers Progress filter to show only non-completed posts, limiting to 1 post, and ordering by menu_order), this approach is much more difficult to set up, less efficient, and takes more configuration time. The dynamic tag handles all of this automatically and efficiently.
Advanced Tips
Tip 1: Combine Multiple Filters
You can combine filters for precise control:
Example: Show locked premium content
- User Level Match: Match
- Drip Filter: Locked
Result: Shows content the user has access to (right level) but can’t access yet (drip locked).
Tip 2: Show Level-Specific Content
Use Bricks conditions to show different content based on user levels:
- Add a Container
- Go to Conditions tab
- Add condition: BricksMembers → Has Access To Level(s)
- Select “Premium Member”
- Add premium-only content inside this container
Result: Container only appears for premium members, independently of the required levels set for the page.
Tip 3: Add a “Coming Soon” Section
Show locked content with unlock dates:
- Create a query loop for lessons
- Drip Filter: Locked
- Display:
{post_title}– “Unlocks on {brm_drip:unlock_date}”
Result: Shows upcoming lessons with unlock dates.
Common Issues and Solutions
Issue 1: Dynamic Tags Show Raw Code
Cause: Tag syntax incorrect or tag not available.
Solution:
- Check spelling and modifiers (e.g.,
:levelsnot:level) - Ensure the module is enabled (e.g., Progress Tracking for progress tags)
Issue 2: No Posts Appear in Query Loop
Cause: User doesn’t have access to any content or wrong post type used.
Solution:
- Assign the user a level (BricksMembers → Users)
- Assign that level to some content
- Check the Bricks Query Loop filters if the correct post type is used and all other settings are correct
- Refresh the dashboard page
Next Steps
Now that you have a functional dashboard, consider adding:
- User Profile Section – Enable the Member Profiles module, then use
{brm_user:avatar},{brm_user:last_login}, and{brm_user:field:key}to display profile data. Add a Bricks form with BRM Update Profile and BRM Update Custom Fields actions for editing. See User Profiles, Custom Fields & Member Directories for the full setup. - Achievements/Badges – Reward users for completing courses
- Recommended Courses – Suggest courses as upsells
- Download Center – Add a query loop of posts with downloads, then use the BRM Protected Download element or
{brm_download}tag in each item. See Protected Downloads & File Security.
Your members now have a central hub to track their progress, access their content, and continue learning!