{
 "generated_on": "2026-09-13",
 "what_this_is": "Investigation drafts prepared from public App Store and Google Play reviews. Not reproduced in the app, and no current status is claimed.",
 "corpora": [
  {
   "name": "App Store, United States storefront",
   "count": 85,
   "window": "Dec 2024 to Sep 2026",
   "note": "The public reviews feed, two pages, every entry carrying its rating, date and app version."
  },
  {
   "name": "Google Play",
   "count": 78,
   "window": "Jan 2025 to Aug 2026",
   "note": "Read with an open-source reader. Twenty carry a public reply from the developer."
  }
 ],
 "corpus": {
  "total": 163,
  "by_store": {
   "App Store": 85,
   "Google Play": 78
  },
  "ratings": {
   "1": 19,
   "2": 4,
   "3": 5,
   "4": 4,
   "5": 131
  },
  "low_rated": 28,
  "five_star": 131,
  "developer_replies": 20,
  "play_total": 78,
  "first_date": "2024-12-29",
  "last_date": "2026-09-09"
 },
 "sources": [
  {
   "name": "App Store customer reviews",
   "url": "https://itunes.apple.com/us/rss/customerreviews/page=1/id=6736954854/sortby=mostrecent/json",
   "note": "The public reviews feed, two pages, 85 reviews, each carrying its rating, date and app version."
  },
  {
   "name": "App Store listing",
   "url": "https://itunes.apple.com/lookup?id=6736954854&country=us",
   "note": "Current version and release dates."
  },
  {
   "name": "Google Play reviews",
   "url": "https://play.google.com/store/apps/details?id=com.reventure.mobileapp",
   "note": "78 reviews read with google-play-scraper 1.2.7, an open-source reader. Twenty carry a public developer reply."
  },
  {
   "name": "Web app page source",
   "url": "https://www.reventure.app/",
   "note": "Kept verbatim. Read for the observation on this page, not for a draft."
  },
  {
   "name": "Web app sitemap",
   "url": "https://map.reventure.app/sitemap-0.xml",
   "note": "Twelve routes, including the cancellation route the second draft starts from."
  }
 ],
 "verification_order_note": "A suggested verification order, with the reason for each place in it and the condition for moving it to development. It is not a sprint and it carries no commitment: the team's own backlog and whatever is already in flight decide that, and neither is visible from here.",
 "tickets": [
  {
   "key": "RVD-1",
   "rank": 1,
   "status": "Investigation draft",
   "summary": "Verify paid access when home listings return \"unauthorized\"",
   "issuetype": "Task",
   "labels": [
    "access",
    "subscription",
    "ios",
    "android"
   ],
   "context": "Three reviewers, on both stores and across ten months, report that a paid subscription did not open the screens they expected. The most recent one names the message on the screen. Whether this is one fault, three unrelated account states, or a mix of the two is not observable from outside the product, so this draft is the check rather than the conclusion.",
   "action": "Pull the subscription and entitlement state for these three accounts at the dates below, on both stores, and compare what the plan should grant against what the account was granted at that moment.",
   "evidence": [
    {
     "id": "ios-14396601628",
     "store": "App Store",
     "date": "2026-08-06",
     "when": "Aug 2026",
     "rating": 1,
     "version": "4.15",
     "source": "App Store, Aug 2026, v4.15",
     "quote": "I paid for a subscription and the app will not let me look up home listings! It says unauthorized no matter what I do",
     "field": "body"
    },
    {
     "id": "ios-13759363818",
     "store": "App Store",
     "date": "2026-02-17",
     "when": "Feb 2026",
     "rating": 1,
     "version": "4.6",
     "source": "App Store, Feb 2026, v4.6",
     "quote": "none of the premium features that i tried accessing, are becoming available after paying the monthly subscription cost.",
     "field": "body"
    },
    {
     "id": "play-b18de416-67b0-4ea1-a62a-33ed8fd1fce9",
     "store": "Google Play",
     "date": "2025-11-23",
     "when": "Nov 2025",
     "rating": 1,
     "version": "43.1",
     "source": "Google Play, Nov 2025, v43.1",
     "quote": "I paid for premium and 2 days later it says I need to pay for premium again.",
     "field": "body",
     "reply_quote": "We reviewed your account and followed up with you directly, and our team responded within hours to assist.",
     "reply_when": "2025-11-23",
     "reply_note": "The reply says the account was reviewed. It does not say what was found, so the report stays open here."
    }
   ],
   "artifact_evidence": [],
   "counter_evidence": [],
   "checks_to_test": [
    "Purchase made on one store, then signed in on the other with the same account.",
    "Entitlement resolved while the device is offline, then reconnecting.",
    "Renewal inside a billing-retry grace period, which both stores treat as still subscribed.",
    "A refund issued by the store, where access should drop and should not look like a failure.",
    "An account created with a store sign-in on one platform and with an email address on the other."
   ],
   "exit_criteria": [
    "The refusal is reproduced on a test account and the entitlement source that returned it is named.",
    "Or the three accounts are shown to have been inactive on those dates, which turns this into a question about the message rather than about access.",
    "Or the records are inconclusive, and the open question is recorded: which entitlement source was consulted at the moment the refusal was returned."
   ],
   "closes_or_changes": "Closes, or links to an existing ticket, if the three purchase records show the subscription inactive on the review dates, or if a known incident already covers this message on those dates.",
   "instrumentation": {
    "event": "entitlement_denied",
    "properties": [
     "store",
     "receipt_state",
     "entitlement_source",
     "screen",
     "minutes_since_purchase"
    ],
    "note": "Worth adding once the path is identified, so that the next occurrence is answerable without a review."
   },
   "order_reason": "First, because it is the only one of the four where money has already changed hands before anything goes wrong, and because the three accounts can be looked up today without shipping anything."
  },
  {
   "key": "RVD-2",
   "rank": 2,
   "status": "Investigation draft",
   "summary": "Confirm purchase channel and subscription state behind reports of billing after cancellation",
   "issuetype": "Task",
   "labels": [
    "subscription",
    "cancellation",
    "web"
   ],
   "context": "Three reviewers believed they had cancelled and describe being charged afterwards. One of them offers a mechanism, a retention offer that has to be actively declined before the cancellation completes. That is one person reading the behaviour from outside, so it is the first thing to test and not a finding.",
   "action": "For each report, establish where the subscription was bought and what state it was in at the time. Then walk the cancellation path once per channel and record where each one ends.",
   "evidence": [
    {
     "id": "ios-14298670449",
     "store": "App Store",
     "date": "2026-07-13",
     "when": "Jul 2026",
     "rating": 2,
     "version": "4.12",
     "source": "App Store, Jul 2026, v4.12",
     "quote": "I thought I had canceled, but apparently that wasn’t the case because I didn’t decline a pop-up offer for a reduced rate.",
     "field": "body"
    },
    {
     "id": "ios-13930650111",
     "store": "App Store",
     "date": "2026-04-06",
     "when": "Apr 2026",
     "rating": 1,
     "version": "4.9",
     "source": "App Store, Apr 2026, v4.9",
     "quote": "Impossible to cancel the subscription they keep charging",
     "field": "title"
    },
    {
     "id": "play-9b5ba212-36e4-44b5-be99-1f0ff8002c7d",
     "store": "Google Play",
     "date": "2025-12-05",
     "when": "Dec 2025",
     "rating": 1,
     "version": "43.2",
     "source": "Google Play, Dec 2025, v43.2",
     "quote": "not able to cancel",
     "field": "body"
    }
   ],
   "artifact_evidence": [
    {
     "file": "reventure_sitemap.xml",
     "label": "A cancellation route exists on the web app, which is where the walkthrough starts",
     "snippet": "https://map.reventure.app/cancel",
     "source": "https://map.reventure.app/sitemap-0.xml"
    }
   ],
   "counter_evidence": [],
   "checks_to_test": [
    "Leaving the retention screen by browser back, by closing the tab, and by the system back gesture.",
    "Cancelling on the web a subscription bought in a store, and the reverse.",
    "Cancelling twice, where the second attempt should be a no-op rather than an error.",
    "Accepting the retention offer, then cancelling again the same day.",
    "Cancelling while a payment retry is in flight."
   ],
   "exit_criteria": [
    "A path is found where the flow ends without the subscription cancelled, and it is written down step by step.",
    "Or every path cancels, and these reports trace to a store-side subscription that the web flow never governed.",
    "Or the accounts cannot be matched, and the open question is recorded: which channel each of these three purchases came through."
   ],
   "closes_or_changes": "Closes if every cancellation path completes when the retention offer is dismissed, and the three reports trace to a store-side subscription instead.",
   "instrumentation": {
    "event": "cancel_step",
    "properties": [
     "step (started, offer_shown, offer_declined, confirmed, abandoned)",
     "channel",
     "days_into_term"
    ],
    "note": "Only useful once the path is known, and then it answers this question without a review."
   },
   "order_reason": "Second, because it is the other one that touches a charge, and because the first step is reading three account records rather than changing anything."
  },
  {
   "key": "RVD-3",
   "rank": 3,
   "status": "Investigation draft",
   "summary": "Attempt to reproduce the Android startup freeze reported on 44.11",
   "issuetype": "Task",
   "labels": [
    "android",
    "stability",
    "qa"
   ],
   "context": "One Play review from August reports a freeze on 44.11, in a single word. Three older reports, from early 2025, describe the app closing shortly after launch, and a later reviewer writes that an update fixed that. Whether the August report is the same thing cannot be read from one word, which is what makes this a question rather than a defect.",
   "action": "Read the crash and ANR rate for 44.11 against the versions either side of it, then attempt a cold start on a low-memory device on that version.",
   "evidence": [
    {
     "id": "play-325ea777-61f0-4362-8add-674b11cb22a3",
     "store": "Google Play",
     "date": "2026-08-05",
     "when": "Aug 2026",
     "rating": 1,
     "version": "44.11",
     "source": "Google Play, Aug 2026, v44.11",
     "quote": "freezes",
     "field": "body",
     "reply_quote": "We'd love to help get this resolved.",
     "reply_when": "2026-08-05",
     "reply_note": "Answered the same day. The exchange left the store, so what came of it is not visible here."
    },
    {
     "id": "play-87efaad8-f554-458c-a6c7-cfe16e0e4adc",
     "store": "Google Play",
     "date": "2025-02-08",
     "when": "Feb 2025",
     "rating": 1,
     "version": "18.0",
     "source": "Google Play, Feb 2025, v18.0",
     "quote": "App launches then shortly closes (in approximately 4 secs). App is inoperable on Android for my experience.",
     "field": "body"
    },
    {
     "id": "play-54c04265-a690-4c5e-a9e8-108e5e448325",
     "store": "Google Play",
     "date": "2025-03-17",
     "when": "Mar 2025",
     "rating": 1,
     "version": null,
     "source": "Google Play, Mar 2025",
     "quote": "Doesn't work. Always crash",
     "field": "body"
    },
    {
     "id": "play-4226dc23-4ef1-4a82-88bc-8b55cb71c9a7",
     "store": "Google Play",
     "date": "2025-02-15",
     "when": "Feb 2025",
     "rating": 3,
     "version": null,
     "source": "Google Play, Feb 2025",
     "quote": "it continually glitches itself closed on my Droid phone",
     "field": "body"
    }
   ],
   "artifact_evidence": [],
   "counter_evidence": [
    {
     "id": "play-3ed92cb4-e828-41bb-93fb-e8a09661e1ce",
     "store": "Google Play",
     "date": "2025-06-20",
     "when": "Jun 2025",
     "rating": 4,
     "version": "36.5",
     "source": "Google Play, Jun 2025, v36.5",
     "quote": "New update fixed a previous issue on Android where it was repeatedly crashing when preparing and loading data during the app initiation.",
     "field": "body",
     "note": "A reviewer reporting a fix for the 2025 reports. It is why those three are listed as history rather than as open reports."
    }
   ],
   "checks_to_test": [
    "Cold start on a low-memory device on the reported version.",
    "First launch after install with no network.",
    "The data-loading path named by the 2025 reports, which is where the earlier reports sat.",
    "Rotating the device during initial load.",
    "A build installed from a staged rollout that was later halted."
   ],
   "exit_criteria": [
    "A reproduction on 44.11 with a trace attached.",
    "Or the console shows no elevated crash or ANR rate on that version, and the August report is left recorded as unexplained rather than closed.",
    "Or nothing reproduces, and the open question is written down: which device and Android version that report came from, which is the one thing the review does not carry."
   ],
   "closes_or_changes": "Links to the 2025 startup reports only if a trace matches them. A higher version number on its own does not close it: the version on a review is what the reporter had installed, not a record of what shipped.",
   "instrumentation": {
    "event": "crash-free sessions and ANR rate, per version and per API level",
    "properties": [
     "app_version",
     "api_level",
     "device_model"
    ],
    "note": "Already collected by the store console. The gap is that it is not what a report like this gets answered with."
   },
   "order_reason": "Third, because the first step costs one console query, and because the answer may well be that there is nothing there, which is worth knowing early."
  },
  {
   "key": "RVD-4",
   "rank": 4,
   "status": "Ready for engineering review",
   "summary": "Check how a store review is matched to an account before a public reply",
   "issuetype": "Task",
   "labels": [
    "support-tooling",
    "internal"
   ],
   "context": "Twenty of the seventy-eight Play reviews carry a public reply, so the answering is already being done. Two of those replies say the account could not be found from the name on the store, and the most recent one asks someone who has already described a problem to describe it again somewhere else. Nothing here says a reply was wrong. It says the person writing it had no handle on the account.",
   "action": "List the identifiers a store review actually exposes, compare them against what the account system can match on, and write down which of them, if any, closes the gap.",
   "evidence": [
    {
     "id": "play-9b5ba212-36e4-44b5-be99-1f0ff8002c7d",
     "store": "Google Play",
     "date": "2025-12-05",
     "when": "Dec 2025",
     "rating": null,
     "version": "43.2",
     "source": "Developer reply on Google Play, Dec 2025",
     "quote": "We couldn’t find an account under the username you entered",
     "field": "reply"
    },
    {
     "id": "play-d2504433-efaf-4207-a3d2-cf517f2ebeed",
     "store": "Google Play",
     "date": "2025-11-01",
     "when": "Nov 2025",
     "rating": null,
     "version": null,
     "source": "Developer reply on Google Play, Nov 2025",
     "quote": "We couldn’t locate an account under this username",
     "field": "reply"
    },
    {
     "id": "play-325ea777-61f0-4362-8add-674b11cb22a3",
     "store": "Google Play",
     "date": "2026-08-05",
     "when": "Aug 2026",
     "rating": null,
     "version": "44.11",
     "source": "Developer reply on Google Play, Aug 2026",
     "quote": "Please reach out to us at helpdesk@reventure.app so our team can investigate and assist.",
     "field": "reply"
    }
   ],
   "artifact_evidence": [],
   "counter_evidence": [],
   "checks_to_test": [
    "A reviewer who never created an account.",
    "A store display name that differs from the account name, which is the case these replies ran into.",
    "A review edited by its author after the reply: the sample contains one that was edited to say the issue had been fixed.",
    "The same person reviewing on both stores.",
    "A review with a rating and no text."
   ],
   "exit_criteria": [
    "A matching identifier is found, and what it can and cannot resolve is written down.",
    "Or no identifier exists, and the finding is that a public reply can only ever ask for an email address, which is worth knowing before anyone builds around it."
   ],
   "closes_or_changes": "Closes if recent low-rated reviews already reach the help desk with an account attached, which would make these two replies the exception rather than the pattern.",
   "instrumentation": {
    "event": "review_ticket_opened",
    "properties": [
     "store",
     "rating",
     "app_version",
     "match_method",
     "hours_review_to_reply"
    ],
    "note": "Suggested only if the step above finds something to match on."
   },
   "order_reason": "Last, because it changes nothing for a user today, and first among the ones that would make every later report easier to answer."
  }
 ],
 "product_feedback_outside_this_engineering_sample": [
  {
   "id": "ios-14456847128",
   "store": "App Store",
   "date": "2026-08-21",
   "when": "Aug 2026",
   "rating": 5,
   "version": "4.19",
   "source": "App Store, Aug 2026, v4.19",
   "quote": "ZIP level data helps, but more detailed stuff like community level would be better.",
   "ask": "Data below ZIP level, at neighbourhood or community granularity."
  },
  {
   "id": "ios-14384276802",
   "store": "App Store",
   "date": "2026-08-03",
   "when": "Aug 2026",
   "rating": 5,
   "version": "4.14",
   "source": "App Store, Aug 2026, v4.14",
   "quote": "I would like to see an inventory per capita metric or an inventory per household metric",
   "ask": "Inventory normalised per capita or per household, so fast-growing areas stay comparable."
  },
  {
   "id": "ios-14384276802",
   "store": "App Store",
   "date": "2026-08-03",
   "when": "Aug 2026",
   "rating": 5,
   "version": "4.14",
   "source": "App Store, Aug 2026, v4.14",
   "quote": "I would like to see the rent numbers be broken down more granularly",
   "ask": "Rent broken down by bedroom count and housing type."
  },
  {
   "id": "ios-13114234472",
   "store": "App Store",
   "date": "2025-09-08",
   "when": "Sep 2025",
   "rating": 5,
   "version": "3.6",
   "source": "App Store, Sep 2025, v3.6",
   "quote": "it would be fantastic to have exclusive, member-only video content",
   "ask": "Member-only video, distinct from the public channel."
  },
  {
   "id": "play-9eec9885-b5c6-464c-8efa-b3d439eda798",
   "store": "Google Play",
   "date": "2025-08-20",
   "when": "Aug 2025",
   "rating": 3,
   "version": "41.0",
   "source": "Google Play, Aug 2025, v41.0",
   "quote": "especially if they simplify their scoring approach",
   "ask": "A simpler scoring model, or a simple view over the current one."
  },
  {
   "id": "ios-14166602906",
   "store": "App Store",
   "date": "2026-06-10",
   "when": "Jun 2026",
   "rating": 1,
   "version": "4.12",
   "source": "App Store, Jun 2026, v4.12",
   "quote": "it doesn’t have a trial period",
   "ask": "A trial before subscribing."
  },
  {
   "id": "ios-13795888554",
   "store": "App Store",
   "date": "2026-02-27",
   "when": "Feb 2026",
   "rating": 3,
   "version": "4.6",
   "source": "App Store, Feb 2026, v4.6",
   "quote": "If there were a more generalized version at a lower cost I would buy it.",
   "ask": "A lighter option for people watching a market rather than buying in one."
  },
  {
   "id": "play-087419c2-20ce-45eb-a6bd-a17d5955e519",
   "store": "Google Play",
   "date": "2025-07-24",
   "when": "Jul 2025",
   "rating": 1,
   "version": "39.3",
   "source": "Google Play, Jul 2025, v39.3",
   "quote": "You have to login and pay in order to do anything.",
   "ask": "What a free account covers, said before the first paywall. Five reviewers reach this conclusion, and the team answers each of them with the same list of what is included, so the list exists. Where it belongs is a product decision rather than an engineering fault, which is why it is here and not in the drafts."
  },
  {
   "id": "ios-14249914782",
   "store": "App Store",
   "date": "2026-07-01",
   "when": "Jul 2026",
   "rating": 5,
   "version": "4.12",
   "source": "App Store, Jul 2026, v4.12",
   "quote": "more short in-app explainers on how to read certain scores for people without an investment background",
   "ask": "Explanations of the metrics where the metrics are read. A glossary route already exists inside the profile menu and several paying reviewers ask for this, but what to show and where is a product call."
  }
 ],
 "observations": [
  {
   "subject": "Blank-page recovery on the web app",
   "text": "The public page code includes a blank-page recovery mechanism. Its triggering and impact are not observable in this sample."
  },
  {
   "subject": "The shape of the sample",
   "text": "The reviews are mostly positive: of the 163 read across the two samples, 131 are five star. What follows is drawn from the smaller number that describe a problem, which is what a queue is made of and not a description of the product."
  }
 ],
 "how_the_drafts_were_made": [
  "Both stores were read in full, every review, rather than counted by keyword. Keyword totals were deliberately not used: they merge unrelated complaints, and they cannot tell a report from an opinion.",
  "A theme became a draft only where several distinct reviews describe the same thing. A single report stayed a single report, and where it was worth recording it went to the product list in the export instead.",
  "A developer reply was read alongside the review it answers. A reply can change how a report is read, by explaining a limit or naming a follow-up. None of them is treated as a resolution.",
  "Two reviews support two drafts each, for different reasons, and both are named below. Nothing is counted twice.",
  "No priority was assigned. The order is a suggestion with its reason attached, because what is already in flight is not visible from outside.",
  "The drafts were then read again, cold, against the full corpus and the developer replies, with the option to merge one, demote one, or drop one. What that pass changed is recorded in report.json."
 ],
 "controls": [
  "Every quote is verbatim from the raw corpus kept with the project, and the build fails if a quote is not found literally in it.",
  "Every count is recomputed from the raw files rather than written by hand, and the page, the CSV and the JSON are checked against each other.",
  "Reviewers are never named, and no reviewer name is read out of the source in the first place."
 ],
 "cold_reread_changes": [
  {
   "ticket": "Blank-page recovery",
   "change": "Dropped as a draft. Kept as an observation with no action attached.",
   "why": "It was written up from the recovery code in the public page source. Code shows that a mechanism exists; it says nothing about whether it fires, how often, or whether anyone is already watching it. Writing a ticket on that would have been inventing an incident."
  },
  {
   "ticket": "Free-account scope, metric definitions",
   "change": "Dropped as drafts. Moved to the product list in the export.",
   "why": "Both are about what should be shown and to whom, which is a product decision. Calling them engineering faults would have been prescribing a roadmap from the outside."
  },
  {
   "ticket": "All four remaining",
   "change": "Rewritten from proposed fixes into investigations.",
   "why": "The first pass wrote acceptance criteria, which presume the cause is known. From outside the product it is not. Each one now carries one action, cases to test, and the conditions that end the check, including the case where the honest outcome is a question rather than a finding."
  },
  {
   "ticket": "RVD-3",
   "change": "The iOS release note and an iOS edge case removed from an Android draft.",
   "why": "A detail from the other platform, kept because it was concrete. It did not belong, so it went."
  },
  {
   "ticket": "RVD-3",
   "change": "The three 2025 reports demoted from open reports to history.",
   "why": "A reviewer writes that an update fixed that behaviour. That is an established match between a symptom and a fix, reported by a user, which is the only thing that changes how an old report reads. A higher version number alone would not have."
  },
  {
   "ticket": "RVD-1",
   "change": "A quote shortened and one sentence of reasoning corrected.",
   "why": "The quote ran into a figure that has no business on this page. The sentence claimed this was the only draft touching a charge, which the cancellation draft also does."
  },
  {
   "ticket": "Counting",
   "change": "Keyword totals abandoned, and the corpus described as two named samples rather than one number.",
   "why": "A total across themes double-counts reviews that say two things, and it reads as a score. Naming the sample, its storefront and its window says what a count actually covers."
  }
 ],
 "reviews_supporting_two_drafts": [
  {
   "review": "play-9b5ba212-36e4-44b5-be99-1f0ff8002c7d",
   "on": [
    "RVD-2 (body)",
    "RVD-4 (reply)"
   ],
   "source": "Google Play, Dec 2025, v43.2"
  },
  {
   "review": "play-325ea777-61f0-4362-8add-674b11cb22a3",
   "on": [
    "RVD-3 (body)",
    "RVD-4 (reply)"
   ],
   "source": "Google Play, Aug 2026, v44.11"
  }
 ],
 "not_observable": [
  "Everything behind the sign-in wall: the map, the reports, the listing analyser and the cancellation screens. Every draft here is written from the outside, from what people described.",
  "Crash and ANR rates, which live in the two store consoles. That is why the Android draft starts with a console query rather than with a hypothesis.",
  "The help desk. The twenty public replies are all that is visible of it.",
  "Whether a report was already handled, already has a ticket, or was fixed in a release. A version number on a review is what the reporter had installed, not a record of what shipped."
 ],
 "limits": [
  "Store reviews are a biased sample: people write after a delight or a failure, rarely in between. Nothing here measures how often something happens, only that it was written down and when.",
  "The App Store sample is the United States storefront. Other storefronts hold almost nothing, so anything specific to another country is invisible here.",
  "A review can belong to more than one theme. The samples are never added into a score, and where one review supports two drafts it is named below.",
  "Everything here was collected on 13 September 2026. Reviews posted since are not in it.",
  "These are drafts prepared from public text. None of them has been reproduced in the app."
 ]
}
