Repository navigation
Jhostin
Problem 4: In the university communities there is usually a waste of resources, (i.e.) the academic materials required for the courses. Since frequently, these are bought for a class and once the course is over, they are never used again and instead they are kept and forgotten or thrown away. Additionally, it is sometimes hard to find these resources and buying them brand-new can be very expensive and many students are willing to use second-hand materials provided by their peers.
The existing marketplaces do not provide the required alternatives to find the specific elements for the courses, at least not to the extent at which a university community itself can. Currently used alternatives, such as groups in social networks are not organized nor trustworthy enough.
The problem statement contains three claims that must be validated separately, and they are not the same conversation:
| # | Claim in the statement | What has to be observed | Where |
|---|---|---|---|
| A | Materials are bought, used once and become idle; buying new is expensive | The full acquisition cycle of a real course: trigger, channel, cost, and what happened to the item afterwards | Structure #1 |
| B | The channels used today (WhatsApp groups, Instagram stories) are not organized enough | A real sale: how many times it had to be reposted, how many messages were lost, what happened to the post after publishing | Structure #2, Q2–Q4 |
| C | They are not trustworthy enough, and a university-only community would be | How trust was established in a real transaction, and whether belonging to Uniandes played any part in it | Structure #2, Q5–Q6 |
The two interviews target the profiles that can validate these claims: a buyer in an early semester who had to purchase expensive material, and a seller who has already sold through WhatsApp groups, Instagram stories or a general marketplace. The working hypothesis behind claim B, never stated during the interview, is that the real pain is having to publish again and again: stories die in 24 hours, posts get buried under the daily messages, and the replies get lost among private chats.
1). Introduction (5mn):
- Context: explanation of the problematic (3mn)
- Goal: why are we doing the interview and what we will do with the answers (1mn)
2). Profile of the interviewee (1mn):
- Career (25sec)
- Semester (20sec)
- Which courses are you taking this term? (15sec)
3). Guide questions: (3mn - 7mn/question) [These questions are a guide, they have the goal to open the discussion]
1. Think about the last course that required you to buy something: a book, a calculator, a lab kit, a license. Walk me through what happened from the moment you found out you needed it until you had it in your hands.
Purpose: Reconstruct the real acquisition journey step by step (trigger, source of information, decision, channel, waiting time). This is the raw material for the Journey Map, and it is asked as a story so the interviewee narrates instead of summarizing.
2. How much did it end up costing, and how did you decide that price was acceptable?
Purpose: Measure real price sensitivity and identify who actually pays (the student or the family). Asking about a real amount already paid avoids the fantasy answers that "how much would you pay?" produces.
3. Was there any moment where you got the wrong thing, or almost did: wrong edition, wrong calculator model, something the professor never actually used?
Purpose: Detect the failure of matching a material to a specific course. This is the core evidence for the claim that generic marketplaces cannot serve a university community.
4. Before buying it new, where did you look? Tell me exactly what you searched and where.
Purpose: Map the alternative channels that already exist for this person and find the exact point where discovery breaks down. It must be answered with concrete places, not with "somewhere on the internet".
5. Has a classmate or a student from a higher semester ever offered you their material, or have you asked for one? What happened?
Purpose: Understand the informal peer network that already works today and why it does not scale beyond the people you already know.
6. Of everything you bought this semester, what do you think you will never open again? Where is it right now?
Purpose: Close the loop, today's buyer is next year's seller. It validates that the same person lives both ends of the cycle, which is what makes a community marketplace viable.
7. [Only at the end] If the same material appeared tomorrow, second-hand, at half the price, what would still make you doubt about buying it?
Purpose: Surface the non-price barriers (condition, trust, timing, effort). This is the only hypothetical question of the guide and it goes last on purpose, so it does not contaminate the previous answers.
4). Conclusion (2mn)
- Short summary of the answers (to confirm/recapitulate)
- Thank you for your time. It helped a lot!
1). Introduction (5mn):
- Context: explanation of the problematic (3mn)
- Goal: why are we doing the interview (1mn)
2). Profile of the interviewee (1mn):
- Career and semester (30sec)
- Which groups or apps do you use to buy or sell among students? (30sec)
3). Guide questions: (3mn - 7mn/question) [These questions are a guide, they have the goal to open the discussion]
1. Let's start with the last thing you sold. Take me through it: from the moment you decided to sell it to the moment the other person had it in their hands.
Purpose: Obtain the complete journey of the alternative that already exists, with its real timings. Everything that turns out to be slow, manual or repetitive in that story is a design opportunity, and it is found without naming it first.
2. How many times did you have to post that same item before it sold?
Purpose: Measure the repetition cost of the current channels. A number greater than one is the evidence that publishing is not a single action but a recurring chore, which is the hypothesis behind claim B.
3. Think about the people who wrote to you about it. How many were there, and how many actually ended up buying? What happened with the rest?
Purpose: Find out where the conversations go. If the answer involves messages mixed with personal chats, people who were never answered, or someone who was forgotten, the loss of leads is confirmed without having suggested it.
4. You mentioned you post on [Instagram stories / the WhatsApp group], walk me through what happens to one of those posts after you publish it.
Purpose: Make the interviewee describe the ephemeral nature of the channel in their own words (the story that expires, the message buried by the next fifty). This is the strongest evidence for "not organized enough" and it must come from them, not from us.
5. How did you decide you could trust the person who bought it?
Purpose: Identify the trust signals actually used today (being from the same university, mutual friends, meeting on campus, paying on delivery). These signals are the direct input for the trust mechanism of the solution, instead of inventing one.
6. Was the buyer from Uniandes? Did that matter to you? Would it have been different with someone from outside the university?
Purpose: Test claim C directly. It is the question that decides whether a university-restricted marketplace has a real advantage or is only a constraint we like.
7. Has anything ever gone wrong: someone who never showed up, an item that was not as described, money that never arrived? Tell me about it.
Purpose: Separate perceived risk from experienced risk, and find out whether a bad experience changed the way the person sells today.
8. How did the two of you agree on the price?
Purpose: Find out whether there is any price reference for second-hand academic material or whether every negotiation starts blind.
9. Where and when did you hand it over? How did you agree on that?
Purpose: Understand the campus logistics (building, time between classes, days on campus). These are hard constraints for a mobile solution and justify features such as location or schedule matching.
10. Why did you post it there and not somewhere else? Did you consider Marketplace, OLX or Mercado Libre?
Purpose: Get the reason why general marketplaces are discarded stated by the user and not by us. Without this answer, the second half of the problem statement remains an assumption.
11. Has it ever happened that you wanted to sell or give away something and you never got around to posting it? Why?
Purpose: Measure the friction on the supply side. A marketplace without inventory dies, so this is the most important question of the guide for the feasibility of the solution.
12. [Only at the end] If there were one place where you posted it once and it stayed there until it sold, what would still make it not worth it for you?
Purpose: Let the interviewee attack our own hypothesis. Placed last so it cannot contaminate the previous answers, and phrased as an invitation to object rather than to approve.
4). Conclusion (2mn)
- Short summary of the answers (to confirm and recapitulate)
- Thank you for your time. It helped a lot!
- Past over future: what the person already did is evidence; what they say they would do is a prediction.
- One concrete episode over an average: "the last thing you sold" produces details; "how do you usually sell?" produces a summary.
- Open over yes/no: questions start with walk me through, tell me about, how did you.
- Never propose the solution inside the question; the only hypothetical goes last, phrased as an invitation to object.
- Never name the pain we expect to find: the word "spam" never appears in the guide.
- What first, why second: the motivation is asked after the fact is on the table.
- A stated purpose per question: if the purpose cannot be written down, the question does not belong in the guide.
Full recording of the interview (video call): Watch on OneDrive
Note: the platform records one speaker at a time, so the video shows whoever is talking at each moment. The name of the current speaker is visible on screen in both frames below.
Interviewer (Jhostin Aleck Sanchez Mora):
Interviewee (Marco Ramirez):
Interviewee: Marco, last-semester Computer Science student, Universidad de los Andes. Profile: Seller. Sold three second-hand textbooks from his language course through Instagram stories and WhatsApp groups.
Jhostin: Hi, I'm Jhostin, and I would like to know if you're open to answering a few questions. It will be fast, I swear.
Marco: Yeah, for sure.
Jhostin: Okay, so let me talk a little about who I am and what I'm going to ask, and then I would like you to introduce yourself. So, I'm Jhostin. Right now, I'm working on discovering a problem. Basically, we are trying to understand an issue that we think is happening on campus right now. What we see is that students buy materials for a class. They can be books, calculators, lab kits, and when the semester ends, those things just become obsolete. They are not used anymore. Meanwhile, someone who may be two or three semesters below is buying the exact same thing, but completely new. We know and are aware that there are some groups, maybe on WhatsApp or Instagram, but we don't know how well they are working or if they are really good. As you told me before, you sold something in the past, so I would like to understand your experience. It would be great if we could go a little deeper into that. Just to set the context, what are you studying, and what semester are you in?
Marco: Hi, I'm Marco. I'm a last-semester computer science student. And yeah, what you said is completely right. I tried to sell some used books from the language courses I took, because for each course you have to have a book. They don't require you to buy it brand new, but I did. At the end of those courses, I wanted to get rid of them because I didn't need them anymore. So yeah, basically, that was my experience selling stuff at the university.
Jhostin: Okay, perfect. Let's start with the last thing you sold. As you told me, you sold a book. Take me through the process, from the moment you decided to sell it until the moment the other person had it in their hands. I would like to understand the end-to-end process, what happened, how long it took, and anything else you can explain.
Marco: Yeah. As I told you, there are three main books that you need in order to take those courses. For the first classes I had to use one book. At the end of that course, I tried to sell it, but I didn't know how or where, so I just kept it at my house. By the time I finished the whole language track, I had three books sitting at my house. They had been used when I started the courses, but they weren't being used anymore. That was the moment when I tried to sell them quickly because I wasn't using them. I knew that people taking those courses for the first time needed them, and it wouldn't be ecologically correct to purchase a new book or print the materials again. When I finished my last language class, at the end of that semester, I tried to sell the three books to different people because no one needs all three books at the same time. At the end of that semester, no one contacted me because people usually try to purchase them when a new semester starts and when they are sure they will need that version of the book. Since it was a new semester, they might need a new version or something like that. I tried to sell them during the last three weeks of that semester. No one was interested in purchasing them, so I had to wait until the beginning of the next semester to try again. I had two main options. One was posting stories on Instagram saying, "Hey, I have these language books. Does anyone need them?" The other option was posting in WhatsApp groups because there are many groups where people buy and sell stuff. I tried both options, but it was pretty much a nightmare. If no one saw the post or was interested in it on the first day, it would probably be forgotten among all the messages sent daily. On Instagram, the story is deleted after 24 hours, so you have to keep reposting the same thing, and it feels kind of spammy. It isn't the best experience for selling something through those channels. After around two weeks, someone was interested in one of the books, and later someone was interested in another one, and then the other one. That's how I sold them.
Jhostin: Okay, perfect. Let me do a little recap. One of the biggest issues you mentioned is the lack of organization and order in those groups. The posts you make get lost, and it becomes difficult for people to find them. Is that right?
Marco: Yeah, basically. If I put myself in the perspective of the people I was trying to sell the books to, they would have to check the group daily, scroll through all the messages, and see whether there were any of the books that they needed. For both the seller and the buyer, it's a bad experience overall. I think the lack of organization, indexes, and search options for books, calculators, and different types of materials makes it much more difficult to buy and sell things at the university.
Jhostin: Okay, perfect. I would also like to know how you decided whether you could trust the person who was going to buy your book.
Marco: Sure. The way it normally works in those groups is that you agree to meet in one of the university buildings, such as the ML or W building. Since the meeting is inside the university and you need a student card to enter the buildings, you can be sure that the person is a student because they are inside the building. Basically, the transactions are made in person, inside the university.
Jhostin: Okay, perfect. Is it important to you that the person is from your university, in this case, Los Andes?
Marco: I would say so. It gives me much more confidence that I won't get scammed. At the end of the day, they were only books. But if it were something like an expensive calculator, I would be much more worried about getting robbed or something like that. It doesn't necessarily have to be someone from Los Andes, which is the university I'm currently attending. It could be someone from La Javeriana because they might also need calculators, books, and other materials. That would create a much larger market of people to whom I could sell those books or a calculator. So yeah, I would be completely comfortable selling to another verified student.
Jhostin: Okay. So we can say that the fact that the person is a student from Los Andes gives you more confidence. Is that right?
Marco: Yeah, yeah, we can say that.
Jhostin: Tell me, how did the two of you agree on the price? Did you compare it with anything? How was that process?
Marco: Basically, I knew the original price I had paid for the book, and I applied around a 30% discount because it was used. That was how I set the price because there wasn't any current competition or other people selling the same thing. I couldn't see what the average price was for those books. So yeah, that was basically how I set the price.
Jhostin: Okay, perfect. Thanks for the information. The last question is hypothetical. Imagine there were a place, such as an application, where you could post something once and it would remain available. People could easily filter the information, access it, and verify it. The application would only be available to verified students. Would something like that work for you?
Marco: Yeah, it would be awesome. I would know that people who enter the application and use a filter, such as "language books," could find me much more easily and quickly. They could also see that I'm a verified student using my Uniandes email. I think that would increase people's confidence when buying and selling things. It would also make the process faster because you would know what you want, search for it, and get it.
Jhostin: Okay, that's great. I would also like to ask whether there is anything I should have asked you but didn't ask about, or anything else you would like to share.
Marco: In the hypothetical case of that application, how could you make sure that the transactions were actually completed? For example, imagine that I'm selling one of those books. I post it for sale, but I only have one unit of that book. After I sell it and receive the money, if that was the only thing I was trying to sell on the app, I might uninstall the application without marking the book as sold or removing the post. The post would remain active even though I was no longer selling the book because I had uninstalled the application. How could you know whether someone selling something had already sold it and the listing had become a ghost post?
Jhostin: Okay. At this moment, we are only trying to understand the problem. It's a good question, and it's an important issue that we should consider because that is something that could happen. A ghost post could remain visible even though the product is no longer available. We could say that this is one of the possible risks. It would be important, for example, to confirm whether something is still available when a person shows interest in it. We would need to understand the actual stock or availability of products in the marketplace. But yeah, it was only a hypothetical situation to understand whether something like an application could help you in some way. Your question is great, and I think that would be everything. Thank you very much for your time. This helps us a lot. Seriously, thank you again, and I'll see you next time, okay?
Marco: For sure, Jhostin. Thank you so much.
I interviewed Marco, a last-semester Computer Science student at Universidad de los Andes, who sold three used textbooks after finishing the language track they belonged to. He kept the first one at home simply because he did not know how or where to sell it, and repeated that until three books had accumulated. He posted them in the last weeks of the semester and nobody answered, because students only look for these books when a new term starts, so he had to wait for the next semester. He sold them through Instagram stories and WhatsApp groups, which he described as a nightmare: posts get buried among the daily messages and stories disappear after 24 hours, so he had to keep reposting, which felt spammy. Trust came from meeting inside a university building, since a student card is required to enter, and it mattered more for expensive items than for books. Interestingly, he said the marketplace should not be limited to Los Andes but open to any verified student, since that would create a larger market. He priced the books 30% below what he paid because there was no reference price available, and he raised the risk of ghost posts: listings left behind by sellers who complete a sale and never remove the post.
The closing hypothetical ("would something like that work for you?") produced agreement rather than evidence, so it is not used as a finding. Three questions from the guide were not covered and are carried over to the next interview: how many people wrote versus how many actually bought, whether anything ever went wrong in a transaction, and why general marketplaces such as Marketplace or OLX were never considered.
Text version of the What-How-Why table
| WHAT (observed action) | HOW (the way it is done) | WHY (inferred motivation / need) |
|---|---|---|
| Keeps a book he no longer needs at home instead of selling it, and repeats this until three accumulate | Passively, by default, after a failed attempt to figure out where to sell | The cost of finding a channel is higher than the value of the item; with no obvious destination, storing is the path of least resistance |
| Posts the three books for sale in the last three weeks of the semester | Proactively, expecting immediate demand, and receives no answer | He acts when he stops needing the item, not when someone else starts needing it; he has no way of knowing when the demand will exist |
| Waits for the next semester and posts again | Resignedly, after a forced two-month pause | He learns that demand is seasonal and tied to enrolment, and adapts by waiting instead of by finding a better channel |
| Reposts the same item repeatedly on Instagram stories | Manually, every 24 hours, feeling that it "feels kind of spammy" | The channel forgets; only repetition keeps the offer visible, and the social cost of that repetition falls on the seller |
| Posts in WhatsApp buy-and-sell groups | Once, hoping to be seen on the first day, otherwise buried under daily messages | He needs reach, and these groups are the only place where the university audience is already gathered, even though the format destroys the post |
| Imagines the buyer scrolling the group every day to find the book they need | Empathetically, unprompted, describing the other side of the failure | He understands the problem is structural rather than personal: without indexes or search, both sides lose |
| Meets the buyer inside a university building to close the deal | In person, in ML or W, where a student card is required to enter | Physical access to campus works as an identity check; he outsources verification to the building instead of to the platform |
| Would worry far more if the item were an expensive calculator | By raising his own guard as the value rises | Perceived risk is proportional to the price; a single trust mechanism does not fit every transaction |
| Declares he would sell to a student from another university | Openly, correcting the premise of the question | His need is a larger pool of verified buyers; the university boundary protects him only insofar as it certifies that the other party is a student |
| Prices the book at 30% below what he originally paid | Arbitrarily, with no reference point available | He needs an anchor to feel the price is fair, and in the absence of a market he invents one |
| Raises the risk of a listing surviving its own sale | Analytically, when invited to ask his own question | He anticipates that trust in a marketplace depends on its listings being true, not merely on its users being verified |
Based on Daniel's interview with Mariana Salomé Hernández (see Daniel's page).
Figure. Repository pattern in the lost report feature of the Flutter app (lib/features/reports).
The screen (ReportLostItemScreen) only talks to its ViewModel (ReportLostItemController), and the ViewModel only knows the LostReportRepository interface: getCategories(), getMyActiveReports(), submit(draft) and syncPending(). LostReportRepositoryImpl is the only class that knows where the data really goes:
-
FirestoreReportDataSource: writeslostReportsandlostReportPrivatein one batch, following the shared contract inProyecto/firebase/schema.md. -
ReportPhotoStorage: uploads the photo to Firebase Storage (lostReports/{reportId}.jpg). -
PendingReportStore: keeps the reports created without a connection on the device. -
ConnectivityService: says whether the device has a network.
submit(draft) returns a SubmitResult with the status submitted or queuedOffline. The screen shows one message or the other without knowing whether the report went to Firestore or to the local queue.
Rationale: the lost report has three possible destinations (Firestore, Storage and the offline queue) and an order imposed by the security rules: report first, then photo, then photoPath. Keeping that logic in one repository leaves the screen and the ViewModel free of Firebase code, so new behavior (the photo, then the offline queue) was added without changing the screen's flow. It also makes the feature testable: the widget tests inject FakeLostReportRepository, and the repository tests use fakes of the data source, the storage, the queue and the connectivity, so none of them need Firebase or a real network.
The student fills in item, category, description and place, plus an optional private verification detail that only the owner and Lost & Found staff can read (lostReportPrivate). The report id is generated on the device, so a retry reuses the same document.
- Pattern: Repository (see above).
- Code:
lib/features/reports/in CampusFind_Flutter.
Sensor feature. The student can take a photo with the camera (image_picker, resized to 1280 px). LostReportRepositoryImpl creates the report, uploads the photo through ReportPhotoStorage and then saves its Storage path in photoPath. If only the photo fails, the report is kept and the photo is retried later.
- Pattern: Repository. The camera is behind a
PhotoPickerinterface, so the tests use a fake camera.
Context-aware feature. Without a connection, or if Firestore does not answer within 10 seconds, the repository saves the report in PendingReportStore (SharedPreferences, with a copy of the photo) and returns queuedOffline. PendingReportSync calls syncPending() when the connection returns or the student signs in, and retries after 5, 15, 30 and 60 seconds. Because each queued report keeps its id, a retry never creates a duplicate.
- Pattern: Repository. The screen does not change between online and offline; only the repository decides where the report goes.
- Tested end to end with Maestro (
.maestro/offline_queue.yaml): airplane mode, report queued, report sent after reconnecting.
Business Question Type 3: Which app features are used most frequently by students?
The analysis uses usage events generated by the Flutter student app. The analytics model supports seven feature identifiers, and the current Flutter instrumentation records four of them: searching found items, opening "I lost an item" and opening "I found an item" (from the Home actions), and sending a lost report. Each event stores the student's uid, the feature identifier, the platform (flutter) and the time it occurred (occurredAt). Only the feature and the time are recorded, not what the student wrote. The remaining identifiers (view_my_report, password_login, biometric_login) are already accepted by the rules and the aggregation, so they can be instrumented later without changing the pipeline.
The Flutter application writes each event to Cloud Firestore through the Firebase SDK. The write does not block the screen, and if the device is offline Firestore keeps it in its local queue and sends it when the connection returns. Firestore Security Rules only accept events created by the authenticated student for their own uid, with exactly those four fields and a feature from the allowed list. Only admins can read the raw events.
The raw events are stored in the featureUsageEvents collection in Cloud Firestore. The computed result is stored in a single document, analytics/featureUsage, which is the only document the dashboard needs to read.
This BQ is processed in the Usage and Outcome Analytics stage of the pipeline (Feature usage frequency).
A scheduled Cloud Function, aggregateFeatureUsage, runs every hour. For each of the seven supported features it counts the total events, the events from the last 7 days and the events per platform, using Firestore count() aggregation queries so it does not download every event document. It then sorts the features by total uses to build the ranking, identifies the most used feature and saves the result together with the time it was computed.
featureUsageEvents → Count per feature → Count last 7 days → Count per platform → Sort by total → analytics/featureUsage
The computed results are shown in the "Most used features" panel of the staff Analytics Dashboard in the Flutter app, next to the other BQs. The panel lists the features from most to least used, with the total uses, the uses in the last 7 days and the split by platform, and staff can reload it to see the latest aggregation. This shows which parts of the student app bring value and which ones are ignored, so the team can prioritize, improve or remove features based on real usage.
Repository for Documentation of the Project. Select a Sprint to see the deliverables.
| Sprint | Microsprints | Status |
|---|---|---|
| Sprint 1 | MS1 | MS2 | MS3 | MS4 | Complete |
| Sprint 2 | MS5 | MS6 | MS7 | | In process |
- Sofia Losada - 202221008
- Jhostin Sanchez - 202214064
- Emilio Zea -202221744
- Alex Pérez - 202123321
- Camilo - 202211362
- Daniel Rivera - 202123493