How to check if user exists in Airtable by email address

I need help with checking if a user already exists in my Airtable database by searching for their email. If the user doesn’t exist, I want to add them to the table.

Here’s my current code:

var Airtable = require('airtable');
var database = new Airtable({ apiKey: process.env.API_KEY }).base(process.env.BASE_ID);

app.post('/createUser', (req, res) => {
  const { userId, name, userEmail, avatar, authProvider } = req.body;
  database('members').find({filterByFormula: `FIND(userEmail = '${userEmail}')`}, function(error, result) {
    if (error) res.status(400).send(error);
    console.log('Found record', result.id);
    database('members').replace([{ "fields": { userId, name, userEmail, avatar, authProvider }}], function(error, results) {
      if (error) console.log(error)
      else console.log(results[0]) 
      res.status(200).send(results[0]._rawJson);
    });
  });
});

I’m getting this error:

AirtableError {
  error: 'NOT_FOUND',
  message: 'Could not find what you are looking for',
  statusCode: 404
}

I also tried using select instead of find:

database('members').select({filterByFormula: `FIND(userEmail = '${userEmail}')`}, function(error, result) {

But that gives me:

Airtable: select takes only one parameter, but it was given 2 parameters. Use eachPage or firstPage to fetch records.

What’s the correct way to search for a record by email in Airtable?

Your filter syntax and method usage are the problem. I hit the same issue when building auth for our webapp. The find() method wants a record ID, not a filter - that’s why you’re getting the 404.

Here’s what works:

app.post('/createUser', (req, res) => {
  const { userId, name, userEmail, avatar, authProvider } = req.body;
  
  database('members').select({
    filterByFormula: `{userEmail} = "${userEmail}"`
  }).firstPage((err, records) => {
    if (err) return res.status(400).send(err);
    
    if (records && records.length > 0) {
      // User exists - update existing record
      database('members').update(records[0].id, {
        userId, name, userEmail, avatar, authProvider
      }, (err, record) => {
        if (err) return res.status(400).send(err);
        res.status(200).send(record._rawJson);
      });
    } else {
      // User doesn't exist - create new
      database('members').create({
        userId, name, userEmail, avatar, authProvider
      }, (err, record) => {
        if (err) return res.status(400).send(err);
        res.status(201).send(record._rawJson);
      });
    }
  });
});

Double-check that your field name in curly braces matches exactly what’s in Airtable. The double quotes prevent issues with special characters in email addresses.

Your filterByFormula syntax is wrong. The FIND function doesn’t work like that in Airtable.

Try this instead:

database('members').select({
  filterByFormula: `{Email} = '${userEmail}'`
}).firstPage(function(err, records) {
  if (err) {
    console.error(err);
    return res.status(400).send(err);
  }
  
  if (records.length > 0) {
    // User exists, update them
    const recordId = records[0].id;
    database('members').update(recordId, {
      userId, name, userEmail, avatar, authProvider
    }, function(err, record) {
      if (err) console.log(err);
      res.status(200).send(record._rawJson);
    });
  } else {
    // User doesn't exist, create new record
    database('members').create({
      userId, name, userEmail, avatar, authProvider
    }, function(err, record) {
      if (err) console.log(err);
      res.status(201).send(record._rawJson);
    });
  }
});

Just replace {Email} with whatever your actual email field is called.

I hit this same issue last year building user management for our tool. Here’s what matters:

  1. Use select() with firstPage() instead of find()
  2. Filter formula should be {FieldName} = 'value'
  3. Check records.length to see if user exists
  4. Use update() for existing users, create() for new ones

You’re mixing up find and select - that’s why you’re getting the 404. The find method wants a record ID, not a filter formula.

Here’s what worked for me:

database('members').select({
  filterByFormula: `{userEmail} = "${userEmail}"`
}).eachPage(function page(records, fetchNextPage) {
  if (records.length > 0) {
    // User exists - handle accordingly
    console.log('User found:', records[0]);
    // Your update logic here
  } else {
    // Create new user
    database('members').create({
      userId, name, userEmail, avatar, authProvider
    }, function(err, record) {
      if (err) console.log(err);
      res.status(200).send(record._rawJson);
    });
  }
}, function done(err) {
  if (err) console.error(err);
});

Double-check your field name matches Airtable exactly - it’s case sensitive. Use double quotes in the filter to avoid problems with single quotes in emails.