# EVENT\_STORMING.md

## EVENT\_STORMING.md — CardApp

Рабочий результат event storming-сессии. Документ фиксирует доменные контексты, акторов, ключевые события, команды, политики и открытые вопросы по CardApp. Это не финальная техническая спецификация: часть правил помечена как `TBD` или `future`, если решение отложено.

***

### Акторы

* **Пользователь / держатель карты** — регистрируется, открывает карты, пополняет баланс, совершает платежи, управляет настройками, обращается в поддержку.
* **Приглашённый пользователь / реферал** — приходит по реферальной ссылке, регистрируется, открывает карту и делает первый депозит.
* **Партнёр / affiliate** — привлекает пользователей через партнёрские ссылки, QR, sub-id и postback API, получает CPA/RevShare.
* **AI-ассистент** — отвечает строго по базе знаний, собирает первичный контекст обращений и споров, эскалирует к человеку.
* **Support** — общается с пользователем, собирает данные, создаёт и эскалирует запросы, но не выполняет финансовые и ограничительные действия.
* **Admin** — управляет критичными действиями, тарифами, контентом, возвратами, ограничениями и подтверждениями.
* **ControlObserver** — read-only роль отдела контроля; участвует в подтверждении сверок и high-risk операций.
* **СБП-провайдер** — сообщает о СБП-платежах, плательщике, статусах и возвратах.
* **Crypto/custody provider** — сообщает о crypto-депозитах, подтверждениях и выводах при закрытии аккаунта.
* **Card issuing / CaaS provider** — выпускает карты, возвращает статусы выпуска, реквизиты и статусы карточных операций.
* **3DS/card processor** — инициирует 3DS, авторизации, клиринг и отказы.
* **Notification providers** — Telegram, email и push-каналы.

***

### Bounded Contexts

1. **Acquisition & Attribution** — вход по referral, affiliate и marketing links.
2. **Registration & Identity** — регистрация, OTP, cross-platform identity, сессии и устройства.
3. **KYC & Compliance** — risk-based KYC, внешний KYC-провайдер, санкционные/PEP проверки.
4. **Tariffs & Card Opening** — тарифы, quote, оплата открытия, выпуск карты.
5. **Cards** — статусы карт, реквизиты, заморозка, блокировка, закрытие, физическая доставка.
6. **Deposits: SBP** — СБП-депозиты, плательщики, лимиты, KYC-триггеры, возвраты.
7. **Deposits: Crypto** — crypto-депозиты, late/unmatched deposits, claim flow.
8. **Payments & 3DS** — авторизация, 3DS, лимиты оплаты, decline reasons.
9. **Ledger & Finance** — master accounts, ledger entries, projections, ручные корректировки.
10. **Treasury** — provider funding, credit limit, срочные алерты.
11. **Risk** — риск-сигналы по СБП, устройствам, операциям и ограничениям.
12. **Support & Disputes** — тикеты, AI intake, споры, эскалации.
13. **Referral** — реферальная программа пользователя.
14. **Affiliate** — партнёрский кабинет, postback API, комиссии, выплаты.
15. **Notifications** — настройки каналов и доставка уведомлений.
16. **AdminPanel & RBAC** — роли, права, approvals, audit.
17. **Legal & Content** — legal docs, тарифы, FAQ/knowledge base, notification templates.
18. **Privacy** — PII masking, доступ к персональным данным, закрытие аккаунта.
19. **Reconciliation** — сверки, daily close, ручное подтверждение v1.

***

### Acquisition & Attribution

#### События

```
Acquisition.LinkOpened
Acquisition.AttributionCaptured
Acquisition.AttributionAlreadyExists
Acquisition.AttributionConflictRejected
Acquisition.FunnelEntered
Acquisition.TargetPlatformResolved
Acquisition.LandingOpened
Acquisition.TelegramMiniAppOpened
Acquisition.AppInstallRedirected
```

#### Link types

```
referral_link
partner_link
internal_marketing_link
```

#### Target platforms

```
landing
telegram_mini_app
app_store
google_play
```

`MAKS Mini App` отложен на future scope.

#### Milestones воронки

```
Funnel.RegistrationCompleted
Funnel.FirstCardOpened
Funnel.FirstDepositCompleted
```

KYC не является обязательным milestone для всех пользователей, потому что KYC запускается только по risk triggers.

#### Nurture / reactivation

