{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://inquir.org/use-cases/nightly-etl#webpage","url":"https://inquir.org/use-cases/nightly-etl","name":"Serverless nightly ETL without Airflow or Kubernetes","headline":"Serverless nightly ETL without Airflow or Kubernetes","description":"Serverless nightly ETL: extract from external sources, transform with Node.js or Python, load to your data store—all in scheduled pipeline steps with retries, execution history, and no Airflow cluster to manage.","inLanguage":"en-US","isPartOf":{"@id":"https://inquir.org/#website"},"author":{"@type":"Organization","name":"Inquir"},"datePublished":"2025-01-01T00:00:00.000Z","dateModified":"2026-04-20T00:00:00.000Z","citation":"https://inquir.org/docs"},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://inquir.org"},{"@type":"ListItem","position":2,"name":"Use cases","item":"https://inquir.org/use-cases"},{"@type":"ListItem","position":3,"name":"Nightly ETL","item":"https://inquir.org/use-cases/nightly-etl"}]},{"@type":"HowTo","@id":"https://inquir.org/use-cases/nightly-etl#howto","name":"Serverless nightly ETL without Airflow or Kubernetes","description":"Serverless nightly ETL: extract from external sources, transform with Node.js or Python, load to your data store—all in scheduled pipeline steps with retries, execution history, and no Airflow cluster to manage.","inLanguage":"en-US","author":{"@type":"Organization","name":"Inquir"},"step":[{"@type":"HowToStep","position":1,"name":"Extract step: fetch from sources","text":"Call external APIs or query source database. Store raw data to intermediate storage or pass as pipeline payload."},{"@type":"HowToStep","position":2,"name":"Transform step: apply business logic","text":"Clean, normalize, enrich, and aggregate. Python with pandas; Node.js for JSON transforms. Output structured data."},{"@type":"HowToStep","position":3,"name":"Load step: write to destination","text":"Upsert to data warehouse, update analytics tables, generate aggregates. Idempotent by batch ID or date range."}],"isPartOf":{"@id":"https://inquir.org/use-cases/nightly-etl#webpage"}},{"@type":"FAQPage","@id":"https://inquir.org/use-cases/nightly-etl#faq","url":"https://inquir.org/use-cases/nightly-etl","isPartOf":{"@id":"https://inquir.org/use-cases/nightly-etl#webpage"},"mainEntity":[{"@type":"Question","name":"Can I pass data between pipeline steps?","acceptedAnswer":{"@type":"Answer","text":"Yes—pipeline steps return structured output. The next step receives it as event.previousOutput. For large payloads (CSV, JSON files), store to object storage and pass the storage key between steps."}},{"@type":"Question","name":"How do I handle a failed ETL load step?","acceptedAnswer":{"@type":"Answer","text":"Configure retry count and delay on the load step. Ensure the load step is idempotent (upsert by stable ID or date range). If retries exhaust, execution history records the failure and alerts fire."}}]}]}