[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) › tapScheduleInput

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

Defined in: [packages/common/src/Schedule.ts:2100](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Schedule.ts#L2100)

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

Useful for logging errors during retry or monitoring what values are being
processed.

### Observing schedule input

```ts
import {
  assertEqual,
  exponential,
  tapScheduleInput,
  testCreateDeps,
  type Millis,
  type Schedule,
  type Typed,
} from "@evolu/common";

interface MyError extends Typed<"NetworkError" | "Timeout"> {}
const retrySchedule: Schedule<Millis, MyError> = exponential("100ms");
// Log errors for debugging.
const messages: Array<string> = [];
const logged = tapScheduleInput((error: MyError) => {
  messages.push(`Retrying after error: ${error.type}`);
})(retrySchedule);

// Or retain just the retry reasons for metrics.
const reasons: Array<string> = [];
const tracked = tapScheduleInput((error: MyError) => {
  reasons.push(error.type);
})(retrySchedule);
const deps = testCreateDeps();
const error: MyError = { type: "NetworkError" };
logged(deps)(error);
tracked(deps)(error);

assertEqual(messages, ["Retrying after error: NetworkError"]);
assertEqual(reasons, ["NetworkError"]);
```