Forum Academy Marketplace Showcase Pricing Features

List Shifter: Reverse, Rotate, Swap and ITERATE (Loop) Over Bubble Lists | Now at v1.4: Adds Numeric Option, GET INDEX Action

I want to sort by the score of the selected skill in descending order.

I have 3 skill categories, each category has 4 skills. User. wants to find players whose selected skills have the maximum value.

for example, the user selects Motivation, Team working, Creativity & innovation.

My repeating group should show users whose skills have the maximum value, sorted in descending order. Sorting should take place according to the score of the selected skill. The repeating group data type is users.I want to sort by the score of the selected skill in descending order.


Amazing plugin, I am just experimenting with it.

I had a question and can’t seem to find the answer in the docs.

Once I have moved my items around in a list and they have new positions in LS ‘Shifted List’ - how do I then save those changes back to the Bubble database?

I’ve managed to get elements moving up and down in the list, but stuck on how to save those changes back to the DB!

Cheers, James

Hi @keith, Please, I will like to ask you one question so that it can help me decide if your plugin is what I need to solve my problem. I have a data from the database, and a data from the API, and I want to display both data in a single repeating group. Please can this plugin solve this issue? I will appreciate your response.

Why does List Shifter work when I use “List Shifter Iterator” but not when I try to do the same with “PROCESS List”? Am I doing something wrong? Maybe a bug? @keith

I found an answer to it: Update the rank of a list's items after shifting it with List Shifter

1 Like


Is there anything in the works (or some oh-so-wise advice) you have for this issue of not being able to consistently view/save the shifted list after a “Shiftup/down”?

I am trying to 1) shift the original list,2) save the shifted list to the DB (in its new order of course), and 3) display the saved list in an RG like normal.

I am having the same exact issue @michael.dascal describes above and can provide a video if needed. In some magic way your plugin is changing what the Bubble DB “thinks” is my real list is and replacing it with the ListShifters.

Really appreciate all of your work here!

Next 2 rounds of drinks on me if we can get this to work!!


@keith I am having a really hard time trying to make use of some of the more advanced features of this list shifter. Wondering if you could provide some assistance?

In my case I have a list of coffee beans I would like to sort. Each bean thing has 3-5 flavours. For example, Bean 1 might have cherry, cinnamon, nutmeg. The user also has corresponding flavours (upto) 40 which contains the text of the flavour and a corresponding number. For eg Cheery: 3, Nutmeg: 2, Cinnamon: 5. The sorting should be on the list of coffee beans based on a calculated field where the flavours of the users flavour profile, is present in the current coffee bean thing, and is extracted and then summed. For example. in the example above Bean 1 would sum to 10 (3+2+5). How can I achieve this level of sorting using ListShifter?

I am having a problem implementing this exact same solution that @rico.trevisan discovered.

Only iterates over the first 2 items in the list for whatever reason with a weird quirk that if you put a pause in between each update of the database in the iterate workflow it then only updates the first.

So I am not sure if there is something weird (read: that I dont understand that should be obvious) that is time dependent or something where @rico.trevisan 's solution is on a simpler app and therefore faster??? :man_shrugging::joy:

@brian4 as I’m sure I’ve explained in a video about List Shifter, you can’t really (and shouldn’t) use the Iterate action to perform repeated database create/update/delete actions. What happens is that actions like Create a New Thing (as a very good example) will appear to happen instantaneously in the page, but have (of course) not actually finished on the backend. Wait LONG enough and they will finish, but you can easily get the backend very backed up/throttled… and there is no way to know they are done (except via trying to leave the page - if you see the “not safe to leave” message you know it’s not done).

List Shifter is SIMPLY NOT FOR DOING this type of thing.


This is, of course, one of the biggest and frankly dumbest limitations of Bubble: That the only objects you can create are Things and that Things can only be created through interaction with the database.

The problem isn’t so much that Things must be predefined in the backend, but that, once you’ve created a custom datatype (a Thing) in the backend that you can’t create a local Thing of that type in the page.

In JavaScript, we create objects on the client side all the time for many different reasons. That we’re unable to do this in Bubble is a huge limitation.

It would be handy if we could create Things in the page, knowing that they are not stored in the database and, if desired, we could later take a list of such local Things and then commit them to the database if needed. It’s incredibly clunky and dumb as it is now.

The closest we can get to this in Bubble as it is right now is to create parallel lists of all of the simple data types that comprise a Thing and then pass them to a backend workflow and iteratively turn them into Things via a recursive workflow (tip - my List Popper plugin is useful in this regard).