```
Nurture.SequenceStarted
Nurture.StepScheduled
Nurture.StepTriggered
Nurture.MessageSent
Nurture.SequenceStopped
Engagement.ActivityRecorded
Engagement.UserBecameInactive
Reactivation.SequenceStarted
Reactivation.SequenceSuppressed
```

Schedule для незавершённого этапа: `15 минут`, `24 часа`, `72 часа`, `7 дней`.

Пользователь считается неактивным, если 10 дней нет никаких пользовательских активностей: входов, платежей, депозитов, обращений в поддержку, сообщений AI, действий с картами или рефералкой.

***

### Registration & Identity

#### События

```
Onboarding.RegistrationStarted
User.FullNameProvided
User.PhoneLinked
User.PhoneConfirmationRequested
User.PhoneConfirmed
User.EmailLinked
User.EmailConfirmationRequested
User.EmailConfirmed
User.Registered
User.ExistingAccountDetected
User.RegistrationRejected
Login.Suggested
```

Регистрация завершена только после ввода ФИО, телефона, email и подтверждения и телефона, и email.

#### OTP

```
Otp.Requested
Otp.Sent
Otp.VerificationAttempted
Otp.Verified
Otp.Failed
Otp.Expired
Otp.AttemptsExceeded
Otp.ResendRequested
```

OTP действует 2 минуты. Максимум 5 попыток. Новый OTP можно запросить сразу после истечения 2 минут.

#### Web login

```
Login.Started
Login.IdentifierSubmitted
Otp.Requested
Otp.Verified
Session.Opened
```

#### Telegram Mini App login

```
Telegram.MiniAppOpened
Telegram.IdentityReceived
User.TelegramIdentityMatched
User.TelegramIdentityNotMatched
User.TelegramIdentityLinked
Session.Opened
```

Если Telegram identity уже привязан, открывается сессия. Если нет — запускается регистрация. При успешной регистрации через Telegram Mini App Telegram identity автоматически привязывается к аккаунту.

#### Sessions & devices

```
Device.Seen
TwoFactor.Challenged
TwoFactor.Verified
Device.Confirmed
Device.ListViewed
Device.Revoked
Session.Opened
Session.OpeningRejected
Session.Refreshed
Session.Revoked
User.LoggedOut
```

Новое устройство требует OTP/2FA. Если 2FA не пройдена, сессия не открывается. Пользователь может смотреть доверенные устройства и отзывать их. Отзыв текущего устройства сразу завершает текущую сессию.

#### 2FA

```
TwoFactor.MethodEnabled
TwoFactor.MethodDisabled
TwoFactor.PrimaryMethodSelected
TwoFactor.BackupMethodSelected
TwoFactor.MethodChangeRequested
TwoFactor.CodeSent
TwoFactor.PushSent
TwoFactor.Verified
TwoFactor.Failed
```

Методы v1: `email_otp`, `sms_otp`, `telegram_bot_code`, `app_push`. Пользователь выбирает основной и запасной метод. Изменение методов требует текущий 2FA. Потеря всех методов восстанавливается через поддержку + KYC.

***

### KYC & Compliance

#### События

```
KYC.Application.Required
KYC.Application.Started
KYC.DocumentTypeSelected
KYC.Document.Submitted
KYC.FaceCheckStarted
KYC.FaceCheckPassed
KYC.FaceCheckFailed
KYC.Application.SubmittedToProvider
KYC.ProviderStatusReceived
KYC.ProviderReviewStarted
KYC.ProviderFinalResultReceived
KYC.Application.Approved
KYC.Application.Rejected
KYC.Application.Expired
KYC.RetryRequested
KYC.RetryLimitChecked
KYC.RetryLimitExceeded
```

#### Документы

```
passport
international_passport
driver_license
residence_permit_with_photo
```

Лицевая проверка обязательна.

KYC делает внешний провайдер. CardApp не видит и не хранит документы, а получает только статусы и метаданные.

#### Compliance

```
Compliance.SanctionsHitRecorded
Compliance.ReviewRequired
User.DepositRestrictionApplied
User.DepositRestrictionKept
User.DepositRestrictionLifted
```

Sanctions/PEP/watchlist hit не блокирует аккаунт полностью. Ограничиваются депозиты, платежи по уже доступному балансу остаются доступны. Финальный результат возвращает внешний KYC-провайдер.

