# ADR: When to validate customers count?
## Background
* Each customer could be a part of `n` number of segments. `n` is configurable. Let's call `n` as _slots_ henseforth and assume its value is 20.
* Each promotion (possibly) creates a new segment, so there is a 1-1 mapping between promotion and segment.
* One merchant can create multiple promotions.
Given the points above, we can see that a merchant can possibly consume all available slots (n) of a customer.
There are a few optimisations we can do to reduce this occupation of slots by a single (or handful) of merchants.
1. Create the segment on promotion's start_date, instead of when the promotion is created
2. Delete the segment when the promotion ends
3. Delete the segment if the merchant deletes, or deactivates the promotion
For us, #2, and #3 are straightforward to do. However, #1 poses some complications. Let's talk about the process flow when creating the promotion.
### Flow
1. MPS calls MSS's /sync-segment with
* merchant_id
* segment_type
* start_date
* end_date
3. MSS fetches the customer_id for merchant_id, and segment_type from its local DB
4. MSS filters out the customer_ids for which slots are filled up `(number of segments > n)`
* If the list from #3 is > 0
* MSS accepts request
* Increment counters for customers (filtered list)
* else
* Reject the request
The step 4 from flow above can happen at two different times.
1. On promo creation
2. On promo start date
### On promo creation
Flow remains the same as described above. Validation happens synchronously, and merchantnt gets the response at promo creation time.
Pros:
1. Merchant gets a sync feedback
2. If there are no customers at creation time, we don't create the promotion
Cons:
1. A single merchant can take up more slots than necessary, since we are incrementing `n` right when someone creates a promotion.
2. At creation time, we don't have the true representation of a segment for the duration of promo. Eg: The set of new_users today is different from what it would be a month in future.
### On promo start date
Here, we don't validate the segment list at promo creation time. Instead, we just accept the request.
On start date:
1. Fetch the customer_ids
2. Filter customers who've number_of_segments < `n`
* If customers > 0
* Create a segment, sync these with SS
* Increment counters (n) for these
* Else
* Ignore
> A simple check could be done at this time eg: check if there is at least one customer in segment, without doing slots filter
Pros:
1. Only relevent segments are created at any point in time
2. More slots available
3. Represents the correct state, since the segment is read on promo start date
Cons:
1. Merchant won't get a sync feeback. There is a possibility that we create the promotion but don't have any audience for it on start date
* One way to communicate this with merchant would be to expose the audience count on promo-details page.