Privacy and analytics
What GrowingHQ measures, what it refuses to measure, and why.
Current state of this build
Google Analytics is configured as a destination. Nothing is loaded and nothing is sent until you agree: decline, and the Google tag is never requested at all. If you agree, only the events listed below are sent, and only the fields shown. GrowingHQ loads no external font and no remote image, and the analytics tag is the only third-party script it will ever load.
Your choice
Analytics is currently not yet chosen.
Turning it off stops further events immediately and tells Google to deny analytics storage. A tag already loaded in this tab cannot be unloaded until you reload the page.
What would be measured, with consent
The complete list. Every event exists to answer a question that would change an editorial decision — an event that cannot state one does not belong in the catalogue.
| Event | The question it answers | What it carries |
|---|---|---|
| page_viewed | Which parts of the catalogue are read, and are the indexable ones the read ones? | pageFamily, indexable, entityId |
| entity_viewed | Which plants and problems attract the most interest, and which are never opened? | entityId, kind |
| internal_search | Does search resolve what people ask it? | resultBand, resultCount, queryLength |
| search_returned_nothing | What is GrowingHQ being asked for that it cannot answer at all? | queryLength, wordCount |
| grow_query_run | Is the What Can I Grow engine answering usefully, and how often does it have to admit the data is thin? | criteriaCount, resultBand, rejectedCount, weakDataShown |
| grow_query_empty | Which conditions can GrowingHQ not yet suggest anything for? | criteriaCount, narrowestCriterion |
| system_filtered | Which growing methods do readers actually filter by? This is what should decide which systems get populated next. | methodSlug, resultBand |
| evidence_opened | Does anybody open the evidence? The transparency argument depends on the answer. | disclosure, pageFamily |
| source_opened | Which authorities do readers go and check for themselves? | sourceSlug, pageFamily |
| share_performed | Which pages are worth passing on? Nothing about who they were passed to. | method, pageFamily |
| diagnosis_started | Which symptoms bring people to the diagnostic tool at all? | symptomId, hasPlant |
| diagnosis_completed | Does the tool reach a usable answer, and when it declines, which symptom and how much was described? | symptomId, outcome, observationsGiven, candidates |
| selector_dimension_used | Which What Can I Grow filters do people actually use? A dimension nobody touches should be reconsidered rather than kept for completeness. | dimension |
| selector_result_opened | Do people open results from the top of the list, or scroll past the ranking? A low position bias suggests the ranking is not helping. | entityId, position |
| consent_granted | Is the banner or the settings page where people actually decide? | surface, policyVersion |
No event can carry free text, and none can be made to. Every field is an enum, a bounded integer, a boolean or a catalogue slug — those are the only field kinds the schema offers, so what you type into the search box has nowhere to go.
Considered and deliberately not implemented
Kept in the source code as well as on this page, so that the next person who thinks “we should track scroll depth” finds the reason before they write it.
| Not collected | Why not |
|---|---|
| search_query_text | A raw gardening search can contain a location, a plot number, a neighbour or a photograph description. There is no field shaped to hold one and there will not be. Length band and word count answer the same editorial question. |
| grow_query_values | The reader's own conditions — their light, their soil, their container size — describe their home. GrowingHQ needs to know WHICH criterion is failing, not what they typed into it. |
| scroll_depth | Would not change an editorial decision. Reading position is not comprehension, and plant profiles are deliberately long reference documents read by jumping to a section. |
| time_on_page | Rewards the wrong outcome. A reader who identifies blossom end rot in nine seconds is the success case, not the failure case. |
| postcode_or_region_entered | Region selection is genuinely useful to the product and genuinely identifying at fine resolution. Until there is a coarse enough banding to be safe, it is not collected. |
| consent_denied | Cannot be transmitted by a system that respects the refusal it describes. The denominator comes from page_viewed instead. |
| user_id | GrowingHQ has no accounts and will not recognise a returning reader. |
Commercial content
GrowingHQ carries no advertising and embeds no ad network. When commercial content is introduced it will come through the HEKNO platform rather than a direct network relationship, and the placement policy is already written into the code: no commercial content on any page carrying a critical safety warning, and none at all on 10 page families including every diagnostic page and every page about how GrowingHQ works.
The reason for the diagnostic exclusion is specific. A product placement beside a list of possible causes turns a diagnostic tool into a sales funnel, and a reader can no longer tell which of the two they are reading.