KYC retry: до 5 раз за 24 часа. После исчерпания попыток — попробовать позже через 24 часа.

***

### Tariffs & Card Opening

#### Тарифы v1

| Тариф                  | Тип      | Назначение                     | Стоимость | FX markup |
| ---------------------- | -------- | ------------------------------ | --------: | --------: |
| Для подписок           | virtual  | дешёвая виртуальная карта      |  1990 RUB |      +25% |
| Для путешественников   | virtual  | средняя виртуальная карта      |  2990 RUB |      +12% |
| Премиальная            | virtual  | дорогая виртуальная карта      | 14999 RUB |       +7% |
| Премиальная-физическая | physical | ультрадорогая физическая карта | 19999 RUB |       +5% |

Лимиты по тарифам будут заданы позже, но модель должна их поддерживать.

#### События

```
Tariff.Created
Tariff.Updated
Tariff.Published
Tariff.Archived
Tariff.IssuancePriceUpdated
Tariff.LimitsConfigured
Tariff.LimitsUpdated
Fx.MarkupUpdatedByAdmin
```

Изменение стоимости выпуска влияет только на новые карты. FX markup и курсы применяются ко всем картам соответствующего тарифа/типа.

#### Quote и открытие карты

```
Card.IssuanceRequested
Card.TariffSelected
Card.TypeSelected
Payment.QuoteCreated
Payment.QuoteAccepted
Payment.QuoteExpired
Card.OpeningPaymentInitiated
Card.IssuanceFeeReserved
Card.InitialDepositReserved
Sbp.Deposit.Credited / Wallet.CryptoDeposit.Credited
Card.IssuanceSubmittedToProvider
Card.IssuanceConfirmed
Card.CredentialsIssued
Card.Activated
Funnel.FirstCardOpened
```

Quote/payment window действует 2 часа для открытия карты и пополнений. На это время фиксируются расчёт, цена, курс и резерв лимита.

Минимальная сумма при открытии новой карты = стоимость выпуска карты + первый депозит $10. Всё сверх стоимости выпуска зачисляется на баланс карты. Если карта уже открыта, минимальный депозит = $10.

#### Provider cascade

```
Card.IssuanceSubmittedToProvider
Card.ProviderIssuanceFailed
Card.IssuanceCascadedToProvider
Card.IssuancePending
Card.IssuanceTimerStarted
Card.IssuanceDelayed
Card.IssuanceSlaBreached
Card.IssuanceTimerExpired
Card.IssuanceConfirmed
Card.IssuanceCascadeExhausted
Support.Ticket.Opened
```

Если провайдер не смог выпустить карту, система каскадирует выпуск к другому провайдеру. Если карта не выпущена через 24 часа — уведомление пользователю и алерт админам. Через 48 часов создаётся support case и пользователь выбирает: ждать дальше или запросить возврат.

Пользовательский статус ожидания: «Ещё чуть-чуть и ваша карта будет готова».

***

### Cards

#### Статусы карты

```
pending_issuance
active
frozen
blocked
closing_pending
closed
expired
```

#### События

```
Card.IssuancePending
Card.CredentialsIssued
Card.CredentialsViewed
Audit.CardSensitiveDataViewed
Card.Activated
Card.FreezeRequested
Card.Frozen
Card.UnfreezeRequested
Card.Unfrozen
Card.Blocked
Card.UnblockRequested
Card.Unblocked
Card.ClosingPending
Card.Closed
Card.Expired
Card.ReissueOfferShown
Card.NewCardPurchaseSuggested
```

`frozen` — временная заморозка пользователем. `blocked` — принудительная блокировка системой/admin. Пользователь не может сам разблокировать `blocked` карту.

Заморозка карты не требует OTP/2FA. Разморозка требует OTP/2FA.

Закрытие карты только через поддержку. Окончательное закрытие возможно только после завершения pending authorizations, споров, незавершённых депозитов и ожидаемых возвратов. Остаток переводится на другую карту или создаётся support/finance case.

#### Physical card delivery

```
Card.DeliveryAddressSubmitted
Card.PhysicalProductionStarted
Card.PhysicalProduced
Card.Shipped
Card.Delivered
Card.DeliveryFailed
Card.DeliveryAddressUpdateRequested
Card.DeliveryRescheduled
```

Если доставка не удалась: обязательное уведомление, автоматический support ticket, уточнение адреса, повторная доставка через support/admin.

