Marketing Analytics πŸ”¬ Analyst + πŸ— Architect β—† Independent Project ⚠ Simulated Data
TicketPush β€”
End-to-End
Marketing Analytics
Most marketing teams run attribution, funnel, LTV, and promo ROI as four separate reports that never talk to each other β€” TicketPush builds the schema, data, and dashboard to answer all four from a single source of truth.
MySQL Python Power BI Marketing Attribution Customer Journey Promo Code ROI Funnel Analytics LTV Modeling
The Problem

Marketing data that
never connects.

Mobile-first ticketing platforms generate data across every touchpoint β€” ad impressions, session behavior, promo code redemptions, purchases, and post-sale activity. Each system captures a piece of the customer story. None of them complete it.

Marketing teams end up with attribution reports that don't account for promo impact, funnel reports disconnected from LTV, and campaign ROI calculations that can't be compared channel-to-channel because the underlying data was never modeled relationally.

The result is that decisions about where to spend the next marketing dollar get made with incomplete signal β€” often optimizing for volume metrics when the actual margin story looks completely different.

TicketPush simulates that environment end to end β€” schema designed from scratch, realistic data generated via Python, and a four-page Power BI dashboard built to answer the specific questions a growth or revenue team actually asks.

Gap 01 Β· Disconnected Attribution
First-touch and last-touch attribution lived in separate tools with no way to compare them against the same campaign spend or promo code usage.
Gap 02 Β· Funnel Without Context
Session-to-conversion funnel metrics existed but weren't tied to channel, campaign, or customer tier β€” making them descriptive but not diagnostic.
Gap 03 Β· Promo Code Blindspot
Promo codes drove revenue but with no relational model, there was no way to calculate their true margin impact or compare them to non-promotional acquisition cost.
Gap 04 Β· No LTV Architecture
Customer lifetime value and repeat purchase risk lived in spreadsheets β€” no model to feed into campaign targeting or cohort comparison.
My Role

Schema to dashboard

πŸ—
What I Built
  • Engineered the relational MySQL schema from scratch β€” eight tables, fully normalized, with realistic foreign key relationships across users, sessions, orders, campaigns, and promo codes
  • Simulated all source data with Python β€” realistic user behavior, multi-channel campaign exposure, promo redemption patterns, and purchase timing distributions
  • Built both first-touch and last-touch attribution models β€” implemented as SQL logic and surfaced comparably in the same dashboard view
  • Created the Customer Journey Summary table β€” a consolidation layer capturing each user's full lifecycle: acquisition path, funnel stage, time-to-purchase, and repeat risk score
  • Designed the four-page Power BI dashboard β€” each page answering a distinct analytical question with shared filters and consistent KPI definitions
πŸ“‹
Scope & Constraints
  • All data is simulated β€” designed to behave like a real mobile ticketing platform; not a client engagement or production dataset
  • Single-developer build β€” schema design, data engineering, attribution logic, and visualization all by the same person
  • Power BI chosen deliberately β€” industry-standard for marketing analytics reporting; demonstrates the ability to take SQL output and translate it into executive-ready dashboards
  • MySQL over a cloud warehouse β€” intentional for the simulation context; same schema logic transfers directly to BigQuery or Redshift
  • Repeat risk model is behavioral β€” based on purchase recency and frequency patterns, not a trained ML classifier; noted as a v2 upgrade path
The Approach

From blank schema
to actionable insight

Five stages β€” each one producing an artifact that the next stage depends on.

01
Schema Design
Designed an 8-table relational MySQL schema covering the full customer lifecycle β€” users to sessions to orders to campaigns.
02
Data Simulation
Generated realistic mock data with Python β€” behavioral distributions, multi-channel exposure, promo redemption rates, and purchase timing.
03
Attribution Logic
Built first-touch and last-touch attribution in SQL. Linked campaign spend to revenue and calculated channel-level ROAS.
04
Journey Summary
Consolidated each user's lifecycle into a single Customer Journey Summary table β€” funnel stage, LTV, repeat risk, and acquisition path.
05
Dashboard Build
Built a four-page Power BI dashboard with consistent KPI definitions, shared filters, and one analytical question per page.
The Stack

Tools & schema

Four tools, eight tables β€” and a relational schema diagram showing how the data model connects.

