Bring live data into every workflow run. Query your CRM, ERP, spreadsheets, databases, REST APIs, and GraphQL endpoints — and use the results in AI blocks, transform blocks, and proposal generation.
Datasource blocks execute at run time — they query your external systems with the actual current data for each workflow run. Unlike static configuration, datasource blocks ensure that every proposal uses today's prices, every RFP response references the current project portfolio, and every quote reflects current inventory levels.
Each datasource block references a configured provider connection (set up once in Settings) and defines a query — which can be static or can include template variables populated from earlier workflow blocks.
Results from datasource blocks are structured JSON arrays or objects available to all downstream blocks — AI reasoning blocks, transform blocks, merge blocks, and proposal template fills.
Extracts: customer_name, material_list
Query: WHERE name = {{customer_name}}
Query: prices for {{material_list}}
Combine CRM data + pricing into context
Query your CRM for account, contact, opportunity, or custom object records. The CRM query block uses your configured CRM provider connection and returns matching records as a JSON array. Results can be used to enrich AI context, pre-fill proposal templates, or drive conditional routing.
{{field_name}} syntax// Salesforce: find account by name
SELECT Id, Name, Industry,
AnnualRevenue, PricingTier__c
FROM Account
WHERE Name LIKE '%{{customer_name}}%'
LIMIT 1
[{
"Id": "0015g00001XyzABC",
"Name": "BuildCo Inc.",
"Industry": "Construction",
"AnnualRevenue": 45000000,
"PricingTier__c": "Enterprise",
"BillingCity": "Chicago",
"BillingState": "IL"
}]
No-match handling. Configure what happens when the query returns zero records — fail the block (halts the workflow), continue with empty array, or route to a fallback path. For RFP workflows, "no CRM match" often routes to a new-customer path that creates a Salesforce lead as part of the workflow.
The ERP pricing lookup block is specifically designed for the construction and manufacturing use case of querying a bill-of-materials or material list against your ERP's pricing engine. It accepts a list of material numbers and quantities, passes them to the ERP, and returns current prices, lead times, and availability — typically as a line-item enriched array.
The block accepts a material list array — typically output from an AI extraction block or a workbook line items array. Each item should include a material identifier (part number, material code, or ERP-internal ID) and an optional quantity for quantity-based pricing.
Returns the input array enriched with pricing fields: unit price, currency, discount tier, lead time days, and stock availability. The downstream merge block or proposal template can then use these enriched items directly.
// Input to ERP Pricing block
[
{ "material_no": "MAT-00142",
"quantity": 24,
"unit": "EA" },
{ "material_no": "MAT-00891",
"quantity": 3,
"unit": "SET" }
]
// Output from ERP Pricing block
[
{ "material_no": "MAT-00142",
"quantity": 24,
"unit_price": 142.50,
"currency": "USD",
"total_price": 3420.00,
"lead_time_days": 5,
"in_stock": true },
{ "material_no": "MAT-00891",
"quantity": 3,
"unit_price": 895.00,
"currency": "USD",
"total_price": 2685.00,
"lead_time_days": 14,
"in_stock": false }
]
Read data from Excel (.xlsx) or Google Sheets and use it as structured data in your workflow. The spreadsheet block is especially useful for rate sheets, labor cost tables, historical bid data, and pricing matrices that are maintained by your team in Excel or Sheets rather than a formal ERP system.
Returns a JSON array where each row is an object keyed by the header row values. Numbers are returned as JSON numbers (not strings), dates as ISO 8601 strings, and empty cells as null.
Live vs. static. Every workflow run re-reads the spreadsheet at the time of execution — you always get current data. If your rate sheet is updated mid-month, the next workflow run automatically picks up the new rates without any configuration change. This is different from importing rates once into a static configuration.
Execute parameterized SQL queries against internal databases — PostgreSQL, MySQL, or SQL Server. The SQL query block uses a configured database connection (managed in RenderDraw Settings) and accepts a parameterized query where workflow data can be safely injected as query parameters (never string-concatenated — SQL injection prevention is enforced).
@param_name syntax for safe parameter injectionSQL query blocks use read-only database users in all RenderDraw-managed connections. If you bring your own database credentials, we strongly recommend using a read-only user scoped to the minimum tables needed. Write operations are not supported in SQL query blocks — use a REST API call block or a dedicated write integration instead.
-- Example: Historical project lookup
SELECT
project_name,
project_type,
total_value,
margin_pct,
completion_date
FROM projects
WHERE customer_id = @customer_id
AND project_type = @project_type
AND completion_date >= @cutoff_date
ORDER BY total_value DESC
LIMIT 10
Internal data without an ERP. For companies without a full ERP system, the SQL query block against an internal PostgreSQL or MySQL database is the fastest path to bringing live pricing, inventory, and project history data into workflows — without needing a REST API layer first.
The REST API call block makes an HTTP request to any external REST endpoint and returns the response body as workflow data. It is the generic integration block for any service that doesn't have a dedicated native block — custom pricing APIs, supply chain visibility platforms, internal microservices, partner data feeds.
{{field_name}}$.data.items)// REST API call configuration
{
"method": "POST",
"url": "https://pricing.internal.com
/api/v2/quote",
"headers": {
"Content-Type": "application/json",
"X-Customer-Tier": "{{crm.pricing_tier}}"
},
"body": {
"materials": "{{extraction.materials}}",
"project_type": "{{extraction.project_type}}",
"requested_ship_date": "{{extraction.deadline}}"
},
"response_extract": "$.quote_items"
}
Pagination support. For REST APIs that paginate results, configure the REST API call block with cursor-based or offset-based pagination. The block automatically loops through pages and returns a single merged array — no Loop block required for paginated lookups.
Execute GraphQL queries and mutations against any GraphQL endpoint. Useful for Shopify product catalog, GitHub project data, internal GraphQL APIs, or any backend that exposes a GraphQL interface.
query ProductPricing(
$skus: [String!]!
) {
products(skus: $skus) {
sku
title
pricing {
price
currency
availableQuantity
leadTimeDays
}
}
}
// Variables
{
"skus": "{{extraction.sku_list}}"
}
Datasource blocks support optional response caching per block. When caching is enabled, a cache key is computed from the block configuration and injected parameter values. If a matching cache entry exists and is within the TTL, the cached result is returned instead of making a live request — reducing latency and external API call volume.
Caching is disabled by default — enable it for data that doesn't change often (ERP catalog prices, customer tier assignments) and leave it disabled for data that must always be live (inventory availability, real-time quote pricing).
External APIs impose rate limits that can cause workflow failures during high-volume periods. RenderDraw's datasource blocks handle rate limits gracefully:
Salesforce API governor limits. Salesforce enforces daily API call limits per org. For high-volume workflows, enable response caching for CRM query blocks and use Salesforce bulk APIs for batch operations. The RenderDraw Salesforce connector tracks usage and alerts you when approaching the daily limit.
Stop using yesterday's prices. Connect your ERP, CRM, and internal data sources to your workflows — every run pulls current data automatically.