Skip to main content

How to find Plan IDs and Price IDs

Duncan from Memberstack
Duncan from Memberstack
  • Updated

Plan IDs (pln_) vs. Price IDs (prc_): When to Use Which

⏱️ TL;DR

  • Free Plans: Use Plan IDs (start with pln_) combined with the data-ms-plan:add="pln_..." attribute.
  • Paid Plans: Use Price IDs (start with prc_) combined with the data-ms-price:add="prc_..." attribute.
  • The Golden Rule: Never put a pln_ ID on a paid plan button, and never put a prc_ ID on a data-ms-plan:add attribute. Doing so will cause checkout to fail silently (users sign up but never see Stripe Checkout) or reject the sign-up entirely.

1. Why Does Memberstack Have Both Plans and Prices?

To understand why we have two different IDs, it helps to understand how Memberstack connects to Stripe:

  1. A Plan (Product) is the "What": A Plan in Memberstack represents the actual access level or group your member belongs to (e.g., "Premium Membership"). In Stripe, this creates a Product.
  2. A Price is the "How Much": A Price represents how much and how often a member pays for that access (e.g., "$10/month" or "$100/year"). A single Plan can have multiple Prices (monthly, yearly, lifetime), but it is still the same Plan.

Because of this structure:

  • Free Plans don't have a price. Therefore, they only have a Plan ID (pln_).
  • Paid Plans must have a price. Therefore, to trigger a payment, you must target a specific Price ID (prc_).

2. Quick Attribute Reference Table

Use this table as a cheat sheet when setting up your Webflow links, buttons, or forms:

3. What Happens If I Mix Them Up? (The Failure Modes)

Mixing up these IDs and attributes is the #1 cause of checkout and sign-up issues. Here is exactly what happens when things are mapped incorrectly:

❌ Scenario A: Using a pln_ ID to assign a Paid Plan (The "Silent" Failure)

  • What you did: You added data-ms-price:add="pln_paid-plan-id" to a button, hoping it would sign the user up and charge them.
  • What happens: The user fills out your signup form, submits it, and is successfully registered as a member. However, Stripe Checkout never opens, and no payment is taken. The member gets created but no plan is assigned to the user . No errors appear in your Stripe dashboard because Memberstack never told Stripe to charge them.
  • How to fix it: Replace the pln_ ID with your paid plan's prc_ ID.

❌ Scenario B: Using a prc_ ID to assign a Free Plan (The "Rejection" Failure)

  • What you did: You tried to use data-ms-price:add="prc_..." to assign a free plan, or you put a prc_ ID inside a data-ms-plan:add attribute.
  • What happens: The user signs up and is successfully registered as a member but no free plan is assigned to such user. 
  • How to fix it: Click on your site's Test Mode Inspector badge in the bottom-center, it will highlight the incorrect attribute in red. Change the attribute to data-ms-plan:add and replace the ID with the free plan's pln_ ID. 

4. Understanding the Attributes: add vs. update

Memberstack uses different attributes depending on whether a member is joining a plan for the first time or changing an existing plan.

🟢 data-ms-plan:add="pln_..."

  • When to use: When a new or existing member is signing up for a Free Plan for the first time.
  • Behavior: Grants access to the free plan instantly.
  • To Switch Free Plans: Because free plans are additive, if you want a member to "switch" free plans, you must use this attribute to add the new plan, and use data-ms-plan:remove="pln_old-plan-id" on the same action to remove the old one. 

🔵 data-ms-price:add="prc_..."

  • When to use: When a new or existing member is buying a Paid Plan, or purchasing a One-Time Payment (like lifetime access or digital products).
  • Behavior: Redirects the user to Stripe Checkout to enter their payment details.

🔄 data-ms-price:update="prc_..."

  • When to use: When an existing paid member wants to switch, upgrade, or downgrade their recurring subscription to a different paid price (e.g., upgrading from Monthly to Yearly).
  • Behavior: Instead of creating a brand new, duplicate subscription, this tells Stripe to update/replace their existing subscription. Stripe will automatically prorate the charge.
  • ⚠️ Crucial Warning: You cannot use data-ms-price:update with one-time payments. It only works for recurring subscriptions. One-time payments must always use data-ms-price:add.

5. Where to Find Your IDs in the Dashboard

Finding the right ID is easy once you know where to look inside your Memberstack Dashboard:

Finding a Free Plan ID (pln_)

  1. Go to Plans in the left-hand menu.
  2. Click on your Free Plan.
  3. Click on 'Install and Publish' button on the right side panel and look for the Plan ID. It will look like this: pln_your-plan-name-12345.
  4. Click the Copy icon next to it.

A Plan ID is necessary when adding signup buttons for free plans on your site. If you want to create a button for a Paid Plan, please scroll down. 

You can find them on the Plans page in your dashboard.  

Finding a Paid Price ID (prc_)

  1. Go to Plans in the left-hand menu.
  2. Click on your Paid Plan.
  3. Each price you have created (e.g., Monthly, Yearly) will have its own individual Price ID listed next to it. It will look like this: prc_your-price-name-12345.
  4. Click the Copy icon next to the specific price you want to use.

A Price ID is necessary when adding signup buttons for Paid plans on your site. If you want to create a button for a Free Plan, please scroll up. 

You can find them on the Plans page in your dashboard.

❓ Frequently Asked Questions (FAQ)

Q: I copied a Stripe price ID (like price_12345) from my Stripe Dashboard. Can I use that?

No. Memberstack uses its own internal Price IDs (which start with prc_) to coordinate everything. Always copy your Price IDs directly from the Memberstack Dashboard, not from Stripe. Memberstack will handle translating that prc_ ID to the correct Stripe ID behind the scenes.

Q: Can I use data-ms-plan:add and data-ms-price:add on the exact same button?

No. You should not stack these two attributes on a single button or link. While it is possible it can cause unpredictable behavior:

  • For new users: Memberstack's signup queue can only store one pending plan selection at a time. Stacking both will cause them to overwrite each other, meaning the user will only receive one of the plans upon signup.
  • For logged-in members: Stacking both triggers two concurrent actions (redirecting to Stripe Checkout and granting a free plan). The automatic page reload/redirect from granting the free plan will interrupt and break the Stripe Checkout redirect.

The Solution (Plan Logic):
If you need a member to have both a free plan and a paid plan, configure the button to only sell the paid plan (data-ms-price:add). Then, use Plan Logic in your Memberstack dashboard to automatically grant the free plan:

  1. Go to Plans and select your paid plan.
  2. Open Advanced Settings and locate Plan Logic.
  3. Create a rule: IF member purchases [Paid Plan] → THEN add [Free Plan].

Note: Plan Logic runs when a member's plans are updated (such as completing a checkout), making this the perfect, seamless way to assign both plans at once.

Q: Why does my ID start with a capital letters like Pln_ or Prc_?

Memberstack IDs are strictly lowercase. If you see a capital letter (like Pln_ or Prc_), your web builder (especially Webflow's custom attribute panel) may have automatically capitalized the first letter when you pasted or typed it in. Double-check your settings in Webflow and make sure it is written exactly as it appears in the dashboard: pln_... or prc_...

Q: What is data-ms-price:remove="all" used for?

If you have a multi-step checkout form where a user can select different plans before checking out, use data-ms-price:remove="all" to clear out any previously selected prices before they make their final selection. This prevents them from accidentally purchasing multiple subscriptions at once.

Was this article helpful?

Didn’t find your answer?

Get an instant answer from Rey, or reach a human. Either way, we’re happy to help.

Comments

No comments yet. Start the conversation below.

Please sign in to leave a comment.

Sitemap