Hey @bubble - you broke the data model for Lists in SSAs! Please to fix!

I’m not too vocal on the forum, but felt I needed to make sure the Bubble team understood the business and financial ripple effects that a small change, such as moving the .get and .list functions, can make to a customer that has come to rely on them.

On Wednesday this week, Oct 26th at 1:30 pm, our largest client, a multi-million dollar accounting firm, contacted us saying that a feature we’d built for them (on Bubble) for tax planning was no longer working. They were in the middle of pre-scheduled tax planning meetings with their clients, and relied on this feature to correctly forecast and discuss next year’s taxes.

This tax planning feature was built using a custom plug-in that relies on the .get and .list functions. As you would expect, a measure of panic ensued on their side, and then shortly after, on our side to identify what was happening, and why a feature that had worked so reliably in months past was no longer working. We mobilized development, product management and test resources to troubleshoot this issue.

My company’s cost for this small change:

  • About 4 team members for two days trying to troubleshoot and communicate updates to key clients
  • Fallout and difficult conversations with our largest client

My client’s cost for this small change:

  • Postponed meetings with their clients when expected data was no longer available to them
  • Frustration with my team’s services, as this important functionality was no longer working
  • 2 team members working to find manual workarounds to get the data needed to hopefully salvage their already scheduled meetings, because our functionality no longer delivered it.

Between my client and my team, we spent a combined $6,200 in salary for the time required to troubleshoot and communicate on this small change.

So, bottom line, we love Bubble, you’ve made some of our best client offerings possible, we’ve come to depend on you, which is why we absolutely need transparency on and time to prepare for outward facing/breaking changes like this.

@emmanuel, @josh, @alex.stanescu, I need you to promote awareness throughout your entire organization of the unexpected and far-reaching effects that even slight changes to code can have, especially when customers like me have integrated with that code. It’s mission-critical for me that Bubble figures out how to instill this mindset in all those that are making these changes. Please keep this in mind, especially whenever the team engages in refactoring.

26 Likes

This reply won’t add any value in this thread, but bravo, @shaunh. Your post should be required reading for every Bubble employee, and it should be the standard to which folks are held when they want to post about how a Bubble issue has affected their business. Seriously, I have literally never seen another post like it. It’s always something like, “Holy crap! Bubble is down and my entire business/future/life is riding on a presentation we have in 10 minutes!!! Please do something, Bubble!”, and that’s just nonsense compared to what you wrote. Again, bravo.

11 Likes

So, because I mentioned it in a previous reply to @alex.stanescu, I should say some words about how we might tell other Bubble objects apart. And I mentioned Things and API response objects (I have no idea what else to call those API things, but maybe Bubble has a term for them?)

In plugins, we often have a need to specially handle Things (vs primitive data types) such as when we are publishing to a plugin’s outputs (err… “exposed states”). In the following, item is an item may that may be of some basic data type or it may be a Thing and we might then want to represent that Thing by its unique ID.

(Again, this is something that is suggested by the plugin API “docs”, but that we find is not, strictly speaking, required as we seem to be able to shove a Thing in object form to our outputs or its unique ID and either seems to work just fine. List Shifter, for example, does the former (because it has no other need to inspect any fields on any Thing so why bother now, eh?))

Anyway, to differentiate a simple data type from a Thing, we might check (as I did for years):

item.hasOwnProperty('get')

because only Things will have a get property on them. (Based on Alex’s comments above, I guess we would be better to do item.get since get might disappear as a property. But ya learn something new everyday.) We might alternatively look for listProperties, but get is easier to write, right? And what we’re doing here is ensuring that we don’t try get() on something that ain’t got get().

And to get the unique ID, we would:

item.get('_id')

And so to publish to some output of “dynamic” type we would:

instance.publishState('some_state', item.hasOwnProperty('get') ? item.get('_id') : item)

That is, “if item is a Thing, publish its unique ID, otherwise just publish the item”.

In our newly-recommended syntax, I guess we would better do:

instance.publishState('some_state', item.get ? item.get('_id') : item)

which I still hate, but whatever.

HOWEVER, an API response object also has a get method on it (it also has listProperties()) and so, if we do the above, this will fail for API response thingies – because they do have a get() on them, but they will not (in general) have the unique ID field '_id'.

And so, more recently, I do the check like this (item is a Thing if it (1) has get and (2) has a property named ‘_id’):

item.hasOwnProperty('get') && item.listProperties().includes('_id')

