Meeting Title: Brainforge x Ellie Integration Planning Date: 2025-10-27 Meeting participants: Uttam Kumaran, Zoran Selinger, Nick Milligan, Loren, IvanMiranda


WEBVTT

1 00:01:53.110 00:01:54.220 Zoran Selinger: Hello.

2 00:01:55.490 00:01:56.660 Nick Milligan: Hey, how’s it going?

3 00:01:57.480 00:01:58.460 Uttam Kumaran: Hey, Nick, how are you?

4 00:01:59.170 00:02:07.560 Nick Milligan: Good. I invited, I think I mentioned this in the email, our data engineer and then manager of data analytics.

5 00:02:07.770 00:02:13.749 Nick Milligan: our stack and our resources that are available for this integration. Cool. Speak saying, well, we have all these things, then…

6 00:02:14.840 00:02:17.490 Nick Milligan: Realizes it still sells up the infrastructure, so…

7 00:02:18.210 00:02:19.290 Uttam Kumaran: Okay, perfect.

8 00:02:21.360 00:02:24.660 Uttam Kumaran: I can wait for them. Yeah, I think it should be…

9 00:02:25.160 00:02:28.530 Uttam Kumaran: not too bad. I mean, Azure just tends to be complex with, like.

10 00:02:28.640 00:02:32.169 Uttam Kumaran: IAM and some of the resource provisioning, but…

11 00:02:32.380 00:02:36.400 Uttam Kumaran: our stuff isn’t too complicated, so I feel like we’re… we can…

12 00:02:37.000 00:02:43.199 Uttam Kumaran: You know, either hand it to your team, or if we get the, sort of, clear where to put stuff, we can also do that, so…

13 00:02:43.430 00:02:45.210 Nick Milligan: Awesome. Do you also have the,

14 00:02:45.490 00:02:49.719 Nick Milligan: I don’t know if you already sent this over to me, but, the technical documentation for the integration?

15 00:02:50.160 00:02:51.840 Uttam Kumaran: We can send that over.

16 00:02:52.960 00:02:54.710 Uttam Kumaran: Yeah, we’ll send that over after this.

17 00:03:06.370 00:03:10.969 Nick Milligan: Awesome, here’s Lauren, my Manager of Data Analytics, is that your title, right?

18 00:03:13.380 00:03:14.250 Uttam Kumaran: Hey, Lauren.

19 00:03:21.010 00:03:25.300 Uttam Kumaran: Don’t think you’re on mute, but maybe the mic’s not working, I don’t know, I can’t hear you.

20 00:03:28.110 00:03:29.110 Uttam Kumaran: Hey, Ivan.

21 00:03:33.440 00:03:34.340 IvanMiranda: Hi, good morning.

22 00:03:34.800 00:03:35.730 Uttam Kumaran: Hey, good morning.

23 00:03:36.300 00:03:37.040 Zoran Selinger: Okay.

24 00:03:39.470 00:03:40.720 Nick Milligan: Alright, hang on, everybody.

25 00:03:41.620 00:03:56.849 Uttam Kumaran: Yeah, so maybe let’s, let’s get started. I mean, I guess to kind of give some context, we’ve been helping, you know, the team, and Allison on, you know, several things on the… on the marketing, conversion, you know, management side.

26 00:03:56.850 00:04:02.030 Uttam Kumaran: And we’ve, you know, gone ahead and set up the proof of concept of

27 00:04:02.170 00:04:18.049 Uttam Kumaran: sort of the system, you know, for Allison, but we have done it in a, you know, a simple GCP instance, and we want to migrate it over to, you know, y’all’s Azure setup, and so that’s kind of the onus for the call.

28 00:04:19.000 00:04:37.320 Uttam Kumaran: you know, I talked… I’ve sort of sent a couple messages to Nick a little bit about, what it is we’re doing, but really, I’ll let Zoran kind of highlight that, but on the GCP side, we’re using BigQuery for, you know, just some simple, row-based data storage. We’re using Cloud Functions.

29 00:04:37.670 00:04:50.880 Uttam Kumaran: For an HTTP-triggered, like, event from Amplitude, I guess that’s probably just using webhooks, and then something for, PubSub as well. And then we have an event queue for, like, conversion uploads.

30 00:04:50.940 00:05:03.769 Uttam Kumaran: So I… we’re familiar a little bit with the Azure equivalents, like Azure Functions, Event Grid, but that’s sort of, like, our current system, maybe throw on,

