| D1 |
Coupons |
Coupons page shows "Error loading coupons - Request failed with status code 401" with Retry button |
NOT FIXED Backend |
Screenshot
Page displays red "Error loading coupons" text with 401 status. The Coupons API endpoint requires auth that isn't provided.
Ensure the coupons API endpoint accepts the same auth mechanism as other /api/retool/* endpoints. Check if it uses a different route prefix.
|
| D2 |
Events |
Events page shows "Error loading events - Request failed with status code 401" with Retry button |
NOT FIXED Backend |
Screenshot
Same 401 pattern as Coupons. Admin routes (/api/admin/*) are not accepting auth tokens.
Backend admin middleware needs to accept the same JWT/session auth as retool routes.
|
| D3 |
User Profiles |
User Profiles page renders completely blank — no content, no error message, just empty white page |
NOT FIXED Backend |
Unlike Events/Coupons which show error messages, User Profiles silently fails with no feedback. Worse UX than showing an error.
Add error handling with a visible error state. If the API fails, show "Error loading user profiles" instead of a blank page.
|
| D4 |
Sidebar |
Collapsed sidebar nav icons have NO tooltips — all 6 navigation items show blank text on hover |
NOT FIXED UI |
Screenshot
When sidebar is collapsed, tested all nav links — none have title, aria-label, or tooltip. Users cannot tell what each icon means.
Add title attribute or a Radix Tooltip to each nav link when sidebar is collapsed: "Dashboard", "Customers", "Licenses", "Quotes", "Invoices", "Admin".
|
| D5 |
Customer Form |
Only "Email" has a red asterisk — no other required fields (Company, Country) are marked as required |
NOT FIXED UI |
Screenshot
Tested: only 1 red asterisk found (on Email label, rgb(239,68,68)). Company, Country, Category are all visually optional even though they may be required by the API.
Add <span className="text-red-500">*</span> to all required field labels in CustomerForm.tsx.
|
| D6 |
Customer Form |
Placeholder values masquerade as real data: "John", "Doe", "Acme Inc.", "US", "EU123456789", "0" |
NOT FIXED UI |
Screenshot
Deep test confirmed: First Name placeholder="John", Last Name placeholder="Doe", Company placeholder="Acme Inc.", Country placeholder="US", VAT placeholder="EU123456789". These are placeholder attributes, not values, but they render as gray text inside the inputs — making it look like the form is pre-filled with "John Doe from Acme Inc."
Change placeholders to instructions: "Enter first name", "Enter last name", "Enter company name", "Select country", "e.g. EU123456789".
|
| D7 |
All lists |
Filter bar heights inconsistent across all pages: Customers [32px, 28px], Quotes [32px, 28px, 16px], Licenses [32px, 28px, 16px] |
NOT FIXED UI |
Screenshot (Quotes) | Screenshot (Customers)
Measured every filter element on each page. Three distinct height classes used inconsistently. Quotes and Licenses pages have 16px elements (likely hidden selects).
Standardize all filter bar elements to h-9 (36px). Apply to Input, Select, Button, CustomerSelector uniformly across Customers.tsx, Quotes.tsx, Licenses.tsx, Invoices.tsx.
|
| D8 |
Invoices |
Invoices empty state says "Search or Select Customer" while Quotes/Licenses say "No Customer Selected" — 3 different patterns |
NOT FIXED UI |
Screenshot (Invoices) | Screenshot (Licenses)
Tested all 4 list pages:
• Customers: "No customers found"
• Quotes: "No Customer Selected / Select a customer to view their quotes"
• Licenses: "No Customer Selected / Select a customer to view their licenses"
• Invoices: "Search or Select Customer / Search for an invoice ID or select a customer / Use the customer search above to get started"
Use a single shared EmptyState component for all list pages. If customer selection is required, use: "Select a customer to view [resource]". Better yet: show all records by default (see N2).
|
| D9 |
Coupons |
Coupons filter bar has different design pattern: Search input spans full width, "Apply" button instead of auto-filter |
NOT FIXED UI |
Screenshot
Coupons page has a wide Search input + Status dropdown + Apply + Clear buttons. Other list pages use auto-filtering without an Apply button and have narrower inputs.
Align Coupons filter bar with other pages: use auto-filtering on change, consistent input widths, remove the "Apply" button, add a filter label above each input.
|
| D10 |
Quote Maker |
Clicking quote type (New/Renewal/Upsell) does not navigate to step 2 — page stays on selector |
NOT FIXED Backend |
Screenshot
Clicking "New Quote", "Renewal", or "Upsell" does not advance the wizard. The page remains on the type selector. Likely blocked by API auth — the wizard needs to fetch products/plans before showing step 2.
The wizard should show a loading state and graceful error if the products API fails, not silently stay on step 1. Add error toast: "Could not load products. Please check your connection."
|
| D11 |
Reports |
Reports page loads with all €0 values and "No data for selected period" — no indication of auth issue |
NOT FIXED UI |
Screenshot
All 8 summary cards show €0. The sub-table shows "No data for selected period". Unlike Coupons/Events which show a clear error, Reports silently returns zeros, making it unclear if the data is genuinely empty or if auth failed.
Distinguish between "no data" and "API error". Show a warning banner when API returns 401 or error. "Could not load report data — check your permissions."
|
| D12 |
Events (blank) |
Events page (/events) renders completely blank — different from Admin Events which shows error |
NOT FIXED UI |
Screenshot
Navigating to /events (vs /admin/events) renders a completely blank white page with no sidebar, no content, no error. This is likely a routing issue — the /events route may not exist or is an unhandled catch-all.
Add a 404/redirect for unknown routes. Or ensure /events redirects to /admin/events.
|