And, so, in this way, we don’t accidentally try to reference an ‘_id’ field on an API response object. So our publish becomes:

instance.publishState('some_state', (item.hasOwnProperty('get') && Item.listProperties().includes('_id')) ? item.get('_id') : item)

Or, as Alex would recommend:

instance.publishState('some_state', (item.get && item.listProperties().includes('_id')) ? item.get('_id') : item)

I only recently learned about this when folks were like, hey, List Popper (or some other plugin) doesn’t work properly with API thingies. And, of course, there’s no documentation around this, so I just had to inspect, explore and work it out.

It’s unclear to me if there’s some explicit way to understand if a thing-like Bubble object is a Thing vs an API response object. Sure would be nice if someone might tell us that.

@shaunh yep. We covered this a couple months ago as well here: Monthly Community Update -- September 2022 - #9 by bubble.trouble

The official response if you read the thread was basically that they are working on the server architecture to correct these issues but it isn’t going to be ready anytime soon. I’m afraid we are going to have to continue to deal with issues like this for the foreseeable future until we can get app versioning on the main/shared cluster. This is an unavoidable consequence of the development process that Bubble has chosen (which is rapid iteration) and it seems like regardless of how important they feel like the topic is, they don’t have the ability to come up with a solution in the sort term. I’m betting their official response to you will be something along the lines of “You should be paying for a dedicated instance” in which case you wouldn’t have been affected by this (and other) breaking changes.

If you look at the releases in the last two days to the main/shared cluster, there were 22 (Releases | Bubble). There is no way to ensure bug free code 100% of the time with that many code changes (some of these updates were to fix bugs that were released). It seems like their (unspoken) position is that the main/shared cluster is more of a test environment for their dedicated cluster/customers. Regardless of whether or not this is their position it still ends up being the net result for most of their customers.

@shaunh fuuuuuhhh, dude! And here I was pissed because my Thursday night was spent telling people, “hey man, plugins can’t break in the way you are implying”, followed by, “hmm… well actually this shit isn’t working, but I cannot tell why”, followed by a few hours of effing around in test mode with List Popper (always a joy trying to inspect what’s going on in an SSA, it’s like building a ship in a bottle).

And all that to support a free plugin that people rarely tip me for. In my original draft post here (which was much angrier than the one I posted) I was going to suggest to Bubble that they owe me at least 3 hours at my consulting rate for providing support to other Bubble customers and letting them know that they have a real problem.

3 Likes

I guess the other thing(s) that @shaunh’s account tells us is that:

  1. If @keith is a dumb-dumb, well, he’s not alone and, lacking any specific guidance, many other plugin developers have found the same things he has and have come to the same (perfectly logical and reasonable) conclusions about how one should do things in Bubble plugins.

In fact, said developers may have looked at @keith’s own code in open source plugins like List Popper (which I think is probably the first plugin that exposed the code for how I do stuff like read lists and support Things as well as basic datatypes, etc.) and said, “oh yeah, that makes sense, let’s do it like that.”

Plugin devs don’t really talk to each other very much except in pretty general terms over in the plugin builders forum. And because so much knowledge about Bubble plug-in development is hard-won, we’re often not eager to share exactly how we do things.

Like, it’s sort of “trade secret” to me how to build plugins that properly support all data types, properly handle Lists, etc. Like the song says, “I could teach you… but I’d hafta charge.” You’ll figure it out, ya know?

So (again, lacking any canonical information on how things should be done), plugin devs find their own solutions to various problems and so there’s no telling how many approaches to some common issue might be floating around out there.

That being said, I think that a lot of devs converge on the same solution to the same problems and, in the case we’re discussing here, it is completely reasonable to observe that, on Lists, length and get are exposed as properties and that we can ensure their existence by – ya know – looking for those properties using the methods on the Object interface.

And we would have no reason to expect that this would suddenly change. You’d be bonkers paranoid to think that .hasOwnProperty would be fragile in this context. Like, completely nuts. But here we are.

But what this also tells us is that, internally, Bubble has very little idea how plugin devs actually interact with the plugin API.

And, if there’s supposed to be some canonical way of doing some certain thing, the API should provide that. (As an example: I mean, why the heck am I even having to cook up my own approaches to publishing Things properly? If the plugin API was a proper API, wouldn’t instance.publishState() just handle it for me? Yes, yes it would.)

4 Likes

Okay, stop typing, @keith, and go get a milkshake, man.

