Searchable CPV codes dropdown/multidropdown set up

Hi everyone

I am trying to set up a form for users that is basically an interface for interacting with Tender Platforms. The user can set up filters from the app, which are later sent to those platforms in order to filter relevant tenders for that user.

The challenge I am currently having not wrapping my head around is how to set up a dropdown or multiselect dropdown with CPV codes?

For the context: CPV codes are basically 8-digit numbers that encode specific procurement categories. You can take a look at them here:

https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32008R0213

The problem is that there are more than 9000 of those codes. So I already tried to load them into the option set (not the smartest move), but the multiselect dropdown was only able to show about 20-30% of all codes uploaded and did not willed to show any other.

My other try was to upload them into Bubble DB instead, and it did not work as well. It looks like multiselect dropdowns just can not handle such a large number of options.

I would also prefer if the element would support search-as-you-type kind of input. So that I can start typing ‘72’ in the multiselect dropdown, and it would show me ‘72XXXXXX’ CPVs.

Has anyone faced a similar issue or a need to have a dropdown with THOUSANDS of options? I’m open to any thoughts or advice.

Your best option is probably to use a search input instead of a dropdown. If you really want to use Dropdown, you need to use plugins probably.

@boston85719 have released a plugin that could maybe help you to save on WU for this kind of requests

Thanks @Jici

@artur.bielobrov There are other ways to achieve this, although I’m not quite sure if they are as quick and easy to implement.

I have just added the Search Box element to the Data Jedi Plugin

Here is a video with quick rundown of how it works and how to set up. I’m not sure where your data is coming from now, but no matter which way you are getting it, the Search Box element will be able to work with it.

BTW, the video demonstrates just 1,000 objects, as I didn’t have an ability to generate 10,000 unique dummy data and the unique identifier key values need to be unique. I would imagine with the speed at which it is initialized for the 1,000 objects, it should be okay for 9,000 but I’m not sure as I have not tested a list of that size yet.

If you think this is the right solution for you and need some assistance with getting your data prepared, please feel free to reach out.

Thanks for the advice, I’ll try to look into search input implementation as well.

Hi, thanks for the detailed answer & prepared video snippet!

We did not use any paid plugins at a moment, but I will look into your suggested one & raise that point in our team.

Yes, it is best practice with anything to reduce your dependence on outside sources. So in bubble, as much as you can build without plugins, it is sage advice to follow, those features should be built without a plugin.

The time to use a plugin, free or paid, would be when it is not possible to get the same functionality through basic Bubble features.

What I used to do was build a group called ‘Drop Container’ and put inside of it an input element and any necessary accompanying icons. This is used as the ‘dropdown’ portion where a user will click the icon to open the dropdown.

Then create a group focus element to attach to the Drop Container. Inside of the groupfocus add a repeating group. Set it up with your necessary elements for display, plus the data type and source. It is important to have constraints that will reference the input elements value to match against (use contains operator) the values in your data set for the field you target the search by (CPV).

It is best to ensure the cpv codes are lowercase, and that you translate the input element value into lowercase. Easiest and most versatile way to do that is to add a group with a type set to text and the value set to the input elements value (use lowercase and trimmed operators) which is ultimately what is used in the filters constraints.

Making use of lowercase just eliminates complexities of matching based on differences in the dataset and the user input value as capitalization does impact matching.

If these values are fetched via an API call, you can filter that based on the key of CPV and the input formatted value (the group value).

This had been my approach for years. It gives complete control over the design of the dropdown choices for users to select from.

Where is the dataset coming from? You mention trying to load them into the DB or option sets as the list is large.

If you want another method of loading them and then searching them using your own custom build dropdown, consider doing something like this below:

  1. Setup API connector:

  1. Upload the JSON file of your dataset into an Option attribute in your Bubble app

  1. Click the little ‘see’ text button next the file uploader in the attributes after uploading the json file and copy the URL from the browser.

  2. Go back to API connector and paste that url in as the url of the API call.

  3. Initialize the call and map the keys to the type of data they are supposed to be.


  1. Go to your repeating group as your suggested matches/display and set the datasource to be that of your api call through ‘get data from external api’ and make sure the data type is set the right type.

What this setup does for you, since it sounds like the dataset doesn’t change and from that link to a 300+ page pdf document, likely doesn’t have an API and so might only be in a spreadsheet somewhere, is to import that dataset into your Bubble app storing it in your Bubble App data storage on your Bubble app Amazon bucket. Then using that link as the api call address and initializing, you are creating a data type object you can work with as any other type of data in bubble dynamic expressions, and so can setup your custom searchbox as described above.

It also will return the 9,000 objects without performing any search of your database, so you only get charged WUs for the characters returned. Additionally, you will only be filtering client side the data which isn’t even really in your Bubble DB (at least not as custom data type entries or option set values), and so will experiencing quick enough filtering.

That should be sufficient to load the 9,000 entries fast enough, cheap enough and in the entire dataset so you can set this up without a plugin.