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.