Product Analytics · Business Analysis

E-Commerce Product Analytics

Conversion funnel, retention, and revenue-driver analysis that turns customer friction into testable action.

Role Product Analyst · Data Analyst
Tools PostgreSQL · Python · Power BI
Scale 4.3M sessions
Purchase 157K sessions
Opportunity 310,249 high-intent losses

My approach

Model the journey at session grain

I transformed raw events into governed session, funnel, cohort, and customer-behaviour marts.

Separate association from causation

I used statistical tests and power checks without treating historical behaviour as proven uplift.

Convert opportunity into experiments

I specified five tests with hypotheses, primary metrics, guardrails, and decision rules.

Customer journey

Find where intent stops.

The analysis separates browsing, high intent, and purchase behaviour.

Key insights

Insight must lead to action.

Observational evidence supports a test. It does not prove a causal effect.

01

310K high-intent sessions did not convert.

Users added several products but did not purchase. Test: checkout reassurance.

02

147K high-exploration sessions did not convert.

Users explored many products but did not purchase. Test: product recommendation support.

03

£50+ products had the lowest view-to-cart rate.

The main friction appeared before the cart. Test: trust and delivery information.

Decision evidence

How does analysis become a test?

The views progress from behaviour to action and then to a measurable experiment.

01 · Behaviour

Which behaviours signal purchase intent?

Why this visual exists. Conversion is compared across cart, view, exploration, removal, and session-duration bands.

Customer behaviour dashboard comparing conversion by cart count, view count, product exploration, removals, and session duration.
Finding

Conversion reaches 24.3% for sessions with 11 or more cart events and 19.4% for 11 or more product explorations.

Interpretation

High activity identifies intent. It does not prove that increasing activity will cause conversion.

Decision

Use high-intent and high-exploration segments to define test audiences.

02 · Recommendation

Which actions match the friction?

Why this visual exists. Each analytical pattern is translated into a specific commercial action area.

Business recommendations dashboard for cart abandonment, product discovery, brands, and early retention.
Finding

The analysis points to checkout friction, product discovery, brand concentration, and early retention as distinct opportunities.

Interpretation

A recommendation remains a hypothesis until a controlled test measures uplift and guardrails.

Decision

Convert each action area into a test with one primary metric and explicit risk checks.

03 · Experiment plan

Which test should run first?

Why this visual exists. Opportunity size, expected uplift, revenue range, sample need, and decision rules are shown together.

Experiment opportunities dashboard with prioritised tests, target segments, expected uplift, revenue impact, sample size, and decision rules.
Finding

The roadmap contains five tests. High-price trust signals have the highest directional revenue potential at about £103K, but require the largest sample.

Interpretation

Potential value alone does not determine priority. Feasibility, sample size, and guardrails change the order.

Decision

Start with a feasible segment, then roll out only when conversion improves and the stated guardrail remains stable.

Source: original Power BI screenshots from the project repository. This is a personal portfolio project; revenue figures are estimates, not actual business revenue.

Related concepts

Explore how the analysis becomes a test.

Implementation proof · SQL

Turn behavioural intent into a test audience.

The query isolates non-buyers with meaningful cart activity and removes extreme sessions before the segment is used for test design.

CREATE TABLE high_intent_lost_sessions AS
SELECT user_session, user_id, session_duration_minutes,
       cart_count, unique_products_interacted,
       cart_abandoned_flag
FROM session_journey
WHERE converted_flag = 0
  AND cart_count BETWEEN 3 AND 20
  AND session_duration_minutes BETWEEN 1 AND 180;