What we've shipped.
Every SnowExporter release, latest at the top. Existing installs upgrade in place via the Snowflake Marketplace — your destinations, channels, schedules, and audit history carry over.
Eight reverse-ETL connectors and Database Replication.
The Reverse ETL library grew from two connectors to eight, and whole-database change-data-capture graduated into a first-class feature: Database Replication. Everything runs on one shared, governed sync runtime — field mapping, incremental watermarks, rate-limit retry, reconciliation, and the compliance loop are identical across every destination.
Live on the Snowflake Marketplace as of 2026-07-09. Existing installs auto-upgrade in place — your destinations, connectors, schedules, and audit history carry over. Still included free for every install; the first paid tier arrives with v3.0.
🔄 Six new Reverse ETL connectors
Joining Salesforce and HubSpot: Iterable (region-aware US/EU,
bulkUpdate), Braze (per-workspace REST endpoint,
/users/track), Zendesk (email + API-token,
create_or_update_many with async job polling),
Marketo (OAuth2 client credentials, leads.json
createOrUpdate), Klaviyo (private-key auth, async profile-import
jobs), and Segment (write-key, HTTP Tracking API
identify fan-out). Browse them in a searchable connector library and set
one up through the Snowsight credential dialog — no copy-paste SQL. Each new
connector shipped on the shared v2.4 runtime in roughly two hours, versus the
multi-day builds the first two took.
🗄️ Database Replication — whole-database CDC to cloud storage
Point it at a source database, pick a cloud destination and a schedule, and every run
drops a timestamped file per table containing only the rows that changed since the
previous run. One config covers the entire database — no per-table setup. Choose
a file layout (flat, Hive-date partitions, or run-folders), cap the file size, and, for
audit tables that don't fit the single-column heuristic, set a per-table
watermark expression override (e.g. GREATEST(created_at,
COALESCE(updated_at, created_at))) so inserts and updates both get captured.
☁️ Cloud storage, front and center
Settings → Destinations now leads with Cloud storage — Amazon S3, Google Cloud Storage, and Azure Blob, each via a Snowflake storage integration — with a provider-first add flow. Internal Snowflake stages get their own tab. Reverse ETL connector setup moved under Destinations too, so every place data can go lives in one menu.
🕒 One schedule monitor
The new Schedules page lists everything that runs on a cadence — scheduled exports, Reverse ETL syncs, and database replications — with friendly names, next-run and last-run times in your timezone, and pause/resume in one place. Admin failure alerts (with 60-minute dedup) ping you when any scheduled run fails.
🔒 Hardening
A code-review pass tightened the Database Replication engine: race-free run IDs for overlapping scheduled + manual runs, automatic watermark reseeding when a table's override type changes (closing a silent skip/re-export edge case), schedule-expression validation, and safer SQL-literal escaping throughout.
Incremental Extract — watermark-based CDC for any audit-tracked table.
v2.3 turns “extract changes since last run” into a one-checkbox feature for
any table with an audit column. Pick a watermark column once — SnowExporter scores
candidates 70–100 by name pattern and auto-fills the wizard. First run captures
MAX(watermark); every subsequent run emits only rows where the watermark
advanced. Typically less than 1% of the table on monotonic-counter columns.
Included free for every install. v2.3 ships on the same free tier as v1.x, v2.0, v2.1, and v2.2 — no Pro tier required. The first paid tier introduces with v3.0 (details closer to ship). Apply for v3.0 early access pricing input at [email protected].
🚀 Bulk setup for 500-table scale
The lighthouse use case is the regulated-industry Snowflake shop with hundreds of audit-tracked tables (Basel III, HIPAA, NAIC, SOX 404 environments all carry mature audit columns). Bulk-add mode scans a schema, surfaces every table with an auto-detected watermark column and confidence score, lets you uncheck the ones you don't want or override columns, and submits them all in one transaction. Configure 500 watermarks in 5 minutes.
🔌 Universal delivery-surface coverage
All 10 delivery surfaces accept an optional SYNC_KEY param to enable
incremental mode: SEND_MAIL, RUN_UNLOAD,
SEND_SLACK, SEND_TEAMS, SEND_WEBHOOK,
SEND_SFTP, RENDER_PDF, RENDER_XLSX,
RUN_SALESFORCE_SYNC, RUN_HUBSPOT_SYNC. Pass it from your
scheduled task and the watermark engine takes over. No SYNC_KEY = full
passthrough, exactly as it behaved before — v2.3 is fully backwards-compatible.
✅ Advance-on-success-only
The watermark only moves forward when the delivery proc returns SUCCEEDED. Failed runs, policy-blocked runs, and partial runs all preserve the watermark so the next run re-pulls the same delta. Idempotent by construction — re-running a failed incremental job never silently skips rows.
🛡 Compliance loop still applies
Every policy that gates a full extract also gates an incremental extract. The policy
engine evaluates the incremental query with the watermark predicate already
injected, so size-aware policies reason about the delta size, not the full table.
COMPLIANCE_AUDIT rows are written for every incremental run with the same
verdict / destination / user columns as a full extract.
📊 Pruning telemetry
Each incremental run logs how Snowflake pruned the watermark predicate — partitions read vs total, ratio, and selectivity. Helps tune watermark column choice on hot tables.
⏩ Watermark dashboard
Settings → Compliance → ⏩ Incremental sub-tab now shows every watermark with its current value, last-advanced timestamp, history, and a rewind action. Use rewind to re-pull deltas from a prior point in time without losing the historical record.
🧪 Try it without setting up an external table
CALL code_schema.GENERATE_INCREMENTAL_DEMO_DATA(100) seeds a sample table
with a monotonic UPDATE_KEY column so you can try v2.3 end-to-end in 30
seconds after install. Re-run to append deltas and watch the watermark advance on the
next scheduled run.
⬆ Upgrading from v2.2.x
No re-install required. Existing installs receive v2.3 automatically. After upgrade,
customers using SFTP, Salesforce, or HubSpot delivery surfaces must re-run
INITIALIZE_SFTP / INITIALIZE_SALESFORCE /
INITIALIZE_HUBSPOT once to pick up the SYNC_KEY-aware
signatures.
Available on the Snowflake Marketplace via DEFAULT channel as of 2026-06-15, following Snowflake's security scan. Existing installs auto-upgrade; new installs land on v2.3 by default.
Compliance enforcement extends to Reverse ETL.
The same policy engine that already gates email, Slack, SFTP, and file unloads now gates Reverse ETL upserts to Salesforce and HubSpot. Write a policy once, and it applies to every channel — including the ones that talk to SaaS APIs.
🛡 Compliance integration for Reverse ETL
RUN_SALESFORCE_SYNCandRUN_HUBSPOT_SYNCnow go throughENFORCE_POLICY_OR_NULL— the same helper that already gates email, Slack, SFTP, and file unloads- Policy verdicts: BLOCK halts the sync, REQUIRE_APPROVAL enqueues for the compliance team, FORCE_MASK rewrites the source query through the masking proc, WARN_ONLY appends a warning to the success message
- Policy enforcement happens before the network call to Salesforce / HubSpot — saves your API quota and rate-limit budget on blocked runs
- Destination types added to the audit and policy lookup:
REVETL_SALESFORCE,REVETL_HUBSPOT - Customers must re-run
INITIALIZE_SALESFORCE/INITIALIZE_HUBSPOTto pick up the new bodies after upgrading
Available on the Snowflake Marketplace via DEFAULT channel as of 2026-06-12, following Snowflake's security scan. Existing installs auto-upgrade; new installs land on v2.2.11 by default. Read the launch post →
Reverse ETL ships — Salesforce + HubSpot, native, no middle hop.
Push Snowflake records straight to Salesforce and HubSpot as upserts. Field mapping, schema discovery, state fingerprints, rate-limit retry, and post-run reconciliation — all running inside your Snowflake account.
v2.2.10 — 🟧 HubSpot connector
- New connector: HubSpot via Private App access tokens — setup is ~3 clicks in HubSpot Settings → Integrations → Private Apps, grant CRM scopes, copy token
/account-info/v3/detailsfor test connection/crm/v3/properties/{type}for schema discovery/crm/v3/objects/{type}/batch/upsertfor syncs (100 records/batch)/crm/v3/objects/{type}/searchfor post-run reconciliation- Same state-fingerprint cache, rate-limit retry, and
COMPLIANCE_AUDITtrail as the Salesforce connector
v2.2.6 – v2.2.9 — 🔄 Salesforce hardening + reconciliation + UI polish
- Salesforce reconciliation — post-run SOQL
COUNTcompared to source rows synced COMPLIANCE_AUDITintegration for Reverse ETL runs- Sidebar nav reorganized; brand consolidation into single footer
- Fixed SQL internal error 300016 in "Your syncs" list (rewrote with CTE +
ROW_NUMBERvs correlated subqueries) - Logo centered in sidebar footer
v2.2.3 – v2.2.5 — 🔄 Salesforce upsert + field mapping ship
- Salesforce JWT Bearer auth with admin-pre-approved External Client Apps (no browser consent loop)
- Composite-API upsert: 200 records/batch with external ID match field
- Field mapping UI: drag source columns onto destination fields, with required/default semantics
- Schema discovery via Salesforce
DESCRIBE— see real fields, no doc hunting - State fingerprint cache (SHA-256 over record properties,
MERGEintoREVETL_SYNC_STATE) — skips unchanged records on subsequent runs - Rate-limit retry with
Retry-Afterheader honored, exponential backoff fallback - Token caching in
REVETL_SF_TOKEN_CACHE— fewer JWT signing operations
v2.2.0 – v2.2.2 — 🚀 Reverse ETL foundation
- New top-level Reverse ETL page in the app
- 5 backend tables:
REVETL_CONNECTORS,REVETL_SYNC_CONFIG,REVETL_FIELD_MAPPINGS,REVETL_SYNC_RUNS,REVETL_SYNC_STATE - Salesforce External Client App setup wizard
- Fixed
ALTER TABLEonCOMPLIANCE_AUDITre-execution that tripped Snowflake's ambiguous-column check (removed redundantDEFAULTclause)
Policy enforcement on every delivery surface.
Per-destination policies that BLOCK, REQUIRE_APPROVAL, or REQUIRE_MASKING sensitive deliveries — applied uniformly across all 9 delivery surfaces. With an approval queue, a compliance-mode toggle, and 5 new first-class audit columns.
v2.1.6 — 📊 Audit log extensions
COMPLIANCE_AUDITgains 5 new first-class columns:COMPLIANCE_MODE,IS_BLOCKED,APPROVAL_ID,APPROVAL_STATUS,POLICY_VERDICT_JSON- Filter / aggregate on blocked exports without JSON parsing
- New filter row in the Reports sub-tab: compliance mode + "Only blocked" toggle
- New status values:
BLOCKED,PENDING_APPROVAL,APPROVED_AUTORESUME
v2.1.5 — ⏸ Approval workflow
- New top-level Approvals page
- Policies tagged
REQUIRE_APPROVALnow route to a queue instead of blocking - Auto-resume: re-submitting a previously-approved export ships without re-asking
- 48-hour expiration on approval requests
v2.1.4 — 🛡 Policy enforcement on all 9 delivery surfaces
BLOCK/REQUIRE_APPROVAL/REQUIRE_MASKINGnow apply across email body, email link, Slack, Teams, webhook, SFTP, file unload, PDF render, XLSX render- New
ENFORCE_POLICY_OR_NULLhelper centralizes the (mode × policy) decision
v2.1.3 — 🛡 SEND_MAIL policy enforcement
- First delivery surface (email body) now honors compliance mode + active policies
ENFORCEmode actually blocks;WARN_ONLYrecords the verdict in audit;OFFpreserves v2.0 behavior
v2.1.2 — 🎛 Compliance mode + wizard preflight
- New Compliance Mode card in Settings → Compliance:
OFF/WARN_ONLY/ENFORCE - New preflight banner in the export wizard previews per-destination policy verdicts
v2.1.1 — 📋 Policies CRUD UI
- Manage destination policies in Settings → Compliance → Policies sub-tab
- Filter / toggle 12 seeded policies, add custom policies
v2.1.0 — 🏛 Policy gate foundation
DESTINATION_POLICYtable with 12 seeded best-practice policies (all inactive by default)CHECK_DESTINATION_POLICYproc evaluates (query × destination) verdicts
Compliance & Governance — classify and mask sensitive data.
Automatic detection of PII, PCI, PHI, and credential columns in your source tables using 45 built-in rules. Mask-by-default applies the right transform per type before the result ever leaves Snowflake. Every export writes a compliance audit row.
Automatic sensitive-data detection
- 45 built-in rules covering PII (names, addresses, phone numbers, SSNs), PCI (card numbers, CVVs), PHI (medical IDs, diagnosis codes), and credentials (API keys, access tokens, password hashes)
- Extendable with custom patterns — register your own column-name patterns or regex content rules in Settings → 🛡️ Compliance → Detection rules
- Detected matches surface in the Create Data Export wizard before the export runs, so you see exactly what will be masked and can override per-column
Mask-by-default transforms
- Last-4 only for credit card numbers and account numbers (
4111-1111-1111-1111→****1111) - Redaction for names and free-text identifiers (
John Smith→█████ ████) - Hashing (SHA-256) for medical IDs and other reference identifiers — preserves equality joins downstream while removing the plaintext
- Domain-only for email addresses (
[email protected]→@acme.com)
Compliance audit log
- Who exported (the Snowflake user and the SnowExporter role)
- What — columns selected, row count, masking applied per column
- To where — channel, destination identifier, recipient or endpoint
- With what masking — every column's resolved masking transform
v2.0 runs on Snowflake Standard edition. All data and processing stay inside the customer's Snowflake account.
Non-breaking migration. Existing v1.x scheduled exports keep their original cleartext behavior when you upgrade. Masking is opt-in for legacy schedules and default-on for new schedules created after the upgrade.
Describe your export in plain English.
The Create Data Export wizard gets a 🤖 AI assist input. Type one sentence; the wizard fills itself in. Powered by Snowflake Cortex, so your data stays inside your Snowflake account.
How it works
"Email me the top 10 customers by revenue every Monday at 9 AM Eastern."
Cortex (currently mistral-large) extracts and returns:
- The SQL query, using only the tables in the database and schema you selected
- The schedule as a cron expression plus an IANA timezone string
- The delivery mode — email body, email link, Slack, Teams, or file destination
- The recipients and destination, matched against your configured channels and destinations
The wizard pre-fills the SQL and shows a recap card with the suggested schedule and delivery. You review every field before clicking Schedule. Nothing is auto-submitted; you can edit anything.
Different from Snowsight Copilot
Snowsight Copilot writes SQL. SnowExporter's AI writes the SQL plus extracts the cron expression, timezone, delivery channel, recipients, and destination — turning a one-sentence ask into a complete scheduled export, not just a query you still have to wire up by hand.
Requirements & access
- Snowflake Cortex must be enabled on your account (paid Snowflake accounts; not most trial accounts). On accounts without Cortex, the AI panel renders an explainer and the manual wizard works normally.
- SnowExporter Pro or Trial only. Free-plan users see an upgrade card in place of the input.
- Your data never leaves your Snowflake account. Cortex runs server-side inside Snowflake, just like the rest of SnowExporter.
What's unchanged
- Same three account-level privileges requested
- Per-destination role enforcement remains policy-only; runtime enforcement on the roadmap
- Email body delivery still capped at 50 rows per send
- App state still in
backend_schema, survivessnow app upgrade - Slack, Teams, and email channels from v1.2 continue to work exactly as configured
Now delivers to Slack and Microsoft Teams.
Pick a Slack or Teams channel as an export destination. Results render as a monospace table directly in the channel, with an optional downloadable file for larger results.
New delivery modes
💬 Slack — channel message. Pick a Slack channel as an export destination. Results render as a monospace table directly in the channel (up to 10 rows + summary). Optional downloadable file attached via a 24-hour presigned link for larger results.
💬 Microsoft Teams — channel message. Same shape using Teams MessageCards. File attachments render as a clickable Download button.
Settings reorganized
- Email recipients, Slack channels, and Teams channels now all live under a single 📣 Notifications tab with sub-tabs for each channel type.
- Every channel integration carries optional Business Contact and Description fields so admins can document who owns each endpoint.
- One-click Test button next to every channel.
Bug fixes worth calling out
Encrypted-garbage downloads fixed. Internal stages must be created with
ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE') for presigned download links to
return readable files. Snowflake's default encryption returns raw encrypted bytes
through presigned URLs. The in-app setup helper and the README now both require it.
Multi-line Slack and Teams messages no longer dropped silently. Fixed the webhook integration body template so messages with newlines deliver intact.
GZIP default flipped to OFF for file attachments. Default-on was
producing .csv.gz files that chat-app previews mishandled. A ⚠️ warning
appears when GZIP is toggled back on for chat-mode file attachments.
Silent-failure bug fixed. Scheduled-run failures that previously looked like successes in the audit log now correctly surface as failures with the actual error message attached.
UX and performance improvements.
A small patch focused on making the existing flows faster and tidier — no new features, no API or behavior changes.
- Wizard query previews render faster.
- Scheduled-task startup latency reduced.
- Destinations page loads faster with many entries.
- Minor UI polish across Home, Logs, and Settings.
SnowExporter is on the Snowflake Marketplace.
The first public release. Run a query, deliver the result by email, presigned download link, or file to an internal stage or external cloud — on demand or on a schedule.
Delivery modes
- Email in the body — up to 50 rows (Snowflake's
SYSTEM$SEND_EMAILcap) - Email with presigned download link to a file written to an internal stage
- File write to an internal stage or AWS S3 / GCP GCS / Azure Blob
File formats & options
- CSV (default) or JSON
- Optional GZIP compression
- Optional timestamp suffix on the file name
- Partitioned or single-file output (follows Snowflake's
COPY INTOrules)
Scheduling
- Cron-based schedules for any export type
- Timezone configurable in Settings → Timezone
- Pause / resume / delete from the Scheduled Exports page
Destinations
- Multi-destination support — define as many as you need
- Per-destination enable / disable
- Per-destination Description and Business Contact metadata
- Per-destination "allowed roles" policy, recorded in UI (runtime enforcement on the roadmap)
Application roles
app_admin— full accessapp_analyst— limited / consumer access, granted as a sub-role ofapp_admin- Per-user role provisioning helper in Settings → Users
Observability
- Activity dashboard on the Home page
- Full audit log on the Logs page
- Per-query actual compute credits from
ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
Privileges requested (only three)
IMPORTED PRIVILEGES ON SNOWFLAKE DB— to read compute attributionEXECUTE TASK— for scheduled exportsEXECUTE MANAGED TASK— for serverless scheduled exports
The app does not request CREATE DATABASE,
MANAGE WAREHOUSES, or any privileges it does not use.
Known limitations in v1.0
- Email body delivery: ≤50 rows per send
- Email recipients: verified Snowflake user emails only
- Per-destination role enforcement: policy-only; runtime enforcement on the roadmap
- File size: follows Snowflake's
COPY INTOlimits
Get the latest on the Snowflake Marketplace.
Existing installs auto-upgrade — destinations, channels, schedules, and audit history carry over from any earlier version.