See my video about creating shopping carts in which I demonstrate this idea of passing the component parts of a Thing (in this case, the components of Line Items that are part of an Order) to a backend workflow that then assembles them into Things.

1 Like



I watched most of the videos and somehow didn’t make that connection. Maybe since I am not a programmer initially I didn’t register that point.

It seemed strange that it worked and then didn’t work and then @rico.trevisan got it to work and demonstrated that the backend workflow was in fact working, when I guess something on his page meant that he didn’t trigger the Bubble Limiter?

I was avoiding the backend workflow stuff because it looked scary and don’t want to trigger paid plan on this app yet…

Guess it is time to find a workaround! Thanks for the awesome plugin!


1 Like

It could be that. My demo was on a new app without much. Each item has few fields in it.

So, @keith is this a race condition? What could be happening is that Brian’s first iteration looks ok on the front end, but the actual change is sitting in a queue in the backend? When Brian makes subsequent changes all those are added to the queue and, at some point, one of those iterations actually goes through in the backend. God only knows which index it will register.

So this “defence mechanism” solution won’t work?

Nonetheless, I like your solution that only saves at the end. Mine currently fires at each button click. I will change that.

Is there a List Shift operator that tells me when the Original and Shifted list are different? That way I can show something in the frontend to tell the user to save his modifications.

Found it! 's list shiftedworks like a charm.

Which reminds me, it’s that time of the year to tithe your favorite creators: GRUPZ: Karma-Ware Plugins for Bubble

So my understanding of @keith’s message is neither solution should work reliably… yours or mine.

And unlike what is suggested in the message, on my instance the iteration NEVER completes and fully updates the database.

I can wait forever and nothing happens on a list of 4 items. Keith’s “Iteration complete” action fires off after 2 iterations, one with a pause.

So that is curious in and of itself.

Keith can of course correct me but it seems as if you’re getting lucky at this point and your solution will likely break pretty quickly for Bubble being silly type reasons as it has in mine.

Reading through the bajillions of replies I think I caught Keith mentioning something about using List Shifter to create a list of Things and then saving the list to a list in the parent Thing.

In my example, have a field called “list of exercises” and then replace that list after a save button is fired.

Then the list should appear on the page in the order saved.

Considering this is a demo app and the list will only have a few items…

… I am less concerned about what I understand (probably wrongly) to be the security and data weight reasons why this is not the best idea.

Am I completely out to lunch?


@rico.trevisan when rereading your original message I think there is a misunderstanding with what is happening on my side.

I don’t think there is a queue backlog as it never “looks ok on the front end”.

The iteration works and the backend is updated fine for two items only. The “iteration complete” event is thrown then with Debug Buddy suggesting to me that the whole operation has stopped, and backed up by the fact nothing happens after.

Did I understand what you were saying incorrectly?

I am not sure what/how that worked with “'s list shifted”

Mind creating a screenshot with the expression? I never had any luck with the “'s shifted list” which I think is different so I am not sure what you’re referring to…


Here’s the solution I came up with for my use case as a fitness training app. It allows…

1- changing the order of a list of exercises
2- adding multiples of the same exercise to a workout… ie adding multiples of the same thing to a list and then saving it in

We accomplish #1 by creating a list of things and resetting the list when something is done being sorted

We accomplish #2 by creating a “Join” thing with parent-child fields. This gets around the "cant have the same item multiple times in a list.

Here’s a quick vid to show you how it works. If you have any questions ping me and maybe we will start a new thread.

1 Like

A little stuck on something. I’m trying to use the response from Google Calendar to make a list of date ranges. The response is a list of items that each have a “start” and “end” value which are each dates.


I need to get a list of date ranges. So two options I see are:

  1. Pass the data as is and generate date ranges. That assumes that I can access each start and end time. Tried using “List Item Field of Interest” in the PROCESS List action but no luck.

  2. Create two lists (one for list of start dates and one for end dates) and combine them to create date ranges.

Are either of these possible using ListShifter? This was my attempt:

Hey Keith! I spent about 2 hours with you today :slight_smile: watched most of your videos from 1-2 years ago, and implemented List Shifter IN PRODUCTION to paginate some previously-infinite scroll tables to these beauties!

I went to the karma page to show my appreciation, and saw this warning message:

Is this still relevant? Or is List Shifter 100% Karma now?

1 Like