diff --git a/web/src/routes/console/billing/+page.svelte b/web/src/routes/console/billing/+page.svelte
index 5130976a..5e8d40d5 100644
--- a/web/src/routes/console/billing/+page.svelte
+++ b/web/src/routes/console/billing/+page.svelte
@@ -1,7 +1,8 @@
@@ -43,6 +142,22 @@
Billing
+ {#if upgradeStatus === 'checking'}
+
+
+ Confirming your upgrade…
+
+ {:else if upgradeStatus === 'confirmed' && isPro}
+
+ ✓
+ Upgrade confirmed — welcome to Pro!
+
+ {:else if upgradeStatus === 'timeout'}
+
+
Your payment went through but we haven't confirmed your upgrade yet. Try refreshing in a moment; if your plan still shows Free, contact support@getpad.dev.
+
+ {/if}
+
Current Plan
@@ -232,4 +347,73 @@
font-size: 0.85rem;
font-weight: 500;
}
+
+ .upgrade-banner {
+ display: flex;
+ align-items: center;
+ gap: var(--space-3);
+ padding: var(--space-3) var(--space-4);
+ border-radius: var(--radius);
+ font-size: 0.9rem;
+ line-height: 1.4;
+ border: 1px solid transparent;
+ }
+
+ .upgrade-banner.checking {
+ background: color-mix(in srgb, var(--accent-blue) 10%, transparent);
+ border-color: color-mix(in srgb, var(--accent-blue) 30%, transparent);
+ color: var(--text-primary);
+ }
+
+ .upgrade-banner.success {
+ background: color-mix(in srgb, var(--accent-green) 12%, transparent);
+ border-color: color-mix(in srgb, var(--accent-green) 35%, transparent);
+ color: var(--text-primary);
+ }
+
+ .upgrade-banner.warning {
+ background: color-mix(in srgb, var(--accent-yellow, #eab308) 12%, transparent);
+ border-color: color-mix(in srgb, var(--accent-yellow, #eab308) 35%, transparent);
+ color: var(--text-primary);
+ }
+
+ .upgrade-banner a {
+ color: var(--accent-blue);
+ text-decoration: underline;
+ }
+
+ .spinner {
+ width: 14px;
+ height: 14px;
+ border: 2px solid color-mix(in srgb, var(--accent-blue) 30%, transparent);
+ border-top-color: var(--accent-blue);
+ border-radius: 50%;
+ animation: spin 0.8s linear infinite;
+ flex-shrink: 0;
+ }
+
+ .check-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background: var(--accent-green);
+ color: #fff;
+ font-size: 0.7rem;
+ font-weight: 700;
+ flex-shrink: 0;
+ }
+
+ @keyframes spin {
+ to { transform: rotate(360deg); }
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ .spinner {
+ animation: none;
+ border-top-color: transparent;
+ }
+ }