An end-to-end BI project that transforms raw credit card and customer transaction data into an interactive Power BI dashboard, revealing weekly revenue trends, customer demographics, and card performance across a full fiscal year (2023).
The pipeline covers the complete analytics workflow: PostgreSQL (data warehousing) → SQL (ETL/joins) → Power BI (DAX + visualization).
Credit card issuers need a single view of how revenue, transaction activity, and delinquency evolve week over week, and how they vary across customer segments. This project consolidates two raw datasets—card-level transactions and customer demographics—into a PostgreSQL database, models the relationship in Power BI, and builds a set of DAX measures to power a weekly financial performance dashboard.
Business questions answered:
- How is weekly revenue trending, and what changed week-over-week?
- Which card categories, states, and expenditure types drive the most transaction volume?
- How do age, income, and gender segments differ in revenue contribution and credit utilization?
- What is the customer activation rate within 30 days, and what is the delinquency rate?
Two related tables, joined on Client_Num, covering 10,293 unique customers across 53 weeks of 2023 (including a supplementary Week-53 data load).
| Table | Description | Key Fields |
|---|---|---|
cc_detail |
Weekly card & transaction activity | Card_Category, Credit_Limit, Total_Revolving_Bal, Total_Trans_Amt, Total_Trans_Ct, Avg_Utilization_Ratio, Interest_Earned, Delinquent_Acc |
cust_detail |
Customer demographics & profile | Customer_Age, Gender, Income, Education_Level, Marital_Status, State, Car/House Owner, Cust_Satisfaction_Score |
Source files:
credit_card.csv/cc_add.csv(Week-53 top-up)customer.csv/cust_add.csv(Week-53 top-up)
CSV files (raw exports)
│
▼
PostgreSQL (ccdb database)
├─ CREATE TABLE cc_detail
├─ CREATE TABLE cust_detail
└─ COPY ... FROM CSV (bulk load, including Week-53 incremental load)
│
▼
Power BI (PostgreSQL connector)
├─ Data modeling (relationship on Client_Num)
├─ DAX calculated columns & measures
└─ Interactive report pages
The full SQL used to provision the database, create both tables, and load all four CSVs (including the mid-project Week-53 incremental refresh) is in SQL Query - Financial Dashboard Data.sql.
A few of the key calculated columns and measures built for this report:
AgeGroup = SWITCH(
TRUE(),
'cust_detail'[customer_age] < 30, "20-30",
'cust_detail'[customer_age] >= 30 && 'cust_detail'[customer_age] < 40, "30-40",
'cust_detail'[customer_age] >= 40 && 'cust_detail'[customer_age] < 50, "40-50",
'cust_detail'[customer_age] >= 50 && 'cust_detail'[customer_age] < 60, "50-60",
'cust_detail'[customer_age] >= 60, "60+",
"unknown"
)
IncomeGroup = SWITCH(
TRUE(),
'cust_detail'[income] < 35000, "Low",
'cust_detail'[income] >= 35000 && 'cust_detail'[income] < 70000, "Med",
'cust_detail'[income] >= 70000, "High",
"unknown"
)
Revenue = 'cc_detail'[annual_fees] + 'cc_detail'[total_trans_amt] + 'cc_detail'[interest_earned]
Current_week_Revenue = CALCULATE(
SUM('cc_detail'[Revenue]),
FILTER(ALL('cc_detail'), 'cc_detail'[week_num2] = MAX('cc_detail'[week_num2]))
)
Previous_week_Revenue = CALCULATE(
SUM('cc_detail'[Revenue]),
FILTER(ALL('cc_detail'), 'cc_detail'[week_num2] = MAX('cc_detail'[week_num2]) - 1)
)
Current_week_Revenue and Previous_week_Revenue power the week-over-week (WoW) revenue growth KPI on the dashboard.
| Metric | Value |
|---|---|
| Overall Revenue | $56.5M |
| Total Interest Earned | $8.0M |
| Total Transaction Amount | $45.5M |
| Revenue by Gender | Male $30.9M · Female $25.6M |
| Top Card Categories | Blue & Silver ≈ 97% of all cards issued |
| Top 3 States by Revenue | TX, NY, CA (≈ 38% combined) |
| Customer Activation Rate (30-day) | 57.5% |
| Overall Delinquency Rate | 6.1% |
| Avg. Credit Utilization Ratio | 27.5% |
| Most Common Transaction Method | Swipe (70%), Chip (24%), Online (6%) |
| Top Expense Category | Bills (29%), followed by Entertainment (20%) & Fuel (17%) |
| Week-53 WoW Revenue Change | +28.8% |
The Power BI report includes:
- Weekly financial summary — revenue, transaction amount/count, and WoW % change trends
- Customer segmentation — breakdowns by age group, income group, gender, education, and marital status
- Card performance — revenue and utilization by card category (Blue/Silver/Gold/Platinum)
- Geographic view — revenue and transaction volume by state
- Risk indicators — activation rate and delinquent account rate
- Drill-through and slicer-based filtering by quarter, card category, and expenditure type
- Database: PostgreSQL
- ETL: SQL (
CREATE TABLE,COPY ... CSV) - BI / Visualization: Power BI Desktop, DAX
- Data Source Format: CSV
- Set up PostgreSQL:
CREATE DATABASE ccdb;
- Create the tables and load the data using the provided script:
SQL Query - Financial Dashboard Data.sql- Update the file paths in each
COPYstatement to point to your local CSV files. - If you hit a
date/time field value out of rangeerror, runSET datestyle TO 'ISO, DMY';before theCOPYcommands.
- Update the file paths in each
- Connect Power BI to PostgreSQL:
- Open
Credit_Card_Financial_Dashboard.pbix - Go to Home → Transform Data → Data Source Settings and point the PostgreSQL connector to your local
ccdbdatabase.
- Open
- Refresh the model to load
cc_detailandcust_detail, then explore the report pages.
├── Credit_Card_Financial_Dashboard.pbix # Power BI report
├── SQL Query - Financial Dashboard Data.sql # DB setup + ETL script
├── credit_card.csv
├── cc_add.csv # Week-53 incremental load
├── customer.csv
├── cust_add.csv # Week-53 incremental load
├── dashboard-transaction-report (1).png
├── dashboard-customer-report (1).png
└── README.md
Ashmit Srivastava 📧 ashmitsrivastava0208@gmail.com 🔗 LinkedIn · GitHub