MySQL
Relational schema design, attribution logic, journey summary queries
Python
Full dataset simulation β€” user behavior, campaigns, sessions, purchases
Power BI
4-page executive dashboard β€” attribution, funnel, LTV, advanced analytics
πŸ“‘
Excel
Campaign cost inputs, promo code validation, QA reference tables
Relational Database Schema
MySQL Β· 8 Tables Β· Full customer lifecycle
TicketPush v1
CORE TRANSACTION LAYER CAMPAIGN LAYER DERIVED / SUMMARY LAYER users πŸ”‘ user_id name, email signup_date acquisition_channel city, age, gender loyalty_tier CORE Β· ANCHOR TABLE sessions πŸ”‘ session_id πŸ”— user_id channel, start_time pages_viewed converted, device referrer_url FUNNEL TRACKING orders πŸ”‘ order_id πŸ”— user_id, promo_id order_date, total discount_applied payment_method channel_source TRANSACTION FACTS order_items πŸ”— order_id ticket_type, qty, price promo_codes πŸ”‘ promo_id code, discount_pct campaign_id, valid_from valid_to, usage_limit times_used PROMO ROI LAYER marketing_campaigns πŸ”‘ campaign_id name, channel start_date, end_date budget, spend impressions, clicks ATTRIBUTION SOURCE campaign_events πŸ”— user_id πŸ”— campaign_id event_type, event_date channel, touch_order ATTRIBUTION BRIDGE customer_journey_summary πŸ”— user_id first_session_date last_session_date first_order_date days_to_first_purchase channel_attribution acquisition_path funnel_stage lifetime_value repeat_risk_score DERIVED Β· CONSOLIDATES ALL SOURCES β†’ DASHBOARD-READY πŸ”‘ Primary Key πŸ”— Foreign Key β€”β€” Direct FK - - Indirect join - - Feeds summary table
The Output

Four pages. One source of truth.

A Power BI dashboard built around four distinct analytical questions β€” each page answers one and connects to the others through shared filters and consistent KPI definitions.

Marketing Performance Dashboard
Page 01
Marketing Performance
Revenue, Orders, CAC, ROAS by channel
Attribution & ROI Dashboard
Page 02
Attribution & ROI
First-touch vs last-touch Β· Promo code impact
Screenshot Not Available
Page 03
Customer Funnel & LTV
Session β†’ conversion Β· LTV segmentation
Screenshot Not Available
Page 04
Advanced Analytics
Journey summary Β· Repeat risk Β· Cohorts

Pages 03 and 04 screenshots pending upload β€” placeholders shown above

Results

The stat sheet

8 tables
Relational Schema
Fully normalized MySQL schema covering the complete customer lifecycle β€” users, sessions, orders, campaigns, and promo codes.
4 pages
Power BI Dashboard
Marketing Performance, Attribution & ROI, Customer Funnel & LTV, and Advanced Analytics β€” one question per page.
2Γ—
Attribution Models
First-touch and last-touch attribution built in SQL and surfaced comparably in the same dashboard β€” against the same campaign spend.
1 CJS
Customer Journey Summary
Single consolidated table per user β€” acquisition path, funnel stage, LTV, time-to-purchase, and repeat risk score in one row.
Analyst Lens

Key decisions & tradeoffs

The modeling choices that shaped the output β€” and what each one cost.

Decision Rationale Tradeoff
Both attribution models, same view First-touch and last-touch tell different stories about the same campaign spend. Showing them side-by-side in the same dashboard lets analysts see where they diverge β€” and where that divergence changes the channel investment decision. More complex DAX β€” maintaining two attribution paths in the same Power BI model required careful measure isolation to prevent filter context bleed between models.
Customer Journey Summary as a pre-built table Consolidating lifecycle metrics into a single per-user table makes every downstream query simpler. Without it, the LTV and funnel calculations would require multi-join logic on every dashboard page β€” adding latency and maintenance risk. Refresh dependency β€” the summary table must be rebuilt whenever source data changes. Acceptable for a simulation; in production this becomes a scheduled pipeline job.
MySQL over a cloud warehouse The relational schema logic is identical whether run in MySQL, BigQuery, or Redshift. MySQL was chosen for local development speed and to demonstrate that the analytical design is tool-agnostic β€” the queries transfer directly. Fully portable β€” every SQL file in this project runs on BigQuery or Redshift with minimal syntax changes, making it a genuine production blueprint.
Behavioral repeat risk, not ML classifier A rule-based repeat risk score (recency Γ— frequency) is transparent and explainable. A trained classifier would produce better predictions but would require ground truth labels that don't exist in a simulated dataset. Lower predictive accuracy β€” acknowledged as a v2 upgrade path once the dataset has real behavioral history to train against.
Python simulation over static seed data Generating data programmatically means the dataset can be scaled, varied, or re-seeded to test edge cases. It also demonstrates the ability to model realistic behavioral distributions β€” not just assign random values. Reproducible and scalable β€” the simulation can generate 1,000 users or 100,000 users with a single parameter change, making it a proper load-testing environment.
Gallery

Screenshot gallery

Dashboard views, SQL logic, and Python simulation β€” click any screenshot to expand.

Γ—