#### Provider incident

```
Provider.IncidentDetected
Provider.DisabledFromCascade
Admin.CriticalAlertRaised
Card.MassReissueRequired
Card.ReissueStarted
Card.ReissuedAtServiceExpense
Card.CredentialsIssued
Card.BalanceTransferStarted
Ledger.Entries.Posted
Card.BalanceTransferred
```

При массовом сбое провайдера он исключается из каскада. Пользователям может автоматически выпускаться новая карта за счёт сервиса. Старая карта становится `blocked`, баланс переносится на новую через ledger.

***

### Deposits: SBP

#### Базовые события

```
Sbp.Deposit.Initiated
Sbp.PaymentInstructionsGenerated
Sbp.QrGenerated
Sbp.Deposit.Paid
Sbp.Deposit.Credited
Sbp.Deposit.OnHold
Sbp.Deposit.Failed
Sbp.Deposit.Expired
Sbp.Deposit.LatePaid
Sbp.Deposit.ExcessDetected
Sbp.RefundRequested
Sbp.Refunded
```

#### Плательщик

```
Sbp.PayerObserved
Sbp.PayerFingerprintCreated
Sbp.PayerBoundToUser
Sbp.PayerMatchedToKnownPayer
Sbp.PayerMatchedToKycIdentity
Sbp.PayerIdentityUncertain
Sbp.PayerMismatchDetected
Sbp.UniquePayerRecorded
Sbp.UniquePayerCountChanged
Sbp.PayerInstrumentRecorded
Sbp.PayerInstrumentCountChanged
```

Собираем максимум доступных данных о плательщике: ФИО, телефон, банк, счёт, provider id, masked/hash значения, raw payload reference. Уникальный плательщик = человек, не отдельный банк/счёт. Один человек из разных банков считается одним плательщиком.

#### Лимиты депозита

```
Card.DepositLimitChecked
Card.DepositLimitReserved
Card.DepositLimitReservationReleased
Card.DepositLimitConsumed
Card.DepositLimitExceeded
Card.AlternativeTopUpTargetSuggested
Card.NewCardPurchaseSuggested
```

Депозитный лимит считается по накопленной сумме входящих пополнений за период, а не по текущему балансу. Если лимит $1000/мес и пользователь уже пополнил $700, доступно только $300, даже если часть баланса потрачена.

Если пополнение превышает депозитный лимит текущей карты, депозит не создаётся/не принимается. Пользователю предлагается выбрать другую карту с доступным лимитом или открыть новую карту.

#### KYC и плательщики

```
Risk.KycThresholdChecked
Risk.KycThresholdExceeded
KYC.Application.Required
KYC.VerificationTimerStarted
KYC.VerificationTimerExpired
```

KYC-триггеры по СБП:

* сумма СБП больше `N` в RUB;
* другой ФИО плательщика до KYC.

После KYC ограничение по сумме СБП без KYC снимается полностью, но тарифные лимиты карты продолжают действовать.

Если первый СБП-депозит выше `N`, средства ставятся on hold, запрашивается KYC, таймер 1-2 часа. Если KYC успешен — депозит зачисляется и плательщик привязывается. Если нет — возврат.

Эталонный СБП-плательщик фиксируется только по первому успешно зачисленному депозиту.

#### Unique payer restriction

```
Risk.UniquePayerThresholdExceeded
Risk.UserWarningIssued
User.DepositRestrictionApplied
User.DepositRestrictionLiftRequested
User.DepositRestrictionLifted
Support.Ticket.EscalatedToCompliance
```

Счётчик уникальных СБП-плательщиков считается за всё время. 6-й уникальный плательщик после KYC ещё пропускается и депозит зачисляется. Сразу после этого включается ограничение: дальнейшие СБП-депозиты разрешены только от плательщика, совпадающего с KYC-ФИО после нормализации.

Если после ограничения приходит платёж от нового/чужого плательщика, он не зачисляется и автоматически возвращается. До оплаты ФИО неизвестно, поэтому проверка происходит после `Sbp.PayerObserved`.

Ограничение может снять compliance/admin после проверки. В v1 support только объясняет и эскалирует.

***

### Deposits: Crypto

#### События

