At a glance
How far back in time you can still recover your data, expressed as the age in hours of your oldest recoverable point. Snowflake does not take backups the way a traditional database does: it continuously protects data through Time Travel (a configurable DATA_RETENTION_TIME_IN_DAYS window) followed by a 7-day Fail-safe period. This card reflects the Time Travel retention floor, the practical answer to “if someone dropped or corrupted a table right now, how old is the furthest-back state I could restore it to?” A low number means a short safety net. The default Time Travel window is 1 day (24h); Enterprise edition allows up to 90 days. The card flags when the recoverable floor drops dangerously short.
Calculation
Snowflake has no nightly “backup job”, so there is no last-run timestamp to read. Recovery is governed by Time Travel retention. The card computes the recoverable depth from the effective retention setting:DATA_RETENTION_TIME_IN_DAYS = 0 punches a hole in an otherwise well-protected account, and the card surfaces the weakest link. Second, after Time Travel expires, a further 7-day Fail-safe period exists, but Fail-safe is recoverable only by Snowflake Support, not self-service, so this card deliberately reports the Time Travel floor, the depth you can actually reach yourself. The > 72h trigger fires when the self-service recovery floor falls short of the recovery point objective the team has set.
Worked example
A platform team runs Snowflake (Enterprise edition) as the warehouse behind a Shopify Plus store’s analytics. Their stated recovery point objective is “we must be able to self-restore any production table to at least 3 days ago.” Snapshot taken 02 Jun 26, 14:00 UTC.
The account default looks great at 168h, but the card headline reads 0 hours because it reports the weakest critical object, and
ORDERS_FACT has retention turned off entirely. This is the exact failure mode the card exists to catch: a team feels safe because the account default is 7 days, while their single most important fact table has no Time Travel at all.
What happened: during a schema migration eight weeks ago an engineer set DATA_RETENTION_TIME_IN_DAYS = 0 on ORDERS_FACT to avoid Time Travel storage during a heavy rebuild, then forgot to restore it. If a bad MERGE corrupted that table today, there would be no self-service UNDROP/AT(OFFSET => ...) path, only a Fail-safe ticket to Snowflake Support with a multi-hour turnaround.
- The account default lies to you. A green account-level retention can sit on top of a single object with retention zeroed. This card reports the floor, not the average, on purpose.
- Time Travel is your only self-service recovery. Fail-safe exists, but it is a support ticket, not a command. Treat the Time Travel floor as your real RPO.
- Retention costs storage. A longer window protects you but inflates Time Travel and Fail-safe bytes, which is why migrations often zero it temporarily. The discipline is to always restore it afterwards, and this card is the safety net that catches when nobody did.
Sibling cards
Reconciling against the source
Where to look in Snowflake:Why our number may legitimately differ from Snowflake’s own view:SHOW PARAMETERS LIKE 'DATA_RETENTION_TIME_IN_DAYS' IN ACCOUNT;for the account default.SHOW PARAMETERS LIKE 'DATA_RETENTION_TIME_IN_DAYS' IN TABLE <db>.<schema>.<table>;for a per-object override. QuerySNOWFLAKE.ACCOUNT_USAGE.TABLES(columnRETENTION_TIME) to scan every table’s effective retention at once. Test actual recoverability withSELECT ... AT(OFFSET => -3600)orUNDROP TABLEto prove the floor is real, not just configured.
Cross-connector reconciliation: recovery depth pairs with replication health. If Cross-Account Replication Lag (s) is also degraded, both your logical-error and region-loss safety nets are weak at once, which is the highest-priority resilience surface.
Known limitations / FAQs
Snowflake does not “take backups”, so what is a snapshot here? Correct, there is no backup job. Snowflake continuously retains historical versions of your data for the Time Travel window, then for a further 7-day Fail-safe period. We translate that continuous protection into a single intuitive number: how far back you can still recover. “Snapshot age” is the age of the oldest self-restorable state. Why does the card show 24 hours when my account default is 7 days? Almost always a per-object override. A table or schema withDATA_RETENTION_TIME_IN_DAYS set below the account default lowers the floor, and this card reports the floor. Run the ACCOUNT_USAGE.TABLES scan above to find the object pulling it down.
What is the difference between Time Travel and Fail-safe?
Time Travel is self-service: you run AT(OFFSET => ...), UNDROP, or clone to recover, within your retention window. Fail-safe is a non-configurable 7-day period after Time Travel expires, recoverable only via a Snowflake Support ticket. This card reports the Time Travel floor because that is the depth you control.
Can I set retention to 90 days?
Only on Enterprise edition or above, and only up to 90 days. Standard edition caps DATA_RETENTION_TIME_IN_DAYS at 1. Longer windows increase Time Travel and Fail-safe storage, so they cost more; see Storage Used (TB).
Does a retention of 0 mean my data is unrecoverable?
For self-service, yes, no Time Travel means no UNDROP or time-offset query. Fail-safe may still hold 7 days, but recovery is a support ticket with no SLA guarantee on speed. Treat a 0 floor as effectively no safety net for fast recovery.
Why does the alert fire above 72 hours? Surely more retention is better?
The trigger is a guard, not a “longer is bad” rule. It is configured against your recovery point objective: the card flags when the self-service floor diverges from policy, typically when an override has dropped a critical object’s window below the RPO. Set the alert threshold to match your own RPO in the Alert Rules tab.
Do transient and temporary tables affect this card?
By design we scope to persistent critical objects. Transient and temporary tables have no Fail-safe and frequently run retention 0 deliberately (they are throwaway), so including them would generate noise. If you depend on a transient table for recovery, it is the wrong object type for that data.