Robbin Schuchmann
Robbin Schuchmann
June 4, 2025

How to Build an Admin Dashboard with AI - Day 13 of Learning in Public

So here's the thing about building with AI - sometimes you spend half your day fixing problems you accidentally created while trying to solve other problems. Day 13 of my 60-day challenge was basically me wrestling with my admin dashboard, getting excited when things worked, and then watching it all fall apart again.

Quick summary

I'm building a travel directory for Bali (think curated stays, restaurants, beach clubs), and today I focused on cleaning up the admin dashboard where my partner and I will add new listings. What started as "let's make this prettier" turned into a deep dive of database relationships, image uploads, and me learning why you shouldn't store projects in random folders.

Why I'm sharing this mess

Living here in Bali and building this in public, I've realized that the messy parts are actually the most valuable to share. Everyone shows you the final polished result, but nobody talks about spending 3 hours figuring out why your database relationships aren't working, or why your images won't upload.

This stuff is real. And if you're building something similar, you're probably going to hit these same roadblocks.

The challenge I was facing

My admin dashboard looked like it was built in 2005. Seriously ugly. The table wasn't showing the right data (categories showing as "uncategorized" even though they were stored correctly), the layout was cramped, and adding new listings felt clunky.

Plus, I had this bigger vision: I wanted the dashboard to handle not just basic listing info, but also our personal reviews, image uploads, and all the data that makes each place special.

What I tried first (spoiler: it didn't work)

I started by asking my AI assistant to clean up the table and remove some filters I didn't like. Simple enough, right?

Wrong. The data wasn't displaying properly because - and this took me way too long to figure out - the database queries weren't joining the tables correctly. So even though everything was stored perfectly in the database, the admin interface was showing placeholder text.

You know what's funny? I used to think this was a frontend problem. Turns out it was all about how I was fetching the data.

The breakthrough moment

After some back and forth with the AI, we figured out the table joins were missing. Once we fixed that, suddenly everything started showing up correctly:

  • Hotel categories instead of "uncategorized"

  • Actual locations instead of empty fields

  • Price ranges displaying properly

  • All the data I knew was there

It's wild how one small database query fix can make everything click into place.

Here's how I actually built the improved dashboard

Step 1: Fixed the data display issues

The core problem was in how we were fetching data from the stays table. We needed to properly join it with categories and locations tables. Once the AI rewrote those queries, the admin table started showing real information instead of placeholders.

Step 2: Redesigned the edit form layout

The old tabbed interface was cramped and hard to navigate. I asked for a sidebar navigation instead - way cleaner. Now when you edit a listing, you get:

  • Basic info (name, category, location)

  • Images section

  • Location and timing details

  • Room types

  • Amenities

  • Reviews (our personal experience)

Each section has its own space, and you can jump between them easily.

Step 3: Set up proper image uploads

This was the trickiest part. I wanted images to upload to Supabase storage buckets, but kept getting stuck at 0% upload progress.

The issue? Row Level Security policies. Basically, the database didn't know who was allowed to upload images. Once I added the proper SQL policies (the AI generated them for me), uploads started working.

Step 4: Added the review system

Here's where I got excited - I realized we needed a way to add our personal reviews for each place. Not just basic listing info, but our actual experience: rating, visit date, photos, the whole story.

This required connecting the reviews table to the listings table properly. Another database relationship puzzle that took longer than expected to solve.

The stuff that went wrong

Oh man, where do I start:

  • Database relationships everywhere: I kept getting errors about missing relationships between tables. Turns out I was trying to connect reviews to "stays" when they should connect to the broader "listings" table (since we'll have restaurants, beach clubs, etc. too).

  • Image upload failures: Spent ages debugging why images wouldn't upload, only to discover I needed to configure row-level security policies for the storage buckets.

  • Profile ID confusion: The system kept asking for a profile_id that didn't exist in my reviews table. Had to add that column and properly link it to user profiles.

  • Frontend layout disasters: Every time I asked the AI to improve the layout, something else would break. The single listing page got completely messed up at one point.

How I fixed the problems

Most fixes came down to being more specific with the AI about what I wanted. Instead of saying "fix the layout," I learned to say "use the listings table, not the stays table for reviews" or "add row-level security policies for image uploads."

Also, I moved my entire project into the main folder. I'd been storing it in a subfolder, and apparently that was causing all sorts of issues with the AI understanding the project structure.

What it looks like now

The admin dashboard is actually usable now:

  • Clean sidebar navigation for editing listings

  • Proper data display in the main table

  • Working image uploads (though I still need to add WebP conversion)

  • Review system that connects properly to listings

  • Success notifications when you save changes

It's not perfect, but it's functional. My partner can actually use this to add new places without wanting to throw her laptop out the window.

Lessons I'm taking from this

  • Database relationships are everything: Half my problems came from not understanding how tables should connect to each other

  • Be specific with AI prompts: "Fix this" doesn't work. "Connect reviews to listings table using listing_id" does

  • Row-level security matters: You can't just upload files to Supabase without proper permissions

  • Sometimes you need to step back: When the layout got completely messed up, I just reverted everything and started over

The biggest lesson? This stuff is messy, and that's normal. I'm building this in public partly because I want people to see the real process, not just the highlight reel.

What I'm working on next

Tomorrow I'm going to focus on getting the frontend listing pages working properly with all this new data. The single listing page layout got broken when we changed the database structure, so that needs fixing.

I also want to add WebP image conversion for better performance, and maybe start working on the other categories (restaurants, beach clubs) now that I have the stays working.

Final thoughts

Day 13 was frustrating and rewarding in equal measure. The kind of day where you solve one problem and create three new ones, but somehow end up with something better than when you started.

If you're building something similar, expect these kinds of days. Database relationships are confusing, AI sometimes makes things worse before making them better, and that's all part of the process.

The cool thing is, once you get through these foundational challenges, everything else becomes easier. Now that I have the admin dashboard working for stays, building it for restaurants and beach clubs should be mostly copy-paste.


Following along with the 60-day challenge? I'm sharing everything - the wins, the failures, and all the messy bits in between. It's been a wild ride so far.

Robbin Schuchmann

Robbin Schuchmann

Entrepreneur and founder of multiple companies in the global employment space. Passionate about simplifying global hiring and connecting talent across borders.