A clip from S25-E06 — BuiltOnAir Live Podcast.
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.
CLIP VIDEO
Watch this clip from the show.
CLIP AUDIO
Listen to this clip, or add the show to your favorite podcast player.
Listen On: Apple | Overcast | Spotify
THE FULL EPISODE
This clip is part of S25-E06. Watch or listen to the whole conversation: S25-E06
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 Clip
Alli Alosa demonstrates how to use the ‘Insert as JSON’ feature in Airtable automations to reliably handle incoming data from external webhooks, such as Fillout. She explains why this method is more robust than traditional field mapping, especially when dealing with inconsistent data.
The discussion covers a practical use case involving event feedback collection. By passing the entire payload as a JSON object, you can prevent automations from failing when certain form fields are left empty or missing from the payload.
Finally, the team explores how to use this JSON data within a script action. Instead of manually mapping every individual field as an input, you can pass the entire object into a script, allowing for much more scalable and maintainable automation logic.
⏱ In this cut:
- 01:03 — Using feedback collection as a use case
- 12:38 — The benefits of using Insert as JSON
- 13:37 — Solving errors caused by empty field values
- 17:00 — Passing JSON data into a script action
- 25:09 — Conditional filters and advanced integrations
Clip Transcription
The transcription for this clip can be found here:
Danny Fellars: So good live demos going on with Airtable there. Danny Fellars: Very cool. Danny Fellars: Yep. Danny Fellars: K. Danny Fellars: So a few things, to keep you up to date on. Danny Fellars: With that, Ali is gonna talk about some new feature in automations inserting as JSON. Danny Fellars: What does that even mean for JSON? Danny Fellars: I've heard people say it. Danny Fellars: Who's who's this JSON guy? Alli Alosa: I my my old, colleague, like, counterpart at at Gagell's, his name was Jason, and so we would and whenever we talk about Jason, we'd be laughing about it because our conversations would get confusing. Alli Alosa: So we okay. Alli Alosa: I'm gonna share my screen. Alli Alosa: Let me open this up. Alli Alosa: Amazing. Alli Alosa: Oh, okay. Alli Alosa: There we go. Alli Alosa: Perfect. Alli Alosa: So let me move you guys over to to my other screen so I can still see it. Alli Alosa: Okay. Alli Alosa: So, I'm gonna use a a use case of collecting feedback from people that attended an event. Alli Alosa: So I'm gonna we'll set up a fill out form, a very simple one, and it'll populate these two tables, submissions and scores. Alli Alosa: Let me make this a little bit smaller. Alli Alosa: This was possible to do before, but now it's a little bit easier and just it's gonna be more reliable with this insert as JSON option, and I'll go through what it helps with and why it's useful, and what the problem was previously as well. Alli Alosa: So let's actually just start with a little bit of the schema. Alli Alosa: Super, super simple here. Alli Alosa: And I had to clean it up. Alli Alosa: I reworked it a little bit. Alli Alosa: We have events. Alli Alosa: We have people, and then we have submissions. Alli Alosa: So people are submitting scores about the event. Alli Alosa: And each one of these submission records is just like a holder. Alli Alosa: So it's like this holder of each of the scores that the person submitted. Alli Alosa: So I wanna send out one form, but I wanna collect on different lines if I actually group this instead by submission. Alli Alosa: Clearly, did I do something wrong here? Alli Alosa: Interesting. Alli Alosa: Let me go back. Alli Alosa: Oh, yeah. Alli Alosa: There is yeah, I only just have one. Alli Alosa: I had I had Claude generate fake data for this. Alli Alosa: So there's only one one score, it looks like, per regardless, I wanna be able to have each line or each category be on its own line. Alli Alosa: So that way when I have my dashboard, I can, you know, filter it by type, by event, by submitted by, and still I can get an average across all of that accurately, and I won't have to be able to I won't I won't need to be able to, like, have separate fields. Alli Alosa: That's like average score ambiance, average score food, average score service. Alli Alosa: It's just easier to set it up this way for reporting purposes, and it just looks nicer, I think. Alli Alosa: So there's a lot of advantages to that, but let's talk about what this JSON is. Alli Alosa: So I'm gonna open up automations, and we'll get this started. Alli Alosa: My first thing here is I wanna actually set up my trigger. Alli Alosa: And in my case, I'm gonna use when webhook received. Alli Alosa: This is a little bit more of the setup beforehand, but I'm gonna throw together this really quick fill out form, which I have pointed at my submissions table. Alli Alosa: And it's going to create a new record at my on my submissions table upon submission. Alli Alosa: So we're gonna go edit. Alli Alosa: I'm just gonna throw in the event submitted by, and then I'm going to actually throw in other fields. Alli Alosa: So the cool thing about fill out this is kind of like a a demo of other things you can do in fill out, which is I find super, super helpful. Alli Alosa: You can connect these fields to Airtable. Alli Alosa: Right? Alli Alosa: So that's connected to my event field. Alli Alosa: I go to missions. Alli Alosa: My event field here, and then my submitted by is this as well. Alli Alosa: I'm gonna skip over the whole, you know, privacy issue with the submitted by field being exposed. Alli Alosa: If I were doing this full build, I would actually, you know, go through the means of hiding it and whatnot. Alli Alosa: But let's assume that everybody is okay with seeing everyone in this drop down for now. Alli Alosa: I don't wanna send out one individual form per score because that's annoying, and I don't want my users to be annoyed. Alli Alosa: So I'm going to send out one form, and I'm gonna have three different questions on that form. Alli Alosa: Let's ignore the fact that this is not scalable. Alli Alosa: I'm going for looking nice over scalability, right, because that's sometimes more important. Alli Alosa: Because and what I mean by that is if I ever add a new category, like, say, I wanna start tracking a new category, I'm gonna need to go back to this form and add a new field to it to start collecting that information as well. Alli Alosa: Kind of a negative point piece, but, unfortunately, if you use things like this choice matrix, the data it gives you back does not work. Alli Alosa: Like, you you just can't connect it dynamically to link records, etcetera. Alli Alosa: So we're going to throw in any kind of field because we can just decide what we like here. Alli Alosa: So in our case, I have a rating. Alli Alosa: That's what I ultimately wanna collect as a number from one to 10. Alli Alosa: So I'm gonna throw in either maybe a slider, so you can choose what you like. Alli Alosa: Here, you could say what the maximum is. Alli Alosa: So if that was ten, eighty nine out of 10. Alli Alosa: You could have this, and I could feel like this. Alli Alosa: Rate ambiance. Alli Alosa: And then short answer. Alli Alosa: Let's actually just say ambiance rating, ambiance notes, just to keep the names all the same. Danny Fellars: Yeah. Danny Fellars: Yeah. Alli Alosa: And then I think I did value. Alli Alosa: No service. Danny Fellars: And we'll do one more. Alli Alosa: Okay. Alli Alosa: So let's publish this and just go straight to that. Alli Alosa: So, obviously, I could spend the time making this look nice. Alli Alosa: We're gonna skip that part. Alli Alosa: But I'm gonna choose an event. Alli Alosa: Interesting. Kamille Parks: Live demos. Alli Alosa: Yeah. Alli Alosa: Right? Alli Alosa: What's going on there? Alli Alosa: Okay. Alli Alosa: It is negative. Alli Alosa: Logic. Danny Fellars: No filters. Danny Fellars: Yeah. Danny Fellars: Refresh. Alli Alosa: Wow. Alli Alosa: What is going on? Alli Alosa: Maybe I'm not connected to the right Danny Fellars: It worked in your Alli Alosa: It did. Alli Alosa: I think so that's strange. Alli Alosa: Let me just delete these fields, and I'm gonna delete that integration. Alli Alosa: And the cool thing about fill out is so these fields are are not connected to anything. Alli Alosa: They are just the forms field. Alli Alosa: So I'm gonna leave those there, and then I can actually add a new integration. Alli Alosa: I've since I think what happened is I had two two bases that were named, event ratings in JSON. Alli Alosa: I had several bases named NPS example, I think. Alli Alosa: So and they all happen to have events and submitted by as fields. Alli Alosa: So still submissions. Alli Alosa: Continue. Alli Alosa: Finish. Alli Alosa: Publish now. Alli Alosa: Now I'm gonna add back event. Alli Alosa: Alright. Alli Alosa: Now let's go refresh. Alli Alosa: And Airtable being slow. Alli Alosa: There we go. Alli Alosa: Yeah. Alli Alosa: So let's say for the gala, Maya says great. Alli Alosa: Loved it. Alli Alosa: And I'm gonna skip service rating on purpose. Alli Alosa: And, actually, what I want to do here is go first into our integrate section and just talk about what that looks like. Alli Alosa: So right now, I only have event and submitted by mapped because those are the only two fields that I have connected to Airtable. Alli Alosa: I want to add in here the submission ID because, ultimately, what I want to do is be able to create that new record on my submissions table, and then I'm gonna trigger a webhook to create all the score records, that are linked to that submission. Alli Alosa: And in order to do that, I need the submission ID as part of, yeah, submission record to match them up correctly. Alli Alosa: So I'm gonna do that in here. Alli Alosa: Update. Alli Alosa: And I need to publish. Alli Alosa: This takes a second to show up. Alli Alosa: There we go. Alli Alosa: And that would create the record on my submissions table. Alli Alosa: If we go where is my form? Alli Alosa: So here's that new submission here. Alli Alosa: I don't have any scores linked to it yet, and this is fill out actual format of their submission ID. Alli Alosa: So now I need to go and actually send the data via the webhook, and this is where we get into our JSON piece. Alli Alosa: I'm going to actually go out of my integrations. Alli Alosa: So I'm back on this screen, and I can add additional integrations in addition to my Airtable one. Alli Alosa: So in this case, I want webhook and an Airtable automations. Alli Alosa: I'm gonna go make sure I have this copied, and I can paste it here. Alli Alosa: Now if I just test that, it's not gonna send anything because there are no values in my form. Alli Alosa: So if I go look at what that just gave me here, there's just gonna be, like, some things, but there's nothing really of use to me here. Alli Alosa: However, there will be when there's actual submissions. Alli Alosa: So I'm going to go back into here, and the easiest thing to do, ironically, I think, is to use the advanced tab. Alli Alosa: And in this, we can map the fields that we want. Alli Alosa: But, actually, you know what? Alli Alosa: I'm just gonna try it with this and just use the whole thing as JSON now because we can do that now. Alli Alosa: And that might actually be more useful. Alli Alosa: So let's do that. Alli Alosa: So I'm gonna just say finish setup here and publish, and then I'm actually just gonna go refill this out again. Alli Alosa: Do a different one. Alli Alosa: Just leave a few blanks. Alli Alosa: Okay. Alli Alosa: So that should have given me more information. Alli Alosa: So here's my actual values from the submission. Alli Alosa: So previously, what is frustrating about this, about Airtable scripting action in particular, is that if any of these values were empty, you had them mapped to something in the script, it would just error. Alli Alosa: Like, there was no way around it. Alli Alosa: Like, if it were empty, instead of just being a null value and being fine, it would just be like, sorry. Alli Alosa: We can't continue forward at all. Alli Alosa: And so that's what the benefit is of using the whole thing as JSON. Alli Alosa: So if I open up this script, pop action here. Alli Alosa: Let's just say JSON. Alli Alosa: And here, I can say insert as JSON data or I could and this is what it was always before is I could actually dive into this JSON tree here and say, okay. Alli Alosa: All of my submission data, I'm relying on the questions. Alli Alosa: Let's see. Alli Alosa: Value. Alli Alosa: There was, like, no way to get this out without being able to use the JSON data unless you map it. Alli Alosa: That's what there's a distinction with the the fill out specifically is under the advanced tab. Alli Alosa: If you map it to the parameters that you want, then you can always rely on them being in the same place. Alli Alosa: If they were empty, they still would cause a problem. Alli Alosa: So now I can actually just grab all of the questions. Alli Alosa: And in this case, I'm trying to think through how I want to do it. Alli Alosa: Let's see. Alli Alosa: I wanna do that. Alli Alosa: I almost wanna map them and fill out because it's better. Alli Alosa: It's better to map them and fill out ahead of time because I only need the those questions those answers. Alli Alosa: Mhmm. Alli Alosa: Yeah. Alli Alosa: I think I should do that. Alli Alosa: I'm just gonna do it really quick, which is here. Alli Alosa: This would be, like, score. Alli Alosa: Ambiance, score fruits, score service, notes. Alli Alosa: And then I need the submission ID. Alli Alosa: I think that's notes. Danny Fellars: Notes. Danny Fellars: And the submission ID. Danny Fellars: That Alli Alosa: now if I submit. Danny Fellars: But, yeah, if you were if you're using scripting, you could put the whole thing in there and then parse it in your script. Alli Alosa: Yeah. Alli Alosa: You can. Alli Alosa: Yes. Alli Alosa: Absolutely. Alli Alosa: It's just with fill out specifically, it can get all like, the way they have it. Alli Alosa: I find it easier to just pull out the ones that I want. Alli Alosa: And then then what I'm I'm still gonna use the full JSON here because Right. Alli Alosa: If I didn't Danny Fellars: Yeah. Danny Fellars: There you go. Danny Fellars: Yeah. Danny Fellars: That's a much easier object to Alli Alosa: Exactly. Alli Alosa: Like, now I'm only dealing with what I want. Alli Alosa: Right? Alli Alosa: This is just the data I need to deal with. Alli Alosa: But I left note service empty on purpose so that we can see in here if I were to map this Mhmm. Alli Alosa: To that and just if I try and use that and then run it with a submission that's empty, it will not, work. Alli Alosa: It would error. Danny Fellars: I think I think it would still work because it's still in in the in the post. Kamille Parks: Yeah. Kamille Parks: The the main problem is when you have missing keys or impermanent keys. Kamille Parks: So if note service wasn't part of the payload at all, not just null, just it wasn't included, That's a definite error. Kamille Parks: And then whether or not it errors and what you've done here kinda depends on what you do with it. Alli Alosa: Well, they Yeah. Alli Alosa: Well, even if no. Alli Alosa: There is a maybe I'm not hitting the, like, exact place where it would error, but there is a place that, like, I'm not articulating correctly where Kamille Parks: Well, you're correct. Kamille Parks: Probably the fine record step because that hates no values. Kamille Parks: It has a very hard time of saying, has any of no. Kamille Parks: For whatever reason, it freaks out instead of just saying returning nothing or returning anything. Kamille Parks: I would take either of those over here, but that's that's just me. Danny Fellars: Sometimes I'll have a webhook that that comes from two different sources, and I might have, like, a mode value that specifies, like, where it came from. Danny Fellars: And the schema is maybe a little bit different, and I have to I have to make sure both sources have all the same keys even if they're not used so that it doesn't error. Alli Alosa: Yeah. Alli Alosa: Mhmm. Alli Alosa: Yeah. Alli Alosa: Stuff like that. Alli Alosa: Exactly. Alli Alosa: So now I can take this and I could split it across those records. Alli Alosa: And Danny Fellars: Okay. Danny Fellars: Now it's the thing is it actually comes in as an object. Danny Fellars: I was thinking it would come as a string, and you had to do JSON part Kamille Parks: of it. Kamille Parks: For for all other steps, it comes in as a string that is JSON formatted. Kamille Parks: But for the run script action, it does say insert as JSON data versus insert as JSON string. Kamille Parks: So it does tell you that it is gonna come in as, like, a full object, which means whoever's sending you Webex, make sure that they're formatted correctly. Kamille Parks: Because if they if it's not proper JSON, this is going to fail. Danny Fellars: Yeah. Danny Fellars: Yeah. Alli Alosa: No. Alli Alosa: Exactly. Alli Alosa: So yeah. Alli Alosa: Now we we would be able to then map that. Alli Alosa: And, actually, I wouldn't even need a script step for this because I could just but the re what I would the reason why I would use a script step for this is if I name everything appropriately, what I could actually do is, like, write a a loop over all of these parameters except for, like, take submission ID out and then dynamically create however many sets of scores and notes I have. Alli Alosa: So that way I don't need to edit the script every time. Alli Alosa: Mhmm. Alli Alosa: I'm not gonna spend the time doing that via this just to leave time for Camille's demo as well. Alli Alosa: But the way that this inserts all of the data at once affords you further scalability without needing to, like, worry about it erroring if there's something empty as long as you write your script the correct way. Kamille Parks: And my least favorite part of the script action and automations is the putting in inputs. Kamille Parks: You only need one input. Kamille Parks: Yeah. Kamille Parks: Give just just give me the data from the webhook, and I'll write my, you know, variable names myself rather than this very fiddly one input per field that's coming from your form, which is harder to maintain. Kamille Parks: Yeah. Kamille Parks: Remember, this is the thing that Claude can't do yet. Kamille Parks: So while we're in this interim period where you can build automations except for scripts, make the script part easier on all of us. Kamille Parks: Just just do one input and then parse it yourself inside the script. Kamille Parks: You're using a script anyway. Alli Alosa: Yeah. Alli Alosa: Exactly. Alli Alosa: Yeah. Alli Alosa: So instead of having to go through and do one of these for each one, I can just do this one with all the JSON. Alli Alosa: And then, like I said, like, write some code to just as long as I name all of my parameters the same in a trustworthy way, then I can never have to update the script and only update the form, which would be the way that I'd probably approach doing something like this. Alli Alosa: But the first thing you would actually do in this would be to find the submission ID record. Alli Alosa: You can link them all up together. Danny Fellars: Now does it, this is more fill out question. Danny Fellars: Is it sequential where it will create a record first and then call the webhook, or does it do, like, both at the same time so it's possible the webhook got there before the create record? Alli Alosa: Very good question. Alli Alosa: And I actually thought about that as I was setting it up today because I've done this a million times. Alli Alosa: I've never I believe it is sequential that the the create record is, like, you can't drag them. Alli Alosa: But if it's set up to create a record, it I I believe that happens first. Alli Alosa: I actually don't know if they have that documented, though. Kamille Parks: And, Ali, I'm less familiar with, fill out, but I know they have workflows. Kamille Parks: So I can imagine a scenario where this form itself creates a record in Airtable, and then I'm imagining, like, you make a workflow that's like, well, when it's done doing that, then fire this webhook, as, like, a potential. Kamille Parks: And then, yet another way to do it, technically, I guess, is if if you have it so that it's still pulling data from Airtable so you could get that drop down of events and people. Kamille Parks: But if it doesn't create the record at all, it only sends the webhook of what someone submitted. Kamille Parks: You can make the automation create the submission and then create so you you can force it to be sequential if fill out is not inherently sequential in that way. Alli Alosa: 100. Alli Alosa: And it what it also, I don't know about the workflow. Alli Alosa: I haven't tried workflows yet, but what was what? Alli Alosa: I was I got distracted by looking at something else. Alli Alosa: The order in which these happen, I've never actually had it misfire out of order. Alli Alosa: Like, I've never had the webhook go before the record is created. Alli Alosa: I wish they had it documented, though. Alli Alosa: I don't see it. Alli Alosa: Yeah. Alli Alosa: I don't actually see it anywhere. Danny Fellars: If, yeah, I don't think I bet that they are sequential because if or, like, they both trigger at the same time because I don't think you can use info from your create record in the webhook. Danny Fellars: Yeah. Danny Fellars: So that's more flow. Alli Alosa: What's what's really cool though that you can do you can get fancy with this. Alli Alosa: So there's you can put a few things. Alli Alosa: First, you can do a conditional filter on any integration here. Alli Alosa: So you can say only run this if one of the form answers is x or y or whatever. Alli Alosa: Like, you can add conditions here, and they have condition groups, which is great. Alli Alosa: Then you can also if you set this up to update a record, which I wouldn't for this use case, but in this case, they let you do, and I don't think I have this is not the right form or a plan level, but they have a prefetch feature. Alli Alosa: So if you are updating a record in a particular database, for example, and you need information that's in a different table or a different database that's related, you can go fetch that information, before the user even sees the page, which is really cool. Alli Alosa: And then you can use it in your in your everything else. Alli Alosa: What you can't do is get the ID of the record that was created. Alli Alosa: Like, that's something that I have often yearned for. Alli Alosa: That's why I'm using the submission ID here instead to be able to match the scores because, otherwise, like, that's something that Airtable does if you when you read if you use a redirect from an Airtable form, you can use, like, squiggly record underscore ID squiggly to, like, use that as a placeholder for the ID of the record that the form created. Alli Alosa: Yeah. Alli Alosa: You cannot do that and fill out to my knowledge. Alli Alosa: Yeah. Danny Fellars: Cool. Danny Fellars: Yeah. Danny Fellars: That's a good example of both of fill out and the power of JSON, and that's a nice nice addition. Danny Fellars: You can also do it yeah. Danny Fellars: There's other places where you can insert as JSON, like you're mentioning, like, as JSON string. Danny Fellars: So if you wanna, like, update a record Mhmm. Kamille Parks: The one thing I'm curious about is the repeated action, group in an automation, can take any array. Kamille Parks: It doesn't have to be from a fine record step, although that is the most common, I think, use case. Kamille Parks: Since JSON has arrays in it, I do wonder if the webhook, like, if you could never mind. Kamille Parks: I've I've talked myself out of it. Kamille Parks: You could already do that. Kamille Parks: It's not affected by the insert as JSON because it comes in already as an object from the trigger, which means if it's an array in the trigger, you can loop over that. Kamille Parks: So in this case, not all that relevant, but it is, like, it's just a reminder of it. Kamille Parks: Let's say your JSON wasn't formatted in the array that you want. Kamille Parks: You can plug it into the script very easily, map it however you need to get the array that you want, and then use that in, additional steps afterward. Alli Alosa: Right. Alli Alosa: That's kinda where I was headed with, like, the the naming, like, mapping this from an object into an array of those pairs for the score, notes, score, notes. Alli Alosa: Right. Alli Alosa: Yeah. Alli Alosa: And that's how I wish it could be mapped when it came out of fill out. Alli Alosa: That's, like, where I was like, okay. Alli Alosa: If I had the matrix, but, like, something like that. Alli Alosa: But, yeah, I digress. Alli Alosa: I could go on and on. Danny Fellars: Yeah. Danny Fellars: Cool. Danny Fellars: Cool. Danny Fellars: Yeah. Danny Fellars: Thanks for sharing that. Danny Fellars: We'll move on and, get to double dip today on two new features. Danny Fellars: Now Kamille is gonna walk us through MCP automations.