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.