31 00:05:03.990 00:05:05.870 Uttam Kumaran: Did I miss anything?

32 00:05:07.230 00:05:09.719 Zoran Selinger: No, that’s basically, that’s basically it, yeah.

33 00:05:10.430 00:05:11.050 Uttam Kumaran: Okay.

34 00:05:11.200 00:05:24.059 Uttam Kumaran: So, yeah, kind of the goal of this call is just to see, and we’ll kind of provide all the technical documentation and, like, functions of what we need to migrate, but just want to understand from your side,

35 00:05:24.460 00:05:33.330 Uttam Kumaran: Is that something that, we can get provisioned, like, Bay Area to do this, or we can even just pass it to your team for configuration?

36 00:05:33.510 00:05:36.559 Uttam Kumaran: Yeah, happy to kind of kick the conversation off there.

37 00:05:38.570 00:05:40.230 Nick Milligan: Sure. Yeah, I think…

38 00:05:40.810 00:05:51.530 Nick Milligan: I mean, I’m fine with either… either direction. I’ve done some very minor, like, Azure setups in the past for integrations, but it really depends on, you know, the applications being integrated into it, but

39 00:05:51.910 00:05:58.380 Nick Milligan: brought in Lauren and Ivan just because they understand the Azure Stack a lot more than I do, or ever want to know.

40 00:05:58.810 00:06:02.769 Nick Milligan: But, yeah, Ivan, Lauren, do you guys have a, preference?

41 00:06:03.840 00:06:04.500 Nick Milligan: Yeah.

42 00:06:10.240 00:06:18.480 Loren: Sorry, I’m a little confused. I missed the first part of what what was said here, are we…

43 00:06:18.940 00:06:24.039 Loren: So we’re trying to move something from… into the Azure stack? What’s going on?

44 00:06:25.210 00:06:26.450 Uttam Kumaran: Yeah, Zora Nikkad.

45 00:06:27.010 00:06:39.810 Zoran Selinger: Yeah, okay, cool. So, the reason why we need to move something is we implemented a custom solution to integrate between Amplitude and Google Ads.

46 00:06:39.900 00:06:55.380 Zoran Selinger: So this is… it’s very important to have… to have those, kind of conversion signals inside the campaigns, and obviously we have many franchisees that, have their own accounts, and, they would like to have that reporting.

47 00:06:55.390 00:07:02.660 Zoran Selinger: The… there is a native amplitude integration with Google Ads, which is…

48 00:07:02.790 00:07:18.799 Zoran Selinger: impossible to work with this scale, because we essentially, it’s, for one, for one connection in amplitude is only for one account and one conversion action. And we might have, you know, hundreds

49 00:07:19.260 00:07:20.579 Zoran Selinger: of accounts.

50 00:07:20.840 00:07:28.400 Zoran Selinger: hundreds of franchisees. And all of them can have multiple conversion actions that they would like to track.

51 00:07:28.630 00:07:36.110 Zoran Selinger: So, it’s essentially impossible to use the native integration between those two systems.

52 00:07:36.360 00:07:42.979 Zoran Selinger: So we had to build, a custom system that would do this,

53 00:07:44.090 00:07:46.379 Zoran Selinger: So that it’s kind of,

54 00:07:46.790 00:07:58.159 Zoran Selinger: much, much easier to manage. We went with the simplest possible solution, so for the… from the… basically, for the user interface, for the front end, we just used

55 00:07:58.350 00:08:00.270 Zoran Selinger: a Google Form.

56 00:08:00.770 00:08:12.780 Zoran Selinger: which sends data to a Google Sheet, and essentially syncs to BigQuery just for the settings. So this is a table that will at most have, you know.

57 00:08:13.850 00:08:16.760 Zoran Selinger: Couple of hundreds to 2,000 rows.

58 00:08:16.960 00:08:18.570 Zoran Selinger: And it’s… it’s…

59 00:08:19.120 00:08:26.429 Zoran Selinger: that’s basically it. So it’s basically the permutations of the number of accounts and conversion actions that we have.

60 00:08:26.560 00:08:31.399 Zoran Selinger: And the whole system is just two cloud functions.

61 00:08:32.860 00:08:47.810 Zoran Selinger: One of them is a controller that receives data directly from Amplitude, so it’s a… it has an endpoint, receives it to a webhook, and then there’s… between them, there’s a PubSub.

