RedeemID also runs on [EmDash](https://github.com/emdash-cms/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`](https://www.npmjs.com/package/@redeemid/emdash), with its source on [GitHub](https://github.com/webmultipliers/redeemid-emdash). 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](https://redeemid-emdash-demo.vinnysgreen.workers.dev/), a copy of the WordPress demo's newsroom. To set up your own site, see [Install on EmDash](/docs/emdash-install/).

## 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](https://github.com/webmultipliers/redeemid-emdash/releases) 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: false` paywall 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 a `member.erased` event 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-emdash` command. They're read-only unless `agents.actions` is 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 the `preferences.saved` event names the fields changed, never the answers.
- Protected files: uploads in a media folder named in `files` reach 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.used` and `meter.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.