```
Wallet.CryptoDeposit.Initiated
Wallet.CryptoAssetSelected
Wallet.CryptoNetworkSelected
Wallet.DepositAddress.Assigned
Wallet.CryptoDeposit.Detected
Wallet.CryptoDeposit.Confirmed
Wallet.CryptoDeposit.ConvertedToStable
Wallet.CryptoDeposit.Credited
Wallet.CryptoDeposit.Failed
Wallet.CryptoDeposit.LateDetected
Wallet.CryptoDeposit.MatchedToExpiredQuote
Wallet.CryptoDeposit.ExcessDetected
Wallet.CryptoDeposit.OnHold
Wallet.CryptoDeposit.UnmatchedDetected
Wallet.CryptoDeposit.UnmatchedHeld
```

Crypto доступно для всего: открытие первой карты, открытие следующих карт, обычные пополнения.

На выходе процессинга CardApp учитывает стейблы. Конкретный стейбл зависит от CaaS/провайдера и внутреннего treasury.

Если crypto-платёж пришёл после истечения 2-часового quote, но backend может сопоставить его с заявкой и депозит проходит проверки, процедура завершается и средства зачисляются.

Если crypto-платёж невозможно сопоставить, средства удерживаются как unmatched до обращения отправителя.

#### Unmatched crypto claim

```
Wallet.CryptoDeposit.ClaimStarted
Wallet.CryptoDeposit.ClaimEvidenceSubmitted
Risk.Evaluation.Performed
Support.EvidenceCollected
Wallet.CryptoDeposit.ClaimReviewRequested
Wallet.CryptoDeposit.ClaimApprovedByAdmin
Wallet.CryptoDeposit.ClaimApprovedByControlObserver
Wallet.CryptoDeposit.ClaimRejected
Wallet.CryptoDeposit.MatchedManually
Wallet.CryptoDeposit.Credited
```

Support собирает доказательства, решение требует Admin + ControlObserver. Это high-risk case.

***

### Payments & 3DS

#### Авторизация

```
Tx.Authorization.Registered
Risk.Evaluation.Performed
Card.PaymentLimitChecked
Card.PaymentLimitExceeded
Card.OnlinePaymentPermissionChecked
Tx.Authorization.Approved
Tx.Authorization.Declined
Tx.Authorization.Reversed
Tx.Authorization.Cleared
Tx.Authorization.RefundedByMerchant
Ledger.HoldPlaced
Ledger.HoldReleased
Ledger.HoldCaptured
Ledger.HoldExpired
```

Онлайн-платёж идёт через authorization → 3DS при необходимости → clearing.

#### 3DS

```
ThreeDS.ChallengeRequired
ThreeDS.ChallengePresented
ThreeDS.Approved
ThreeDS.Declined
ThreeDS.Expired
ThreeDS.Failed
```

3DS может требоваться провайдером/мерчантом или внутренней risk-логикой. Если пользователь не подтвердил 3DS или таймер истёк, авторизация всегда отклоняется.

#### Decline reasons

```
INSUFFICIENT_FUNDS
PAYMENT_LIMIT_EXCEEDED
ONLINE_PAYMENTS_DISABLED
CARD_FROZEN
CARD_BLOCKED
THREE_DS_FAILED
SUSPICIOUS_OPERATION
SERVICE_TEMPORARILY_UNAVAILABLE
```

`PAYMENT_LIMIT_EXCEEDED` отображается пользователю как `Payment limit exceeded`. Для `SUSPICIOUS_OPERATION` в v1 только отклоняем операцию, без заморозки карты и без дополнительного 2FA.

#### Лимиты и настройки карты

```
Card.UserPaymentLimitDecreaseRequested
Card.UserPaymentLimitIncreaseRequested
Card.UserPaymentLimitsUpdated
Card.OnlinePaymentsDisableRequested
Card.OnlinePaymentsDisabledByUser
Card.OnlinePaymentsEnableRequested
Card.OnlinePaymentsEnabledByUser
```

Есть суточный лимит, месячный лимит и настройка онлайн-платежей. Пользовательские лимиты не могут превышать тарифные. Уменьшение лимитов и выключение онлайн-платежей не требуют 2FA. Увеличение лимитов и включение онлайн-платежей требуют OTP/2FA.

***

### Ledger & Finance

#### События

