You're allowed 72 refreshes in a 24-hour period, so that's once every 20 minutes.
One of my own apps displays timers on the widgets, and they generally keep in sync when I use one timeline entry with a date of now, and set it to refresh after now + 20 minutes, i.e.
let date = Date()
let refreshDate = Calendar.autoupdatingCurrent.date(byAdding: .minute, value: 20, to: date)!
...
return Timeline(entries: entries, policy: .after(refreshDate))
I say they "generally" keep in sync. There can be occasions where they'll be a minute or two out - as @jcgoforth explained - so I work around that.
(For info, if the timer is going to hit zero before the 20 minutes, then the refreshDate is set to the actual date of the end of the timer, so the refresh happens then rather than up to 20 minutes later.)
The best thing you can do is use the preview timeline in Xcode. Add something like this to your widget view, and open the preview canvas in Xcode. You can then scroll through the entries and see how they'll look:
#Preview(as: .systemMedium) {
WidgetExtension()
} timeline: {
for offset in 0..<30 {
let entryDate = Calendar.current.date(byAdding: .minute, value: offset, to: secondEntryDate)!
let entry = SingleClockEntry(date: entryDate, configuration: configuration)
entries.append(entry)
}