Настройка Ghost Members (подписки/пейволл)
Ghost Members — встроенная система подписчиков без внешних плагинов. Интегрируется со Stripe для платных уровней доступа (Tiers). Поддерживает бесплатных подписчиков (email-лист), платные уровни с месячной/годовой оплатой и paywall-контент.
Активация и базовая настройка
В Ghost Admin: Settings → Memberships:
- Включить Members: yes
- Default post access: Members only / Paid-members only / Free
- Portal: настройка кнопки регистрации и форм
Подключение Stripe
Admin → Settings → Memberships → Connect with Stripe
Потребуется Stripe account (Standard или Connect). Ghost создаёт Products и Prices в Stripe автоматически при настройке Tiers. Webhooks настраиваются Ghost CLI автоматически.
Уровни доступа (Tiers)
Admin → Settings → Memberships → Tiers
Каждый Tier имеет:
- Monthly/yearly цены в Stripe
- Список benefits (отображается на странице подписки)
- Описание
Пейволл в контенте
В редакторе Koenig вставляем разделитель Members:
[Открытая часть статьи]
⚡ Members Only [вставить карточку "Members Only"]
[Платный контент — доступен только подписчикам]
В теме Handlebars:
{{! post.hbs}}
{{#post}}
{{#if access}}
{{! Пользователь имеет доступ — показываем контент}}
<div class="gh-content">{{content}}</div>
{{else}}
{{! Нет доступа — пейволл}}
<div class="gh-content">{{content}}</div>
{{! Ghost автоматически обрежет контент по маркеру}}
<div class="paywall" data-members-only>
{{#if @member}}
{{! Авторизован, но нет нужного уровня}}
<h3>Эта статья для платных подписчиков</h3>
<a href="#/portal/upgrade" data-portal="upgrade">Улучшить подписку</a>
{{else}}
{{! Не авторизован}}
<h3>Читайте без ограничений</h3>
<a href="#/portal/signup" data-portal="signup/free">Подписаться бесплатно</a>
<a href="#/portal/signup" data-portal="signup">Стать платным подписчиком</a>
{{/if}}
</div>
{{/if}}
{{/post}}
Ghost Portal
Portal — встроенный виджет аутентификации (iframe), вставляемый в тему:
{{! В footer.hbs или перед </body>}}
{{#if @labs.members}}
<script defer src="{{asset "js/portal.min.js"}}"></script>
{{/if}}
Управление открытием Portal через data-атрибуты:
<a href="#/portal" data-portal>Войти</a>
<a href="#/portal/signup" data-portal="signup">Зарегистрироваться</a>
<a href="#/portal/account" data-portal="account">Мой аккаунт</a>
Кастомный Signup Flow
{{! Форма с указанием конкретного Tier и периода}}
<a href="#/portal/signup?plan=monthly" data-portal="signup/monthly">
Подписаться за {{price currency="USD" numberFormat="short"}}/мес
</a>
Проверка статуса подписчика
{{! Персонализированный контент}}
{{#if @member}}
<p>Привет, {{@member.name}}!</p>
{{#if @member.paid}}
<span class="badge">Premium</span>
{{! Показать данные о подписке}}
{{#foreach @member.subscriptions}}
Подписка активна до {{date current_period_end format="DD.MM.YYYY"}}
{{/foreach}}
{{/if}}
{{/if}}
Настройка Webhook для синхронизации с внешними системами
Ghost Admin → Settings → Integrations → Custom Integrations → Add webhook:
События: member.added, member.updated, member.deleted, member.payment.succeeded.
// Обработчик webhook (Node.js)
app.post('/ghost/webhook', express.json(), async (req, res) => {
const event = req.body;
if (event.member?.current?.subscribed && !event.member.previous?.subscribed) {
// Новый подписчик — добавляем в CRM
await addToCrm(event.member.current);
}
if (event.member?.current?.status === 'paid') {
// Новый платный подписчик — выдаём доступ к Discord
await grantDiscordAccess(event.member.current.email);
}
res.sendStatus(200);
});
Настройка Members с одним платным уровнем и базовым пейволлом — 1–2 дня. Несколько уровней доступа, кастомный Portal UI, webhook-интеграции — 3–5 дней.