62 00:08:47.930 00:08:49.030 Zoran Selinger: Queue?

63 00:08:49.900 00:08:57.209 Zoran Selinger: That the second function just picks the message from the queue and uploads the conversion.

64 00:08:58.170 00:09:01.399 Zoran Selinger: That’s really everything there is to it.

65 00:09:01.520 00:09:17.220 Zoran Selinger: So that initial controller just reads the data from the BigQuery, so receives the payload from Amplitude, reads some settings from BigQuery, sends the message to a PubSub queue, to a subscription, to a topic.

66 00:09:17.440 00:09:27.000 Zoran Selinger: And then there’s a second function that actually does the Google Ads API call and uploads to the system.

67 00:09:27.010 00:09:43.649 Zoran Selinger: In the background, it’s not as smooth, because the Google’s API, it doesn’t allow us to, to implement, to look up the… the click. We don’t have any, any,

68 00:09:43.830 00:09:49.170 Zoran Selinger: Parameter that tells us exactly which account the click is from.

69 00:09:49.540 00:09:52.130 Zoran Selinger: So we have to attempt…

70 00:09:52.940 00:10:09.980 Zoran Selinger: either we have to do multiple calls to figure out where the click, came from, or we basically attempt to upload to all the eligible accounts for that particular event. And then, you know, when we find,

71 00:10:10.290 00:10:24.130 Zoran Selinger: an account that click… that the click came from, then we stop… we stop looping. This is unfortunately the limit of the API, so we have to deal with it. It’s…

72 00:10:24.160 00:10:34.559 Zoran Selinger: It’s nothing… it’s nothing terrible, but still, it’s a huge, huge improvement on… On, you know, managing…

73 00:10:34.740 00:10:38.490 Zoran Selinger: a thousand different connections inside the amplitude interface.

74 00:10:40.010 00:10:40.540 Nick Milligan: Interesting.

75 00:10:40.540 00:10:43.600 Zoran Selinger: So that’s… that’s… that’s the infrastructure in the backend.

76 00:10:43.600 00:10:48.859 Nick Milligan: I appreciate that. Is the end goal, and I have to… I’ve been in a few different…

77 00:10:49.400 00:10:59.339 Nick Milligan: too many meetings lately, but just to refresh my memory, like, obviously with the franchisees and, like, the… all the different locations, that one integration’s not gonna work, but having this multiple

78 00:10:59.410 00:11:12.829 Nick Milligan: Is the end goal to give us, like, give Ellie, corporate, Allison’s team the analytics, and then we divvy that out to the franchisees, or is this more so, like, each franchisee will be able to look in whenever they want to see

79 00:11:13.340 00:11:16.669 Nick Milligan: the data that’s pertinent to their location.

80 00:11:17.010 00:11:23.720 Zoran Selinger: So, the way this works, so first, for each franchisee that wants this.

81 00:11:23.820 00:11:32.840 Zoran Selinger: They have to be added to our… it’s called MCC account in Google Ads, so basically it’s a manager account that can have sub-accounts below it.

82 00:11:32.880 00:11:53.000 Zoran Selinger: So that’s the first step, and then we need to create… then we need to create a couple of conversion actions that they want to have, basic conversions, signals, conversion events that they wanna have in those accounts, and then the third step would just be to submit those into our, you know, BigQuery table via Google Forms.

83 00:11:53.000 00:11:56.159 Zoran Selinger: So that’s… there are basically 3-4 steps.

84 00:11:56.190 00:11:59.949 Zoran Selinger: To plug in a new franchisee into this system.

85 00:12:01.050 00:12:02.160 Nick Milligan: Okay, that makes sense.

86 00:12:02.160 00:12:02.720 Zoran Selinger: Yeah.

87 00:12:03.620 00:12:05.359 Nick Milligan: Awesome, thanks for the, overview.

88 00:12:05.560 00:12:06.160 Zoran Selinger: True.

89 00:12:10.550 00:12:15.390 Nick Milligan: Ivan or Lauren, do you have any… Thoughts or concerns?

90 00:12:15.530 00:12:26.139 Loren: Yeah… We’re not… So what’s… what’s needed on our end, and is…

91 00:12:26.370 00:12:30.229 Loren: Is this something that we’re moving on soon?

