Slow & Steady

Benedicte and Benedikt take on the challenge of #SummerofUITweaks for their products.
Currently enjoying the last weeks of the European summer, Benedicte is loving the “chilling but still getting work done” vibe. Aside from implementing UI tweaks, they’ve also been working on the WeWeb and Supabase integrations at Outseta.

Meanwhile, Benedikt and the Userlist team encountered a bug that caused a broadcast to be sent twice to its recipients. They’ve also updated their frontend dependencies, got a new UI component for their new data structure, and more.

Creators & Guests

Host
Benedicte Raae 👑
Queen Raae - Let's get the most out of @GatsbyJS | Creator of POW! — the privacy-first menstrual cycle journal (https://t.co/t2m6aOaCgM) | Co-host of the @SlowSteadyPod
Host
Benedikt Deicke
Software Engineer & Co-founder of @userlist. Co-host at @SlowSteadyPod. Running @femtoconf. Creator of @stagecms. Loves music, food, and cooking.
Editor
Krista Melgarejo
Marketing & Podcasts at @userlist | Writer and digital marketer by trade | Still trying to get that science degree 🎓

What is Slow & Steady?

Join us as we share what it's like to build and launch a bootstrapped startup while working for yourself full-time. Benedikt is working on Userlist, and Benedicte is establishing herself as a Gatsby expert and developer advocate for hire.

Benedicte:

Welcome to Slow and Steady, a podcast where you get to follow along as we build products in public. Each week, we'll give you an honest take into our lives as we share our struggles, our wins, everything in between. I'm Benedicte, and I'm feeling pretty relaxed.

Benedikt:

And I'm Benedikt. Today is August 9th. This is episode number 186, and I'm feeling a bit annoyed.

Benedicte:

A bit annoyed? What's up?

Benedikt:

What's up? Had some issues on on production today that derailed my plan for the entire day. So I'm annoyed. Like I had

Benedicte:

With yourself then, I guess.

Benedikt:

With myself then. Yes. Of course, with myself. That's when I'm most annoyed, When I'm annoyed about myself. Mhmm.

Benedikt:

Yeah. I mean, in the end, not the end of the world. Nothing too dramatic. But, I'm still not 100% sure what happened, but we managed to send a Fairly large broadcast. And instead of sending everyone 1 email for that broadcast, we send Almost everyone, 2 emails of the same broadcast.

Benedikt:

And it does

Benedicte:

double up.

Benedikt:

Yeah. But not exactly. Like, it's not exactly double. I think 80 people didn't get it twice. So it's super weird.

Benedikt:

It's Mhmm. Yeah. I don't know. We did some hunting for the root cause, and I'm not entirely sure we found it, but we at least found one way how this could happen. It's not necessarily the way that it happened, but it seems to be related to connection issues to, to Redis, Where some of the, like, some of the sidekick code we have to to send jobs into the system.

Benedikt:

It has, like, this reliable push feature where, like, when there is a connection error, it retries it. And it looks like In cases where, it sent a command but didn't get a reply, it would send a command again, but redis might have received it. And because, the job that we were pushing wasn't Wasn't idempotent or whatever that's called? Like, if you run it twice, it will do the work twice instead of just doing it once. And it might be related to that.

Benedikt:

So, yeah, I don't know. We changed the job, so it it would Well, for 1, we would ensure it's unique in the queue. And then when it does its job, it checks that it hasn't done its job before. So I guess it's good now, but, yeah.

Benedicte:

I I think those things are they're called something, and I I'm so bad at, like, remembering, but I remembering reading about it in SwissX serverless handbook. And it's it's some kinda, like, general problem. Like, you know, if you send a messenger running to a general saying attack or not attack, like if you don't have an answer, like, do you know do you attack or don't you attack? Or, like, there's Mhmm. You know, there's that what if the message isn't didn't come through problem.

Benedicte:

