This expression works with Geometry Generator (for visualization only). Unfortunately, you can't create actual geometries with this as aggregate functions do not work with Geometry by expression.
However, this solution has the advantage that you can teak the values and see the effect changing in realtime. So you can manually change the buffer distance in line 3 and the percentage of the minimum overlap (line 6) to create dissolved buffers. On line 12 you can change the no. of matching features if you want (how many neighbouring points are taken into consideration):
with_variable(
'dist',
5000, -- define buffer distance here
with_variable(
'overlap',
50, -- define the min. overlap in percent
buffer (
collect(
collect_geometries(
array_filter (
array_foreach(
overlay_nearest (
@layer,
$geometry,
limit:=10 -- define how many points should be considered; -1 for all points
),
case
when area (
intersection (buffer(@element,@dist), buffer ($geometry,@dist))) >=
area (buffer ($geometry,@dist)) * @overlap / 100
then buffer ($geometry,@dist)
else buffer ($geometry, 0)
end
),
@element is not NULL
)
)
),0
)
))
Black dotted line: all buffers with the defined distance; red polygons: dissolved buffers with overlap >= 50%:
