Members and plans

Sign-in for visitors, paid and free plans, and drip content.

This is the guide the PageHub MCP server gives an AI agent for get_style_reference({ topic: "members" }). Names like set_theme are its tools (connect one), and the liquid topic is the HTML + Liquid reference.

Members are the site's customers (visitors who sign in with an emailed link), not the team that edits the site (list_site_members / invite_site_member are that team).

  • Plans: list_membership_plans, set_membership_plan({ slug, name, … }) (the slug is permanent). Paid: stripePriceIds (Stripe price ids or pd:<rowId>); accessDays limits a one-time price (omit = lifetime); free: selfSignup: true with no prices; archived stops selling but members keep it. Pro and up.
  • People: list_members (filter plan, status, q), set_member({ action }) add (+ sendInvite), grant, revoke, extend, block, unblock, rename. Applies on their next page load; never cancels Stripe billing.
  • In a page the member is customer.me | first, never customer itself: me.plans['pro'] is true while they hold the plan and me.planDays['pro'] is the whole days since they got it (drip). Signed in at all is customer.signed_in.
HTML + Liquid
{% assign member = customer.me | first %}
{% if member.plans['pro'] %}
  <h3>Lesson 1: Setting up</h3>
  {% if member.planDays['pro'] >= 7 %}
    <h3>Lesson 2: Going further</h3>
  {% else %}
    <p>Lesson 2 opens in {{ 7 | minus: member.planDays['pro'] }} days.</p>
  {% endif %}
{% elsif customer.signed_in %}
  <a href="/pricing">See plans</a>
{% else %}
  <a href="/account">Sign in</a>
{% endif %}
  • Whole pages: update_page({ policy: { access } }) (see pages). Whole collections or single rows: see collections. Files: see downloads. Library blocks to start from: members-plan-gate and customer-account (the sign-in and account page). Customer accounts need a paid plan.