[00:00] (0.08s)
today we're doing a super exciting build
[00:02] (2.72s)
of a full app with cursor we're going to
[00:04] (4.20s)
see how fast we can do it I'm going for
[00:06] (6.52s)
20 minutes and if you don't know cursor
[00:08] (8.60s)
is the AI code editor a lot of people
[00:10] (10.40s)
are talking about it is it really living
[00:12] (12.40s)
up to the hype I personally think yes
[00:14] (14.08s)
been using it for maybe two months and
[00:17] (17.04s)
uh loving it really speeds up workflows
[00:19] (19.04s)
especially when you're building things
[00:20] (20.28s)
from scratch whether a whole app or just
[00:22] (22.64s)
new components for your app and various
[00:24] (24.20s)
things of that nature so in this video
[00:26] (26.04s)
I'm going to give you an overview of
[00:27] (27.48s)
what we're going to build why we're
[00:28] (28.72s)
building it and then I'm going to try to
[00:30] (30.00s)
fully launch this app and deploy it um
[00:33] (33.40s)
I'll show you how I'm doing everything
[00:35] (35.00s)
and hopefully it won't be too boring and
[00:37] (37.72s)
uh yeah we're going to see how fast it
[00:39] (39.96s)
will go so let's get started so I've
[00:42] (42.72s)
been trying to build kind of like
[00:43] (43.84s)
influencer marketing apps for close to
[00:46] (46.16s)
two years haven't had a huge hit with it
[00:49] (49.24s)
but the problem is definitely real which
[00:50] (50.84s)
is influencer marketing it can work
[00:53] (53.08s)
really well but for most brands it's
[00:55] (55.44s)
very difficult because the current tools
[00:57] (57.44s)
are inefficient they're expensive and
[00:58] (58.88s)
Etc so I'm playing around in this space
[01:01] (61.08s)
continuing to increase my knowledge try
[01:02] (62.80s)
different things and um one opportunity
[01:05] (65.44s)
I've seen recently is that a lot of
[01:08] (68.24s)
businesses like they already have their
[01:09] (69.40s)
customer list like say you're Shopify
[01:10] (70.96s)
store you have a record of everyone's
[01:12] (72.64s)
email who's ever bought from you and in
[01:14] (74.56s)
other cases you might have an email
[01:15] (75.96s)
subscriber list so what I'm thinking is
[01:18] (78.20s)
like these people are kind of the best
[01:19] (79.64s)
Advocates or Affiliates for the brand
[01:21] (81.88s)
and of course you can just email them
[01:23] (83.20s)
all a referral bonus an email offer uh
[01:26] (86.60s)
or another type of uh offer for
[01:28] (88.76s)
referring a friend however however um
[01:30] (90.72s)
when it comes to this list not
[01:32] (92.72s)
everyone's created equal so you might
[01:34] (94.96s)
have people who have bought from you who
[01:36] (96.44s)
are like big social media influencers
[01:38] (98.56s)
they have followings on Instagram Tik
[01:40] (100.32s)
Tok YouTube and with these people you
[01:42] (102.44s)
might want to send them like let's say a
[01:44] (104.52s)
free uh set of bonus products or um pay
[01:48] (108.04s)
them a little bit to be an advocate for
[01:49] (109.60s)
your brand and it's great because you
[01:51] (111.36s)
know they genuinely love your products
[01:53] (113.52s)
because they already bought from you or
[01:55] (115.20s)
subscribed to you and know you without
[01:57] (117.60s)
you paying them so basically if you can
[01:59] (119.52s)
find these people and then you know do
[02:01] (121.56s)
what you want on once you have this data
[02:03] (123.00s)
I think that could be huge uh for
[02:05] (125.48s)
companies so what I'm thinking is like a
[02:07] (127.68s)
super simple software tool which allows
[02:10] (130.68s)
you to upload your customer list and
[02:13] (133.08s)
then it gives you basically back which
[02:15] (135.32s)
of these influencers have large social
[02:16] (136.96s)
media followings using an influencer
[02:19] (139.28s)
sech API what I'm thinking is it can be
[02:21] (141.64s)
credit based so you can sign up get some
[02:23] (143.24s)
free credits see how it works and then
[02:26] (146.40s)
it's only going to charge you for
[02:28] (148.00s)
successful matches and then at least for
[02:30] (150.76s)
the MVP you can download the results of
[02:32] (152.64s)
everyone who is a match what is their uh
[02:34] (154.64s)
follower account platform URL to their
[02:37] (157.04s)
profile so you can go from there so I've
[02:39] (159.52s)
kind of already set up the project just
[02:41] (161.60s)
because that part is very boring and not
[02:43] (163.56s)
interesting uh basically I created a new
[02:45] (165.92s)
directory with vit I set up my Firebase
[02:48] (168.24s)
project which you can do with a Firebase
[02:49] (169.92s)
console and turned on Google off um I
[02:52] (172.16s)
set up Firebase locally meaning I just
[02:54] (174.24s)
linked my project to my uh repo my
[02:57] (177.56s)
Firebase project and I also added my uh
[02:59] (179.88s)
Secrets already to aend file because
[03:03] (183.84s)
yeah there I can't put those on YouTube
[03:06] (186.36s)
so and then yeah I'm also going to just
[03:08] (188.08s)
use an existing stripe account that I
[03:09] (189.76s)
have uh just because it's not worth
[03:11] (191.80s)
creating a new one for a practice
[03:13] (193.80s)
project but setting up stripe is very
[03:15] (195.44s)
easy uh basically if you want to see
[03:17] (197.36s)
everything I did here it is here are the
[03:19] (199.40s)
commands just set a v linked fir store
[03:22] (202.36s)
and moved my uh secrets from a temp
[03:24] (204.60s)
folder to my functions folder which are
[03:27] (207.00s)
mainly going to use the secrets we can
[03:28] (208.80s)
open up our running app it's just a V
[03:31] (211.88s)
starting point and uh then we can get
[03:35] (215.20s)
into what is our prompt going to be how
[03:37] (217.68s)
is cursor going to build this so I've
[03:40] (220.48s)
already got I've also gone ahead and
[03:42] (222.04s)
written a quite a detailed spec and
[03:45] (225.24s)
you're going to say well you know if
[03:46] (226.88s)
you're doing all this like it's not
[03:48] (228.28s)
really building from scratch and what
[03:49] (229.68s)
I'll say is this is like number one I
[03:51] (231.60s)
think writing as many details up front
[03:53] (233.68s)
it really helps you get the best first
[03:55] (235.20s)
shot output with the cursor composer
[03:58] (238.32s)
composer being the part of cursor that
[04:00] (240.52s)
can edit create and uh span across
[04:02] (242.80s)
multiple files because once you have the
[04:04] (244.80s)
generated code it's much harder to
[04:07] (247.48s)
change and so yeah and you can also have
[04:10] (250.80s)
ai generate this for you like if you're
[04:12] (252.52s)
not really familiar with your stack
[04:13] (253.96s)
already I might be able to fill in some
[04:15] (255.44s)
of the gaps that you have in your in
[04:17] (257.72s)
your knowledge especially if you're have
[04:19] (259.76s)
not been programming for almost 10 years
[04:21] (261.60s)
uh like I have so just running through
[04:23] (263.52s)
this super quick to find the stack up
[04:25] (265.44s)
top kind of like the color scheme the
[04:27] (267.08s)
data model we're going to have three
[04:28] (268.28s)
Firebase collections one one for people
[04:30] (270.16s)
who log in one for um successful matches
[04:33] (273.68s)
and saving the influencer data there and
[04:35] (275.52s)
then each CSV upload we do and what the
[04:38] (278.60s)
status of that upload is like did it
[04:40] (280.12s)
succeed did it fail for some reason def
[04:41] (281.76s)
find the secret Keys just so cursor
[04:43] (283.88s)
knows what they are and then of course
[04:45] (285.48s)
we have our provider react context so
[04:48] (288.44s)
that's we're going to have most of our
[04:49] (289.68s)
state and it basically is just the basic
[04:51] (291.92s)
stuff reading from the database
[04:54] (294.16s)
Collections and then writing to them and
[04:57] (297.28s)
our most important write which is the
[04:59] (299.08s)
actual check is going to occur in a
[05:01] (301.52s)
cloud function um just so it can run on
[05:05] (305.52s)
the back end and we can retry it Etc if
[05:07] (307.40s)
it fails now components SL pages is just
[05:11] (311.16s)
going to be our pages of our front end
[05:13] (313.76s)
so we have a simple landing page with
[05:16] (316.00s)
the at the slash path we have a login
[05:18] (318.08s)
page just going to use Google login
[05:20] (320.48s)
dashboard is going to display our entire
[05:23] (323.08s)
table of influencer matches and then
[05:27] (327.32s)
have some filtering I don't know if
[05:28] (328.96s)
that's going to work and then also have
[05:30] (330.76s)
a place where you can upload which is
[05:31] (331.96s)
going to have a drop zone you can drag
[05:33] (333.48s)
and drop files in and I've made this
[05:35] (335.68s)
really detailed because this part I
[05:37] (337.28s)
think is quite important and cursor can
[05:39] (339.56s)
mess it up if I'm not explicit um then
[05:42] (342.32s)
just the nav bar pretty straightforward
[05:44] (344.40s)
there and then finally the Firebase
[05:46] (346.72s)
functions AKA are a backend tasks
[05:49] (349.44s)
biggest one being the uh after you
[05:51] (351.92s)
upload what is the logic so I've kind of
[05:54] (354.20s)
basically written out the code I would
[05:55] (355.52s)
write in plain text because I don't want
[05:57] (357.68s)
it to miss anything um even even did a
[06:00] (360.84s)
request to our API just explicitly
[06:03] (363.68s)
because it can't really know that
[06:04] (364.96s)
without me providing a doc Source
[06:07] (367.08s)
similar and then yeah just error
[06:09] (369.52s)
handling basically everything you can
[06:11] (371.08s)
pause it and read through here if you're
[06:12] (372.44s)
interested and then the other web hookes
[06:13] (373.84s)
are just for Stripes so generating a
[06:16] (376.00s)
checkout session to buy more credits or
[06:20] (380.20s)
in addition to that a uh web hook which
[06:23] (383.40s)
when the checkout is successful it will
[06:25] (385.76s)
upload our user table with those credits
[06:28] (388.00s)
and then finally if you want to see like
[06:29] (389.32s)
your building history you can do a
[06:31] (391.00s)
hosted portal in stripe uh rather than
[06:33] (393.44s)
saving that to our own database just
[06:34] (394.96s)
more secure to keep it in stripe and the
[06:36] (396.96s)
UI is more familiar for people so with
[06:39] (399.96s)
all that being said let's just paste in
[06:41] (401.80s)
this in a cursor and see what happens
[06:44] (404.08s)
really really quick though before we do
[06:45] (405.56s)
that I want to just recommend if this AI
[06:48] (408.12s)
stuff is completely new for you a uh
[06:50] (410.20s)
free pdf that I've been recommending a
[06:52] (412.52s)
lot recently it is the AI for business
[06:54] (414.76s)
Builders guide from HubSpot it's just a
[06:57] (417.44s)
really I guess good starting point and
[06:59] (419.72s)
even if you think you know AI it just
[07:01] (421.56s)
helps you a lot with prompting when to
[07:03] (423.48s)
use apis and an overview of AI agents
[07:05] (425.96s)
which are getting quite popular and
[07:07] (427.40s)
you're seeing like huge valuations with
[07:09] (429.00s)
AI agent apps so basically it covers all
[07:11] (431.72s)
these things at a high level and gives
[07:14] (434.68s)
you some new terminology some new
[07:16] (436.00s)
techniques to try especially with your
[07:17] (437.40s)
prompts it's actually my favorite part
[07:18] (438.80s)
is the prompting section because you can
[07:20] (440.48s)
understand iterative prompting better
[07:22] (442.36s)
exemplary prompting where you give your
[07:24] (444.92s)
AI like some examples of outputs and
[07:27] (447.76s)
what those examples could be for the
[07:29] (449.68s)
best results as well as um trying to get
[07:32] (452.16s)
just better one shot prompts in general
[07:34] (454.04s)
they're some simple small tips but they
[07:36] (456.36s)
actually really personally helped me
[07:37] (457.88s)
when I started using a cursor more so
[07:40] (460.68s)
yeah if you're thinking about building
[07:41] (461.84s)
an app or a side project using AI tools
[07:44] (464.40s)
or actually integrating your AI into
[07:46] (466.48s)
that app specifically then this business
[07:48] (468.76s)
Builder guide is worth checking out it's
[07:50] (470.28s)
completely free just visit the link
[07:52] (472.00s)
below and shout out to HubSpot for
[07:54] (474.36s)
providing this resource and sponsoring
[07:56] (476.44s)
this video all right let's copy paste
[07:58] (478.80s)
our entire prod so I'm just taking it
[08:00] (480.48s)
from notes we're going over to our
[08:03] (483.68s)
cursor I have a different app open here
[08:06] (486.08s)
so let's just close that and then let's
[08:08] (488.44s)
open well other way we can do it is just
[08:11] (491.40s)
cursor and open like that all right so
[08:15] (495.04s)
we're just going to check yep everything
[08:17] (497.08s)
is as we can see a starter V repo and
[08:20] (500.20s)
then I'm just going to literally copy
[08:21] (501.72s)
paste as is here one more thing I want
[08:24] (504.00s)
to add code this entire app without
[08:26] (506.56s)
stopping don't add any todos
[08:30] (510.08s)
do everything reason I'm adding that
[08:32] (512.24s)
cursor can be a little bit lazy and just
[08:33] (513.72s)
say so you would do this and then the
[08:35] (515.88s)
rest of the ones You' kind of go from
[08:37] (517.44s)
there let's try to get it to do it on
[08:39] (519.04s)
the first try other thing I mentioned in
[08:40] (520.48s)
my other video you can use 01 or you can
[08:42] (522.88s)
use Claude Sonet I found sonnet to be a
[08:45] (525.20s)
little bit faster uh and pretty good
[08:47] (527.56s)
still so I'll just use Sonet for this
[08:49] (529.96s)
one so let's see how long it takes to
[08:52] (532.04s)
run starting at 222 and in the meantime
[08:54] (534.36s)
we could do some other I guess um I
[08:57] (537.44s)
don't know stuff with our config setup
[08:59] (539.32s)
on on fire base Etc but we've already
[09:02] (542.20s)
taken care of that so no worries okay
[09:04] (544.24s)
there's going to be certain parts of
[09:05] (545.32s)
this video that I speed up just cuz it's
[09:06] (546.92s)
a little bit boring but I'm going to try
[09:08] (548.92s)
to keep everything real time like no
[09:11] (551.48s)
cutting as much as possible and if you
[09:13] (553.44s)
want to see the real amount of time this
[09:14] (554.64s)
took just check the clock in the top
[09:16] (556.60s)
right hand corner so this is when I ran
[09:18] (558.44s)
the first prompt it's around 224 and
[09:21] (561.00s)
then you can just add the additional
[09:22] (562.20s)
time onto that it's done running it's
[09:23] (563.88s)
224 so I think it took about 2 minutes
[09:27] (567.36s)
which is cool cuz it created a ton files
[09:30] (570.12s)
so we saved everything and we already
[09:32] (572.28s)
know it's not going to work because it
[09:34] (574.36s)
did not install the dependencies for us
[09:36] (576.56s)
so actually we can also say provide a
[09:39] (579.36s)
list of npm dependencies we need to
[09:42] (582.76s)
install and then it will do that and
[09:45] (585.12s)
there's one other thing I know we need
[09:46] (586.68s)
to do which is to add our Firebase
[09:50] (590.40s)
config okay so it gave us what we need
[09:53] (593.28s)
to install in each directory so let's
[09:55] (595.44s)
first do these in the main directory
[09:57] (597.80s)
about 10 dependencies here and then we
[10:01] (601.40s)
can do the same in functions frankly at
[10:03] (603.76s)
the same time so let's do
[10:08] (608.72s)
that and while that is running let's
[10:12] (612.80s)
take our
[10:14] (614.96s)
Firebase um project uh
[10:19] (619.16s)
configuration from
[10:22] (622.16s)
Firebase so we just go to config
[10:26] (626.24s)
copy and we uh can control shift f for
[10:29] (629.60s)
Firebase
[10:33] (633.60s)
and add it right here
[10:37] (637.12s)
okay checking back
[10:39] (639.80s)
over okay this might be the one part I
[10:42] (642.08s)
speed up because uh my internet is uh a
[10:45] (645.60s)
little bit slow here in Japan so I'll
[10:48] (648.64s)
just see you in one minute all right
[10:51] (651.08s)
finally got it done as you can see it
[10:53] (653.40s)
took five minutes just to run that uh
[10:55] (655.92s)
and let's restart our server so the
[10:59] (659.72s)
dependencies we know are being pulled in
[11:01] (661.68s)
so here we go we have our starting point
[11:03] (663.92s)
at least and we can already see it's a
[11:07] (667.28s)
little bit messed up but I already know
[11:08] (668.88s)
the reason it's because
[11:11] (671.68s)
our V has some default CSS that we just
[11:15] (675.44s)
want to delete so we'll delete this file
[11:18] (678.32s)
and we'll also
[11:20] (680.00s)
delete this file because we don't need
[11:22] (682.84s)
these default Styles okay now we're full
[11:26] (686.00s)
withd we can get
[11:27] (687.36s)
started and we can sign up with Google
[11:31] (691.20s)
since we enabled Google off with
[11:33] (693.12s)
Firebase already it should hopefully
[11:35] (695.96s)
just work just slow internet took a long
[11:38] (698.96s)
time and okay now we are in so
[11:42] (702.64s)
unfortunately did not do a redirect but
[11:45] (705.52s)
we can check believe we called it
[11:47] (707.36s)
dashboard by visiting directly also gave
[11:49] (709.84s)
us a loading State that's cool um and I
[11:53] (713.20s)
have no idea where our menu items are
[11:55] (715.48s)
they're here they're just not visible so
[11:57] (717.96s)
we just have to change the sty on those
[12:00] (720.16s)
let's just go through the issues as we
[12:01] (721.48s)
see them so yeah the first one is going
[12:03] (723.76s)
to be this so let's just jump in and get
[12:06] (726.48s)
familiar with our directory so we have
[12:11] (731.08s)
navbar which my guess is it's here and
[12:15] (735.76s)
then let's actually just do a generator
[12:19] (739.08s)
on these
[12:20] (740.24s)
buttons yeah account uploads and leads
[12:24] (744.08s)
and make these visible on
[12:27] (747.84s)
ypg so I just hit uh command K we'll see
[12:31] (751.68s)
if it fixes it for us no so that is
[12:36] (756.36s)
we're getting into the first issue here
[12:38] (758.68s)
with um
[12:41] (761.00s)
yeah with uh cursor when it doesn't have
[12:44] (764.48s)
the full context of everything it
[12:45] (765.84s)
doesn't know how to make changes so
[12:47] (767.96s)
because it doesn't know the background
[12:49] (769.12s)
color it doesn't know what to change the
[12:51] (771.16s)
text color to let's try changing the
[12:54] (774.24s)
button variant to make always visible on
[12:59] (779.84s)
background but no border yeah so these
[13:03] (783.04s)
are buttons still um probably we just
[13:06] (786.52s)
want to change these to
[13:12] (792.20s)
text so just doing one more change here
[13:15] (795.36s)
there we go and then we can add hover
[13:18] (798.04s)
State more padding uh Flex items align
[13:21] (801.16s)
Center let's just do margin
[13:23] (803.84s)
right8 and then auto complete should
[13:26] (806.24s)
help us a little bit here yeah I'm just
[13:28] (808.88s)
hitting Tab and then let's just add
[13:32] (812.04s)
hover state to
[13:37] (817.28s)
these and more or less it worked we
[13:39] (819.88s)
might want to add a transition to make
[13:41] (821.32s)
that look a little bit better but uh no
[13:43] (823.28s)
worries next thing is this sign out menu
[13:45] (825.96s)
button is not great
[13:49] (829.72s)
so we can just do change to dark color
[13:55] (835.36s)
scheme see if that works still no so
[13:58] (838.88s)
that issue is I think in this menu item
[14:01] (841.56s)
yeah so the hover the non-hover state is
[14:04] (844.96s)
messing it up so let's just start it
[14:07] (847.16s)
with a dark gray and then it will go to
[14:08] (848.72s)
a lighter gray okay so we kind of fixed
[14:10] (850.92s)
our menu bar here let's check if all the
[14:14] (854.44s)
links work this is not going to work yet
[14:16] (856.68s)
because we haven't set up our portal
[14:19] (859.04s)
link code and because we don't have any
[14:22] (862.08s)
leads yet again this doesn't look great
[14:24] (864.00s)
but it's fine for MVP we can go to
[14:26] (866.72s)
uploads so I've created a mock data
[14:28] (868.36s)
spreadsheet just with with name and
[14:29] (869.64s)
email in Google Sheets and I downloaded
[14:32] (872.32s)
that already so let's just try the drag
[14:34] (874.76s)
and drop
[14:37] (877.04s)
and find
[14:39] (879.12s)
that from our most recent download so
[14:42] (882.28s)
I'm going to drag this in it allows us
[14:45] (885.20s)
to map it's not automatically mapping
[14:47] (887.12s)
the fields which we should potentially
[14:49] (889.40s)
fix and then
[14:51] (891.08s)
continue all right so now we're getting
[14:53] (893.24s)
failed to confirm
[14:54] (894.76s)
upload so we can just debug that by
[14:57] (897.20s)
going to
[15:00] (900.84s)
here and this is doing a callable
[15:04] (904.56s)
function now the reason is our callable
[15:06] (906.76s)
functions are not running uh but what
[15:09] (909.24s)
what we can do is add a functions
[15:12] (912.16s)
emulator in development environment this
[15:14] (914.64s)
is just the domain knowledge for
[15:16] (916.16s)
Firebase and we can also do mpm run
[15:20] (920.00s)
serve to get those colable functions
[15:24] (924.52s)
working uh I think that's fine yeah so
[15:29] (929.76s)
when node n not production run functions
[15:34] (934.56s)
emulator all right so I duplicated some
[15:37] (937.08s)
code we can just delete down here and we
[15:40] (940.08s)
can do that restart our server now in
[15:42] (942.60s)
theory uh callable function should work
[15:45] (945.40s)
but we have an error our node version
[15:49] (949.08s)
doesn't match so let's just do NVM
[15:53] (953.56s)
16 and then try running it again and
[15:57] (957.64s)
then we have an actual syntax error I
[16:00] (960.24s)
already know it's with node
[16:01] (961.84s)
fetch so um let's just go to our
[16:05] (965.56s)
functions file yeah no node fetch is
[16:08] (968.20s)
really weird like that like always has
[16:10] (970.84s)
this error so I usually just pull this
[16:13] (973.16s)
from another repo but let's see if
[16:14] (974.52s)
cursor can do
[16:18] (978.92s)
it that's not going to work because you
[16:20] (980.96s)
need require statements in functions and
[16:25] (985.68s)
or maybe you don't I don't remember um
[16:28] (988.00s)
so I'm just going to take this this from
[16:29] (989.48s)
a different repo cuz previously like a
[16:32] (992.24s)
GitHub searched for this issue but um
[16:36] (996.24s)
yeah this is just a little bit
[16:38] (998.08s)
faster so with the node fetch huh that's
[16:42] (1002.76s)
not a problem
[16:45] (1005.76s)
there just
[16:48] (1008.52s)
see it's this one that we need like this
[16:53] (1013.48s)
so I'm just copy this and then we'll try
[16:57] (1017.72s)
this see if that works all right so I
[17:01] (1021.16s)
refreshed we are no longer getting that
[17:03] (1023.32s)
error now we have this secret key error
[17:06] (1026.16s)
and it didn't want to pull this from an
[17:07] (1027.92s)
environment variable so we can just pull
[17:10] (1030.16s)
it from our stripe secret key like that
[17:14] (1034.44s)
and now uh API key config
[17:18] (1038.44s)
authenticator so it just didn't quite
[17:20] (1040.60s)
use our environment variables correctly
[17:23] (1043.96s)
so uh we just want to change that this
[17:27] (1047.92s)
one's going to come later when we set up
[17:29] (1049.48s)
our web Hook and the one it's giving us
[17:33] (1053.80s)
an issue with now is what API key config
[17:38] (1058.48s)
authenticator yeah so we're going to
[17:40] (1060.04s)
want to replace all this uh code here so
[17:42] (1062.88s)
let's just comment this out for now
[17:44] (1064.68s)
because
[17:46] (1066.40s)
it's yeah we got to set that up in
[17:49] (1069.20s)
stripe all right now uh stripe uh wait
[17:55] (1075.04s)
check out
[17:57] (1077.12s)
session wait where is this going coming
[18:01] (1081.04s)
from okay let's just
[18:03] (1083.24s)
restart okay let's check the stack Trace
[18:09] (1089.24s)
stripe okay so we're just not
[18:12] (1092.32s)
quite doing this
[18:15] (1095.12s)
correctly and if I check my other repo
[18:20] (1100.40s)
here just for
[18:22] (1102.76s)
reference yeah we need secret key but we
[18:26] (1106.32s)
can actually just move this import into
[18:29] (1109.36s)
our functions so we can deal with it
[18:32] (1112.56s)
later okay now we're getting this error
[18:37] (1117.04s)
our emulator is not running but it
[18:39] (1119.52s)
should be and now we can check so it
[18:42] (1122.44s)
should be connected oh fire store
[18:45] (1125.16s)
emulator that's my bad okay so let's try
[18:47] (1127.92s)
that again long detour there but let's
[18:52] (1132.16s)
just see if it works all right same
[18:55] (1135.00s)
error uh now it's been blocked
[18:59] (1139.40s)
probably it just doesn't match the name
[19:04] (1144.08s)
check and confirm okay so basically I
[19:07] (1147.92s)
created a function that doesn't exist
[19:11] (1151.12s)
and what we want to do in this case is
[19:15] (1155.08s)
just go back because we don't actually
[19:17] (1157.40s)
need a function for check and confirm
[19:20] (1160.56s)
upload we just want to do this
[19:24] (1164.96s)
locally so like me just read this
[19:30] (1170.80s)
check in confirm upload so let's go back
[19:33] (1173.28s)
to our spec and actually see what we
[19:35] (1175.16s)
wrote here so the Drop Zone let's see
[19:39] (1179.08s)
probably just wrote a mistake in here
[19:40] (1180.80s)
continue should call check in confirmed
[19:44] (1184.04s)
upload yeah I just referenced a function
[19:46] (1186.64s)
that doesn't exist so the AI guessed it
[19:49] (1189.20s)
was a Firebase function but then it
[19:51] (1191.32s)
didn't Implement that function because I
[19:52] (1192.96s)
didn't tell it what it was
[19:55] (1195.88s)
so let's just right here replace check
[19:59] (1199.08s)
and confirm upload with checking CSV
[20:07] (1207.40s)
against what did we
[20:10] (1210.36s)
call our leads confirmed leads and
[20:15] (1215.92s)
finding um non duplicated
[20:20] (1220.40s)
values save this in
[20:26] (1226.52s)
Leads and check whether
[20:29] (1229.52s)
it is less than
[20:40] (1240.12s)
credits okay then set a state variable
[20:45] (1245.20s)
confirm count for the
[20:48] (1248.84s)
number of non
[20:55] (1255.12s)
duplicates now we add this new state
[20:57] (1257.36s)
variable we make sure we have it in our
[21:01] (1261.00s)
okay yeah it should work and then let's
[21:03] (1263.40s)
just find where we
[21:07] (1267.28s)
checking okay so basically it was just a
[21:11] (1271.36s)
small oversight that took a long time to
[21:14] (1274.12s)
fix because we had to read we had to
[21:16] (1276.12s)
read the code to understand what was
[21:19] (1279.08s)
happening but that also made us more
[21:21] (1281.24s)
familiar with our code base so it's no
[21:23] (1283.96s)
problem all right and now we have the
[21:26] (1286.88s)
next state so
[21:29] (1289.44s)
we can uh I think just reverse the order
[21:31] (1291.84s)
these buttons make them back visible as
[21:34] (1294.72s)
well and then let's do color scheme teal
[21:37] (1297.80s)
on this and then confirm upload will
[21:40] (1300.92s)
call handle upload let's just check what
[21:43] (1303.44s)
that's going to do first okay so it's
[21:46] (1306.60s)
going to do do upload from our functions
[21:49] (1309.56s)
and do upload is in fact not a callable
[21:54] (1314.16s)
function we only have one that we're
[21:56] (1316.32s)
going to call directly so instead we
[21:58] (1318.32s)
want to I actually see the issue here
[22:00] (1320.28s)
it's not okay yeah it's not using ad doc
[22:03] (1323.36s)
at all
[22:06] (1326.04s)
so replace do upload with ADD doc to
[22:11] (1331.88s)
uploads and then just to give it all the
[22:16] (1336.56s)
info that it needs we'll make sure that
[22:19] (1339.60s)
it has all the correct properties now I
[22:21] (1341.96s)
kind of messed up here because we do
[22:24] (1344.00s)
need that lead list that confirmed set
[22:27] (1347.52s)
of emails and I just replaced it with a
[22:30] (1350.00s)
counter variable so we need to actually
[22:32] (1352.12s)
bring that back and let's just remove
[22:34] (1354.44s)
confirm count because that's kind of
[22:36] (1356.32s)
redundant and then we'll replace all
[22:40] (1360.76s)
references with confirm leads length so
[22:44] (1364.68s)
I'm just uh basically control fing for
[22:48] (1368.64s)
confirmed count replacing it again with
[22:50] (1370.72s)
confirmed leads and then
[22:53] (1373.76s)
saving all right so it reset our state
[22:57] (1377.44s)
so let's just bring this I'm back and
[23:00] (1380.40s)
see if our right works and our state
[23:03] (1383.20s)
updates so name email continue found two
[23:07] (1387.32s)
new leads and now it is processing so
[23:09] (1389.92s)
that's cool so let's actually
[23:12] (1392.84s)
check back here in our database this is
[23:17] (1397.92s)
Firebase and we do have an uploads
[23:20] (1400.08s)
record is complete false Etc so uh yeah
[23:25] (1405.56s)
it turns out yeah the oncreate fun
[23:28] (1408.48s)
function will only run when um the fire
[23:32] (1412.24s)
store emulator is running so I guess I
[23:35] (1415.52s)
didn't know that I don't WR these types
[23:37] (1417.76s)
of functions enough but I guess what we
[23:39] (1419.96s)
can do is we can add a retry Handler
[23:43] (1423.48s)
which in the meantime that that will be
[23:45] (1425.48s)
a useful feature to have in general but
[23:49] (1429.28s)
um basically it can just manually call
[23:51] (1431.68s)
this same logic so what what we can
[23:54] (1434.40s)
actually do is go into a function
[23:59] (1439.56s)
and basically take this logic out yeah
[24:03] (1443.80s)
and then we can do it sort of like
[24:08] (1448.16s)
this and then we can just use this both
[24:11] (1451.04s)
in a on create function and a callable
[24:14] (1454.92s)
function so let's actually check so we
[24:19] (1459.56s)
need to just upload ID okay let's let's
[24:22] (1462.56s)
take just upload ID as an argument here
[24:25] (1465.00s)
and then read from the uploads
[24:26] (1466.68s)
collection and then
[24:29] (1469.12s)
alternatively we can add an upload field
[24:32] (1472.56s)
just in case we've already read from uh
[24:35] (1475.76s)
fir store in the case of the oncreate
[24:38] (1478.40s)
function we already have that reference
[24:41] (1481.00s)
so we can do if
[24:43] (1483.16s)
upload is uh undefined then read from
[24:46] (1486.68s)
the uploads
[24:48] (1488.92s)
table upload
[24:51] (1491.16s)
equals yeah and then data um okay in
[24:56] (1496.56s)
this case we will just
[24:58] (1498.84s)
move all this code inside of
[25:03] (1503.88s)
here and
[25:07] (1507.44s)
then we can do
[25:09] (1509.88s)
this uh we can also do an export on
[25:16] (1516.36s)
call and auto complete worked nicely
[25:19] (1519.48s)
there and then if there's an error we
[25:23] (1523.40s)
can uh also do a return true if it
[25:27] (1527.76s)
worked and return false if it didn't
[25:30] (1530.48s)
because callable functions don't have
[25:32] (1532.68s)
very good error handling like that so
[25:36] (1536.44s)
process upload now we just want to do a
[25:38] (1538.84s)
callable function and a retry column so
[25:41] (1541.64s)
let's just search for one of our column
[25:43] (1543.48s)
headers and we have action and now it
[25:46] (1546.96s)
will actually retry for us I don't think
[25:50] (1550.24s)
this is the right function maybe
[25:51] (1551.84s)
actually it is uh handle process upload
[25:57] (1557.04s)
okay it is
[25:59] (1559.16s)
and then what is our colable function
[26:01] (1561.24s)
name just process upload so we just need
[26:05] (1565.00s)
a new function yeah that does
[26:10] (1570.76s)
this and it's reading our other files so
[26:15] (1575.44s)
it is in fact just autoc completing
[26:18] (1578.60s)
everything so let's see if it
[26:21] (1581.40s)
works uh we might also want a loading
[26:23] (1583.60s)
State on this
[26:24] (1584.80s)
button
[26:26] (1586.84s)
so usually we will do like set
[26:31] (1591.88s)
loading set loading false at the end and
[26:36] (1596.08s)
then we just need that as a state
[26:38] (1598.84s)
variable boom all
[26:41] (1601.68s)
right moment of truth and let's put that
[26:44] (1604.92s)
on the process button sorry also this
[26:47] (1607.80s)
loading
[26:49] (1609.84s)
State okay so it's called our colable
[26:53] (1613.32s)
function we can see in the console it uh
[26:57] (1617.36s)
initialized it
[26:58] (1618.92s)
didn't necessarily connect so let's
[27:00] (1620.76s)
check the
[27:01] (1621.84s)
console and upload is undefined so let's
[27:07] (1627.16s)
double check and now this is as you can
[27:09] (1629.68s)
see kind of turning into just
[27:11] (1631.68s)
normal like uh coding here so probably
[27:16] (1636.64s)
this is not going to be
[27:20] (1640.08s)
passing this correctly yeah data upload
[27:26] (1646.36s)
okay um so let's try that again it's not
[27:30] (1650.88s)
going to succeed or fail so we need to
[27:33] (1653.76s)
try this
[27:34] (1654.96s)
again okay okay this is a great progress
[27:38] (1658.72s)
so at least we are moving forward so now
[27:44] (1664.52s)
we have in functions a config variable
[27:48] (1668.32s)
still left in there and let's replace
[27:51] (1671.00s)
this with uh yeah Bally these
[27:55] (1675.88s)
values okay saved let's try
[27:59] (1679.12s)
again we need some sort of a timeout or
[28:01] (1681.72s)
something on that because it's not
[28:03] (1683.92s)
upload updating the loading State
[28:06] (1686.00s)
correctly okay snap is not defined this
[28:10] (1690.36s)
uh this is good
[28:14] (1694.20s)
so oh we can do snap
[28:20] (1700.40s)
here so I guess we going to have
[28:23] (1703.08s)
to create a third variable here that we
[28:26] (1706.96s)
can pass into snap app also and then
[28:34] (1714.36s)
here then that should actually do the
[28:36] (1716.64s)
trick uh all
[28:38] (1718.72s)
right let's try this again and let's
[28:42] (1722.68s)
also debug our is loading because for
[28:46] (1726.36s)
whatever reason you can just log result
[28:49] (1729.00s)
to see what happens next
[28:50] (1730.92s)
time let's process check our logs
[28:55] (1735.08s)
here and we have a failed so let's check
[28:59] (1739.64s)
our object data
[29:01] (1741.84s)
false status error okay at least our
[29:04] (1744.40s)
error updated and we didn't provide we
[29:08] (1748.32s)
we're not logging correctly in our
[29:11] (1751.08s)
function so I think this request failed
[29:15] (1755.24s)
let's just log that and try one more
[29:19] (1759.92s)
time okay
[29:22] (1762.68s)
so I think
[29:24] (1764.96s)
our let may just check the API Dot
[29:31] (1771.56s)
here because this is
[29:34] (1774.64s)
now causing the
[29:39] (1779.36s)
issue post email
[29:43] (1783.32s)
search for some reason it's
[29:46] (1786.56s)
forwarding this to
[29:49] (1789.48s)
XT yeah just had it run API do email-
[29:57] (1797.04s)
search all
[30:01] (1801.76s)
process okay so we got another error but
[30:04] (1804.48s)
at least it wasn't the going into here
[30:08] (1808.24s)
if you get what I mean so let's now
[30:10] (1810.48s)
console log out the data because
[30:12] (1812.48s)
probably just be shape of the response
[30:15] (1815.00s)
is not what we
[30:16] (1816.40s)
expected yeah so we got not matched
[30:18] (1818.68s)
emails and matched
[30:21] (1821.20s)
emails data let's just re Check Total
[30:24] (1824.48s)
matches zero as expected
[30:30] (1830.44s)
and let's just bring
[30:43] (1843.16s)
um okay it's because matched emails is
[30:47] (1847.08s)
undefined so if data matched
[30:50] (1850.64s)
emails so we're just going to do that
[30:52] (1852.84s)
conditionally and
[30:55] (1855.04s)
then also this conditionally
[30:59] (1859.76s)
and then Auto completely messed up
[31:02] (1862.68s)
somewhere so we just
[31:05] (1865.68s)
undo and here we can't set values as
[31:09] (1869.48s)
null so I just do empty
[31:11] (1871.72s)
array and then
[31:14] (1874.08s)
save all right let's try
[31:18] (1878.60s)
again okay so we got failed to process
[31:22] (1882.08s)
we got not L emails but it's unclear
[31:26] (1886.40s)
exactly where
[31:29] (1889.08s)
this is
[31:30] (1890.92s)
um happening so total matches probably
[31:36] (1896.44s)
because this could be one
[31:38] (1898.88s)
issue um actually let's check if credits
[31:42] (1902.44s)
because that should always be
[31:47] (1907.52s)
set yeah credits is there user data
[31:52] (1912.96s)
credits we can just in
[31:56] (1916.16s)
fact see if the lead stable was created
[31:59] (1919.44s)
that'll give us a little bit of info so
[32:02] (1922.44s)
we didn't get
[32:18] (1938.20s)
so data
[32:21] (1941.28s)
not uh I don't think we need this we
[32:24] (1944.04s)
just need this because the emails should
[32:28] (1948.08s)
already be in the leads
[32:30] (1950.92s)
collection
[32:33] (1953.80s)
and I think we're just not
[32:37] (1957.08s)
logging the error so that would be
[32:41] (1961.88s)
something standard I wouldn't even think
[32:43] (1963.88s)
to um add manually like I just do it
[32:48] (1968.36s)
already so probably why I missed
[32:52] (1972.92s)
it okay great so it's the server
[32:56] (1976.52s)
timestamp there's always
[32:58] (1978.68s)
problems with this thing so I just do
[33:01] (1981.84s)
new date because the
[33:05] (1985.44s)
exact time is not super important it can
[33:10] (1990.52s)
be whatever
[33:14] (1994.52s)
um that we have at the javascri in the
[33:18] (1998.32s)
JavaScript context so I think this one's
[33:21] (2001.52s)
going to work have a good
[33:23] (2003.48s)
feeling yeah there we go so success
[33:27] (2007.08s)
let's go back to leads which we now need
[33:29] (2009.76s)
to refresh and uh We've checked two
[33:33] (2013.00s)
emails so that's actually good that's
[33:35] (2015.04s)
solid um let's try an example with an
[33:39] (2019.04s)
email we basically just need to to test
[33:42] (2022.24s)
all the different um possible scenarios
[33:47] (2027.12s)
like you know duplicated emails and
[33:49] (2029.16s)
similar um I have this other app with
[33:52] (2032.72s)
email addresses in it um don't want to
[33:56] (2036.36s)
anyone but going to take uh this
[34:00] (2040.08s)
email so hopefully you guys don't spam
[34:04] (2044.08s)
him but basically I'm going to add this
[34:07] (2047.76s)
into my CSV redownload it and we can
[34:12] (2052.96s)
concurrently test duplicated emails as
[34:15] (2055.60s)
well as the email that should have a
[34:18] (2058.16s)
matching result so let's try this again
[34:22] (2062.00s)
so we have our new download and it
[34:23] (2063.76s)
should create a new upload record
[34:27] (2067.96s)
uh this selecting manually getting a
[34:29] (2069.76s)
little bit annoying and then let's just
[34:31] (2071.88s)
confirm that upload so let's see if it's
[34:34] (2074.36s)
going to work and process without any
[34:36] (2076.84s)
input from our side um of course it's
[34:40] (2080.40s)
not going to run though because we don't
[34:42] (2082.76s)
have like
[34:44] (2084.12s)
the oncreate function but it does seem
[34:47] (2087.32s)
like that one
[34:48] (2088.72s)
succeeded one issue we have is match not
[34:51] (2091.36s)
match I mistakenly deleted that so uh
[34:55] (2095.68s)
basically we can add that back
[35:00] (2100.20s)
here and this is my other
[35:03] (2103.36s)
repo this is
[35:05] (2105.76s)
nothing and let's just go back to that
[35:11] (2111.00s)
table to see what the property name is
[35:14] (2114.28s)
so we don't need all the uh the full
[35:17] (2117.20s)
array here so we can just do this and
[35:19] (2119.88s)
then we can make this a
[35:23] (2123.08s)
counter like so all right so that will
[35:26] (2126.84s)
fix it for the next load for leads we
[35:29] (2129.48s)
have an error this is good because it
[35:31] (2131.84s)
means there was one added successfully
[35:35] (2135.00s)
so let's just check what it is in the
[35:40] (2140.32s)
database so actually we got two records
[35:43] (2143.48s)
we got a Tik Tok account and we got an
[35:46] (2146.12s)
Instagram account here so what we can do
[35:49] (2149.04s)
is we have to slightly change our data
[35:51] (2151.52s)
model I guess for uh each user or we can
[35:54] (2154.84s)
just display
[35:56] (2156.16s)
the let's say
[35:58] (2158.32s)
one with the most followers so I think
[36:00] (2160.08s)
let's in fact um do that let's go back
[36:03] (2163.96s)
over to our
[36:07] (2167.60s)
dashboard
[36:14] (2174.24s)
actually uh okay now let's
[36:18] (2178.76s)
actually yeah after this filter let's do
[36:22] (2182.92s)
math um and we can
[36:26] (2186.04s)
do basic this
[36:29] (2189.08s)
here then we can look into
[36:32] (2192.68s)
um cons
[36:37] (2197.08s)
profile equals
[36:44] (2204.56s)
find and we'll find the uh user with the
[36:48] (2208.84s)
highest
[36:50] (2210.96s)
um basically
[36:54] (2214.80s)
followers so um
[36:58] (2218.04s)
just to save some brain effort here we
[36:59] (2219.92s)
can say find
[37:03] (2223.48s)
the user with greatest
[37:10] (2230.28s)
followers all right I'm speeding this
[37:12] (2232.12s)
part up just because I look really dumb
[37:13] (2233.96s)
because I couldn't map the shape of the
[37:16] (2236.88s)
data to what I need to display on the
[37:18] (2238.92s)
page because it generated me this
[37:20] (2240.72s)
reduced function and I didn't read it
[37:22] (2242.56s)
and I thought I knew what it was doing
[37:24] (2244.36s)
but I didn't so I just kept going back
[37:26] (2246.76s)
and forth like like I don't know
[37:29] (2249.12s)
confused um what I should have done is
[37:31] (2251.40s)
just paste in the object cursor is
[37:33] (2253.76s)
really good at this you just give it
[37:34] (2254.92s)
some Json and you say I want to convert
[37:36] (2256.56s)
it to this and it'll write the code for
[37:38] (2258.28s)
you so I don't know why I chose to do it
[37:39] (2259.80s)
myself but yeah no one's perfect okay I
[37:44] (2264.72s)
didn't say anything in the video or
[37:46] (2266.52s)
celebrate because I wanted to keep going
[37:48] (2268.28s)
but at this point the app is fully
[37:49] (2269.96s)
implemented the core functionality works
[37:52] (2272.12s)
the only thing missing is the stripe
[37:54] (2274.24s)
payments as well as the deployment
[37:56] (2276.44s)
itself those are just normal coding so
[37:58] (2278.60s)
I'm going to keep showing it I'm going
[38:00] (2280.04s)
to keep going but I'm going to speed up
[38:01] (2281.28s)
the video because the AI and the core
[38:03] (2283.08s)
app is done and for the rest I'll just
[38:04] (2284.96s)
do a voiceover explaining what I'm doing
[38:07] (2287.28s)
so the first thing I did as you'll see
[38:08] (2288.68s)
is add those links both to the
[38:10] (2290.08s)
influencer profile and email and you'll
[38:12] (2292.12s)
see the time when I finish is exactly
[38:14] (2294.00s)
324 so exactly 1 hour to finish the core
[38:16] (2296.96s)
app the next thing I did was deploy the
[38:18] (2298.84s)
app to production so I use fly IO it's
[38:21] (2301.40s)
the same as versel or any Cloud hosting
[38:24] (2304.76s)
provider and then I'm jumping over to to
[38:27] (2307.80s)
implement all the stripe methods and I'm
[38:29] (2309.96s)
not sure why but I decided to do that
[38:31] (2311.48s)
fully manually even though the AI could
[38:33] (2313.28s)
have done it it was just doing a few
[38:34] (2314.80s)
things the way I'm not used to so I went
[38:37] (2317.12s)
through the whole thing and you'll see
[38:38] (2318.16s)
that was kind of a mistake also yeah
[38:40] (2320.28s)
jumped over to enable the off domain for
[38:42] (2322.84s)
production allows you to authenticate
[38:44] (2324.88s)
only on that specific domain and I
[38:47] (2327.12s)
believe what I'm doing now is testing
[38:48] (2328.80s)
that and then what I'm going to do next
[38:52] (2332.64s)
is do the stripe checkout link so that's
[38:56] (2336.24s)
basically just a a request that you send
[38:59] (2339.28s)
so I'm enabling callable functions in
[39:01] (2341.28s)
fir store to securely call that and read
[39:03] (2343.84s)
from the users table to pass the user
[39:06] (2346.48s)
data through to generate a checkout
[39:08] (2348.72s)
session link so I'm reading the docs I'm
[39:11] (2351.72s)
reading from the users table updating
[39:13] (2353.16s)
the secrets and it will return me a link
[39:15] (2355.60s)
which I can do a redirect to so the user
[39:18] (2358.28s)
can complete their payment so I'm just
[39:21] (2361.40s)
still changing a bit of code for that uh
[39:23] (2363.80s)
changing to make sure the secrets are
[39:26] (2366.04s)
correct and setting the values of a
[39:29] (2369.80s)
credit now just a little bit of
[39:32] (2372.36s)
debugging looking back and forth error
[39:35] (2375.84s)
message okay now it works so um I looked
[39:40] (2380.16s)
up how to make quantities adjustable so
[39:42] (2382.12s)
users can choose how many credits
[39:43] (2383.88s)
they're buying and buy as many as they
[39:47] (2387.44s)
want and so that's about to be
[39:51] (2391.28s)
done just again normal coding so there
[39:55] (2395.00s)
we go you can manually adjust it and
[39:57] (2397.40s)
we'll update the price and the next
[40:00] (2400.00s)
thing we're going to do is the web hook
[40:02] (2402.48s)
so that is basically sending a request
[40:05] (2405.16s)
to your custom URL when a payment's
[40:07] (2407.32s)
completed you have to listen for the
[40:09] (2409.36s)
checkout session completed um event and
[40:14] (2414.00s)
I while I was doing that at the same
[40:15] (2415.92s)
time was starting to um do the customer
[40:19] (2419.96s)
portal
[40:21] (2421.08s)
implementation now I'm speeding up this
[40:22] (2422.92s)
part even more and you can see how fast
[40:24] (2424.84s)
the time is going because the this
[40:27] (2427.48s)
feature I actually didn't even use it
[40:29] (2429.08s)
did not work at all um for fixed
[40:31] (2431.80s)
payments it's really only Built for
[40:33] (2433.44s)
subscriptions where it'll show you your
[40:35] (2435.04s)
payment history you can modify cancel
[40:36] (2436.80s)
your subscription Etc um but basically I
[40:39] (2439.40s)
just wanted to show you everything I
[40:41] (2441.88s)
added in this coding session because you
[40:45] (2445.20s)
can see how much time I wasted here at
[40:46] (2446.88s)
the end and the clock is just ticking
[40:50] (2450.04s)
and um also how inefficiently I'm doing
[40:52] (2452.04s)
it so I guess it's important not to get
[40:54] (2454.24s)
tunnel vision when you're uh coding
[40:56] (2456.68s)
because what I should have done is set
[40:58] (2458.04s)
up the local stripe event simulator and
[41:01] (2461.24s)
then tested the web hooks there but
[41:03] (2463.32s)
instead I'm redeploying the functions
[41:05] (2465.92s)
sending the web hook event and then
[41:08] (2468.20s)
checking the logs to see what the error
[41:09] (2469.72s)
is it's just super stupid so I don't
[41:11] (2471.80s)
know why I did that but anyway I just
[41:13] (2473.52s)
wanted to show you anyway and also the
[41:16] (2476.20s)
fact that in the end it didn't even work
[41:19] (2479.56s)
great and here you can just see me
[41:21] (2481.68s)
disappointed when nothing displays in
[41:23] (2483.20s)
the portal however it could be useful in
[41:24] (2484.60s)
the future if we are Auto charging
[41:26] (2486.80s)
people some
[41:28] (2488.24s)
okay so as you guys can see that's led
[41:30] (2490.16s)
to a pretty much completed app um yeah
[41:33] (2493.28s)
basically wasted the last hour messing
[41:34] (2494.80s)
around with us stripe Docks but as you
[41:36] (2496.80s)
can see everything's working when you
[41:37] (2497.92s)
buy credits uh the web hook securely
[41:40] (2500.56s)
updates uh that based on a confirmed
[41:43] (2503.28s)
payment uh you have the stats summary
[41:45] (2505.76s)
and then it will automatically be
[41:47] (2507.04s)
deducting here and then obviously you
[41:48] (2508.96s)
have your links here and then the
[41:50] (2510.40s)
download CSV which I just tested it is
[41:53] (2513.24s)
also working so you can add this to your
[41:55] (2515.12s)
favorite email tool or similar
[41:58] (2518.00s)
so as for where this goes from here um I
[41:59] (2519.80s)
think these post post MVP features could
[42:01] (2521.92s)
make it very useful particularly Shopify
[42:04] (2524.68s)
one because then it becomes fully
[42:06] (2526.16s)
automated no uploading CSV is needed and
[42:09] (2529.32s)
um I think the emailing people is also
[42:11] (2531.88s)
quite cool but maybe less necessary
[42:14] (2534.24s)
because you know you want to customize
[42:15] (2535.80s)
your offer a lot so hope it was
[42:18] (2538.00s)
interesting um remember again to check
[42:20] (2540.32s)
out the AI for business Builders guide
[42:22] (2542.52s)
link is in the description did you guys
[42:24] (2544.24s)
like this build because I can do more
[42:25] (2545.56s)
apps and uh what do you think of overall
[42:27] (2547.88s)
my opinion you can see some of the pros
[42:29] (2549.36s)
and cons here really good for starting
[42:31] (2551.24s)
from scratch if you write a detailed
[42:32] (2552.64s)
spec but that being said if you don't
[42:34] (2554.12s)
know how to Rite the spec well if you
[42:35] (2555.68s)
don't know how to um debug once it
[42:38] (2558.84s)
generates that code you know adding
[42:40] (2560.60s)
things like environment variables
[42:42] (2562.68s)
researching docks maybe cursor doesn't
[42:44] (2564.44s)
have access to uh you're going to hit a
[42:46] (2566.28s)
wall pretty quick with actually
[42:47] (2567.60s)
finishing your app and that's what I
[42:48] (2568.84s)
wanted to show in this video