Is this calendar design possible in Bubble.io without plugins?

Hey Bubble builders :waving_hand:
I’m working on a booking calendar like the one shown below (weekly view, time-based slots, bookings with dynamic height).

My main concern is the booking cards:

  • Each booking can be 1, 2, 3, or more rows tall
  • Height depends on booking duration
  • Cards should align correctly across time slots
  • Status-based colors (Available / Confirmed / Pending)

:red_question_mark: Question:
Is it possible to build this fully in Bubble.io without using any plugins, only with:

  • Repeating Groups
  • Groups
  • Custom states
  • CSS (optional)

If yes, what’s the best structure or approach you’d recommend?

1 Like

Likely not. Mostly css would help but probably not get everything. Issue is multiple RG cells due to duration

2 Likes

Calendars in vanilla bubble are really tedious. Honestly, I suggest using a plugin or third party API service. Make life easier, do yourself a favor.

2 Likes

@rjayaddimalik Yep, this is doable in Bubble without plugins :+1:

The cleanest way is to make a vertical repeating group where each row is a fixed time slot like 30 minutes. Then your booking cards are just groups inside the RG, not separate rows. You set the height of each booking group based on the duration for example: number of slots × row height, so longer bookings are taller.

Position the booking group based on its start time, use conditionals for status colors, and a couple of custom states for the selected week/day. No plugins needed, just a bit of layout math.

Totally possible in Bubble, it’s more about structure than fancy features.

2 Likes

How would you do that and then handle the overlaps?

Overlaps are the tricky part. I’d still keep the fixed time-slot repeating group as the base. Each booking knows its start time and end time. From that, you calculate two things:

  1. how tall the booking card is (duration ÷ slot length × row height)
  2. how far from the top it should start (start time ÷ slot length × row height)

For overlaps, you don’t stack bookings vertically. Instead, you split the column width. Before displaying, you check how many bookings overlap in the same time range and assign each one a “lane” number (1, 2, 3…). Then you set the booking card’s width to 100% ÷ number of overlapping bookings and its left margin based on its lane.

So visually:

  • Time controls vertical position and height
  • Overlaps control horizontal position and width

All of that can be done with calculated fields + conditionals in Bubble. It’s a bit of logic, but once the overlap rules are clear, it stays predictable.

1 Like

How do you configure this work without a plugin?

Best way is you use toolbox plugin.

You can do it without plugins like this:

  1. Make a vertical repeating group for fixed time slots.
  2. Put each booking as a group inside the RG. Set its height = duration ÷ slot length × row height and top offset = start time ÷ slot length × row height.
  3. For overlaps, assign each booking a “lane” number, then set width = 100 ÷ overlapping bookings and left margin = (lane - 1) × width.
  4. Use conditionals for status colors and custom states to track week/day or lane info.

All of this works with RGs, groups, custom states, and basic math and no plugins needed.

Are you saying to set widths and heights dynamically?

I think that account just responds with AI slop seems wrong in most responses recently

4 Likes

Interesting quick project this morning. Been wanting to build a calendar for a while, but was too lazy; this post gave me some motivation.

Happy holiday to everyone who celebrates it. It’s a federal holiday here in the U.S.

Anyway, here is a calendar I put together. It’s all in one HTML element you can drag onto your page.

It uses 3 backend workflows and, of course, a data type.

Right now, it has demo content to test it.

It automatically uses your current time zone.

chrome-capture-2026-01-19

I have it set for a dog groomer, but of course, you can change it to your own use case.

There’s a couple of design changes I want to make also.

I’ll have to test it for full use when I get more time later this evening.

You can do some cool things in Bubble using AI. And all before 9 A.M. :grinning_face:

9 Likes

That’s exactly what I’m trying to build as well :+1:

I’ve already created a very similar version using custom HTML, CSS, and JS. My main challenge was figuring out the best way to integrate it properly into Bubble — for some reason, using an HTML element didn’t click in my mind initially.

I’ll obviously be using an HTML element to embed the calendar, but if you’re able to share how you approached it (especially the Bubble-side setup), it would be a huge help. I don’t want to spend more time reinventing the wheel if there’s a clean and efficient way to do this.

Really appreciate you sharing this — it’s very close to what I need.

2 Likes

Awesome work @senecadatabase ! Could you move the events to other time slots by dragging them (similar to google calendar and pretty much other calendar apps) or is it limited to updating the time manually within the popup?

1 Like

This one really looks beautiful, I have very similar one, you should check schedule X, what this uses behind ? And you should add list view.

1 Like

Sorry for the delay in responding.

I did test it rather quickly this morning, and it worked, but as I said, I need to test it more and make sure everything is working perfectly.

You need to go into the code and set the demo to false. It’s on true right now, so it will show demo data. Once you set it to false, it will be blank, obviously, until you add your data. Once you do this, and you have your data type set up and the 3 backend workflows, it works. You can change the settings in the backend workflows to suit you, and also you can change the code, etc., for your use case. Obviously, you can upload the code to AI (I used GPT) and ask it to make the changes you want.

The workflows are set to ignore privacy rules (as you can see), and it’s set to no auth, because I just have it in test mode.

This automatically adds to your database and is set for the current time, etc. (hopefully :sweat_smile: )

The code you can put into an HTML element on your page. Again, if you want to clean it up without the demo, that’s your choice. CSS and JS are included in the HTML, so don’t worry about that:

https://codepen.io/SenecaDatabase/pen/jErmBeL

Data setup:

Backend workflows (3)

Workflow 1:

Workflow 2:

Workflow 3:

You can take this and change it the way you want to fit your needs. I’m sure the code could be cleaned up if you wanted…but this is what I ended up with before making a lot of edits to tweak it

2 Likes

Prove it! I claim you used Gemini… :rofl:

2 Likes

Oh, ok, I see how it is now…

I was actually trying to be good today and stay out of trouble :grinning_face:

I actually used Grok, an Ouija Board, and my toaster. I’ll do a screenshot in a little bit.

But seriously, I don’t have anything against Gemini. But it seems when I use it for writing and stuff, it always seems too corporate and for older people. I found GPT just seems to be more lively and exciting…then again, maybe it’s the way I prompt them both

2 Likes

Ahh… but what brand of toaster?

2 Likes

Not sure…

got it at the Goodwill.

Don’t know if other countries have Goodwill stores, but it’s where people donate stuff that gets sold to help the less fortunate.

So, if the code doesn’t work…