The Scenario
You are a sales ops manager and the SDR team starts outreach in three hours. The lead-gen campaign delivered 500 target accounts into an Excel table — company name, domain, industry, employee count, owner assignment — and the CRM has to reflect them before anyone sends the first message.
You have been down this road before. Attio's CSV importer does not deduplicate on domain. Every row that already exists in the CRM will get created as a second record. Someone will have to clean up those duplicates afterward, and that someone is going to be you.
The bad version:
- Export existing Attio companies, load into a second Excel sheet, VLOOKUP against the new list to separate creates from updates, manually update the existing ones and batch-create the new ones.
- Go row by row through Attio, searching each domain to decide whether to create or update.
- Push the list to the CRM admin and tell them you need it done before outreach starts, then wait for questions to come back.
None of those are workable before the SDR team's stand-up.
The Easy Way: One Prompt in SheetXAI
SheetXAI is an AI agent that lives inside your Excel workbook. It reads your table, calls Attio with the correct upsert logic per row, and writes the result back — without the importer, without the dedup spreadsheet dance.
Read the Excel table 'TargetAccounts' and assert each row as an Attio company matching on Domain; set Name, Industry, and Description from the corresponding columns; write the Attio record ID into the 'AttioID' column.
What You Get
- The AttioID column fills with the Attio record ID for each row.
- Rows that matched an existing company show 'updated' — the record is patched, not duplicated.
- New companies show 'created' with their new record ID.
- Any row that errors surfaces a message in AttioID so you know exactly what needs attention.
What If the Data Is Not Quite Ready
Domain values are inconsistent across the table
"https://acme.com", "www.acme.com", "acme.com/" — all the same company.
Normalize each Domain value in the TargetAccounts table to bare domain format before matching; upsert each row into Attio as a company; write 'created' or 'updated' and the record ID into the AttioID column.
Some rows are missing Industry or Employee Count
You don't want to blank out those fields on records that already have them in Attio.
For each row in TargetAccounts, upsert the Attio company by Domain; only set Industry if the Industry cell is not empty; only set EmployeeCount if the EmployeeCount cell is not empty; write the result into AttioID.
The workbook has an Assignments sheet with owner emails by domain
For each row in TargetAccounts, upsert the Attio company by Domain; look up the owner email for that domain in the Assignments sheet and set it as the record owner; write the result and record ID into AttioID.
Validate domains, clean fields, and upsert in one pass
Check each Domain in the TargetAccounts table — mark rows with invalid domain format as 'skip - invalid domain' in AttioID. For valid rows, normalize the domain, upsert the Attio company, set Name, Industry, and EmployeeCount where non-empty, and write 'created' or 'updated' plus the record ID into AttioID.
Try It
Get the 7-day free trial of SheetXAI and open any Excel workbook with a list of companies you need in Attio — lead-gen output, enrichment exports, partner lists — and ask it to run the upsert. The Attio integration is included in every SheetXAI plan. See also the spoke on exporting Attio companies to Excel, or the hub for an overview of all Attio integration methods.
