Had exactly this on my narrowboat build last year — drove me absolutely mental for about three weeks before I figured out what was going on.
Short answer: trust the BMS for protection, trust the BMV for trend and history.
The BMV-712 works on coulomb counting — it tracks every amp going in and out and does the maths. Sounds foolproof but it drifts over time, especially if your tail current settings aren't dialled in properly for your specific battery chemistry. Lithium behaves very differently to AGM here, and the defaults are basically nonsense for LiFePO4.
The BMS on the other hand is reading actual cell voltages and applying its own SOC curve — which may or may not be accurate depending on how well the manufacturer has characterised the cells. Fogstar and Victron's own Smart batteries tend to have decent curves baked in, but cheaper Chinese units can be wildly optimistic at the top end.
What actually fixed mine:
- Set the BMV tail current to around 1-2% of capacity for LiFePO4
- Enabled the synchronisation on full charge so it resets to 100% reliably
- Compared both readings only after a proper full absorption cycle
Once I did that, they were within 3-4% of each other pretty consistently, which is about as good as you'll realistically get.
The bigger question is — what BMS are you running? Some of the JBD units communicate over Bluetooth and you can pull proper cell-level data, which changes everything. Would be worth knowing your full setup before anyone gives you more specific advice.
What discrepancy are you actually seeing — is it consistent or does it vary depending on charge state?