RedeemID for EmDash
RedeemID also runs on EmDash, the TypeScript CMS built on Astro. It’s the same idea as the WordPress plugin: Shopify runs the store and the customer account, the site runs the content, and access comes only from the customer’s Shopify tags.
It ships as the npm package @redeemid/emdash, with its source on GitHub. It’s a native EmDash plugin, so it works on Node and on the Cloudflare Workers free plan. It’s early: expect breaking changes before 1.0.0.
See it running on the EmDash demo, a copy of the WordPress demo’s newsroom. To set up your own site, see Install on EmDash.
How it differs from WordPress
- Config is code. Levels, rules, the meter and features live in
astro.config.mjs, next to the rest of the site, so there’s no settings screen or settings transfer. - Templates decide what renders. EmDash has no content filter, so a template renders the entry body with RedeemID’s
<Content>component instead of<PortableText>. Locked parts never reach the page. - Members are EmDash Subscribers. The role only means “signed in” and never grants content. Staff accounts can’t sign in through the store.
- The admin is a plugin page. Members, Privacy, Status and Access test show under Plugins in the EmDash admin.
What it covers
| Feature | WordPress plugin | EmDash package |
|---|---|---|
| Sign-in with the Shopify customer account | Yes | Yes |
| Links a returning reader by verified email | Yes | Yes |
| Tags, name, email and status mirrored by signed webhooks | Yes | Yes |
| Levels from tags, any or all | Yes | Yes |
| Paywall rules: collection, term with child terms, site default, open terms | Yes | Yes |
| Several matching rules: readers must pass all of them | Yes | Yes |
| Paywall break and Members only blocks | Yes | Yes |
| Teasers and access badges | Yes | Yes |
Paywall markup for search engines (isAccessibleForFree: false) |
Yes | Yes |
| The wall, with each level’s text and a join link | Yes | Yes |
| Meter: a few free locked reads a month or week | Yes | Yes, for signed-in readers |
| Drip: entries open days after a level starts | Yes | Yes |
| Member account card, past levels, Refresh membership | Yes | Yes |
| Plan cards and Shopify checkout | Yes | Yes |
| Products, collections, cart page and discount codes | Yes | Yes |
| Pay-what-you-want contributions | Yes | Yes |
| Member features from levels or tags | Yes | Yes |
| Signed event webhooks to your own endpoint | Yes | Yes, 6 events, no retries |
| Staff resync, tag edits written to Shopify, paced bulk resync | Yes | Yes |
| Webhook registration from the admin | Yes | Yes |
| Access test | Yes | Yes |
| Setup wizard | Yes | No, config is code |
| Sell one post on its own | Yes | Yes, with a Sold on its own block |
| Member preferences | Yes | Yes |
| Protected files | Yes | Yes, by media folder |
| Replacing RedeemID’s text | Yes | Yes, in config, for text members and visitors see |
| Privacy export and erasure requests | Yes | Yes |
| AI agents (Abilities API, MCP) and a command line | Yes | Yes, as EmDash MCP tools, and a command line |
| SEO plugin support, multisite, Shopify’s plugin bridge | Yes | Not applicable |
Releases
Each release is on GitHub with its tarball, and on npm.
0.0.15, 9 November 2026
- When a store customer is refused (a staff email, or an account that’s turned off), they’re also signed out of the store, so the next Sign in asks for an email again.
- Registering webhooks from the Status page carries on past a topic Shopify refuses and names the scope it needs.
0.0.14, 9 November 2026
- Pages for signed-in members and visitors with a cart stay out of Astro’s route cache as well as the browser’s.
- Bulk resync reads 25 members a run, which fits the Workers Free limit on database queries.
- Locked entry pages carry
isAccessibleForFree: falsepaywall markup for search engines.
0.0.12, 9 November 2026
- The Status page lists any
REDEEMID_setting that is set but not read, by name only, so a misnamed secret is easy to spot.
0.0.11, 9 November 2026
- Privacy requests: members download or delete their data with a
<YourData>form. Staff export or delete a member, or ask Shopify to erase them, from the admin, and a Privacy page lists every request. Shopify’s privacy webhooks are handled, and amember.erasedevent says when a member’s data is deleted. - AI agents and the command line: staff ask the same questions the admin answers, such as whether a reader can read an entry, through EmDash’s MCP server or the
redeemid-emdashcommand. They’re read-only unlessagents.actionsis on, which adds resyncs and tag edits written to Shopify. - Sell one entry on its own: a Sold on its own block names a tag and a Shopify product. Members holding the tag read the whole entry, and the wall offers the product to everyone else.
0.0.10, 9 November 2026
- Member preferences: members see and change customer fields you define in Shopify, with a
<Preferences>form or its block. Answers are saved on the Shopify customer, and thepreferences.savedevent names the fields changed, never the answers. - Protected files: uploads in a media folder named in
filesreach only the levels or features its rule names, or whoever can read an entry that uses the file. Every download is checked, and allowed ones are never cached. - Replacement text: put any string members and visitors see in your own words, one string at a time, with
text. A replacement that uses a placeholder its original lacks is ignored and listed on the Status page.
0.0.9, 9 November 2026
- Staff tools in the admin. Open a member to resync them from Shopify or to add and remove tags, which are written to Shopify and read back. A bulk resync reads the 50 members synced longest ago each time staff run it.
- The Status page lists the store’s webhook subscriptions and registers missing ones, and shows recent deliveries. A new Access test page shows what an entry needs and whether a reader with some tags gets in.
- Member features from levels or tags, with a
<Feature>component, shown on the member card. - Signed event webhooks:
member.signed_in,member.levels_changed,meter.usedandmeter.exhausted. No event carries an email address.
0.0.8, 8 November 2026
- Product pages, collection grids, a cart page with quantities and discount codes, and pay-what-you-want contributions, each with an editor block. A cart notes the page its first item was added on.
0.0.7, 8 November 2026
- The member account card: levels with when each started, past levels, meter use, and Refresh membership. Plan cards tell members which plan they’re on.
0.0.6, 8 November 2026
- The meter and drip. A rule can opt out of the meter.
0.0.5, 8 November 2026
- Members only blocks for a members part in the middle of a body. The wall names each level’s offer and links to joining, and sign-in, cart and account messages show on the page they return to. Leak tests cover EmDash’s content and search APIs, feeds and sitemaps.
0.0.4, 8 November 2026
- Several matching term rules must all pass, rules cover child terms, terms can open entries to everyone, and there’s a site default and a built-in signed-in level. Teasers and access badges.
0.0.3, 8 November 2026
- Sign-in works on Cloudflare Workers. The Shopify cart, checkout and account link, the admin’s Members and Status pages, and the Paywall break and Plan blocks.
0.0.2, 8 November 2026
- First release: sign-in with the Shopify customer account, the tag mirror, webhooks, levels and rules.