```
Ledger.MasterAccount.Opened
Ledger.Transaction.Posted
Ledger.Entries.Posted
Ledger.Entries.Reversed
Ledger.EntryAttributedToUser
Ledger.EntryAttributedToCard
Ledger.EntryAttributedToPartner
BalanceProjection.Updated
BalanceProjection.Rebuilt
Finance.ManualAdjustmentRequested
Finance.ManualAdjustmentSelfApprovalRejected
Finance.ManualAdjustmentApproved
Finance.ManualAdjustmentRejected
```

У пользователей нет отдельных реальных депозитов; средства находятся в общих master/omnibus accounts. Пользовательский/карточный баланс — это ledger attribution + projection. Ledger entries — источник истины, UI balance — кэш/проекция.

Manual adjustment только через ledger transaction, с обязательной причиной и approval. Создатель не может одобрить собственный adjustment.

***

### Treasury

#### События

```
Treasury.ProviderBalanceLowDetected
Treasury.ProviderCreditLimitConfigured
Treasury.ProviderCreditLimitUsed
Treasury.ProviderCreditLimitNearExhaustion
Treasury.ProviderCreditLimitExhausted
Treasury.UrgentFundingAlertRaised
Treasury.FundingRequired
Treasury.FundingSubmitted
Treasury.FundingConfirmed
```

Если CaaS/card provider balance недостаточен, поднимается срочный алерт. Казначей/admin вручную пополняет provider balance.

У провайдера должен быть credit limit/овердрафт. Если funding и credit limit исчерпаны, пользователь видит нейтральный отказ `Service temporarily unavailable`; внутренняя причина `PROVIDER_LIQUIDITY_EXHAUSTED` видна только админам.

***

### Risk

#### События

```
Risk.SignalRecorded
Risk.SignalAggregated
Risk.Evaluation.Performed
Risk.ScoreChanged
Risk.ThresholdExceeded
Risk.UserWarningIssued
User.DepositRestrictionApplied
```

#### SBP risk signals v1

```
SBP_TOO_MANY_UNIQUE_PAYERS
SBP_NEW_PAYER_AFTER_RESTRICTION
SBP_PAYER_MISMATCH_KYC_NAME
SBP_FREQUENT_PAYER_CHANGE
SBP_PAYER_LINKED_TO_MULTIPLE_USERS
SBP_INSTRUMENT_LINKED_TO_MULTIPLE_USERS
SBP_INSTRUMENT_HAS_MANY_PROBLEM_PAYMENTS
SBP_RETRY_AFTER_REFUND_OR_REJECTION
```

Реакции v1: копим сигналы, показываем в админке, предупреждаем пользователя, ограничиваем депозиты. Автоматический soft-block по этим сигналам в v1 не делаем.

***

### Support & Disputes

#### Support

```
Support.Ticket.Opened
Support.Ticket.LinkedTo
Support.Ticket.LinkedToTransaction
Support.Ticket.LinkedToCard
Support.Ticket.AiContextAttached
Support.Ticket.EscalatedToHuman
Support.Ticket.EscalatedToAdmin
Support.Ticket.Resolved
Support.AdminRequestCreated
```

Support не выполняет financial actions, refunds, manual adjustments или снятие ограничений. Support создаёт и эскалирует запросы.

#### Disputes

```
Ai.DisputeIntakeStarted
Ai.DisputeTransactionSelected
Ai.DisputeReasonCaptured
Ai.DisputeMerchantContactCaptured
Ai.DisputeEvidenceRequested
Ai.DisputeEvidenceUploaded
Ai.DisputeLegitimacyChecked
Ai.DisputeSummaryGenerated
Ai.DisputePreliminaryAssessmentRecorded
Dispute.Opened
Dispute.EvidenceAttached
Dispute.EscalatedToUpstream
Dispute.OutcomeRecorded
```

Спор можно открыть только по списанной/cleared операции и только через поддержку. AI собирает данные и предварительную оценку, но не принимает финальное решение.

***

### Referral

#### События

```
Ref.CodeGenerationRequested
Ref.CodeGenerationRejected
Ref.Code.Generated
Ref.LinkCreated
Referral.Created
Referral.ActivationEligibilityMet
Referral.Activated
Reward.EligibilityComputed
Reward.Accrued
Reward.BalanceUpdated
Reward.PayoutThresholdReached
Reward.TransferTargetCardSelected
Reward.TransferToCardRequested
Reward.TransferToCardCompleted
```

Реферальная ссылка создаётся только после открытия карты и только по явному действию пользователя. Если карты нет, показывается CTA/top-up на открытие карты.