92 00:12:30.450 00:12:37.600 Loren: Is… is Allison deciding this stuff, or who… Yeah.

93 00:12:37.810 00:12:45.450 Uttam Kumaran: Yeah, so, I mean, this… these… this, these services right now are… are active. I… I… we don’t have a huge…

94 00:12:45.780 00:12:49.799 Uttam Kumaran: rush on moving these, but we do want to move these into your infra.

95 00:12:49.940 00:12:51.960 Uttam Kumaran: You know, of course.

96 00:12:52.080 00:13:02.919 Uttam Kumaran: So, you know, ideally, we can have a plan, and then if it’s… depending on your bandwidth, if you want us to get access to Azure and implement, we can do so, and then test and validate.

97 00:13:02.930 00:13:16.820 Uttam Kumaran: That’s totally fine. Like, we would just ticket everything out and sort of track that. We would need access to sort of the relevant Azure services, and if not, we would need to work with your team to, like, provision them if needed.

98 00:13:20.570 00:13:23.099 Loren: I honestly don’t completely know what that means.

99 00:13:23.270 00:13:27.160 Loren: To be honest. Ivan, do you have any… yeah.

100 00:13:27.510 00:13:35.690 Nick Milligan: The technical documentation will help us a lot in regards to, like, what we need to do on our side. Okay. Because, you know, Lauren and Ivan’s, their time, their time is very, like.

101 00:13:38.410 00:13:56.719 Nick Milligan: thin, so I guess the technical documentation will give us a really good insight on whether we want to, you know, provision… I can provision accounts for you guys to move the stack over, but I also kind of want to note… I brought them in just because I’m, you know, thinking about limits and calls and, like, what ceilings we’ll hit, because with anything.

102 00:13:56.790 00:14:02.969 Nick Milligan: Especially if it’s elastic. It’s gonna grow, and just being mindful of, like.

103 00:14:03.050 00:14:10.879 Nick Milligan: because we report to our, their VP of Finance, so understanding the kind of the full costs, too, is really important. Sure.

104 00:14:11.490 00:14:17.199 Nick Milligan: But I think that technical documentation will help us a lot in regards to, like, what the actual integration will look like.

105 00:14:17.360 00:14:19.500 Nick Milligan: And how we best can support it.

106 00:14:20.570 00:14:28.880 Uttam Kumaran: Okay. Yeah, we can write that, and then we would just show… I could just show you exactly, like, what the comparable Azure service that we would need spun up.

107 00:14:29.080 00:14:35.929 Uttam Kumaran: and then kind of the scope of, like, what we would do, and then, I’ll just throw that into a Notion doc, and then we can send that over this week.

108 00:14:36.200 00:14:45.900 Uttam Kumaran: Yeah, that’s totally fine. And then, well, we also… we already have documentation on the cost from our side, so the number of calls. Of course, we’re only seeing, like, what we’re seeing right now.

109 00:14:45.950 00:15:04.239 Uttam Kumaran: But we can highlight not only, like, the volume going through the system in terms of conversion events, but in addition, what it’s, like, how many, for example, cloud functions, they’re typically billed and, like, function run, but we can share how often they’re being run and things like that. And then, yeah, we can just kind of comment in that doc and probably go from there, if that’s fine.

110 00:15:04.970 00:15:06.520 Nick Milligan: I think that would be good.

111 00:15:07.220 00:15:07.840 Zoran Selinger: Cool.

112 00:15:08.600 00:15:09.200 Uttam Kumaran: Cool.

113 00:15:09.320 00:15:10.210 Uttam Kumaran: Okay.

114 00:15:10.210 00:15:22.009 Nick Milligan: Quick question, just as far as, like, you know, implementations you’ve done in the past, what is the normal, like, time frame, timeline, how long does it normally take to implement this or move the stack over for previous clients?

115 00:15:22.010 00:15:27.719 Uttam Kumaran: Yeah, I mean, this… probably end-to-end, this would probably take 2 weeks. I think we probably need at least, like.

116 00:15:28.030 00:15:34.789 Uttam Kumaran: The only reason I’m saying 2-week is so that we can test side-by-side, and then… Do a cutover.

117 00:15:35.880 00:15:46.400 Uttam Kumaran: the whole system, I think most of the, sort of, issues were just in, like, testing and confirming, like, the ergonomics with Allison. And now that we have something running.

118 00:15:46.400 00:15:51.250 Nick Milligan: I think in two weeks. The main things to just be… I would just be cautious of is that.

