Upgrades and rescue
The update stopped at 20%. What is broken now is your accounting.
We upgrade on a staged copy first, rehearse the rollback before anybody needs it, and then re-check the specific reports that have broken in real releases. If your install is down right now, say so in the first line of the email and we will triage before we quote.
The signatures
You will recognise your own error message here.
This failure pattern has been stable for years and it is still being reported — not a historical bug that a past release closed. That is not a criticism of Akaunting; it is what a self-hosted updater that depends on a live connection to a remote server looks like from the outside.
During the update
- "Not able to download core" at 20%, and the progress bar never moves again.
- It reached 60% and stopped. Now every page is a 500.
- Güncelleme %80'e geldi ve orada kaldı.
- artisan update:finish exits with code 1 and no useful message.
- Every page takes forty to fifty seconds and every module reports version 0.0.0.
- The update ran, and now a table its migration expected does not exist.
After the update
- 500 Internal Server Error on the Profit and Loss report.
- Transaction numbers stopped auto-incrementing.
- Invoice reminders have not gone out since we updated.
- A module's menu item is still there, but clicking it returns 403.
- An expense is being counted twice on the Profit and Loss report.
- We edited a bill and it lost its attachment.
Why it happens
Four mechanisms, and none of them are your fault.
Knowing which one you are in decides whether the fix is ten minutes or a project. Guessing is how a broken install becomes two broken installs.
The updater phones home
Core before apps, always
A migration that half ran
2.x to 3.x is not an update
How we do it
Nothing is attempted on the live install until it has already worked on a copy.
Staged first, rolled back once on purpose, then done for real in a window you pick. The regression pass is a fixed list, because the things that break are a fixed list.
- 01
Triage
Same day where we canWhich version you are on, which one you are going to, what apps are installed, whether any core files have been edited, and whether the install is usable at all right now. If it is down, this step is about getting you working — not about the upgrade.
- 02
Stage a copy
Day 1The database and the whole storage directory copied to a separate environment, with outbound access to akaunting.com working, because the updater needs it. This is where the upgrade actually happens for the first time.
- 03
Snapshot, then rehearse the rollback
Before anything is touchedA restore point, and then an actual restore into a scratch environment to prove the restore point is real. A backup nobody has restored is a hope, not a plan — and file attachments are the part that usually turns out to be missing.
- 04
Upgrade in order
Core, then appsCore to the target version, then each paid app to the version that shipped alongside it. Where the one-click path fails, the artisan sequence by hand against a known state, with the output kept.
- 05
Regression pass
The fixed listThe list beside this, item by item, against your real data on the staged copy. Anything that does not match is fixed or written down before anyone talks about cutover.
- 06
Cutover and a written report
In a window you chooseThe same upgrade on the live install, in a window you pick, with the rollback ready and rehearsed. Then a report naming the version installed, what changed, what was verified, and what we would watch for the following week.
What we re-check afterwards, every time
- Profit and Loss — the report that has broken most often, including a 500 after one release and an expense counted twice, fixed in 3.2.1
- Tax summary totals, compared against the previous period rather than eyeballed
- Transaction number auto-increment, which stopped between two patch releases
- Recurring invoices: one test-fired end to end
- Invoice reminders, which stopped working after 3.1.12
- Attachments on documents, including one bill edited and saved to prove the file survives the edit
- Every module's menu item and its permission, because a permission that did not register returns 403
- PDF output, including Turkish characters in a customer name and an address
- Cron and mail, re-proven rather than assumed to have survived
- Opening balances and a trial-balance tie-out, where the client runs Double-Entry
How it is priced
Per version jump, as a rescue, or never again.
A single jump from a known version to a known version is a knowable scope, so it gets a fixed price. A broken install is not knowable from outside, so it gets triage first. The third option is the one that stops this being an annual event.
Upgrade, one version jump
Quoted after assessment
A known starting version to a known target, staged and verified. Fixed price once we know which apps and which customisations are in play.
- Rollback rehearsed, not just planned
- The full regression pass
- Written report at the end
Rescue
Quoted after assessment
The install is down or half-updated. Triage first, then a fixed price to finish or reverse it, agreed before we touch anything on the live server.
- Same-day triage where we can
- Snapshot before any change
- The cause written down, not just the fix
Never again
Quoted after assessment
The maintenance retainer. Upgrades staged and applied by us on our schedule, with the report arriving whether or not anything went wrong.
- Tiered by response time
- Quarterly live restore drill
- Core and apps kept in step
Starting prices for these packages are being finalised. Ask on a call and we will give you a number, not a range.
Scope
What we take on, and what we will not agree to.
The refusals matter more than the inclusions on this page, because most of them are things a client has asked us for at least once.
We take this on
- A stuck one-click update, at any percentage
- "Not able to download core", including on servers with no outbound internet access
- A 500 after an update, and the half-applied migration underneath it
- A locked-out admin, or a role assigned to your own account by mistake
- 2.x to 3.x with the data, run as a project with a staging environment and a cutover window
- Paid apps and custom modules brought back into step with the new core
We will not
- Upgrade a production install with no snapshot, even if you ask us to and even if you are in a hurry.
- Promise that a third-party App Store app has a version compatible with your target core. We check, and sometimes the answer is that it does not.
- Recover data from a backup that was database-only and never included the storage directory. The files are not in there to recover.
- Skip the staged copy to save a day. That day is the entire value of the engagement.
- Guarantee an upgrade path for a customisation made by editing core files. We will tell you what it costs to redo it as a module, which is the only version of that answer worth paying for.
Straight answers
Questions from people mid-upgrade.
The update is stuck right now. What should I do before emailing you?
Why can't you just upgrade core and leave the apps alone?
We are on 2.x. Is upgrading worth it?
Is our data at risk?
How long does a version jump take?
We are on 3.1.x and everything looks fine. Why bother?
Every good build starts with a conversation.
Tell us the process that hurts. We will tell you honestly whether we are the right studio for it — and if we are not, who is.