Goal
From Airtable, when a Purchase Request (table Orders) is set to send, I need to send one single email per supplier. Each order contains multiple Generic Products (table Generics), and each generic can be linked to one or more Suppliers (table Suppliers).
Airtable schema
-
Orders
-
Order Number(text) -
Requested Generics(link to Generics, multiple) -
Order Details(long text, line breaks) -
Send supplier emails(single select: “send”) -
Email sent (Make)(date/time; Make writesnowafter successful sending)
-
-
Generics
-
Name -
Linked Suppliers(link to Suppliers, multiple)
-
-
Suppliers
-
Supplier Name -
Email
-
Make scenario (current)
-
Airtable – Watch Records (Orders)
Filter formula (only picks candidates):AND( {Send supplier emails} = 'send', {Email sent (Make)} = BLANK() ) -
Airtable – Get a Record [Order]
-
Flow Control – Iterator (list:
Order.Requested Generics[]) -
Airtable – Get a Record [Generic]
-
Flow Control – Iterator (list:
Generic.Linked Suppliers[]) -
Airtable – Get a Record [Supplier] → here I get
Supplier.Email(this yields 1 bundle per generic–supplier pair; e.g., 5 bundles if 3+2) -
Flow Control – Array aggregator (A1)
-
Source module:
Get a Record [Supplier] -
Group by:
trim(lower(73."Email"))(73 = the Supplier Get module) -
Stop processing after an empty aggregation: Yes
(Goal: collapse 5 bundles down to 2 unique suppliers.)
-
-
Flow Control – Iterator (I1)
- Array:
A1 → Array[](orGroups[], depending on UI)
(Goal: re-iterate over unique suppliers only.)
- Array:
-
Email – Send an Email
-
To:
I1.Key(this is the grouped supplier email) -
Subject: “Quotation Request {{Order.Order Number}}”
-
Content Type: HTML
-
Body: my template; I insert
{{Order.Order Details}}(long text; CSSwhite-space: pre-line)
-
-
Airtable – Update a Record (Orders)
- Set
{Email sent (Make)} = now(via date/time function picker), so the Watch filter will never match this record again.
- Set
What I expect
If an order involves 3 generics for Supplier A and 2 generics for Supplier B, I expect 2 emails total: one to A, one to B.
What actually happens
Emails are sent per generic (e.g., 5 emails), even though I configured an Array aggregator. In Run history I still see 5 bundles reaching the Email module.
Likely cause
The Email module is still attached to the pre-aggregation path (the first iterator’s cycle), or it’s reading an email value from the earlier Supplier module instead of using the aggregated Key from A1. I also hit “Invalid email address in parameter to” when the To field accidentally concatenated the supplier email with the order number (e.g., someone@mail.comPC-...), which breaks the address.
Exact mappings I’m using
-
Array aggregator (A1) → Group by:
trim(lower(73."Email")) -
Iterator (I1) → Array:
A1.Array[] (or A1.Groups[]) -
Email → To:
I1.Key // only this chip; no concatenation with other chips or text
What I already tried
-
Group bywith and withoutlower()/trim(). -
With and without an extra Text aggregator.
-
Placing the Email immediately after A1 (and after I1).
-
Verified
I1.Keyis just the email (no appended order number). -
Still, Email shows 5 operations in the run (one per generic).
Questions
-
What’s the correct pattern to break out of the first iterator’s cycle and ensure the Email runs per unique supplier only? Is the sequence A1 → I1 → Email the right approach, or do I need a different structure (e.g., Router, distinct aggregator)?
-
Is there a recommended way to guarantee To = unique supplier email that cannot inherit the pre-aggregated bundles?
-
Any best practices to avoid the “Invalid email address in
to” when grouping and mapping (e.g., always useI1.Key, or group by Supplier Record ID and then pick the first email in the group)?
Debug artifacts I can share
-
A1 (Array aggregator) config + output (should show #ops = #unique suppliers).
-
I1 (Iterator on A1) output showing
Key. -
Email Input → To (to confirm it’s
I1.Keyonly). -
Module operation counters (I’m seeing 5 on Email when it should be 2).
Bonus constraints
-
I want to keep the email body simple: the order-level
Order Detailsis the same for all suppliers of that order, so I can insert it directly in the HTML (I do not need to build a per-supplier list unless necessary). -
After successful send(s), I must set
{Email sent (Make)} = nowto block any future re-sends for that order.
Thanks! Any guidance on a definitive “one email per supplier per order” pattern would be hugely appreciated.