But I wouldn't know because it's, yeah, it's got some kind of name.

Benedikt:

Yeah.

Benedicte:

And it's it's it's big in, like, the serverless world, right, where you have different systems talking to, each other. Not that I guess you're not, like, totally serverless, but, like, queuing up jobs and, like, their independent systems. And

Benedikt:

Yeah. Yeah. A lot of independent systems, and, one of them might have had an connection issue. All of them might have had an connection issue. It's It's not entirely clear.

Benedikt:

Like, we did our best to

Benedicte:

Mhmm.

Benedikt:

To investigate this, but it's always hard to do this after the fact. And, I mean, what we noticed is that there were some connection issues to write us in that time frame.

Benedicte:

Like

Benedikt:

there was problems slightly before and during. So it might be related to that, but maybe it was something completely different. But I feel like The fixes we introduced should at least well, I mean, they are not really fixes. Like, they are just, like, mechanism Improvements. Duplicates.

Benedikt:

Yeah. And they should like, whatever this cost us, it should at least not happen again, even though we don't fully understand what caused it. But, yeah, what's a bummer is, well, I don't know. Like, looking at like, we did some more investigation and we noticed that this General problem was around since 2019. So basically since we built this.

Benedicte:

Mhmm.

Benedikt:

But I think I identified 22 broadcasts where we send someone a message more than once.

Benedicte:

Mhmm.

Benedikt:

But it was usually, like, 1 or 2 people. At this time, it was, like, almost all of them. So it it's

Benedicte:

it looks like it looks like it looks like it

Benedikt:

looks like it's for a while.

Benedicte:

How do you check if somebody did not Get an email.

Benedikt:

I mean, that's that's not too difficult, I guess, because we keep like, we keep all the messages that we sent. So we can actually tell, who received a message or who didn't receive a message. And yeah. I don't know. It's a bug.

Benedicte:

But in the game of I feel like I feel like in the game of email as in email service provider, it's It's better actually that somebody got it twice than that they get didn't get it. Like, if we're sending some kind of important, like, Sales message or something like that. Like, yeah, it's annoying that it comes twice. Like, it looks a little unprofessional, but it would have been worse if people, like, didn't get The sales message. Right?

Benedikt:

Yeah. Yeah. I mean, there could be, like, there are a lot of ways we could screw up harder than this.

Benedicte:

I can make you feel good. And you're like, yes. There are many ways we could screw up.

Benedikt:

Yeah. Yeah. I mean, Yeah. Like, I mean, I feel bad about this because it's it's obviously a bug, and it's not a it's not good. But

Benedicte:

In

Benedikt:

the end, it's not the end of the world. Like, they got that message twice. It's Yeah. So what? Like, they delete Both messages.

Benedikt:

So I don't know. Like, part of this

Benedicte:

is annoying.

Benedikt:

What's weird is the scale of it. Like Yeah. I mean, in a way, it's good because that pointed out the issue. Like previously, we didn't notice that, like, 1 or 2 people would get a message twice. Now it was, like, more like 160 k or something like that that got the message twice.

Benedikt:

At least that pointed out the issue. Yes. But now, like, we have measures in place to prevent this from happening again. So all good.

Benedicte:

I must I must say being now that I, you know, work and have access to all of, you know, outside of Slack and then also at the bank, You know, I also have access to the incident channels in both. And, it's humbling to see, like, what Happens in different like, I can't go into all of them, especially the bank ones. But it's like things happen. Like, they're All systems have issues.

Benedikt:

Things happen all the time. Yeah.

Benedicte:

Yeah. Things happen all the time, and you're like, wow.

Benedikt:

And, again, like, it's it's wild to things that, like, can go wrong that you didn't even consider that could go wrong. Mhmm. And

Benedicte:

things that only can go wrong with scale. Like, some things can only go wrong with scale. Like, it would never happen if it was 10 messages. Right. Yeah.

Benedicte:

