Meeting Title: Brainforge API and Cloudflare Sync Date: 2025-10-13 Meeting participants: Zoran Selinger, Henry Zhao
WEBVTT
1 00:00:26.070 ⇒ 00:00:27.610 Henry Zhao: Hey Zaran, how’s it going?
2 00:00:37.970 ⇒ 00:00:40.129 Henry Zhao: You’re saying a thing, you’re mute.
3 00:00:53.650 ⇒ 00:00:55.690 Zoran Selinger: Sorry about that.
4 00:00:57.000 ⇒ 00:00:59.250 Zoran Selinger: Didn’t realize that was on mute.
5 00:00:59.600 ⇒ 00:01:00.579 Zoran Selinger: Can you hear me alright?
6 00:01:01.160 ⇒ 00:01:02.650 Henry Zhao: Yeah, I can, how are you doing?
7 00:01:02.990 ⇒ 00:01:04.849 Zoran Selinger: Yeah, doing well, yes.
8 00:01:05.069 ⇒ 00:01:07.160 Zoran Selinger: Working on another client that we have.
9 00:01:08.110 ⇒ 00:01:14.769 Zoran Selinger: mostly trying to communicate for a few things for Eden, you saw that.
10 00:01:15.880 ⇒ 00:01:18.039 Henry Zhao: I haven’t gone through all the messages yet.
11 00:01:18.670 ⇒ 00:01:24.620 Zoran Selinger: Yeah, I’m just trying to figure out where our API calls for Norvim are, because that…
12 00:01:25.500 ⇒ 00:01:28.940 Zoran Selinger: That’s been kind of standing in place for a while now.
13 00:01:29.590 ⇒ 00:01:39.279 Zoran Selinger: I’ve been trying to get a clear answer from Vaish, and he never came back to me. Today, he did, finally.
14 00:01:39.740 ⇒ 00:01:43.770 Zoran Selinger: He told me he did check a few things, just didn’t tell me.
15 00:01:44.030 ⇒ 00:01:44.830 Zoran Selinger: Bone.
16 00:01:45.030 ⇒ 00:01:50.500 Zoran Selinger: So, at the moment, we don’t know where the API calls for NordBeam are coming from.
17 00:01:51.810 ⇒ 00:01:52.740 Henry Zhao: Okay.
18 00:01:53.370 ⇒ 00:01:54.100 Henry Zhao: I saw.
19 00:01:54.100 ⇒ 00:01:58.800 Zoran Selinger: I want to be sure, so I can tell the guys, okay, it’s definitely not from us.
20 00:01:59.870 ⇒ 00:02:03.219 Zoran Selinger: Let’s, let’s check it out. Let’s, let’s find it.
21 00:02:03.790 ⇒ 00:02:04.460 Zoran Selinger: No.
22 00:02:07.470 ⇒ 00:02:12.380 Henry Zhao: Okay. Do you think we’re ready for the afternoon edge layer chat with the client?
23 00:02:12.890 ⇒ 00:02:18.460 Zoran Selinger: We, are… As ready as we can be, right now.
24 00:02:18.690 ⇒ 00:02:25.570 Zoran Selinger: Let’s, let’s talk about, if, if you want to talk about anything, let’s talk about the schema.
25 00:02:26.370 ⇒ 00:02:26.900 Henry Zhao: Okay.
26 00:02:26.900 ⇒ 00:02:38.219 Zoran Selinger: Because I feel like we are not understanding each other there, in terms of the keys and all that. Basically, I’m giving you what I can give you, right?
27 00:02:38.430 ⇒ 00:02:43.289 Zoran Selinger: There’s not much else available on the Edge, really.
28 00:02:44.180 ⇒ 00:02:44.880 Henry Zhao: Okay.
29 00:02:46.320 ⇒ 00:02:50.469 Zoran Selinger: So there’s… there’s not much that we can do.
30 00:02:50.790 ⇒ 00:02:51.780 Zoran Selinger: There.
31 00:02:53.440 ⇒ 00:02:55.900 Henry Zhao: So I wonder if we need to join with segment data, then.
32 00:02:56.260 ⇒ 00:02:57.110 Zoran Selinger: Sorry?
33 00:02:57.460 ⇒ 00:02:59.899 Henry Zhao: So I wonder if maybe we need to join with segment data?
34 00:03:00.000 ⇒ 00:03:05.179 Zoran Selinger: Well… that was the idea, and I already implemented
35 00:03:05.600 ⇒ 00:03:10.670 Zoran Selinger: the GTM change for segment in particular.
36 00:03:11.590 ⇒ 00:03:12.700 Henry Zhao: Okay.
37 00:03:13.290 ⇒ 00:03:14.220 Zoran Selinger: So…
38 00:03:14.460 ⇒ 00:03:22.020 Zoran Selinger: Let me… let me just confirm… sorry, I’m just looking at the big monitor, I’m not looking at… at the camera.
39 00:03:22.830 ⇒ 00:03:27.660 Zoran Selinger: Let’s see… So I did… did change.
40 00:03:27.930 ⇒ 00:03:36.120 Zoran Selinger: something on this… on the segment. Basically, it should use our hidden user ID from the edge.
41 00:03:36.420 ⇒ 00:03:39.040 Zoran Selinger: as a user ID for segment.
42 00:03:40.910 ⇒ 00:03:42.320 Henry Zhao: It’s user ID right here.
43 00:03:43.160 ⇒ 00:03:48.790 Zoran Selinger: Yes, exactly. So that user ID should… you should find it on segment.
44 00:03:50.490 ⇒ 00:03:51.120 Henry Zhao: Okay.
45 00:03:51.120 ⇒ 00:03:59.859 Zoran Selinger: So, here, version 313 in GTM is my… my segment identify setup.
46 00:04:00.240 ⇒ 00:04:09.069 Zoran Selinger: So I added a few things, and modified the custom identified tag. Basically, that will, pick up
47 00:04:09.290 ⇒ 00:04:16.560 Zoran Selinger: Basically, it was initially, triggered to,
48 00:04:18.110 ⇒ 00:04:26.180 Zoran Selinger: to fire on the use… with the user ID of event modeler from Basque, and now we’re using Edge.
49 00:04:26.460 ⇒ 00:04:29.750 Zoran Selinger: As well.
50 00:04:31.760 ⇒ 00:04:34.969 Henry Zhao: Okay, so let me look into segment and see if I can join on this user ID.
51 00:04:35.410 ⇒ 00:04:38.450 Henry Zhao: If not, I’ll figure out what else I can join on.
52 00:04:39.590 ⇒ 00:04:41.249 Henry Zhao: And we should be good there, I think.
53 00:04:41.500 ⇒ 00:04:43.869 Henry Zhao: And I don’t really know how to use these click IDs.
54 00:04:44.120 ⇒ 00:04:46.470 Henry Zhao: So, if you have some guidance there, that’s helpful.
55 00:04:47.500 ⇒ 00:04:49.619 Zoran Selinger: I’m sorry, say again on the click IDs?
56 00:04:50.060 ⇒ 00:04:56.490 Henry Zhao: Yeah, I don’t know really what to do with these GCLID, LIFAT ID, like, all these IDs, I don’t really know what they’re used for.
57 00:04:56.490 ⇒ 00:04:58.930 Zoran Selinger: You know what, in general, what click IDs are?
58 00:04:59.560 ⇒ 00:05:02.360 Henry Zhao: Yeah, it’s the idea of them clicking through, right?
59 00:05:02.530 ⇒ 00:05:11.810 Zoran Selinger: Yeah, clicking on… typically on an ad. So, it uniquely identifies a single click on an ad.
60 00:05:12.450 ⇒ 00:05:13.870 Henry Zhao: Yeah, I just don’t know how that’s helpful.
61 00:05:14.310 ⇒ 00:05:22.789 Zoran Selinger: One-to-one, we can, if we have a click ID, we can connect it to the exact keyword, ad, campaign, ad group.
62 00:05:23.220 ⇒ 00:05:26.760 Zoran Selinger: everything in the advertising account. So these…
63 00:05:26.760 ⇒ 00:05:27.610 Henry Zhao: No, I don’t need the.
64 00:05:27.610 ⇒ 00:05:29.970 Zoran Selinger: For every single click.
65 00:05:30.140 ⇒ 00:05:31.499 Zoran Selinger: On an advertisement.
66 00:05:31.820 ⇒ 00:05:34.540 Henry Zhao: Yeah, but I don’t need it, because I just need the UTMs. Cool.
67 00:05:34.540 ⇒ 00:05:43.859 Zoran Selinger: That is fine, that is fine. If you don’t do anything, maybe in the future, we can use… maybe we want to use it for lookups at some point.
68 00:05:43.860 ⇒ 00:05:47.560 Henry Zhao: Yeah, yeah, we might need to export it, and then they need to look up in the platform, right?
69 00:05:47.560 ⇒ 00:05:48.450 Zoran Selinger: Yeah, yeah, exactly.
70 00:05:48.450 ⇒ 00:05:50.460 Henry Zhao: Got it, exactly.
71 00:05:51.850 ⇒ 00:05:57.850 Zoran Selinger: next thing on the edge is… is this. I was doing…
72 00:05:58.170 ⇒ 00:06:15.389 Zoran Selinger: a little bit of research, and I couldn’t make it happen on my side, on my website, because something is not working as it should be, because I definitely have the correct setup. But we can potentially use transform rules
73 00:06:15.750 ⇒ 00:06:17.250 Zoran Selinger: in Cloudflare.
74 00:06:18.740 ⇒ 00:06:22.899 Zoran Selinger: And I wanna just pitch that idea today.
75 00:06:23.550 ⇒ 00:06:31.210 Zoran Selinger: Basically, this is what’s happening on Cloudflare. Actually, let me…
76 00:06:31.440 ⇒ 00:06:35.069 Zoran Selinger: Let me share my screen. I’ll share my screen. I’m sure.
77 00:06:35.220 ⇒ 00:06:36.859 Zoran Selinger: I’m just log in.
78 00:06:37.240 ⇒ 00:06:39.460 Zoran Selinger: Just so you’ll see this.
79 00:06:41.410 ⇒ 00:06:43.980 Zoran Selinger: Just one thing did not work for me.
80 00:06:44.610 ⇒ 00:06:49.750 Zoran Selinger: And that seemed to be a bug.
81 00:06:50.270 ⇒ 00:06:51.850 Zoran Selinger: of the platform.
82 00:06:52.440 ⇒ 00:06:58.089 Zoran Selinger: At least for my account, I did not have time to dig into this a little bit deeper.
83 00:06:58.480 ⇒ 00:06:59.970 Zoran Selinger: Not yet, at least.
84 00:07:01.070 ⇒ 00:07:02.670 Zoran Selinger: But I wanna…
85 00:07:05.690 ⇒ 00:07:07.420 Zoran Selinger: Kind of throw that idea.
86 00:07:07.600 ⇒ 00:07:17.989 Zoran Selinger: out there. I know Utam told me there is one other person in Brainforge that can
87 00:07:18.740 ⇒ 00:07:21.580 Zoran Selinger: That knows Cloudflare a little bit.
88 00:07:25.250 ⇒ 00:07:31.099 Zoran Selinger: So I might ask again who that is, and talk to them.
89 00:07:31.440 ⇒ 00:07:35.710 Zoran Selinger: Okay, let me share my screen…
90 00:07:42.390 ⇒ 00:07:55.420 Zoran Selinger: Okay, so in my… So, under my domain… Basically, we have… We have page rules.
91 00:07:57.160 ⇒ 00:08:01.860 Zoran Selinger: So here… No, that’s not it.
92 00:08:04.730 ⇒ 00:08:12.450 Zoran Selinger: Yeah, so worker trigger rule. So, let me explain what this should do. I mean, it definitely does this, okay?
93 00:08:14.670 ⇒ 00:08:21.440 Zoran Selinger: So, it… we are rewriting URLs, but this is not for the end user.
94 00:08:21.790 ⇒ 00:08:36.460 Zoran Selinger: the URL that’s in the top stays the same, okay? So, actually, let me, let me back off and tell you what the problem is. We are, and you saw that, we are triggering our worker on every single page load.
95 00:08:36.830 ⇒ 00:08:43.120 Zoran Selinger: We want to do this only for… for where particular query parameters in the URL shows up.
96 00:08:43.659 ⇒ 00:08:50.520 Zoran Selinger: We only want to trigger it then. We don’t want to trigger it any other time. But… the worker…
97 00:08:50.840 ⇒ 00:08:57.019 Zoran Selinger: Firing rules do not support any matching with query parameters. This is our problem.
98 00:08:57.020 ⇒ 00:08:57.540 Henry Zhao: Okay?
99 00:08:57.840 ⇒ 00:09:03.150 Zoran Selinger: So, we need to have it in the URL pattern, somehow, without…
100 00:09:03.280 ⇒ 00:09:09.419 Zoran Selinger: without the query parameters. We can rewrite internally URLs.
101 00:09:11.480 ⇒ 00:09:18.490 Zoran Selinger: So, what the user sees is… is will be exactly the same, But…
102 00:09:18.900 ⇒ 00:09:29.130 Zoran Selinger: what the edge sees is gonna be something different, okay? So, I’m rewriting, so I’m URL rewriting this. If…
103 00:09:30.530 ⇒ 00:09:36.469 Zoran Selinger: I just took UTM sourcing or GCL ID are there, okay? If they are there.
104 00:09:36.710 ⇒ 00:09:37.980 Henry Zhao: instead of…
105 00:09:38.460 ⇒ 00:09:42.949 Zoran Selinger: keeping the same URL, I want the worker to see
106 00:09:45.320 ⇒ 00:09:53.080 Zoran Selinger: First, slash run worker, and then the rest of the URL, and I want to preserve all the query parameters.
107 00:09:53.620 ⇒ 00:09:54.180 Henry Zhao: Okay.
108 00:09:54.180 ⇒ 00:10:05.810 Zoran Selinger: So, worker, then you go into the worker itself, And you create a rule, That only triggers when…
109 00:10:05.960 ⇒ 00:10:10.510 Zoran Selinger: The URL… URL, the URL path starts with run worker.
110 00:10:10.690 ⇒ 00:10:11.770 Zoran Selinger: Right? Okay.
111 00:10:11.910 ⇒ 00:10:16.769 Zoran Selinger: Yeah, but I did run into a problem where.
112 00:10:17.310 ⇒ 00:10:22.790 Henry Zhao: that triggers some safety rules in Cloudflare, Okay.
113 00:10:23.580 ⇒ 00:10:25.779 Zoran Selinger: We do have options.
114 00:10:25.880 ⇒ 00:10:32.150 Zoran Selinger: to to… Oh, let me…
115 00:10:36.960 ⇒ 00:10:40.550 Zoran Selinger: Oui… not the security center, where is this?
116 00:10:41.410 ⇒ 00:10:45.670 Zoran Selinger: We have rules… Yeah.
117 00:10:46.740 ⇒ 00:10:47.649 Zoran Selinger: Come on.
118 00:10:51.130 ⇒ 00:10:54.490 Henry Zhao: Yeah, this is interesting to see, because I’ve never worked with Cloudflare before.
119 00:10:55.490 ⇒ 00:11:05.179 Zoran Selinger: basically, you can say to Cloudflare, if you see this header, for example, if you see this header in the request.
120 00:11:06.080 ⇒ 00:11:07.799 Zoran Selinger: Turn off all the rules.
121 00:11:09.220 ⇒ 00:11:19.139 Zoran Selinger: So that… basically, our changed… changed URL won’t actually be… be blocked, because at the moment.
122 00:11:19.690 ⇒ 00:11:22.040 Zoran Selinger: On my website, it is blocked.
123 00:11:22.320 ⇒ 00:11:24.420 Zoran Selinger: I get 403 forbidden.
124 00:11:25.070 ⇒ 00:11:29.209 Zoran Selinger: Because the rule is not working, and it should work.
125 00:11:29.870 ⇒ 00:11:31.750 Zoran Selinger: It’s definitely correct.
126 00:11:32.550 ⇒ 00:11:36.570 Zoran Selinger: The setup, I checked it. The setup is good.
127 00:11:41.370 ⇒ 00:11:42.659 Zoran Selinger: Where is it?
128 00:11:44.100 ⇒ 00:11:46.520 Zoran Selinger: So, yeah, there’s security, yep.
129 00:11:46.850 ⇒ 00:11:50.080 Zoran Selinger: Should be there. Yeah, okay, cool, so it’s there.
130 00:11:50.670 ⇒ 00:11:51.850 Zoran Selinger: Let me show you.
131 00:11:56.400 ⇒ 00:12:03.269 Zoran Selinger: Allow internal worker requests. Basically, there’s a… we add a custom secret into one of the headers.
132 00:12:03.780 ⇒ 00:12:04.340 Henry Zhao: Okay.
133 00:12:05.470 ⇒ 00:12:10.219 Zoran Selinger: So, and you see this? I’m skipping all the different checks.
134 00:12:11.780 ⇒ 00:12:21.959 Zoran Selinger: all the different checks that they have in place. I’m skipping everything, if that shows up, which means this is our… this is internally changed.
135 00:12:22.180 ⇒ 00:12:32.080 Zoran Selinger: and it’s a safe page load to load, and our, so browsers should see that this isn’t working for me. When I look at the logs.
136 00:12:32.550 ⇒ 00:12:34.539 Zoran Selinger: I checked everything.
137 00:12:34.750 ⇒ 00:12:54.029 Zoran Selinger: I gave even the logs and screenshots to AI and told it, can you see anything wrong here? And definitely not missing anything. So this rule, basically, it’s not working for me, even though it should be working, so I should go on to the support and go through all that process. I just wanted to, before I do that…
138 00:12:54.060 ⇒ 00:12:57.690 Zoran Selinger: I just wanna see with the guys if… What do they think?
139 00:12:58.370 ⇒ 00:12:58.940 Henry Zhao: Okay.
140 00:12:58.940 ⇒ 00:13:01.330 Zoran Selinger: Because I think this is the way to filter it.
141 00:13:02.050 ⇒ 00:13:09.639 Zoran Selinger: We can absolutely then impact… we can be on the… on the… Free tier, probably, with this.
142 00:13:10.480 ⇒ 00:13:11.190 Henry Zhao: Okay.
143 00:13:11.190 ⇒ 00:13:11.760 Zoran Selinger: No.
144 00:13:12.680 ⇒ 00:13:13.660 Henry Zhao: Okay, sounds good.
145 00:13:14.240 ⇒ 00:13:16.569 Henry Zhao: I don’t know if they’ll know how to answer, but yeah, that sounds good, thank you.
146 00:13:16.570 ⇒ 00:13:19.389 Zoran Selinger: Yeah, I mean, if you think, like.
147 00:13:19.580 ⇒ 00:13:25.790 Zoran Selinger: Yeah, I… this is what I have for that meeting. If you think that’s enough, yeah, we are ready for that.
148 00:13:25.790 ⇒ 00:13:29.469 Henry Zhao: Story’s gonna have other questions for you, just as a heads up, okay?
149 00:13:29.470 ⇒ 00:13:31.120 Zoran Selinger: Yeah, of course, of course.
150 00:13:31.120 ⇒ 00:13:31.650 Henry Zhao: Got it.
151 00:13:33.190 ⇒ 00:13:34.730 Henry Zhao: Okay, and that’s about it.
152 00:13:36.190 ⇒ 00:13:43.740 Zoran Selinger: Good, good. And yeah, we are going to… oh yeah, let’s make… let’s, make sure we make a point.
153 00:13:43.840 ⇒ 00:13:54.290 Zoran Selinger: Of telling them that we are not going to… we are going to keep a little bit more of a documentation, and maybe do things a little bit slower in the future.
154 00:13:54.950 ⇒ 00:13:55.490 Henry Zhao: Okay.
155 00:13:55.490 ⇒ 00:14:08.800 Zoran Selinger: maybe manage those expectations, because obviously we cannot do what we’ve done the first time. Yeah, you’re right, we did reverse it very quickly, identified the problem very quickly, and…
156 00:14:08.800 ⇒ 00:14:11.079 Henry Zhao: But I don’t know that that was avoidable, honestly.
157 00:14:12.600 ⇒ 00:14:19.690 Zoran Selinger: It… I mean, what I wrote, it… at that point, it was avoidable. I would have caught it.
158 00:14:20.690 ⇒ 00:14:22.979 Zoran Selinger: if I was in a meeting,
159 00:14:23.220 ⇒ 00:14:25.589 Zoran Selinger: From the first minute, I wasn’t.
160 00:14:26.270 ⇒ 00:14:34.699 Zoran Selinger: I don’t know if he already had it prior to the meeting, I don’t know, so it might have been… but if I had… if I had a checklist.
161 00:14:35.050 ⇒ 00:14:42.219 Zoran Selinger: I could have… I… I wouldn’t forget, basically, we would see this.
162 00:14:42.360 ⇒ 00:14:43.460 Zoran Selinger: You see this?
163 00:14:44.570 ⇒ 00:14:48.189 Zoran Selinger: So that… I would see this, and I would react to that.
164 00:14:48.340 ⇒ 00:14:50.990 Zoran Selinger: But I forgot. Okay.
165 00:14:50.990 ⇒ 00:14:51.670 Henry Zhao: Okay.
166 00:14:52.320 ⇒ 00:14:58.830 Zoran Selinger: A little bit more documentation checklist to be, I wouldn’t forget, so…
167 00:14:58.830 ⇒ 00:14:59.340 Henry Zhao: Okay.
168 00:14:59.730 ⇒ 00:15:06.820 Zoran Selinger: Yeah. So now they don’t have this, because they are on the paid plan, which never blocks requests.
169 00:15:07.540 ⇒ 00:15:15.130 Zoran Selinger: So they don’t have this option. This is only for a limited, when we have limited number of workers that can fire.
170 00:15:15.900 ⇒ 00:15:16.670 Henry Zhao: Okay.
171 00:15:16.680 ⇒ 00:15:18.819 Zoran Selinger: Yeah, okay, cool. So…
172 00:15:18.820 ⇒ 00:15:22.989 Henry Zhao: Okay, sounds good. And I’ll get working on the segment stuff ASAP.
173 00:15:22.990 ⇒ 00:15:25.200 Zoran Selinger: Okay, cool, cool. Excellent.
174 00:15:25.200 ⇒ 00:15:26.360 Henry Zhao: Excellent, thank you.
175 00:15:26.360 ⇒ 00:15:27.060 Zoran Selinger: Thanks, bye-bye.