6 Likes

You just want more Floppy videos, @micloc, and I was working on one yesterday evening when I decided I’d better look into what the heck was going on and now your Friday movie night with your special lady friend is completely ruined.

5 Likes

Thank you @shaunh for the articulate explanation of the impact this had on you. Per @mikeloc 's suggestion, I’m going to share @shaunh 's post with the Bubble team, because I think it’s important for us to get periodic reminders that there are real people with serious businesses on the other end of our work. I am sincerely sorry for the disruption this issue caused.

I’d also like to give a bit of context here: the plugin API, in its poorly-documented state, was built back when Bubble just consisted of Emmanuel and me. @alex.stanescu and other engineers on our team have been doing a heroic job excavating the (quickly-written, under-documented, messy) code we wrote years ago and barely remember, and modernizing it so that we can get to a world where we do have a sane, rational, public documented API. I am very sympathetic to every plugin developer who just guessed our API and took advantage of “private” state we didn’t mean to expose, because, yeah, I don’t see how you would have figured it on your own otherwise. I’m also very sympathetic to our team trying to figure out what’s implementation and what’s interface, because they have the same challenge you do. I think this incident is a good reminder that a lot of plugins rely on stuff that might look like an implementation detail from our end, and I’ll make sure our team is cognizant of it.

…sadly, basically, yes. I’ve written a longer-form version of this point that explains why this is the current state and how we are thinking about the evolution of it here: What is Bubble's policy on pushing changes? - #4 by josh

10 Likes

Thank you for your post, @josh. The silver lining is that @alex.stanescu deployed a quick fix today that re-enabled those two methods, and we’re back in business on that feature again. We (and our clients) totally appreciate the quick response.

6 Likes

Please do not forget the number of customers who are…“no-coders” who chose your platform to struggle their way through painfully learning and building a working app, so that they could have success and afford a developer to work with later on. Or rebuild later on, or purchase a dedicated solution from you later on. I can’t stress enough that this will ruin me if things keep mysteriously breaking (at this time especially). I literally tested the app I’ve been building for a year (just in Bubble). Things simply didn’t work and I have no idea how they could have been broken.

E.g. A code is sent via Twilio text message during signup process. I built it tested it MANY times and last night when I acquired a whole 10 people out of my 1347 friends on fb (lomfl), none of them received the randomly generated verification code (dynamic data) in the text message. It royally hosed the entire experience and now my already doubting friends say what… At launch, again! I have thousands into this, drive a damn semi to make enough money to keep going on it (which I absolutely hate doing), I believe it played a big part in my divorce as I won’t give up on this. WHOLE POINT BEING… I have everything invested and things breaking while you “improve / implement” AT LAUNCH TIME (meaning do you remember how there is no room for error such as this?). ON TOP OF IT ALL…

I WENT THROUGH THIS SAME EXACT THING WITH ADALO WHEN THEY RECEIVED THEIR FUNDING, AFTER THOUSANDS OF DOLLARS SPENT AND A YEAR BUILDING, I HAD TO LOSE IT ALL TO COME HERE AND LEARN/REBUILD IN BUBBLE. LAUNCHING IN DAYS AND HERE WE GO. I CANNOT TAKE THIS AGAIN!!!

What do you propose and does this sound like something that would “break” from anything that your team did recently. Nobody has been able to sign up due to this, that was tested many times and worked. I’m trying to remain respectful so please DO NOT ignore this.

1 Like

Hi @service , sorry for your frustrating experiences, I know how hard it is to build a company. Our team would be happy to help you; please go to Support | Bubble to share information about your app that we can use to investigate the problem and work with you on a solution.

3 Likes

Yup, nobody cares what I have to say, @service, which is why Josh said he is going to follow my suggestion and share Shaun’s post with the Bubble team. Believe me, man, nobody understands your frustration better than I do, which is why I spend an absurd amount of time helping people in the forum for free, but you are going about it all wrong. Oh, and I didn’t flag your post that was hidden, but call me more names, man… that will fix everything.

2 Likes

That’s definitely fair, and honestly, nobody should spend as much time reading posts as I do… it’s a sickness, really.

I get that, man… I really do. Hell, one of my apps is cyclical in nature, and it just crapped the bed a couple of days ago when I hit capacity and got the email about it well after the fact. So, again, I definitely get it.

