Quickstart
End-to-end walkthrough building a Steel Order Quoting System with Gmail input, schematization, script-based pricing, and Gmail reply.
This guide walks you through building a complete automation from scratch. By the end you will have a process that:
- Monitors a Gmail inbox for incoming steel order requests
- Extracts structured data (customer name, steel type, weight in lbs) from the email body using AI
- Calculates a quote based on the extracted weight
- Replies to the original email thread with the quote
Prerequisites
- A connected Gmail account (OAuth or Service Account) under Settings > Service Accounts
- At least one LLM provider configured (OpenAI or Anthropic)
Create the Schema
A schema defines the shape of data your process works with. For this system you need two data blocks: one for the incoming request and one for the outgoing quote.
- Navigate to Schemas and click New Schema.
- Name it
Steel Order.
Data Block: Order Request
Create a data block called Order Request with these data points:
| Field | Type | Description |
|---|---|---|
customer_name | string | Name of the requesting customer |
customer_email | string | Email address of the customer |
steel_type | string | Type of steel requested (e.g., carbon, stainless, alloy) |
weight_lbs | number | Weight of steel requested in pounds |
urgency | enum | standard, rush, emergency |
Data Block: Quote
Create a second data block called Quote with these data points:
| Field | Type | Description |
|---|---|---|
price_per_lb | number | Price per pound for the steel type |
total_price | number | Calculated total price |
estimated_delivery | string | Estimated delivery date |
notes | string | Any additional notes |
Create the Process
- Navigate to Processes and click New Process.
- Name it
Steel Order Quoter.
You are now in the visual workflow editor. You will add four nodes and connect them left to right.
Add the Gmail Input Node
This node monitors your inbox for order requests.
- Open the Node Palette (left sidebar) and drag an Input node onto the canvas.
- Click the node to open its configuration.
- Set the following:
| Setting | Value |
|---|---|
| Type | Gmail |
| Auth Method | OAuth (or Service Account) |
| Account | Select your connected Gmail account |
| Sender Filter | *@steelcustomer.com |
| Subject Filter | order, quote, steel |
| Polling Interval | 30 |
| Convert to Plain Text | Enabled |
| Label | Email Input |
When this node triggers, it outputs data in this shape:
{
"id": "msg_abc123",
"thread_id": "thread_xyz789",
"sender": "buyer@steelcustomer.com",
"recipients": ["orders@yoursteel.com"],
"subject": "Steel Order Request - 5000 lbs Carbon Steel",
"body": "Hi, we need a quote for 5000 lbs of carbon steel...",
"date": 1712937600
}thread_id is critical — you will template it into the output node to reply in the same thread.Add the Schematization Node
This node uses an LLM to extract structured data from the raw email body into your Order Request data block.
- Drag a Schematization node onto the canvas.
- Connect the Email Input output port to the Schematization input port.
- Open the configuration:
| Setting | Value |
|---|---|
| Schema | Steel Order |
| Data Blocks | Order Request |
| Model | gpt-4o |
| Provider | openai |
| System Prompt | Extract the steel order details from this email. If the customer name is not explicit, use the sender name. Map urgency based on keywords like "rush", "ASAP", "urgent". |
| Label | Extract Order |
After execution, this node outputs:
{
"Order Request": {
"customer_name": "John Smith",
"customer_email": "buyer@steelcustomer.com",
"steel_type": "carbon",
"weight_lbs": 5000,
"urgency": "standard"
}
}Each data block name becomes an output handle, so downstream nodes reference the data as Extract Order.Order Request.weight_lbs.
Add the Script Node (Quote Calculator)
This node runs a Python script to calculate the quote based on the extracted weight and steel type.
- Drag a Script node onto the canvas.
- Connect Extract Order to the Script node.
- Open the configuration and set Label to
Calculate Quote, Output Type totext.
Enter this Python code:
# Price table (per lb)
prices = {
"carbon": 0.45,
"stainless": 1.20,
"alloy": 0.85,
"galvanized": 0.65,
"tool": 2.10
}
# Extract fields from the upstream schematization node
order = input_data["Extract Order"]["Order Request"]
steel_type = (order.get("steel_type") or "carbon").lower()
weight = float(order.get("weight_lbs") or 0)
urgency = order.get("urgency") or "standard"
# Look up price
price_per_lb = prices.get(steel_type, 0.50)
# Urgency multiplier
multiplier = 1.0
if urgency == "rush":
multiplier = 1.25
elif urgency == "emergency":
multiplier = 1.50
# Calculate
total = weight * price_per_lb * multiplier
# Delivery estimate
delivery = "10-14 business days"
if urgency == "rush":
delivery = "5-7 business days"
elif urgency == "emergency":
delivery = "2-3 business days"
# Return structured result
return {
"price_per_lb": price_per_lb,
"total_price": round(total, 2),
"estimated_delivery": delivery,
"weight_lbs": weight,
"steel_type": steel_type,
"urgency": urgency,
"customer_name": order.get("customer_name")
}After execution, this node outputs:
{
"output": {
"price_per_lb": 0.45,
"total_price": 2250.00,
"estimated_delivery": "10-14 business days",
"weight_lbs": 5000,
"steel_type": "carbon",
"urgency": "standard",
"customer_name": "John Smith"
}
}Add the Gmail Output Node (Reply)
This node replies to the original email thread with the calculated quote.
- Drag an Output node onto the canvas.
- Connect Calculate Quote to the Output node.
- Open the configuration:
| Setting | Value |
|---|---|
| Type | Gmail |
| Auth Method | Same as input |
| Account | Same Gmail account |
| Reply Mode | reply |
| Thread ID | {{input["Email Input"]["thread_id"]}} |
| Subject | Re: {{input["Email Input"]["subject"]}} |
| Label | Send Quote |
For the Body, use templates to pull data from both upstream nodes:
Hi {{input["Calculate Quote"]["customer_name"]}},
Thank you for your inquiry. Here is your quote:
Steel Type: {{input["Calculate Quote"]["steel_type"]}}
Weight: {{input["Calculate Quote"]["weight_lbs"]}} lbs
Price per lb: ${{input["Calculate Quote"]["price_per_lb"]}}
Total Price: ${{input["Calculate Quote"]["total_price"]}}
Estimated Delivery: {{input["Calculate Quote"]["estimated_delivery"]}}
This quote is valid for 30 days. Reply to this email to confirm your order.
Best regards,
Steel Orders Team{{input["Email Input"]["thread_id"]}} in the Thread ID field. This tells the Gmail output node to reply within the same email conversation rather than starting a new thread.Connect and Test
Your final graph looks like this:
[Email Input] → [Extract Order] → [Calculate Quote] → [Send Quote]
Manual Test
- Click Start on the process toolbar.
- Send a test email to the monitored inbox:
Subject: Steel Order Request - Carbon Steel Body: Hi, I need a quote for 5000 lbs of carbon steel. This is for our warehouse expansion project. Standard delivery timeline is fine. Thanks, John Smith - Watch the Execution History panel on the right side of the editor.
- Each node will turn green as it completes.
- Check the Gmail inbox — a reply should appear in the same thread.
Inspect Node Output
Click any completed node in the execution history to see:
- Input Data: What the node received
- Output Data: What it produced
- Timing: Start time, duration
- Errors: If anything went wrong
Production Considerations
Error Webhook
Set an error webhook URL on the process to get notified when executions fail:
- Open process settings.
- Set Error Webhook URL to your monitoring endpoint.
- Failed executions will POST error details including the failed node and error category.
Locking
Lock the process to prevent accidental edits while it runs in production:
- Click the Lock icon in the process toolbar.
- Only users with write access can unlock it.
Versioning
Save a version snapshot before making changes:
- Click Versions in the toolbar.
- Click Create Version with a label like
v1.0 - initial release. - You can restore to any previous version if a change breaks something.
Template Reference (Quick)
Templates use double curly braces and bracket notation to reference upstream node data:
| Pattern | Example |
|---|---|
| Field reference | {{input["Node Label"]["field_name"]}} |
| Nested field | {{input["Node Label"]["address"]["city"]}} |
| Array element | {{input["Node Label"]["items"][0]}} |
| File reference | {{input["files"]["Node Label"][0]["name"]}} |
| Built-in function | {{now("2006-01-02")}} |
| Default value | {{default(input["Node"]["field"], "N/A")}} |
| UUID generation | {{uuid()}} |
See Data Flow and Templates for the full reference.
Next Steps
- Concepts Overview — understand the full platform
- Schemas In-Depth — advanced schema features
- Node Reference — every node type explained
- Flow Control — add conditionals and loops to your processes