diff --git a/app/frontend/components/user_payments.py b/app/frontend/components/user_payments.py
index a3506aee368f40f9e6ebc2add90b21925ecf14ea..0573ad380b4ac90729b5a79b3d018932fdb7d432 100644
--- a/app/frontend/components/user_payments.py
+++ b/app/frontend/components/user_payments.py
@@ -220,7 +220,9 @@ def user_payments_frame(parent, switch_func, API_URL, token):
 
         # Format card number with spaces
         raw_number = payment['card_number']
-        formatted_number = ' '.join([raw_number[i:i+4] for i in range(0, len(raw_number), 4)])
+        # Mask first 12 digits and show last 4
+        masked_number = '**** **** **** ' + raw_number[-4:] if len(raw_number) >= 4 else raw_number
+        formatted_number = masked_number
 
         # Card number
         card_number = ctk.CTkLabel(
@@ -644,10 +646,9 @@ def user_payments_frame(parent, switch_func, API_URL, token):
         # Update card number
         card_num = card_entry.get().strip()
         if card_num:
-            # Format card number with spaces
-            formatted_num = ' '.join([card_num[i:i+4] if i+4 <= len(card_num) else '*'*(4-(len(card_num)-i)) 
-                                    for i in range(0, 16, 4)])
-            card_number_preview.configure(text=formatted_num)
+            # Format card number with spaces and mask first 12 digits
+            masked_num = '**** **** **** ' + card_num[-4:] if len(card_num) >= 4 else card_num
+            card_number_preview.configure(text=masked_num)
         else:
             card_number_preview.configure(text="**** **** **** ****")