[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Schedule](https://evolu.dev/docs/api-reference/common/Schedule) › tapScheduleOutput

```ts
function tapScheduleOutput<Output>(
  f: (output: Output) => void,
): <Input>(schedule: Schedule<Output, Input>) => Schedule<Output, Input>;
```

Defined in: [packages/common/src/Schedule.ts:2036](https://github.com/evoluhq/evolu/blob/dd96d79f1dbe9a49fa12ce8e0aa7d3d0177795ca/packages/common/src/Schedule.ts#L2036)

Executes a side effect for every output without altering the schedule.

Useful for logging, monitoring, or debugging without changing schedule
behavior.

### Observing schedule output

```ts
import {
  assertEqual,
  exponential,
  retryStrategyAws,
  tapScheduleOutput,
  testCreateDeps,
  type Millis,
} from "@evolu/common";

// Log each delay for debugging.
const messages: Array<string> = [];
const logged = tapScheduleOutput((delay: Millis) => {
  messages.push(`Next delay: ${delay}ms`);
})(exponential("100ms"));

// Track the preset's pre-jitter delay candidates without changing it.
const recordedCandidates: Array<Millis> = [];
const tracked = tapScheduleOutput((candidate: Millis) => {
  recordedCandidates.push(candidate);
})(retryStrategyAws);
const deps = testCreateDeps();
logged(deps)(undefined);
tracked(deps)(undefined);

assertEqual(messages, ["Next delay: 100ms"]);
assertEqual(recordedCandidates, [50]);
```