Реферал активируется после открытия карты и первого депозита. Бонусы, вероятно, получают обе стороны, но получатели и суммы должны быть конфигурируемыми.

Бонусный баланс можно перевести на карту только после накопления $200. Перевод не автоматический: пользователь сам выбирает целевую карту и нажимает «перевести».

***

### Affiliate

#### Cabinet features

```
Dashboard
Статистика
Ссылки & QR
Postback API
Офферы
Креативы
Выплаты
Команда
Реферал
Поддержка
Новости
Tier progress
Live feed
```

#### События

```
Affiliate.ApplicationSubmitted
Affiliate.ApplicationReviewed
Affiliate.ApplicationApproved
Affiliate.ApplicationRejected
Affiliate.PartnerRegistered
Affiliate.CabinetAccessGranted
Affiliate.LinkCreated
Affiliate.ClickRecorded
Affiliate.AttributionCaptured
Affiliate.RegistrationAttributed
Affiliate.KycApprovedAttributed
Affiliate.FirstCardOpenedAttributed
Affiliate.NewCardBoughtAttributed
Affiliate.FirstDepositAttributed
Affiliate.NewDepositAttributed
Affiliate.FirstSpendAttributed
Affiliate.RevenueAttributed
Affiliate.CustomerActivated
Affiliate.CardOpeningCommissionAccrued
Affiliate.DepositCommissionAccrued
Affiliate.ExchangeRevenueCommissionAccrued
Affiliate.BalanceUpdated
Affiliate.TierProgressChanged
Affiliate.TierChanged
Affiliate.PayoutCycleStarted
Affiliate.PayoutComputed
Affiliate.PayoutApproved
Affiliate.PayoutPaid
```

Партнёр оставляет заявку, получает approval от Admin или affiliate manager, затем доступ в кабинет.

Партнёрские комиссии начисляются сразу, когда клиент партнёра купил карту и пополнил счёт, плюс с каждого следующего пополнения. Payout — раз в месяц по индивидуальным условиям.

#### Postback API

```
Affiliate.PostbackConfigured
Affiliate.PostbackSecretRotated
Affiliate.PostbackPayloadPrepared
Affiliate.PostbackPiiMasked
Affiliate.PostbackQueued
Affiliate.PostbackDeliveryAttempted
Affiliate.PostbackSent
Affiliate.PostbackFailed
Affiliate.PostbackRetried
Affiliate.PostbackDeadLettered
Affiliate.PostbackManualRetryRequested
```

Разрешённые события партнёру: `click`, `registration`, `kyc_approved`, `first_card_opened`, `first_deposit`, `first_spend`, `commission_accrued`, `payout_paid`, `new_card_bought`, `new_deposit`.

Raw PII не передаётся. Допустимы masked identifiers, например `ass***@gmail.com`.

***

### Notifications

#### Категории

| Category      | Название           | Описание                        | Важное |
| ------------- | ------------------ | ------------------------------- | ------ |
| TxAll         | Все транзакции     | При каждом списании             | да     |
| TopUp         | Пополнения         | При зачислении средств          | нет    |
| ThreeDS       | 3DS-запросы        | Подтверждение платежей          | да     |
| Disputes      | Споры              | Статус обращений                | да     |
| Support       | Ответы поддержки   | Сообщения от команды            | нет    |
| ServiceNews   | Новости сервиса    | Обновления и фичи               | нет    |
| Promotions    | Акции              | Промо и кэшбэк                  | нет    |
| Referral      | Реферальные бонусы | Новые рефералы                  | нет    |
| Security      | Безопасность       | Вход, смена пароля, 2FA         | да     |
| KycCompliance | KYC / Compliance   | Верификация и проверки          | да     |
| LegalUpdates  | Legal updates      | Изменения условий и политик     | да     |
| Cards         | Карты              | Выпуск, доставка и статусы карт | да     |

Каналы: `tg`, `email`, `push`.

#### События

```
Notification.PreferenceChangeRequested
Notification.PreferencesUpdated
Notification.PreferenceChangeRejected
Notification.Outbox.Enqueued
Notification.Sent
Notification.Failed
Notification.DeadLettered
Notification.Opened
Notification.Read
Notification.ActionClicked
```

Для important=true нельзя отключить все каналы. Для important=false можно отключить все каналы полностью.

***

