S23-E04 – BuiltOnAir Live Podcast Full Show
To get all the latest videos and demonstrations from the BuiltOnAir Podcast, subscribe and get notified on our Youtube channel here and our newsletter/community here.
FULL EPISODE VIDEO
Watch the full video of the show.
FULL EPISODE AUDIO
Listen to the full Audio podcast for this episode here. Or add to your favorite podcast player
Listen On: Apple | Overcast | Spotify
The BuiltOnAir Podcast is Sponsored by On2Air – Integrations and App extensions to run your business operations in Airtable.
Start a FREE 14 Day Trial of On2Air Now
In This Episode
Welcome to the BuiltOnAir Podcast, the live show. The BuiltOnAir Podcast is a live weekly show highlighting everything happening in the Airtable world.
Check us out at BuiltOnAir.com. Join our community, join our Slack Channel, and meet your fellow Airtable fans.
Episode Summary
In this episode, we dive into the world of Airtable webhooks with expert Martin. We explore the benefits and challenges of using webhooks, and Martin shares his experience building a schema change log using Airtable webhooks. We also discuss the importance of managing cursors, handling token expiration, and dealing with potential issues that may arise. Additionally, Martin shares some of the limitations of Airtable webhooks, including the lack of information about timeline features and syncing. Tune in to learn more about mastering Airtable webhooks and taking your Airtable skills to the next level.
⏱ Timeline:
- 4:53 - Martin introduces himself and his background
- 6:37 - Martin explains his product, PowerSafe
- 8:36 - Martin demos his schema change log using Airtable webhooks
- 16:04 - Martin discusses the benefits of sending data back to Airtable
- 19:23 - Martin shares his experience with Airtable webhooks and lessons learned
Full Transcription
The full transcription for the show can be found here:
[00:00:02] All right,[00:00:03] welcome back to the BuiltOnAir podcast.
[00:00:05] We are in season twenty three,
[00:00:07] episode four.
[00:00:08] Good to be back with you.
[00:00:10] Myself,
[00:00:11] Ali and Kamille are here and we have
[00:00:13] a special guest with us, Martin.
[00:00:15] Welcome, Martin.
[00:00:17] Hi, everyone.
[00:00:19] Nice to have you back.
[00:00:20] We had you on a couple of seasons
[00:00:23] ago, I believe.
[00:00:25] Remind us where where are you located in
[00:00:27] the world?
[00:00:28] Yeah, I’m in Europe, in Czech Republic,
[00:00:32] right now in Prague,
[00:00:33] but I’m traveling a lot, but yeah,
[00:00:35] right now I’m in Prague at my hometown
[00:00:38] or city, let’s say.
[00:00:39] Very cool.
[00:00:40] That’s awesome.
[00:00:42] Cool.
[00:00:42] So every week we do a different segment.
[00:00:46] And this is our week for bringing on
[00:00:48] a guest and having them share some cool
[00:00:51] stuff with us.
[00:00:52] So I will give an update before we
[00:00:55] start.
[00:00:56] Last week,
[00:00:56] we broke some news on the show of
[00:01:00] a new superagents.com that Airtable
[00:01:03] launched.
[00:01:04] and kind of demoed that and um maybe
[00:01:08] we’ll show that in next week’s episode
[00:01:09] again but um anyways i’ve played with it
[00:01:12] a little bit more my general impression is
[00:01:15] kind of cool kind of interesting i don’t
[00:01:19] know if i would use it for a
[00:01:20] whole lot i probably am not the the
[00:01:23] primary use case for it i’m not doing
[00:01:25] a ton of reports and whatnot but um
[00:01:28] Kind of cool,
[00:01:28] but a little disappointing of like that
[00:01:31] they’re putting energy and effort into
[00:01:34] that product that seems a little bit
[00:01:37] outside of what we know Airtable to be.
[00:01:39] So I don’t know if any of you
[00:01:41] have opinions.
[00:01:43] Yeah.
[00:01:46] I saw a comment from someone who was
[00:01:48] happy about the recent automation
[00:01:53] subscription.
[00:01:54] Yeah.
[00:01:57] feature release and they were like, wow,
[00:01:58] it’s great to see that while they’re doing
[00:02:01] AI stuff,
[00:02:02] they’re still releasing features for the
[00:02:05] main product.
[00:02:06] But I don’t know about everyone else.
[00:02:08] I think that feature is broken.
[00:02:09] So I wish they’d stop expanding so they
[00:02:15] could focus on one thing and then do
[00:02:18] it well.
[00:02:18] Yeah, yeah, yeah.
[00:02:21] Yeah, we’ll talk on that one next week.
[00:02:22] We’ll showcase that.
[00:02:25] Absolutely.
[00:02:26] There was one thing I saw someone post
[00:02:27] about Super Agent that I hadn’t really
[00:02:30] thought of.
[00:02:31] And I kind of liked the idea that
[00:02:32] they had,
[00:02:33] which was they kind of thought of it
[00:02:35] as a way to get a launching pad
[00:02:37] for how to approach solving a problem.
[00:02:40] which I thought was really interesting.
[00:02:42] Like she is somebody I can’t remember who
[00:02:43] it was on LinkedIn.
[00:02:45] They said they had been trying to solve
[00:02:47] this problem for a long time and had
[00:02:49] no idea how to approach it.
[00:02:50] And so they just type that into super
[00:02:52] agent and then got like a report on
[00:02:54] like basically how other people have
[00:02:56] solved this problem overtime and like what
[00:02:58] your things should be.
[00:02:59] I think that was a really interesting.
[00:03:01] Way to use that tool.
[00:03:03] Yeah.
[00:03:07] Well, well,
[00:03:08] maybe dive deeper next week on our
[00:03:11] highlights of new functionalities and
[00:03:13] features and whatnot.
[00:03:14] So awesome.
[00:03:16] Well with that, Martin,
[00:03:17] if you want to share your screen and
[00:03:20] give us a,
[00:03:21] before you dive in and give us some
[00:03:22] context, who you are, what you’re up to,
[00:03:24] and a little bit about yourself,
[00:03:26] and then you can jump into what you’ve
[00:03:28] got to share with us today.
[00:03:31] Yes.
[00:03:32] Is my screen showing well?
[00:03:34] Yeah.
[00:03:35] Yeah.
[00:03:35] All right.
[00:03:35] Perfect.
[00:03:37] Yeah.
[00:03:37] So I am a Airtable freelancer.
[00:03:42] I provide Airtable solutions to clients.
[00:03:45] I’ve been doing that for the past two
[00:03:47] years, maybe more at this point.
[00:03:49] I jumped into the Airtable world after
[00:03:53] being a web developer for a long time.
[00:03:56] I have been kind of busy in the
[00:03:58] startup world and oftentimes we had the
[00:04:00] need of some, you know,
[00:04:02] efficient internal tooling.
[00:04:03] And back then I found Airtable as a,
[00:04:07] like,
[00:04:08] like a really convenient solution and and
[00:04:11] then when i wanted to transition to a
[00:04:12] different um different area maybe take a
[00:04:16] small break for just pure web development
[00:04:18] i thought um actually i could build
[00:04:20] solution of the fAirtable combine like my
[00:04:23] knowledge of javascript and uh you know
[00:04:26] web development together with like
[00:04:28] actually uh
[00:04:30] providing expertise with Airtable that
[00:04:33] I’ve learned over time when using it
[00:04:35] internally.
[00:04:36] And then I did a deep dive into
[00:04:40] the various kinds of aspects of Airtable
[00:04:42] over time and provided different kinds of
[00:04:44] solutions to clients.
[00:04:46] But as I did my Airtable freelancing,
[00:04:48] I also was a little bit
[00:04:50] missing the pure web development stuff.
[00:04:53] And then I decided to actually build my
[00:04:55] own products for Airtable.
[00:04:57] And the first one was actually PowerSafe.
[00:05:01] So that’s a Chrome extension for for
[00:05:04] Airtable, not just Airtable, actually,
[00:05:06] but
[00:05:08] You can connect various kinds of
[00:05:11] destinations.
[00:05:11] You can send to also Notion, Kodak,
[00:05:13] Webhooks.
[00:05:14] But Airtable was the first one.
[00:05:15] Also,
[00:05:15] Airtable has the best connection over
[00:05:18] there.
[00:05:19] And so PowerSafe is like a very universal
[00:05:23] advanced web clipper,
[00:05:25] which you can use anytime in your web
[00:05:26] browser and save to different places.
[00:05:30] And you can optionally also use AI
[00:05:33] to have better scraping.
[00:05:35] So that’s what I was mentioning before,
[00:05:38] or what I was showing here before.
[00:05:40] But over time,
[00:05:42] I found out I want to actually have
[00:05:44] also a different kind of product to offer.
[00:05:47] And that’s why I started building a
[00:05:49] PowerSync,
[00:05:50] which is not a Chrome extension.
[00:05:52] It is more of a…
[00:05:55] a backend service, a monitoring service,
[00:05:59] and it’s built on top of the Airtable
[00:06:02] webhooks.
[00:06:03] So the Airtable webhooks,
[00:06:06] it’s a feature of
[00:06:10] of that Airtable has as part of their
[00:06:12] web API.
[00:06:14] And it’s a little bit, I would say,
[00:06:16] advanced to use for most people,
[00:06:20] but they are powerful.
[00:06:21] And PowerSync is one of the ways how
[00:06:24] you can benefit from some of the unique
[00:06:26] features of Airtable Webhooks without
[00:06:30] doing a deep technical development
[00:06:33] yourself.
[00:06:34] So I think I have walked the hard
[00:06:36] path,
[00:06:37] and I have the platform to offer some
[00:06:42] unique features that would be hard to
[00:06:44] maybe implement,
[00:06:47] or maybe even impossible to implement
[00:06:49] through maybe Zapier, NA-TAN,
[00:06:52] and other solutions.
[00:06:57] So the one solution that I can actually
[00:07:00] demo is the schema change log that allows
[00:07:04] us to collect schema changes in your
[00:07:08] Airtable base and send them to Airtable or
[00:07:12] elsewhere.
[00:07:13] And over time,
[00:07:14] as you connect your Airtable base
[00:07:17] and make changes in your Airtable schema,
[00:07:20] like you add tables, you rename tables,
[00:07:22] you change fields, delete fields,
[00:07:25] change formulas,
[00:07:26] add options to single select fields or
[00:07:29] multiple select fields.
[00:07:30] The change log will track that.
[00:07:33] And in real time, it will create,
[00:07:36] for example,
[00:07:36] Airtable records back in your Airtable
[00:07:39] that create a chronological
[00:07:42] set of changes that has happened.
[00:07:44] So let me show it off real quick.
[00:07:47] I will activate this service here.
[00:07:50] And so I can connect Airtable.
[00:07:56] And I can select the base.
[00:08:01] I think I have one demo base prepared.
[00:08:04] So I here select ACRM base.
[00:08:09] And
[00:08:11] Now I confirm the base that I want
[00:08:13] to collect, which is this one.
[00:08:16] And now I say that I want to
[00:08:18] send the schema changes back to Airtable.
[00:08:21] I could also use a webhook or maybe
[00:08:23] send them to Slack,
[00:08:24] but Airtable is usually the best option
[00:08:26] here.
[00:08:29] And I will say that for these schema
[00:08:32] changes,
[00:08:32] I want to actually create a new table
[00:08:35] because I don’t have an existing table
[00:08:36] that I would use for that.
[00:08:38] So I will create a schema changes table.
[00:08:45] And the mapping is sort of prepared here.
[00:08:47] So I will just confirm.
[00:08:51] And now,
[00:08:51] because all of this setup is done,
[00:08:53] I can activate the engine.
[00:09:01] And that’s pretty much it.
[00:09:02] So then like PowerSync has set up a
[00:09:05] Airtable webhook on my behalf.
[00:09:09] And I can open the base.
[00:09:13] I can see that there is this new
[00:09:15] schema changes table.
[00:09:17] Potentially in the future,
[00:09:19] if it’s technical and this is something
[00:09:20] that would be maybe irrelevant to a lot
[00:09:24] of users, I could maybe hide this table.
[00:09:26] But for now I’m keeping it here.
[00:09:29] And now I can test if it’s actually
[00:09:31] working.
[00:09:32] And maybe I will create some kind of
[00:09:34] new field here.
[00:09:38] Maybe in the clients, I can create
[00:09:42] the important like checkbox vip client and
[00:09:49] so i’ve created a new field and and
[00:09:52] i can see here field created and there
[00:09:55] is a description here which says like this
[00:09:58] field vip is created so um that’s that’s
[00:10:03] that’s the basic wiring here if i now
[00:10:06] would like delete this field
[00:10:09] then I should get a different,
[00:10:12] like a new description here that the field
[00:10:13] VIP was deleted.
[00:10:16] So this is in its simplicity,
[00:10:19] how it works.
[00:10:20] I can maybe,
[00:10:23] because I don’t actually have like a
[00:10:24] created now, created at field,
[00:10:26] maybe I can actually create one here,
[00:10:29] created time.
[00:10:33] And so I get a new field.
[00:10:34] Maybe I can sort by created.
[00:10:38] So the latest changes are at the top.
[00:10:40] And actually,
[00:10:40] it even logged here that in the schema
[00:10:43] changes table itself,
[00:10:44] I’ve created a field created.
[00:10:47] Another interesting changes that might be
[00:10:50] interesting to track is that, for example,
[00:10:52] there is a field called email.
[00:10:55] Maybe I would want to have a formula,
[00:10:58] which is email domain.
[00:11:04] And so that gives us a maybe interesting
[00:11:15] like website from the email itself.
[00:11:19] And here in this,
[00:11:23] I’m seeing actually the formula as it is
[00:11:25] being created, right?
[00:11:26] So it’s tracked in the description here.
[00:11:30] And if I go back and maybe adjust
[00:11:32] some detail,
[00:11:34] actually there is nothing to adjust,
[00:11:35] but for the purpose of the demo,
[00:11:37] maybe for some reason I want to track
[00:11:39] a different character,
[00:11:40] it’s probably gonna break.
[00:11:42] Well, actually it’s not breaking.
[00:11:43] Oh, it’s partially break.
[00:11:44] But in the schema changes,
[00:11:47] we should be seeing some diff.
[00:11:51] It’s not perfect.
[00:11:52] There is maybe still something to improve
[00:11:55] here because there is these internal
[00:11:56] markers not translating.
[00:11:59] So sometimes this kind of drops out a
[00:12:02] little bit.
[00:12:02] But I would say still this is better
[00:12:04] than nothing.
[00:12:05] So this still gives you some information
[00:12:07] that something here has changed.
[00:12:12] And there’s like other granular things,
[00:12:15] like maybe I will try to add a
[00:12:17] different type of status, maybe.
[00:12:22] to remove and so i have added a
[00:12:26] new new option here and i should be
[00:12:30] seeing as well that field status is
[00:12:32] updated and there is a new option to
[00:12:34] remove so so that’s the uh functionality
[00:12:38] in its entire like in its in its
[00:12:39] core and maybe we can uh improve it
[00:12:42] a little bit better if we use the
[00:12:45] power of Airtable custom extensions and
[00:12:49] um i will create a new extension
[00:12:53] I can choose custom.
[00:12:56] And I have this one.
[00:12:58] It has at the moment wrong name because
[00:12:59] it was some different extension that I was
[00:13:01] playing with before,
[00:13:02] but I have created this custom extension
[00:13:06] for the schema change log.
[00:13:08] It’s running locally still,
[00:13:10] but I think I need to still fix
[00:13:13] in this case.
[00:13:14] It shouldn’t be,
[00:13:15] the source shouldn’t be clients.
[00:13:17] The source should be schema changes.
[00:13:20] And I think I also need to
[00:13:24] pass a little bit more information.
[00:13:26] So not just event ID,
[00:13:27] but also the collaborator and maybe the
[00:13:30] table ID.
[00:13:32] And now if I refresh, yes,
[00:13:35] so this is the final result here.
[00:13:37] So this is my custom interface extension
[00:13:41] hooked up to the schema changes table.
[00:13:44] And it shows the result in a little
[00:13:46] bit nicer way.
[00:13:49] So I can browse around chronologically
[00:13:51] here and maybe collect.
[00:13:53] It’s by default, it’s grouped by day,
[00:13:56] and then by the person making the changes,
[00:13:58] and then by the table.
[00:14:00] And because it’s an Airtable extension,
[00:14:04] then I can maybe search here,
[00:14:07] maybe search for email,
[00:14:09] and I can see that these are the
[00:14:10] email changes, recent email changes.
[00:14:15] So that’s it for the schema change log
[00:14:20] itself.
[00:14:23] Potentially I could demo more,
[00:14:24] but this is the core functionality.
[00:14:28] Cool.
[00:14:31] Amazing.
[00:14:34] It’s so useful.
[00:14:36] I so often have tried to track down,
[00:14:39] within the Manage Fields tool,
[00:14:41] you can see the person who last modified
[00:14:44] a field.
[00:14:45] But if you’re trying to be like,
[00:14:47] who changed this formula potentially three
[00:14:49] months ago, that’s huge.
[00:14:53] That’s a bravo.
[00:14:54] I’m very impressed.
[00:14:55] That’s awesome.
[00:14:56] Thank you.
[00:14:56] Yeah, thank you.
[00:14:58] It has unfortunately happened more than
[00:15:00] once that someone has deleted a whole
[00:15:03] table.
[00:15:04] And the trash in Airtable doesn’t last
[00:15:07] forever.
[00:15:08] I believe it’s seven days.
[00:15:09] So record history, three years.
[00:15:12] Trash, seven days.
[00:15:14] Interesting decision.
[00:15:15] So it was reported to my team,
[00:15:20] I want to say, like,
[00:15:22] ten days or so after it was deleted.
[00:15:26] which means he couldn’t restore it from
[00:15:28] trash, which means he had to rebuild it.
[00:15:30] So not great,
[00:15:33] but things like that would allow you to
[00:15:36] do even more beyond that.
[00:15:38] Now you have a record in your table
[00:15:41] that says something was deleted.
[00:15:43] Well,
[00:15:43] you can set an email alert based on
[00:15:45] that and said someone deleted a table and
[00:15:47] you immediately know, hey,
[00:15:50] don’t do that and pull it back from
[00:15:52] the trash.
[00:15:53] So even beyond what you’ve just shown,
[00:15:56] there’s some flexibility there for
[00:15:58] whomever uses the service to sort of
[00:16:01] expand it using native Airtable
[00:16:04] capabilities to give you even more
[00:16:05] visibility.
[00:16:09] Yeah,
[00:16:12] I think the approach from my perspective,
[00:16:15] like sending the data back to Airtable,
[00:16:17] it just gives the most power for free.
[00:16:21] I could have my own maybe UI somewhere,
[00:16:24] but
[00:16:25] the main issue is that i would have
[00:16:26] to store more data on my own and
[00:16:28] i don’t want to do that i don’t
[00:16:30] want to store more data than i need
[00:16:31] so i’m at the moment the service is
[00:16:33] storing only technical metadata like
[00:16:35] record ids and some base transaction
[00:16:38] numbers Airtable webhook id and and
[00:16:41] others technical ideas like this but then
[00:16:43] once i can i i delete all the
[00:16:45] data i can and
[00:16:47] because I’m sending the data back to
[00:16:48] Airtable.
[00:16:50] I want to kind of return the data
[00:16:53] as fast as possible.
[00:16:54] And also once you have the data in
[00:16:56] Airtable,
[00:16:57] you can use them in automations and also
[00:17:00] in, for example, in Airtable Omni.
[00:17:03] So with PowerSync,
[00:17:05] with this schema change log,
[00:17:07] you can go to Airtable Omni and ask
[00:17:09] who was the last person who changed this
[00:17:12] field or who deleted this table and you
[00:17:14] were gonna get an answer.
[00:17:17] technically Airtable could do this
[00:17:19] natively, right?
[00:17:21] But because of some, I guess,
[00:17:23] internal how the state is managed, well,
[00:17:27] this is a trick how to surface the
[00:17:28] right information to the table itself,
[00:17:32] to the database itself.
[00:17:34] Yeah.
[00:17:36] So yeah, I’m, I’m, I’m, I’m, I’m, I’m,
[00:17:37] I’m, I’m, I’m, I’m, I’m, I’m, I’m, I’m,
[00:17:38] I’m, I’m, I’m, I’m, I’m, I’m, I’m, I’m,
[00:17:39] I’m, I’m, I’m, I’m, I’m, I’m, I’m, I’m,
[00:17:40] I’m, I’m, I’m, I’m, I’m, I’m, I’m, I’m,
[00:17:43] I’m, I’m, I’m, I’m, I’m, I’m, I’m, I’m,
[00:17:44] I’m, I’m, I’m, I’m, I’m, I’m, I’m, I’m,
[00:17:45] I’m, I’m,
[00:17:45] I’m
[00:17:46] Let’s talk a little bit,
[00:17:47] let’s maybe go deeper into webhooks.
[00:17:49] I’m curious,
[00:17:50] I’ve played with it a little bit.
[00:17:53] I know there’s, I actually,
[00:17:55] do you mind sharing your screen again and
[00:17:56] let’s go to the webhook documentation.
[00:17:59] And I’d be curious to know like lessons
[00:18:01] learned, wishlist items.
[00:18:04] I know it gives some information,
[00:18:06] but it doesn’t give everything.
[00:18:10] Talk us through what you’ve learned.
[00:18:13] Put that up.
[00:18:14] Yeah.
[00:18:14] Dealing with webhooks.
[00:18:15] What’s the good, bad,
[00:18:16] and ugly of webhooks?
[00:18:18] Right.
[00:18:18] So webhooks, they are powerful.
[00:18:21] And I think from Airtable’s perspective,
[00:18:24] they are well-designed.
[00:18:30] When you set up a new webhook,
[00:18:33] you create it dynamically through the API
[00:18:35] itself.
[00:18:38] let me see, create a webhook, right?
[00:18:40] So you send a request with some certain
[00:18:44] parameters and you dynamically even say to
[00:18:53] to which URL you want to receive back
[00:18:56] the pings, right?
[00:19:00] So once you set this up,
[00:19:03] the important thing to mention here is
[00:19:05] that you set up the notification URL,
[00:19:07] but maybe as
[00:19:09] it’s a little bit different to a lot
[00:19:11] of other webhooks that you might have
[00:19:13] tried in different services because here
[00:19:16] you only receive a ping.
[00:19:18] The Airtable will at first only notify you
[00:19:22] something has changed.
[00:19:23] You subscribe to some specific data types,
[00:19:27] maybe the table data or the table schema,
[00:19:31] and you define the scope and certain
[00:19:37] certain details,
[00:19:38] but then back you get only a thing
[00:19:40] that like something has changed.
[00:19:41] And so you have to do a step
[00:19:42] number two,
[00:19:44] which is to list Webhook payloads.
[00:19:47] So as the step two,
[00:19:49] you start fetching the payloads and then
[00:19:51] you have to, as you do that,
[00:19:54] there is something called a cursor and
[00:19:56] Cursor tells you,
[00:19:59] it’s a certain number that tells you how
[00:20:01] many payloads there are.
[00:20:03] And you track that.
[00:20:05] You have to track that on your own
[00:20:06] end, maybe somewhere in a database.
[00:20:09] And you will store some kind of number
[00:20:10] which tells you what is the amount of
[00:20:13] payloads you have fetched so far.
[00:20:15] And when a new ping comes from Airtable,
[00:20:19] you then start fetching new payloads only
[00:20:21] from the previous cursor.
[00:20:23] So you have to manage this cursor.
[00:20:25] And to make it even a little bit
[00:20:27] more complicated,
[00:20:29] sometimes Airtable can send multiple
[00:20:32] different pings,
[00:20:33] even for one change or as changes happen,
[00:20:36] you can receive multiple simultaneous
[00:20:38] pings, right?
[00:20:39] So if you would have this set up
[00:20:41] in some maybe NNN or maybe in Zapier,
[00:20:46] you could very quickly find out that, oh,
[00:20:50] Airtable notified me three times,
[00:20:52] and why was it three times?
[00:20:55] But this is considered to be your problem.
[00:20:58] You need to have a solution so that
[00:21:02] you don’t create duplicate records and so
[00:21:05] that when a ping comes,
[00:21:06] you start iterating over the payloads,
[00:21:09] but you do that in a
[00:21:11] indempotent way.
[00:21:13] So the server should make sure that there
[00:21:18] are no duplicate actions created.
[00:21:20] And so you have to protect yourself
[00:21:22] against that.
[00:21:25] You iterate over these payloads.
[00:21:27] Then you get there is a specific payload
[00:21:30] object that you receive.
[00:21:33] It’s not completely the same as the
[00:21:36] webhook, sorry,
[00:21:38] as the normal Airtable record, right?
[00:21:41] you might opt in for some data to
[00:21:42] be already included in the payload object,
[00:21:50] but it depends what
[00:21:56] what you have configured.
[00:21:58] The unique thing about webhooks is that
[00:22:00] you get the source metadata,
[00:22:02] which is the user of who created the
[00:22:06] record, who updated the record,
[00:22:07] or who created the field,
[00:22:09] deleted the table.
[00:22:10] So in this case here,
[00:22:12] you see the user,
[00:22:13] which is a unique thing about webhooks.
[00:22:15] You couldn’t get this another way,
[00:22:17] like through the REST API.
[00:22:19] Yeah.
[00:22:21] Another unique thing about webhooks is for
[00:22:25] linked records
[00:22:26] you can also get the name,
[00:22:29] the primary key name of the link record,
[00:22:32] not just the ID.
[00:22:33] Is that correct?
[00:22:35] That’s my understanding.
[00:22:36] Right.
[00:22:37] It’s possible.
[00:22:37] I cannot recall.
[00:22:38] But I can attest that it has a
[00:22:44] slightly, actually,
[00:22:47] modern shape in some ways.
[00:22:49] So yeah, I would believe this is true.
[00:22:56] Yeah, I believe that’s linked records,
[00:22:58] yeah.
[00:22:59] I think one of the biggest frustrations I
[00:23:01] had using webhooks was,
[00:23:05] and these are things that you touched
[00:23:06] upon,
[00:23:07] but the idea of using a cursor to
[00:23:10] determine where you are in the history of
[00:23:14] anything being sent to that webhook.
[00:23:16] There’s also a parameter once you get a
[00:23:18] response back that says might have more.
[00:23:22] So not it definitely does,
[00:23:25] not how many parsers are remaining.
[00:23:27] It might have more.
[00:23:29] And if that’s true,
[00:23:30] you got to query it again.
[00:23:32] So that’s fun.
[00:23:33] And then for a certain field,
[00:23:36] we built something in-house for our
[00:23:39] enterprise,
[00:23:39] but it wasn’t focused on schema changes.
[00:23:41] It was more data changes.
[00:23:43] So someone’s email went from at Hotmail to
[00:23:47] at Gmail, for example.
[00:23:50] which you can do with web hooks.
[00:23:51] It’s the exact same implementation of how
[00:23:54] you create a web hook.
[00:23:55] You just send different parameters,
[00:23:57] but for certain field types,
[00:24:00] a single select a user or collaborator
[00:24:03] field,
[00:24:04] updating it as sort of one click action.
[00:24:06] So that’s one update.
[00:24:08] If you’re typing in someone’s email
[00:24:09] address,
[00:24:11] each keystroke is an update according to
[00:24:13] Airtable.
[00:24:14] So that is eight.
[00:24:16] If it’s eight characters long, that’s,
[00:24:18] eight different pings you’re going to get
[00:24:22] from the webhook, which means your cursor,
[00:24:26] you know what I mean?
[00:24:27] You don’t want to update it on that
[00:24:28] first.
[00:24:29] You want to wait till it’s done.
[00:24:30] How do you know when someone’s done
[00:24:31] typing?
[00:24:32] You don’t.
[00:24:33] Right.
[00:24:37] Yeah, yeah.
[00:24:37] That’s completely true.
[00:24:38] And you can, like, again, like,
[00:24:42] at the logic, right,
[00:24:43] you can have in programming,
[00:24:47] there is this concept of debouncing.
[00:24:50] So you could potentially have this
[00:24:52] debounce.
[00:24:52] But again,
[00:24:53] so this is you’re in programming land.
[00:24:55] Like,
[00:24:56] I’m not sure if I could be able
[00:24:58] to handle something like debouncing in
[00:25:00] Zapier or anything.
[00:25:02] I think it’s safe to say that once
[00:25:05] you’re dealing with webhooks,
[00:25:05] it’s probably better to just send it to
[00:25:08] a custom server.
[00:25:10] Or maybe if someone is really advanced
[00:25:13] with NATM,
[00:25:13] maybe they can work around this.
[00:25:14] But for me,
[00:25:16] it’s just much easier to deal with stuff
[00:25:18] like this in a plain web server.
[00:25:20] And yeah, there’s…
[00:25:26] The other thing is handling your token.
[00:25:31] They expire after seven days.
[00:25:33] Is that correct?
[00:25:34] Yes.
[00:25:34] Yeah.
[00:25:37] Yeah.
[00:25:37] So you’ve got to constantly be refreshing
[00:25:39] it.
[00:25:39] Mm-hmm.
[00:25:41] It does refresh itself if something hits
[00:25:44] that webhook.
[00:25:45] So if someone deletes a table on like
[00:25:49] day three of your expiring,
[00:25:50] it’ll reset until the next seven days.
[00:25:53] But if nothing happens to your base
[00:25:55] schema,
[00:25:55] you will have to have this running on
[00:25:58] a cycle.
[00:26:00] Right.
[00:26:01] Right.
[00:26:01] Yes.
[00:26:01] So on my end,
[00:26:02] I have it running as a fallback just
[00:26:04] in case.
[00:26:05] And so as you hit this refresh endpoint,
[00:26:10] it gives you back the new expiration time.
[00:26:13] again,
[00:26:14] I have a job that runs every once
[00:26:18] every few hours and,
[00:26:20] and it checks the webhooks that are in
[00:26:22] Dangerous territory and it refreshes them.
[00:26:24] Yeah, yeah.
[00:26:29] Yeah, that’s something just kind of silly,
[00:26:31] but they require that but more that you
[00:26:34] can ever
[00:26:35] another actually interesting aspect is
[00:26:37] that if for example for whatever reason
[00:26:40] you don’t send back a proper response for
[00:26:43] the webhook
[00:26:48] it will disable itself.
[00:26:49] So maybe your server crashes,
[00:26:55] which can happen every once in a while.
[00:26:57] A server can crash.
[00:26:58] Maybe you are using a service like
[00:27:00] Cloudflare or other,
[00:27:02] and there is an outage,
[00:27:04] worst case scenario.
[00:27:05] And then Airtable tries to contact you and
[00:27:07] tries to contact that notification URL
[00:27:09] that you have set up.
[00:27:10] And it’s getting back like a five or
[00:27:13] three gateway timeout.
[00:27:16] or other kind of error,
[00:27:17] or maybe you have legitimate application
[00:27:20] error on your end.
[00:27:22] So Airtable will disable the webhook.
[00:27:25] It will stop.
[00:27:26] It will say that enable is false.
[00:27:28] And then you have to enable it back.
[00:27:32] And this is also a little bit tricky,
[00:27:34] because then you have to be self-aware
[00:27:36] about, oh, my server crashed.
[00:27:40] Now it’s available again,
[00:27:41] but what if the webhooks were disabled?
[00:27:43] So you have to do also run some
[00:27:45] checks and check the status of all
[00:27:48] webhooks and maybe enable them again.
[00:27:50] So that’s another thing that I have is
[00:27:53] that on every server startup and every
[00:27:56] once in a while,
[00:27:56] I also like proactively check the status
[00:27:58] of all webhooks and in case they are
[00:28:00] actually disabled, I enable them again.
[00:28:04] I can see the reasoning why this is
[00:28:07] being done, but it can also,
[00:28:11] if you don’t know it,
[00:28:12] then it can be an unhappy surprise,
[00:28:15] sort of.
[00:28:16] Yeah.
[00:28:17] Yeah, that’s a lot to maintain.
[00:28:19] Yeah.
[00:28:20] That’s why most people won’t come into
[00:28:24] this world,
[00:28:24] which is probably a good thing.
[00:28:29] What information…
[00:28:32] is still not available in the webhook.
[00:28:34] There’s still some data that Airtable
[00:28:37] doesn’t expose, right?
[00:28:38] Yeah, I cannot.
[00:28:43] So we, I don’t know this for sure.
[00:28:47] If it does, then this would be awesome.
[00:28:49] But my understanding is if you’ve ever
[00:28:52] used the timeline feature where you have
[00:28:55] records that are predecessors of each
[00:28:57] other,
[00:28:57] I’m running into this right now where
[00:28:59] We want to be able to know what
[00:29:01] it’s configured for as far as the buffer
[00:29:04] in between records,
[00:29:05] or if it’s the how the relationship is
[00:29:08] like first to last and stuff.
[00:29:10] My understanding is like that information
[00:29:12] is not given either through the API or
[00:29:15] the web hooks.
[00:29:18] So I think there’s still configuration
[00:29:20] data on fields.
[00:29:23] From the web API,
[00:29:25] you can query what the tables are in
[00:29:28] a base,
[00:29:29] and it will tell you the date dependency
[00:29:31] settings overall.
[00:29:32] That’s not per record.
[00:29:34] That’s just this field is the duration
[00:29:37] field, for example.
[00:29:38] and what the list of holidays are.
[00:29:41] But that’s it.
[00:29:43] My thing that’s missing from the API,
[00:29:48] both web API and webhooks,
[00:29:50] there’s nothing about syncing.
[00:29:52] So there’s no indication that a table is
[00:29:56] synced from another source.
[00:29:58] And when a view is marked as a
[00:30:04] shared link or a sync source for a
[00:30:07] different table, it’s not anywhere.
[00:30:10] So one of the biggest things you can
[00:30:13] do to cripple a base is to sever
[00:30:16] a sync source.
[00:30:17] And there’s no way to be alerted.
[00:30:19] It just sort of happens silently.
[00:30:22] Or even who the owner of that sync
[00:30:24] is because it’s tied to the user who
[00:30:27] set it up.
[00:30:28] And if that user leaves the company.
[00:30:30] Yes.
[00:30:32] We’ve run into this several times.
[00:30:34] It will disable your sync if whomever set
[00:30:37] it up leaves the company,
[00:30:39] even if every other creator in that
[00:30:41] workspace is still there.
[00:30:43] Yep.
[00:30:45] That sounds good.
[00:30:45] Yeah, we’ve reported back to Airtable.
[00:30:53] I found in the admin panel the other
[00:30:54] day where I could actually look at my
[00:30:57] syncs.
[00:31:00] I always saw where the shared links were,
[00:31:02] but I found the actual list of this
[00:31:05] view is being synced to these three bases.
[00:31:08] Because you can do it on a field
[00:31:09] level,
[00:31:11] and you can see that it’s enabled for
[00:31:13] a view, but within the base itself,
[00:31:15] you can’t tell actually where it’s going
[00:31:17] to unless you look at
[00:31:20] like add a field to that view only,
[00:31:22] for example.
[00:31:24] But yeah, that was useful.
[00:31:27] But for me, what I’ve struggled with,
[00:31:30] is there anywhere that you can query
[00:31:32] automations in a base?
[00:31:34] No.
[00:31:37] That would be amazing.
[00:31:39] Yeah.
[00:31:39] I want to get a list of my
[00:31:41] automations.
[00:31:43] For me, as a developer,
[00:31:46] the ideal scenario is that there’s an API
[00:31:49] for everything.
[00:31:52] I get that oftentimes this is just not
[00:31:54] feasible,
[00:31:55] but I think one really good approach that
[00:31:58] some products have is that
[00:32:00] they have an API and their user interface
[00:32:03] is using the same API as the others,
[00:32:07] right?
[00:32:07] As the clients.
[00:32:08] And then they are sort of forced to
[00:32:11] actually improve the API.
[00:32:13] And in Airtable’s case,
[00:32:15] as far as I know,
[00:32:15] this is not the case, right?
[00:32:16] So there is an internal API that the
[00:32:18] interfaces are using and the bays are
[00:32:19] using,
[00:32:20] and then there is the web API that
[00:32:22] is for the others.
[00:32:25] i think especially also like now in the
[00:32:27] age of ai um it also makes sense
[00:32:29] to have as big ai api coverage as
[00:32:32] possible um because then you can have
[00:32:35] agents do stuff for you and um and
[00:32:37] there is definitely pitfalls right if
[00:32:39] there would be for example in api you
[00:32:42] have an option to create a field but
[00:32:44] not to delete the field and it makes
[00:32:45] sense that there is no api for deleted
[00:32:47] deleting the field because an accidental
[00:32:49] deleting of the field leads to a disaster
[00:32:52] but
[00:32:53] So there has to be limits,
[00:32:55] but creating automations with AI,
[00:32:58] like right away you could use GGPT to
[00:33:01] create an automation and you would get a
[00:33:04] lot of it for free.
[00:33:07] The cynical answer to that is Airtable
[00:33:10] wants you to use Omni.
[00:33:12] They don’t want you to use a third
[00:33:13] party AI to do all of that.
[00:33:16] I don’t know how far in advance they
[00:33:18] made that decision because
[00:33:20] None of this was ever available via the
[00:33:22] API, even though it should have been.
[00:33:24] But I think Toddle,
[00:33:27] formerly known as Nordcraft,
[00:33:29] which is like a website web app builder,
[00:33:33] is built out of itself, which I love.
[00:33:35] It’s a great example of what you just
[00:33:37] described of
[00:33:38] If you’re going to build a product that
[00:33:41] makes things,
[00:33:42] make your product out of that thing.
[00:33:44] And then I’ve talked about Outsetta a
[00:33:47] bunch.
[00:33:47] It’s the platform I use to manage
[00:33:50] subscriptions for my services.
[00:33:52] And to subscribe to Outsetta,
[00:33:55] I have an Outsetta account,
[00:33:57] if that makes sense.
[00:33:58] They use their own subscription management
[00:34:00] thing to handle my subscription to sell
[00:34:04] subscriptions to other people.
[00:34:05] So they know the pain points of their
[00:34:09] own product because they’re by the very
[00:34:11] nature of their business model forced to
[00:34:14] use their own product.
[00:34:15] Yeah.
[00:34:15] Yeah.
[00:34:18] It’ll be interesting.
[00:34:20] You know,
[00:34:20] now these new wave of AI browsers are
[00:34:24] coming on board where,
[00:34:27] you know,
[00:34:27] you have browsers that have agents built
[00:34:29] into them and they can then, you know,
[00:34:34] interact with the client through the
[00:34:36] client interface.
[00:34:38] And I wonder how that will change things
[00:34:41] as far as like going through those,
[00:34:44] those browser agents,
[00:34:47] AI agents to interact with the client
[00:34:50] facing API.
[00:34:54] That will expose things.
[00:34:55] Cause yeah, there’s,
[00:34:57] At one point,
[00:34:57] we did a count of how many different
[00:34:59] versions of API or SDKs there are in
[00:35:03] Airtable between…
[00:35:04] There’s two for interfaces.
[00:35:07] Two for interfaces?
[00:35:08] Yes.
[00:35:09] Is that the scripting?
[00:35:11] Well, if you count scripting,
[00:35:12] then there’s four.
[00:35:15] There’s the scripting extension,
[00:35:17] scripting for automations,
[00:35:19] interfaces for the data layer,
[00:35:20] and interfaces for… Interfaces.
[00:35:24] Well…
[00:35:26] extensions for interfaces and extensions
[00:35:28] for the data layer.
[00:35:32] Right, right, right.
[00:35:33] Yeah, yeah.
[00:35:33] Yeah, so we’ve got all those.
[00:35:35] The REST API is different than the webhook
[00:35:38] API.
[00:35:41] Yeah, there’s a lot going on.
[00:35:42] Then we haven’t even talked about,
[00:35:43] there’s an audit log API that you could
[00:35:46] tap into with other things.
[00:35:50] And there’s a special carve out in the
[00:35:52] web API for Skim.
[00:35:54] It does a lot of the same things,
[00:35:57] but very differently.
[00:35:58] Yeah, yeah, yeah, yeah.
[00:36:00] There’s some enterprise only stuff.
[00:36:02] So yeah,
[00:36:04] and then there’s the whole client thing.
[00:36:07] Where, yeah, if you,
[00:36:08] if you look under the hood of,
[00:36:10] of Airtable,
[00:36:11] you can see the network traffic.
[00:36:13] And so there’s a whole, you know,
[00:36:14] API that,
[00:36:16] that the client communicates with,
[00:36:17] with their tables backend.
[00:36:20] Um, it’s pretty interesting as well.
[00:36:22] So a lot of moving parts and they
[00:36:25] don’t stay in sync.
[00:36:26] You know,
[00:36:26] like I was thinking about how you get
[00:36:28] the name,
[00:36:29] the primary key name in the web hook.
[00:36:31] I doubt they’ve updated that for being
[00:36:33] able to change what field is your primary
[00:36:37] key that just came out a month or
[00:36:38] so ago.
[00:36:39] I doubt that’s reflected in the,
[00:36:43] in the web hook.
[00:36:45] I still think you can’t get,
[00:36:48] you know how you can name records in
[00:36:50] a table,
[00:36:51] like instead of calling them records,
[00:36:52] their clients or their meetings or
[00:36:55] whatever.
[00:36:56] I don’t think that’s queryable anywhere.
[00:36:58] You can get the description,
[00:36:59] but you can’t get the name of the
[00:37:01] records.
[00:37:03] Yeah.
[00:37:03] Except you can’t get the base description.
[00:37:05] The base description doesn’t come in the
[00:37:07] API.
[00:37:07] Okay.
[00:37:08] Some of these are a little silly.
[00:37:15] Yeah.
[00:37:15] So much that could be improved.
[00:37:18] And anyways, awesome.
[00:37:21] Thank you, Martin.
[00:37:22] How can people find you,
[00:37:23] especially this new product?
[00:37:24] Where’s it at?
[00:37:26] Yep.
[00:37:28] The website is at sync.powersave.pro.
[00:37:34] So powersave.pro is the Chrome extension,
[00:37:38] and the sync lives here at
[00:37:41] sync.powersave.pro.
[00:37:42] Let me log out to see the landing
[00:37:45] page.
[00:37:46] And this is it.
[00:37:50] So far there is the schema change log.
[00:37:51] There is also Slack engine,
[00:37:52] which is another interesting topic,
[00:37:54] but this is still in beta.
[00:37:56] And I have some work on Stripe integration
[00:37:58] as well, which is also still in beta,
[00:38:01] but the schema change log is all well
[00:38:04] and ready to be used.
[00:38:07] Cool.
[00:38:08] Awesome.
[00:38:09] Thanks for coming on and good to see
[00:38:12] everybody.
[00:38:12] We will be back next week with our
[00:38:16] updates on all the latest changes and
[00:38:18] feature releases.
[00:38:19] So we’ll see you next time.
[00:38:21] Take care.
[00:38:22] Thank you.