Anyway, I reached out to you in a direct message to offer to help if I can. You should take Josh’s advice and reach out to Bubble support, of course, but if you want a second set of eyes on anything, I would be happy to try to help.

4 Likes

That’s ALL much appreciated!! I’m going to have to take a moment to go back in and look as I really just think that these things broke from no control of my own as nothing changed and they were all tested and approved prior to testing with friends last night… Here’s what I typed to support if any of it helps:

During signup I applied an action to a “send verification code” that the new user must enter and click the verify button which shows an alert if the code entered into the field does not match the generated code for that user (verify_code). Last night during testing with 10 people online, it would not send any of them the code (dynamic data of randomly generated code). It was created in the database for each user but no longer appeared in the text message they received. I gave them the code to enter and my alert popped up showing the users that the code did not match, but it did actually.

Another group was supposed to appear after that code set a yes/no field to yes. It did not become visible to let them skip code verification.

I had a repeating group showing recent “listings” viewed and it worked just like the rest in here, with nothing changed and then it simply did not so I deleted it because I am only one man trying to do MUCH too much and I’m not a developer. This all puts me in a bind for a second time as I came here from Adalo to relearn and rebuild after this exact same thing happened when they received their funding and started “improving”. I can’t take another blow like this with launching and zero budget, energy left, patience or help. I don’t even know what to ask for here because if you keep implementing it will keep breaking. Help?!

1 Like

I think I lashed out at the wrong person earlier and apologized for that! The frustrating part is not building the business! The BEYOND frustrating and detrimental part is having the platform you built the entire business on, starts breaking what you’ve paid dearly for and tells you “I’m sorry about your experiences”. I have a collection of hundreds of those replies!

MAIN QUESTION: What helps me launch immediately without Bubble, breaking the app? I guess that’s my only question left that I absolutely NEED a solution for. The rest is understandable. Losing our launch and reputation right out of the gate, is NOT ACCEPTABLE. My business is not understanding, building or rebuilding the bubble platform in the background, it is launching ours. If you do not want to say out loud what I think the only solution is, message me please.

1 Like

There are solutions here. I understand the frustration I really do… but it’s all about perspective. The grass always looks greener on the other side of the fence. This kind of stuff happens all of the time in development so you are already asking the wrong question here:

The question you need to ask, and you need to ask it to yourself first, and the Bubble team second, is how do I properly support my users when there is another outage. What communication is necessary, what redundant channels do I have setup to support my users the next time my app is down. This is what all software business owners do who want their apps and products to be successful regardless of the platform.

When you signed up to use the platform Bubble told you explicitly in ALL CAPS that the code isn’t bug free (and will never be) here: Terms | Bubble (check #12)

And I can 100% assure you from many years of experience that if you went and paid a lot more money to have a custom solution built it would be every bit as error prone and you would experience BEYOND BEYOND frustration when your develpers tell you it’s going to take them hours (or days) to get the functionality fixed. It’s just the nature of the line of work you’ve chosen to be in even if you didn’t know that when you got into Bubble (And don’t worry, you are in good company as most of us didn’t know what we were getting into when we started either).

What is NOT ACCEPTABLE is to put all the blame on Bubble. They are not your Tier 1 support team, that is on you. They are your Tier 2 or Tier 3 support and they have a big team of engineers and support staff working hard for you to squash every bug as quickly as possible (and to try and prevent them in the first place). At ~$129/month give or take depending on your plan, I’d be suprised if you found a single person to work for you at Tier2/3 much less a team of people to support your app. So subscribe to their status page: https://status.bubble.io/ and be ready or hire someone to do so if you are too busy. Be ready to send an email to all of your customers letting them know you are aware that your site is down and you are doing everything in your power to bring it back online. We have lost very few customers over outages. And as Bubble has said, and I’ve started to repeat, please get on a dedicated plan if your app is of such critical imporantance to have 100% garaunteed uptime (which is, by the way, nearly impossible to do without a lot of money thrown at server architecture).

Bubble makes the possibility of an app creation available and does it really well for a lot of people. Without the platform you might not even have an app to launch.

So I would say in the same sentence, “Don’t look a gift horse in the mouth” AND, “Yeah, it is painful when our apps are unavailable for our customers (regardless of the platform).”

4 Likes

Please stop. You made your point. You got flagged for a reason now please calm down and go fix stuff.

It’s a frustration to any affected, but it’s already fixed.

4 Likes

Music to my ears. Have along list of things would love to see

Been here so many times…

1 Like