### AdminPanel & RBAC

#### Разделы

```
Dashboard
Users
Support
Transactions
Cards
Finance
Partners
Content
Analytics
System
```

Feature flags и Settings — future scope. Массовые raw exports / скачивание баз в v1 не делаем.

#### Роли v1

```
Admin
Support
ControlObserver
```

Admin — полный доступ, критичные действия через approval. Support — тикеты, коммуникации, эскалации, просмотр связанного контекста. ControlObserver — read-only, контроль и подтверждение сверок, без изменений.

#### События

```
Admin.RoleCreated
Admin.RoleUpdated
Admin.PermissionGranted
Admin.PermissionRevoked
Admin.OperatorCreated
Admin.OperatorRoleAssigned
Admin.OperatorPermissionOverridden
Admin.CriticalActionRequested
Admin.CriticalActionSelfApprovalRejected
Admin.CriticalActionApproved
Admin.CriticalActionRejected
Audit.AdminAction.Performed
Audit.SystemAction.Performed
```

На старте four-eyes применяется ко всем критичным admin actions. Позже правило можно сделать конфигурируемым.

***

### Legal & Content

#### Legal

```
Legal.Document.Published
Legal.Document.Viewed
Legal.Document.AcceptanceRequired
Legal.Document.Accepted
Legal.Document.VersionSuperseded
Card.TermsAcceptanceRequired
Card.TermsAccepted
```

Общие Terms + Privacy принимаются при регистрации. Условия тарифа и выпуска карты принимаются при открытии каждой новой карты. Новые версии документов могут требовать re-acceptance.

#### Content

```
NotificationTemplate.ChangeRequested
NotificationTemplate.Approved
NotificationTemplate.Published
NotificationTemplate.Rejected
KnowledgeBase.ChangeRequested
KnowledgeBase.Approved
KnowledgeBase.Published
KnowledgeBase.Rejected
Ai.KnowledgeBaseUpdated
```

Notification templates, FAQ и knowledge base редактируются через админку и требуют approval.

AI отвечает строго по опубликованной базе знаний и доступным данным CardApp. Если информации недостаточно — не придумывает и эскалирует.

***

### Privacy

#### События

```
Privacy.AccountClosureRequested
Account.ClosureBlockedByPositiveBalance
User.WithdrawalRequired
Withdrawal.Requested
Withdrawal.ApprovedByAdmin
Withdrawal.ApprovedByControlObserver
Withdrawal.SubmittedToCustody
Withdrawal.Settled
Account.ClosureReady
User.Closed
Privacy.RetentionStarted
Privacy.DataMaskedForOperator
PiiAccess.Requested
PiiAccess.Granted
PiiAccessed
Audit.PiiAccessed
```

При закрытии аккаунта пользователь должен вывести средства в crypto или потратить остаток. После закрытия данные продолжают храниться в базе по retention/legal/compliance требованиям.

Crypto withdrawal в v1 доступен только при закрытии аккаунта и требует Admin + ControlObserver.

PII в админке маскируется по умолчанию. Полные PII может раскрыть только Admin с причиной и audit.

***

### Reconciliation

#### События

```
Recon.Run.Started
Recon.SourceSnapshotCaptured
Recon.Run.Completed
Recon.ReviewRequired
Recon.ReviewStarted
Recon.DiscrepancyDetected
Recon.DiscrepancyResolved
Recon.ReviewApprovedByControlObserver
Recon.ReviewApprovedByAdmin
Recon.ReviewRejected
Recon.DailyClose.Signed
```

В v1 все сверки требуют ручного подтверждения. Автоматизацию добавим позже. Daily close подписывается Admin + ControlObserver.

***

### Open Questions / TBD

* Конкретные депозитные и платёжные лимиты по тарифам.
* Конкретные значения `N` для СБП KYC-threshold по нормативам и тарифам.
* Подробная структура card provider contracts и доступность реквизитов физической карты по провайдерам.
* Точный список полей, приходящих от выбранного СБП-провайдера.
* Конкретные retention periods для late crypto matching metadata.
* Точные суммы и получатели referral rewards.
* Роли будущих affiliate manager / finance / compliance, если штат расширится.
* Конкретные templates уведомлений и тексты legal documents.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://alt3-capital.gitbook.io/funding-arbitrage-strategy/cart/proektnaya-dokumentaciya/event_storming-md.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