Verb.

Benedikt:

And I I spent most of the morning trying to replicate the issue, in my local setup. And I I never managed to, like the code itself, like, everything that I wrote is, Quote, unquote, correct. It it it works like intended. But, apparently, depending on the Surroundings and the environment it runs in and, like, small connection issues, so it's just delays and connection to servers and stuff like it. Apparently, it screws up bad enough to cause a big issue.

Benedikt:

But it's super hard to to pin down and to replicate. So

Benedicte:

And I I really feel like that's that's a little or, like, what I took away from the serverless handbook when I kind of I read it, And I should probably go back and and, like, reread some of it whenever I'll I'll need to create something, of that that size. But What I also took away is like a tiny, like, if it only occurs, you know, in, like, 1 out of 10,000. In a small system, we're like, oh, it happens once every 10,000. Like, that's almost nothing. But then suddenly, when you have, like, 400,000 emails.

Benedicte:

That is a lot of emails. Or, you know, suddenly that, like, 1 in which seems super small is actually a pretty high number We Yeah. And could have a high impact. And but, like, in a smaller system, we're like, well, you know, that's gonna be so rare. We don't kind of even consider that.

Benedicte:

But then as soon as you have that scale, you're like, woah.

Benedikt:

Yeah. Yeah.

Benedicte:

Out of a yeah. Yep. And I guess you're feeling that now because it's scaling.

Benedikt:

Probably. Yeah. Anyways, I think it's Anyways. Fixed. So all good.

Benedikt:

I hope the customer isn't too upset with us. It shouldn't happen again, at least not this particular problem. But, what's again, what's annoying me is that I I was planning to do something else today, and now It's already in the afternoon. I didn't get to any of it.

Benedicte:

Just be done with this podcast, shut off the computer, and go outside. Or are you also in the middle of a storm?

Benedikt:

It's not a storm, but it's raining. So it's not that fun outside. But I need to do I need to, get some groceries and stuff like that later on. So, yeah, this will literally be the end of my workday.

Benedicte:

Well, that sounds pretty good. I'm gonna log off and then I'm gonna exercise because I haven't in a week, which is not good. I'm supposed to do it at least twice a week. So I'm gonna log off and exercise, but I can't exercise out on the beautiful, like, patio or deck or whatever we call it here at the summer house because We are in the middle of Hans, the summer storm of 2023, I think. And we're just waiting it out on an island and hoping we have enough food to tie us up.

Benedikt:

How much food

Benedicte:

do we

Benedikt:

have left?

Benedicte:

You know what? I do think we have enough food, but toilet paper on the other hand, I'm not entirely sure.

Benedikt:

Oh, boy. But, I

Benedicte:

mean, we can't we can't like, when there's a lull, like, it's it's fairly short boat ride over to the other side. It's just that we have a very small boat. And when the winds have been I think yesterday, there were peaks of, like, twin 25 meters per second, which is like, it's not like the highest class of storm, but it's like the highest where you're, like, still Going outside and not being asked to stay, indoors. So it's not like a fun experience having to go over, or cross. But we like, we can.

Benedicte:

So it it will will be fine, but we'd rather not until it settles. So as opposed to settled, like, by Friday, it's supposed to settle and be, like, half like, potashly nice. So, hopefully, they're correct. And, And we're also just extending our stay because there are road blockages, there are floods, all all the way from Sweden, where we are in Gothenburg all the way up to Oslo. So we're just gonna stay put and And just stay put because we can't.

Benedicte:

School hasn't started yet, so we're good.

Benedikt:

Yeah. Yeah.

Benedicte:

Yeah. But, work wise Or why I'm so relaxed since we talked about you being a little annoyed, and then we can go back to you, is because I'm in, like, cabin mode. I've started working, but I still because there's no school, and we're just here at the island. It's like, what day is it even? I don't know.

Benedicte:

Like, I have to keep checking because I had some at the beginning of the summer. I think even before leaving for the cabin, I had some Mondays when we have all hands on outside of where I'm like Like, I I didn't realize it was Monday. And then I managed to actually, like, get to the meeting, like, within the 2 to 3 minutes after the meeting started. But then when I came to the cabin and I also been driving back and forth to Oslo to take care of my mom, and I had, like, no idea what day it was. It wasn't till the next day.

Benedicte:

Was like, oh my god. It was Monday yesterday. I think I completely bailed on this meeting. So I've started sending messages in the Slack. It's like, I am aware it's Monday.

Benedicte:

I'll be seeing you at the meeting just so they know that, Yeah. That I am aware of the weekdays. But it's I love that. It's just so nice just, like, chilling and still getting work done, but it's just a little less Structured, and it's really nice for, I guess, 3 to 5 weeks. And after that, I'm I'm ready to to head back to the city and and get some Structure, to my day again.

Benedicte:

But it's nice to kinda crave that because sometimes I can get a little rebellious Towards structure where I'm like, this life is boring, you know, having this kind of structure. And then having it be completely kinda unstructured and just people hanging out. And, oh, let's make food. Like, we were supposed to record this yesterday. And, like, I actually thought I had a fairly good plan, but my slow roast was done an hour before it should be.

Benedicte:

And I had to message our friends who live, like, 2 minutes away on this little island and be like, you gotta come for the rose now. Like, it's happening now, not in an hour. And they just came, and we ended up spending the whole, you know, afternoon, night just looking at the weather and and drinking wine and eating the food. And it was just lovely and and super unstructured, but I'm I'm I'm feeling the itch. Like, by the end of next week, I'm gonna be like, it's good.

Benedicte:

School starts again, and everybody has to to kinda structure up. But yeah. And, other than that, so I've been doing work. I've been doing outside of work. I've been working with Azeta plus WeWeb.

Benedicte:

I think it's called WeWeb. WeWeb, integration and then also an outside and super bass integration, which is really fun. And now I had to do the write up, which is not Fun. But figuring it out is fun. The write up, not so fun.

Benedicte:

So that's that's on my agenda that I have to, get my findings down on paper so that people can benefit from them. Because otherwise, what's the point? Yes. But I must say, No code tools. Like, oh my god.

Benedicte:

Like, Weeb, if you wanna just create an app, and it doesn't have to have, like, a super intricate custom Some UI. Like, you can make apps, like, super fast, and they look pretty good. And I think it's It's a view behind the the scenes, but it's very much towards, like, apps where it's like, You know, typical app flows, not a content site, but, like, app flows. Mhmm. Well, I feel Framer is more kind of a Webflow Competitor and because it it's you can create custom React components in framework.

Benedicte:

You could obviously make an app, but you'll have to make a lot of the kind of UI changes and, like, make sure that's correct yourself. While in WeWeeb, like, all of their default is Towards, apps. So you can make, like, a to do list, or you can make project planning. You could do, they have, like You know, all of those kind of spreadsheet types things where you just wanted a little bit of a different UI. So And we're early days still.

Benedicte:

Like, I'm really it's gonna be exciting to see kinda where this, like, no code space takes us. Yeah. And then with that set and super bass, I had a lot of fun because I had to figure out how to take one Jot, which I now know they're called. JWTs are called jots for some weird reason.

Benedikt:

Okay.

Benedicte:

Yes. At least the Americans call them jots. So you how to take 1 JWT or JSON Web Token and, decode it and then sign it with another key or, like, Decode it and verify it, and then resign it with another key so that, you can do row level security in Supabase With an auxetta, jot. So that was kind of fun. And I made it work and had to write some Dino code.

Benedikt:

So Nice.

Benedicte:

Yeah. And I think it's like I don't know. Like, figuring those things out. I don't know why. It's so it's like a little, like, detective.

Benedicte:

It's so much fun, but then the write up.

Benedikt:

So Yeah. Like, The problem is, like, it's exciting until you figured it out, and then it's boring because you know how it works. Right?

Benedicte:

Exactly. But, like, if somebody's gotta pay me for that work, I need to be able to write it up. Like, it's not you can't have one without The other.

Benedikt:

Yeah. Yeah.

Benedicte:

Because nobody's interested in me figuring out how things integrate and then just keeping it in my head.

Benedikt:

Yeah. Unfortunately, that's not how it works.

Benedicte:

That's not how it works. No. So I think I think, like it's like, you know, when I do more of them and I have more of system in place. Like, it's gonna be easier, hopefully, to be like, oh, prerequisites. Like, you know, this guide will do We'll solve or, like, answer x.

Benedicte:

And, I kinda started that with, like, WeWeb to to kinda have a structure moving forward for different integrations. So I think I'll make it work. I just need to be in a little bit more of a structured environment.

Benedikt:

Makes sense.

Benedicte:

Yeah. But that's that's about it, for me and support, of course. But

Benedikt:

Cool.

Benedicte:

But yeah. And working on proposals, but they're the same ones as at the beginning of the summer. So so that's it.

Benedikt:

You mean proposals for, like, new client work?

Benedicte:

Mhmm. Mhmm. Yep. Yeah. And then some of UI tweaks, which I see you've been, like, Tackling as well.

Benedikt:

Yes. Yes. At least, at least deliberately try to do, like, 1 or 2 per week. So last week, I did, small tool tips for buttons without labels. And this week, I Change the select box to, nice buttons, which, like, It's not wasn't my idea, but we had this design and Figma since, I don't know, forever.

Benedikt:

And we never got around to actually implementing it. I figured this was the perfect time to to actually do that change and make that change. So thanks a lot for a lot for Starting this initiative because otherwise, we'd probably ignore it for another year or so.

Benedicte:

And they look really nice. They look really nice.

Benedikt:

Yeah. They do

Benedicte:

We call them boxes, but I should have done buttons because I quote tweeted with I like big Boxes. But it would have been much better with I like big buttons, and I cannot lie.

Benedikt:

Yeah. But, like, the the fun thing is, like, it's not an it wasn't a new UI component even. It was literally just, like, switching one thing for the other, Which I guess is totally in line for, the sum of UI tweaks because it's not sum of UI reinventing. It's just like Small changes here and there that actually improve things. So, yeah, was a perfect candidate for that.

Benedicte:

We've been also been doing I haven't added that, but Bernard and I said I also fixed the UI tool tip that didn't change based on your selection. So you got, like, a little Confusion there where you're like, okay. But did I select it? Did I not select it? Because that then the the the helpful UI tip wasn't so helpful anymore.

Benedicte:

So he's fixed that.

Benedikt:

Nice. Yeah.

Benedicte:

Yeah. Other things you've done?

Benedikt:

Other things I've done it's been a while since we talked, so we've actually done a lot of things. More notably, We spend because

Benedicte:

you've actually been working full time.

Benedikt:

Yeah. I've been actually been working full time. Yeah. True. We've been updating all our front end dependencies a couple weeks So we are finally on the latest Amber version and Amber data version and and all of that.

Benedikt:

And, we also took opportunity to start, like, by default, Amberg ships with, code linting tools, like, for JavaScript and, templates. And so far, we've been ignoring those and just, like, not running them. But, we were foolish enough to decide to finally start doing this. And, like, You don't look excited. Yeah.

Benedikt:

I

Benedicte:

don't like excited for ignoring linting rules. No. I do not look excited about that. I'm excited you're now doing them.

Benedikt:

Yeah. We're not doing that. I mean, the problem is, like, our app is 5 years old by now. Right? So, I'm not entirely sure.

Benedikt:

