New to Kestra?
Use blueprints to kickstart your first workflows.
Automatically create HubSpot contacts from new and updated Postgres rows. An event driven, incremental Postgres to HubSpot sync orchestrated with Kestra.
Keep your HubSpot CRM in lockstep with your application database. This blueprint watches a Postgres customers table for new and recently updated rows and pushes each one into HubSpot as a contact, so your sales and marketing teams always work from fresh data without manual CSV exports or brittle one off scripts. It closes the common gap between an operational database (where signups and profile edits actually happen) and the CRM (where revenue teams live), giving you a reliable Postgres to HubSpot pipeline that runs on its own.
io.kestra.plugin.jdbc.postgresql.Trigger polls Postgres on a PT5M interval with fetchType: FETCH, selecting first_name, last_name, email, phone, and job_title from customers where updated_at is within the last day and the row has not yet been processed (processed_at IS NULL OR processed_at < updated_at).trigger.rows, and a io.kestra.plugin.core.flow.ForEach task iterates over every returned row.io.kestra.plugin.hubspot.contacts.Create task creates a contact in HubSpot, mapping email, firstName, lastName, phone, and jobTitle from the row values via json(taskrun.value).Postgres can store and emit data, but it cannot orchestrate an end to end sync to an external API on its own. Kestra adds an event driven trigger that polls the table, fans out work with ForEach, and lets you attach retries, alerting, and error handling around the HubSpot calls. You get full execution lineage and logs for every contact created, a single declarative YAML definition you can review and version, and the ability to schedule or pause the pipeline centrally, none of which a database scheduler or an ad hoc script gives you.
customers table with first_name, last_name, email, phone, job_title, updated_at, and processed_at columns.HUBSPOT_API_KEY: HubSpot private app token or API key used to create contacts.POSTGRES_URL: JDBC connection URL for your Postgres database.POSTGRES_USERNAME: Postgres user with read access to the customers table.POSTGRES_PASSWORD: password for that Postgres user.customers table and its columns exist, or adjust the trigger SQL to match your schema.processed_at after a successful create so the same row is not synced twice (add a follow up Query task).interval to your latency needs.