code: public function withCustomData(string $name, $value): Payload
      {
          if ($value && !is_array($value) && !is_scalar($value) && !$value instanceof \JsonSerializable) {
              throw new \InvalidArgumentException(sprintf(
                  'The custom data value should be a scalar or \JsonSerializable instance, but "%s" given.',
                  is_object($value) ? get_class($value) : gettype($value)
              ));
          }
  
          $cloned = clone $this;
  
          $cloned->customData[$name] = $value;
  
          return $cloned;
      }
docs: Add or replace custom data
  
  @param string $name
  @param mixed  $value
  
  @return Payload
  
  @throws \InvalidArgumentException