Linting was a default thing back then in the project. And conventions also change a lot over time. So what was considered good 5 years ago isn't necessarily considered good today. So last year, when we first talked about this, there were still too many issues to reasonably, Fix them all. But we have since worked our way out of the old patterns that the framework encouraged to watch the new ones.

Benedikt:

So again, we were foolish enough to think we could just, like, quickly fix all of them and then continue. Well, they quickly turned into a week. So we spent fixing Linter errors for an entire week. But I think, yeah, by now, they are all gone. Like, we fixed everything.

Benedikt:

You also introduced, linting for style sheets, which is also quite nice. And again, like, with the upgraded dependencies and the linting, the code base is as shiny as it has ever been. Like, I'm not saying it's Perfect. And, like, there's there's nothing we can improve, but it's in a much better shape than it was before. And, That week of, work definitely paid off in terms of, like, code quality and and cleanliness.

Benedikt:

But again, we We underestimated the effort. We were like, this is just a handful of issues. We just quickly fixed them. But, yeah, That's insane. I think we never committed that many changes in a week than we did during that week.

Benedicte:

There's a similar effort at the bank where, it's always been TypeScript, but it hasn't been I'm not that into TypeScript exactly. So I might be saying this wrong, but we hadn't turned on, like, strict, and we didn't turn on it breaking when building If the TypeScript wasn't correct. So there was warnings, but you could ignore them kind of. And you would just get, like, squiggly lines in your editor, but Nothing, like, really bad happened. And that has now been turned on in all the projects and or is gonna be turned on.

Benedicte:

I think each app can turn it on themselves, but all of the tooling surrounding it had to be fixed before it could be turned on in the apps because we are consuming then Common libraries, and they need to be fixed before we can consume them with strict TypeScript. And it's been like a summer job, which is, like, a perfect use of summer because, You know, in most of Europe, things slow down, and there's not that many people at work. And there's also a code freeze. Like, you can't do any, new, publish any new things into the codebase in the summer because there are less people on support and less people all around. So it's it was like a Great.

Benedicte:

And somebody took this on upon themselves, and it's, like, finishing up now. And I think it's gonna be, Like, super helpful moving forward. Like, it's gonna be such a big help for all of us, and that somebody took the time to do that. I'm just in awe, like, that they They did that, and just very happy, for their for their work. And then 1 person is now doing it so that we can run a little script on our code.

Benedicte:

And what it will do is that it will create a comment that kind of turns it off for every every error we have So that we can still kind of build and and work with our code, but then it has, like, a little to do. And then you can go through all of those comments, the to do comments, and, like, fix it, And then enable linting or TypeScript checking, I guess, for each line after you fixed it, so that it doesn't kind of stop us or, like, completely stop the what we're working on. But that's yeah. That's it's it's cool. It's cool to see, but it's, like, effects, like, basically Every file.

Benedikt:

Mhmm. Yes. That's exactly what happened, for us as well. And we had a similar approach. Like, Blair was, like, running them all and then adding them to an ignore file.

Benedikt:

And then We split them up between us and, like, started I I think at some point, he was fixing stuff from the top of the list, and I started from the bottom. And eventually, We met in the middle and had fixed them all. Yeah. So, yeah, this was kind of, like, a little bit of a Of a breather we had, between, the experimental implementation of the visual workflow builder. And now, like, since last week, Leo's primarily working on the actual visual workflow builder.

Benedikt:

And, Jane, like, during the week where we're at the the linting doing the linting stuff, Jane came up with some really nice designs. So now it's like, everyone's super excited because The implementation and the design, like, finally come together, and it's looking really nice. I'm really excited about this. So that's that's what we're working on at the moment. At least what's Leos lay Leos working on Back end is mostly done for this.

Benedikt:

