Вы получаете webhook об обновлении, а затем обновляете сделку и соответственно амо пришлет webhook повторно. Вам при получение webhook надо проверять поля на заполненность и если они и так уже имеют нужное значение то сделку не обновлять
Судя по вашему коду должно получиться нечто такое:
<?php
$data = $_POST['leads']['update'][0];
$data['custom_fields'] = isset($data['custom_fields']) ? $data['custom_fields'] : array();
$id = $data['id'];
$lead_cf = array();
foreach ($data['custom_fields'] as $custom_field) {
$lead_cf[$custom_field['id']] = $custom_field;
}
if (!isset($lead_cf[514667]) || !isset($lead_cf[514669])) {
exit();
}
$predoplata = intval($lead_cf[514667]['values'][0]['value']);
$postoplata = intval($lead_cf[514669]['values'][0]['value']);
if ($predoplata === 0 || $postoplata === 0) {
exit();
}
$sale = $postoplata + $predoplata;
$prev_sale = isset($lead_cf[514689]) ? intval($lead_cf[514689]['values'][0]['value']) : null;
if ($prev_sale !== $sale) {
$lead = array(
'update' => array(
array(
'id' => $id,
'updated_at' => time(),
'custom_fields' => array(
array(
'id' => 514689,
'values' => array(
array(
'value' => $sale
),
),
),
),
),
),
);
// TODO: SEND TO AMO
}