appsmithorg/appsmith · error · Error
Save page failed
Error message
Save page failed
What it means
Error thrown when SAVE_PAGE_ERROR wins the race against SAVE_PAGE_SUCCESS while adding a building block to the canvas. The skeleton widget was inserted, but the layout save that must precede pasting the building block failed, so the saga aborts before calling addBuildingBlockActionsToApplication.
Solutions
- Retry the drag-and-drop after confirming the server is reachable.
- Reduce the existing page size (remove unused widgets) if the save payload is rejected for size.
- Check the debugger / network response for the SAVE_PAGE error reason.
- Avoid concurrent building-block drops; one editor at a time on the page.
Defensive patterns
Strategy: retry
Prevention
- Confirm the server is reachable before dropping building blocks.
- Avoid two editors dropping blocks onto the same page simultaneously.
- Keep page widget count reasonable so save payloads are not rejected.
When it happens
Trigger: updateAndSaveLayout rejects server-side (validation error in the new skeleton, throttling, 5xx, network drop); concurrent save attempts collide; the page layout is too large and the server rejects it.
Common situations: Workspace offline briefly; large pages exceeding server limits; two editors dropping blocks at the same instant; backend deploy in progress.
Related errors
- Unable to fetch newly created actions
- ${extractExecutionErrorMessage(e)}
- Failed importing template
- Failed to load JS libraries
- PE-DSE-5000
AI-assisted analysis of appsmithorg/appsmith@8cd9021c24 (2026-08-12).
Data as JSON: /api/errors/18ccb2014ce93f54.
Report an issue: GitHub.
Appendix: source
Thrown at app/client/src/sagas/BuildingBlockSagas/BuildingBlockAdditionSagas.ts:204
const loadWorkspaceId: string = yield select(getCurrentWorkspaceId);
const existingCopiedWidgets: unknown = yield call(getCopiedWidgets);
const buildingBlockDragStartTimestamp: number = yield select(
getBuildingBlockDragStartTimestamp,
);
// start loading for dropping building blocks
yield put({
type: ReduxActionTypes.DRAGGING_BUILDING_BLOCK_TO_CANVAS_INIT,
});
// makes sure updateAndSaveLayout completes first for initial skeletonWidget addition
const saveResult: unknown = yield race({
success: take(ReduxActionTypes.SAVE_PAGE_SUCCESS),
failure: take(ReduxActionErrorTypes.SAVE_PAGE_ERROR),
});
if (typeof saveResult === "object" && "failure" in saveResult!) {
throw new Error("Save page failed");
}
const response: ApiResponse<ImportBuildingBlockToApplicationResponse> =
yield call(addBuildingBlockActionsToApplication, dragDetails);
const isValid: boolean = yield validateResponse(response);
if (isValid) {
yield saveBuildingBlockWidgetsToStore(response);
// remove skeleton loader just before pasting the building block
yield put({
type: WidgetReduxActionTypes.WIDGET_SINGLE_DELETE,
payload: {
widgetId: skeletonLoaderId,
parentId: buildingBlockWidget.widgetId,
disallowUndo: true,
isShortcut: false,
},View on GitHub (pinned to 8cd9021c24)