And I'm working on the continuation of trigger refactoring we've been doing over the last couple of weeks. So the server side has been done for quite a while now, But they spent a couple of days since we last talked on a new trigger component, like in the UI that now works with the New data structure where you don't like, basically, looks like the old one, but works with the new data structure and is a little bit more flexible. And, the nice thing is, like, previously, we had hardcoded all the triggers. And now with the new changes and the new UI component, it's basically a configuration file. Like, You can pass the component a schema of sorts, and it will figure out, like, The UI based on it.

Benedikt:

Mhmm. And that's that's really nice. It makes it super easy to add new stuff. And that's what I'm currently working with to To get our conversion goal implementation done, which ironically was also one of those projects that I think earlier this year, I was like, oh, we've got reporting, we've Got triggers. Merge them together.

Benedikt:

You get conversion goals out of it, and now we are in month 3 or so of this project. And it's only now, like, my plan for this week was to finish it, and actually make some good progress Today, that didn't happen, so maybe I'm not able to finish it, but I'll at least try. But it turned out to be one of those features where it sounded easy. And now that we are in it and, like, building it, like, the amount of open questions is just insane. And the Like, not like just like the open questions we have, but it feels like the open questions the world has about us.

Benedikt:

Because I like, some I tried answering some of those questions by googling with no, With no success and, we had some conversation with peers and different, like, who run similar products and analytics products, and they also don't have the answers. So it feels like

Benedicte:

This is one of those make a decision, and then just that's How it's That's how you do it.

Benedikt:

Yeah. Yeah. Yeah. Like, the thing we're struggling with in particular with this is like, So the idea of conversion goals is basically something happens, and then there's a window of, like, I don't know, 90 days where something else happens that you then can attribute to the initial thing happening. So in our case, it's like, I don't know, you send an email And you wanted that email to trigger the person to buy.

Benedikt:

And if they buy within, I don't know, a week, that counts as a conversion on that initial message. But then how do you con like, how do you calculate the conversion rate on that? And not just in 1 case, but in, like, a 100 cases in parallel and stuff that happened inside the window and outside the window, and you're only tracking, like, occurrences of conversions or, like, occurrences of the events and don't necessarily have Correlation to who did it, and I it's a I'm I'm I'm doing a bad job of describing it, but, like, Calculating any sort of conversion rate is weird.

Benedicte:

Yeah. And then you're back to, like, was it that email? Like, it could have been that they just, like

Benedikt:

Yes. That's I mean

Benedicte:

You know?

Benedikt:

That's the thing we decided to be fine with Since day 1 because in the end, you don't know. But it might have contributed. Mhmm. But, like, the thing It's

Benedicte:

the same it's the same as if it was a billboard ad. Right? Because, like, in the old days, you would or you still do. Like, you have a billboard ad and you if you then. But then, I guess, you never would have looked at 1 person, but you would say, like, we can see that sales are up in this area surrounding this billboard ad.

Benedicte:

So something has happened. But you can't say, like, that 1 person driving past it bought because of that. So the I guess the same thing would be for Email even though you have that data, if they open or not or if they clicked or not, it's still not, like, did that person buy? It's more Did this increase Yeah. Buying?

Benedikt:

Yeah. Yeah. Exactly. That's that's what we're trying to do. But, then for example, If you look at, like, all the messages sent over a week and then all the conversions over a week, you might be tempted to just, like, divided to to get, like, a conversion rate.

Benedikt:

Mhmm. But you end up with situations where we have, like, a 200% conversion rate and stuff like that, which doesn't make a lot of sense. And then we started thinking about, like, offsetting the the windows by the length of the conversion window. So we compare this week's conversion with last week's emails, which also is incorrect. I think the latest Thing we are trying to do is, like, have a rolling window of, like, the average over the last 90 days or so.

Benedikt:

And I don't know. That is It's super weird and super awkward. And we're still we're still trying to figure it out. But the plan for this week, as I said, is ship a version even if incorrect. So, you we have some real word data to work with.

Benedicte:

Behind the feature flag then, I guess.

Benedikt:

