# cw-subscription design notes
- Off-chain task discover collectible subscriptions either by off-chain indexing or query on-chain queue ordered by `next_collection_time`.
- Off-chain task compute `current_collection_time` and `next_collection_time` for collectible subscriptions, send them together with subscription ids to contract.
- Contract verifies (verification is much more efficient than datetime rounding):
- Both `current_collection_time` and `next_collection_time` matches the cron spec
- `next_collection_time > current_collection_time > last_collection_time`
> it's possible that some periods are skipped, if the off-chain task made mistake, and those skipped periods can't be retried later.
- off chain task is free to choose different strategies:
- collect all, platform can do this as public good.
- collect those owned by himself, merchant can do this if platform failed to do the above.
- off chain task is free to choose different failure retry strategries.
- Require some amount of deposit for active plans/subscriptions, which is refunded when plans/subscriptions are deleted, incentivise user to delete unused stuff and reclaim on-chain resources.
- Use self-incremented u128 for plan/subscription id, when overflow, wrap around and try to find an unused one.
- Support cw20(cw1155 too?) tokens, subscribers should set approval to allow subscription contract to transfer fund, native tokens can be used through 1-to-1 mapped cw20 token.
- Subscriber specify expiration time when subscription expire automatically, it can also unsubscribe at any time anyway. Plan can't enfore a minimal duration for subscription.