119 00:15:51.250 00:15:58.150 Uttam Kumaran: we have access to, like, all the small things we need in Azure. Usually that’s what takes time, given how complicated, like, Azure is.

120 00:15:58.150 00:16:00.930 Nick Milligan: And then we have enough time for testing, but…

121 00:16:01.510 00:16:04.469 Uttam Kumaran: I don’t know, I was on, like, 2 weeks? Seems pretty fair for this.

122 00:16:04.470 00:16:05.080 Zoran Selinger: Okay.

123 00:16:05.080 00:16:16.020 Uttam Kumaran: I think Zoran… Zoran probably thinks we just do it faster, but I… I said two weeks… I said, like, end-to-end would be good, so that way we could focus the first week on moving it over, the second week on testing, and cut over.

124 00:16:16.230 00:16:17.780 Nick Milligan: Sure, that makes sense.

125 00:16:18.320 00:16:30.959 Uttam Kumaran: These are pretty simple, just, like, little services, so it’s nothing, like, insanely complicated. Yeah, they do have one-to-one mapping between what their equivalent is in Google and Azure, so…

126 00:16:31.120 00:16:33.539 Uttam Kumaran: Yeah, hopefully not too bad.

127 00:16:35.790 00:16:48.780 Nick Milligan: Yeah, I think that’d be good. Okay. The full, like, scope of this, just because we’re quite risk-averse as a company in regards to, like, access to Azure, because Azure is amazing in the sense that they have a role for almost anything.

128 00:16:48.950 00:16:49.560 Uttam Kumaran: Yes.

129 00:16:49.560 00:16:52.330 Nick Milligan: Those roles actually say what they’re supposed to do.

130 00:16:52.520 00:16:54.970 Nick Milligan: Or actually give you those permissions, it’s just to go…

131 00:16:54.970 00:17:02.090 Uttam Kumaran: Definitely, and that’s also, for me, look, if we can just hand you the functions that we need to run, and, like, the validations on how to test.

132 00:17:02.210 00:17:12.160 Uttam Kumaran: Happy to do that, or if you want to provide us with just read-only access, or we want to do it on a call, totally happy to adhere to whatever, like, the security constraints are, so…

133 00:17:12.480 00:17:13.900 Nick Milligan: I think that’d be really helpful.

134 00:17:14.460 00:17:21.830 Nick Milligan: Okay. I think next steps would be getting the technical documentation so we can kind of just understand the full scope of it.

135 00:17:22.119 00:17:31.300 Nick Milligan: And any other… anything else you want to share with us in regards to, previous clients and how you’ve done it before? Just so we’re prepared, we can kind of carve out the time to best support this.

136 00:17:31.420 00:17:39.259 Nick Milligan: Because I do understand, you know, with Google Analytics being not HIPAA compliant, yet every company that deals with healthcare information uses Google Analytics.

137 00:17:39.260 00:17:40.200 Uttam Kumaran: Yes.

138 00:17:40.200 00:17:43.790 Nick Milligan: It’s been such a compliance nightmare the last year and a half.

139 00:17:44.110 00:17:44.610 Nick Milligan: So…

140 00:17:44.610 00:17:45.190 Uttam Kumaran: Yes.

141 00:17:45.190 00:17:48.040 Nick Milligan: Yeah, it’d be good to check this off our list.

142 00:17:49.080 00:18:02.230 Uttam Kumaran: Cool. Okay. Okay, perfect. Alright, so we’ll do that from our side, and yeah, I appreciate the time, and yeah, we’ll just try to coordinate everything sort of over email for this work stream, if that’s fine. We’re also in Slack with Allison. I don’t know if you guys are also on Slack.

143 00:18:02.230 00:18:03.369 Nick Milligan: I wish we were.

144 00:18:03.370 00:18:10.079 Uttam Kumaran: Okay, alright. So if email’s fine, then we’ll, we’ll just shoot the emails over.

145 00:18:10.080 00:18:11.460 Nick Milligan: Alright, sounds good.

146 00:18:11.460 00:18:14.249 Uttam Kumaran: Okay, alright. Thank you, everyone. Thanks, Ivan. Thanks, Lauren.

147 00:18:14.710 00:18:15.630 IvanMiranda: Thanks, guys. Thank you.

148 00:18:16.030 00:18:16.690 Loren: Means.