Yes. Behind the feature flag. Yeah. Again, I I I thought this was easy. It's not.

Benedicte:

I mean, it's just 1 pretty little graph. Like, how hard can it be?

Benedikt:

Yeah. Exactly. It's just like 1 number that you have to show and then,

Benedicte:

It's like 1 widget On your page, it's like Yeah. A widget. You know, it's just little widget. Like, how how hard can it be?

Benedikt:

Yep. Yep. A similar thing happened on the on the design for the new, for the visual workflow builder, Where Jane casually threw in an undo and then redo button in the UI. Yeah. And we were like, Yeah.

Benedikt:

Maybe not for version 1. Because so for I

Benedicte:

may come on. Maybe we can do it.

Benedikt:

I'm not entirely sure we can do it, at least not not in the current version of things.

Benedicte:

Okay.

Benedikt:

Yeah. Like it is complex. It's very complex because it's so much so many entities working together to to get that workflow. If you do. Yeah.

Benedikt:

I'm not getting into this. Like, it's complicated. We we we we are deliberately ignoring a lot of things, for version 1.

Benedicte:

Yes. So, no. But that makes sense. And also with visual stuff, like undo and redo becomes so much harder because it's like, if you moved something, is that an Like, if you moved something and it doesn't logically change something, it just, like, changes it visually a little bit, then is that an undo? And, like, how long do you have to move before it be an undo because it's pretty annoying if every pixel turns out being an undo is if you're undoing a move, you're, like,

Benedikt:

undoing every

Benedicte:

pixel. Yeah.

Benedikt:

Yeah. Yeah. Exactly.

Benedicte:

No. You should only undo after, like, let go of the thing. That's when we capture something that can be undone. Yeah. It's, Yeah.

Benedicte:

But I mean, every software has it. So how hard can it be?

Benedikt:

And then, like, you're editing messages inside, inside the workflow. So, is Doing an undo on the on the workflow level. Also, undoing, like, this one word change that you made in a message, like, 5 levels down, Stuff like that. I guess complicated. So that's, for now, we're not we're not adding those 2 buttons even though they were in the should design.

Benedicte:

They can stay on the Figma file.

Benedikt:

Yes. For

Benedicte:

another couple of years.

Benedikt:

A lot of stuff just stays in Figma and never sees the light of day.

Benedicte:

Oh, well. I am looking forward to seeing this visual builder because I hate visual builders. I think that you're gonna make a a good one.

Benedikt:

Hopefully. And maybe, we should run it past you before we before we launch it to

Benedicte:

Yes. Make an independent one like last time, and I'll have fun with it.

Benedikt:

Yeah. We we do. Like, I can actually send it to you, I guess. I have to double check, but we are we're working on it. Like, there's a storybook version of it.

Benedicte:

Mhmm. Exactly.

Benedikt:

Yeah.

Benedicte:

And I'll try to undo and be annoyed.

Benedikt:

Yeah. And you you will not be able to do it.

Benedicte:

Yes. Well, good one. I'll see you in 2 weeks or talk to you in 2 weeks. No.

Benedikt:

You won't because I will be on vacation.

Benedicte:

What? Are you going to like, you don't do vacation.

Benedikt:

Yeah. It's my 1st vacation this year. So, yeah, I will not be there. Actually, this

Benedicte:

is my last for you.

Benedikt:

This is my last week of work, and then I'm off for well, off as off as one of us can be. Right? But for 3 weeks. So I will be only be back in September. Woah.

Benedikt:

Yes.

Benedicte:

So I'll see you in 4 weeks then.

Benedikt:

Yeah. Yeah. Probably. And you can still decide if you wanna have a guest on, while I'm away. You probably

Benedicte:

should guest suggestions, folks. Get DM me guest suggestions, and I'll make it happen. Cool.

Benedikt:

Well, then, I guess,

Benedicte:

have a good rest of your week. And have a good vacation.