LogoMkSaaS Docs
LogoMkSaaS Docs
HomepageNotion DownloadTemplate ImportFeature OverviewQuick Start
Beginner Pitfalls to AvoidPurchase & After-SalesTask SystemProject ManagementArea ManagementImport TroubleshootingTroubleshootingTechnical Support
Update LogPurchase Guide
X (Twitter)
FAQ

Troubleshooting

Use this Notion template to check quick fix guides for known issues. Covers core fixes like habit check-in heatmap alignment, clipper button failures, and Homepage navigation jump errors.

Due to the enormous volume of the FLO.W system, there may be some errors in various detailed corners. This document is established to fix these errors.

Clipper Complete Button Error Fix

Important

If your template was duplicated after 2025.11.03, you don't need to handle this fix

Issue Manifestation

In the clipper article, clicking the [Complete] button cannot change the reading status to [Completed]

image

Solution

Click the [Complete] property, and the following prompt will pop up

image

Then click [Edit Property - Edit Automation], then click where the error appears

image

Change [Deleted Option] to [Completed]

image

Finally click the save button

image

Habit Check-in Heatmap Error Fix

Important

If your template was duplicated after 2025.11.03, you don't need to handle this fix

Issue Manifestation

When the month reaches November or December, the heatmap display cannot align correctly, as shown below:

image

Solution

Copy the following code, then overwrite the original code

/* ========== Check-in Statistics Dashboard (Based on Current Month) - Integrated Habit Categories and Monthly Goals ========== */
lets(
    /* --- Core Variables --- */
    boardReferenceDate, now(), /* Dashboard always based on current date and time */
    currentYear, boardReferenceDate.formatDate("YYYY"), /* Current year string */
    currentMonth, boardReferenceDate.formatDate("MM"), /* Current month string */
    boardYearMonth, currentYear + "/" + currentMonth, /* Current year-month, e.g., "2025/05" */

    /* --- Today's Check-in Status --- */
    todayDateText, now().formatDate("YYYY/MM/DD"),
    allRecords, prop("Check-in Records"), /* All check-in records */
    isCheckedInToday, allRecords.filter(current.prop("Date").formatDate("YYYY/MM/DD") == todayDateText).length() > 0,
    todayCheckInStatusText, if(isCheckedInToday, "✅ Checked in today", "❌ Not checked in today"),

    habitCategory, prop("Habit Category"), /* Get habit category */
    monthlyLimitTarget, prop("Goal/Limit"), /* Get monthly upper or lower limit target value */

    /* Adjust marker and color based on habit category */
    triggerMark, if(habitCategory == "Good Habit", "✓", "x"),
    userDefinedColorForHabit, prop("Habit Color"),
    triggerColor, if(
        habitCategory == "Good Habit",
        "green",
        empty(userDefinedColorForHabit) ? "red" : userDefinedColorForHabit
    ),

    /* --- 1. Calculate monthly trigger/completion count --- */
    /* allRecords defined above */
    monthlyTriggers,
    allRecords.filter(
        current.prop("Date").formatDate("YYYY/MM") == boardYearMonth
    ).length(),

    /* --- 2. Build first line habit info string display (for both good and bad habits) --- */
    habitInfo,
        lets(
            baseText, format("This month ") + monthlyTriggers + " times",
            actualSuffixText, /* Initialize suffix text */
                if(empty(monthlyLimitTarget),
                    "", /* If no goal/limit set, suffix is empty */
                    if(habitCategory == "Good Habit",
                        lets(
                            neededForTarget, monthlyLimitTarget - monthlyTriggers,
                            if(neededForTarget <= 0,
                                "|Goal reached",
                                "|Need " + format(neededForTarget) + " more times"
                            )
                        ),
                        /* When it's a bad habit */
                        lets(
                            remainingCount, monthlyLimitTarget - monthlyTriggers,
                            if(remainingCount >= 0,
                                "|" + format(remainingCount) + " times remaining",
                                "|Exceeded " + format(abs(remainingCount)) + " times"
                            )
                        )
                    )
                ),
            (baseText + actualSuffixText).style("b", "u") /* Combine and apply style */
        ),

    /* --- 3. Month and weekday headers --- */
   monthHeader,
    lets(
        monthNum, boardReferenceDate.formatDate("MM").toNumber(),
        monthText, if(monthNum >= 11,
            boardReferenceDate.formatDate("MMM"),  /* Use abbreviation for Nov, Dec */
            boardReferenceDate.formatDate("MM")  /* Use numbers for Jan-Oct */
        ),
        monthText.style(
            triggerColor + "_background", "c", "b", triggerColor
        )
    ),

    dayAbbreviations, ["M", "T", "W", "T", "F", "S", "S"],
    weekHeader, dayAbbreviations.map(
        lets(
            dayAbbr, current,
            dayIndex, index,
            systemToday, now().day(),
            isToday, (systemToday == 0 && dayIndex == 6) || (systemToday != 0 && systemToday - 1 == dayIndex),
            dayAbbr.style(
                triggerColor + "_background", "c", "b",
                isToday ? ((triggerColor == "yellow" || triggerColor == "pink" || triggerColor == "green" || triggerColor == "gray") ? "brown" : "white") : triggerColor
            )
        )
    ).join(" "),
    fullHeader, monthHeader + " " + weekHeader,

    /* --- 4. Weekly check-in heatmap --- */
    firstDayOfBoardMonth, parseDate(currentYear + "-" + currentMonth),
    startDayOfWeekForBoardMonth, firstDayOfBoardMonth.day(),
    week1StartDate, firstDayOfBoardMonth.dateSubtract((startDayOfWeekForBoardMonth + 6) % 7, "days"),
    weekDaysOffsets, [0, 1, 2, 3, 4, 5, 6],
    weekOffsetsForMap, [0, 7, 14, 21, 28, 35],

    allWeekViewsRendered, weekOffsetsForMap.map(
        lets(
            daysToAdd, current,
            currentWeekStartDate, week1StartDate.dateAdd(daysToAdd, "days"),
            currentWeekIndex, index,
            isThisWeekPotentiallyRelevant, currentWeekStartDate.formatDate("YYYY/MM") == boardYearMonth || currentWeekStartDate.dateAdd(6, "days").formatDate("YYYY/MM") == boardYearMonth,
            displayThisWeek, (currentWeekIndex < 5) || (currentWeekIndex == 5 && isThisWeekPotentiallyRelevant),

            weekViewContent, displayThisWeek ? (
                (currentWeekStartDate.formatDate("WW") + "Week").style(
                    currentWeekStartDate.formatDate("YYYY/WW") == now().formatDate("YYYY/WW") ? triggerColor + "_background" : "",
                    "c", "b", triggerColor
                ) + " " +
                weekDaysOffsets.map(
                    lets(
                        dayOffset, current,
                        currentDayInGrid, currentWeekStartDate.dateAdd(dayOffset, "days"),
                        isCurrentDisplayMonth, currentDayInGrid.formatDate("YYYY/MM") == boardYearMonth,
                        dailyTriggersCount, isCurrentDisplayMonth ?
                            allRecords.filter(
                                current.prop("Date").formatDate("YYYY/MM/DD") == currentDayInGrid.formatDate("YYYY/MM/DD")
                            ).length() : 0,
                        isActualToday, currentDayInGrid.formatDate("YYYY/MM/DD") == todayDateText, /* Use todayDateText for comparison */

                        (dailyTriggersCount > 0 ? triggerMark : (isCurrentDisplayMonth ? "·" : " ")).style(
                            dailyTriggersCount > 0 ? triggerColor + "_background" : (isActualToday && isCurrentDisplayMonth ? "blue_background" : ""),
                            "c", "b",
                            dailyTriggersCount > 0 ? triggerColor : (isCurrentDisplayMonth ? (isActualToday ? "white" : "gray") : "")
                        )
                    )
                ).join(" ")
            ) : "",
            weekViewContent
        )
    ).filter(current != "").join("\n"),

    /* --- Build monthly goal/limit text line (for summary) --- */
    monthlyTargetDisplayLine,
        if(empty(monthlyLimitTarget),
            "", /* If goal/limit is empty, this line is empty */
            if(habitCategory == "Good Habit",
                format("Monthly goal ") + format(monthlyLimitTarget) + " times",
                format("Monthly limit ") + format(monthlyLimitTarget) + " times"
            )
        ),

    /* --- Calculate last month and annual statistics (for summary) --- */
    dateForLastMonth, boardReferenceDate.dateSubtract(1, "months"),
    lastMonthYearMonth, dateForLastMonth.formatDate("YYYY/MM"),
    lastMonthTriggers, allRecords.filter(
        current.prop("Date").formatDate("YYYY/MM") == lastMonthYearMonth
    ).length(),

    percentageChangeText, /* Adjust wording for "increase from 0" */
        if(lastMonthTriggers == 0,
            /* When last month was 0 */
            if(monthlyTriggers > 0,
                "Increased " + format(monthlyTriggers) + " times this month", /* Fix: remove duplicate "last month 0" */
                "No change" /* If this month is also 0, then no change */
            ),
            /* When last month is not 0, calculate percentage */
            lets(
                diff, monthlyTriggers - lastMonthTriggers,
                percentage, round(diff / lastMonthTriggers * 100),
                if(percentage == 0,
                    "No change",
                    if(percentage > 0,
                        "Increased " + format(percentage) + "%",
                        "Decreased " + format(abs(percentage)) + "%"
                    )
                )
            )
        ),
    lastMonthSummary, "Last month " + format(lastMonthTriggers) + " times|" + percentageChangeText,

    thisYearTriggers, allRecords.filter(
        current.prop("Date").formatDate("YYYY") == currentYear
    ).length(),
    thisYearSummary, "Total this year " + format(thisYearTriggers) + " times",

    /* --- 5. Final assembly of all parts --- */
    finalOutput,
    todayCheckInStatusText + "\n" +
    habitInfo + "\n" +
    fullHeader + "\n" +
    allWeekViewsRendered + "\n\n" +
    if(empty(monthlyTargetDisplayLine), "", monthlyTargetDisplayLine + "\n") +
    lastMonthSummary + "\n" +
    thisYearSummary + "\n",
    finalOutput
)

Clipper - Relation Property Last Edited Time

Important

If your template was duplicated after 2025.11.02, you don't need to handle this fix

Issue Manifestation

Open an article in the Clipper module, find the [Relation Property Last Edited Time] property, click it and find the following error:

image

Solution

Copy the following code, then completely overwrite it

lets(
	project,prop("Related Project").map(current.prop("Last Edited Time")),
	task,prop("Related Task").map(current.prop("Last Edited Time")),
	extract,prop("Related Extract").map(current.prop("Last Edited Time")),
	author,prop("From").map(current.prop("Last Edited Time")),
	category,prop("Book List Category").map(current.prop("Last Edited Time")),
	subArea,prop("Sub-Area").map(current.prop("Last Edited Time")),
	note,prop("Related Note").map(current.prop("Last Edited Time")),
	Area,prop("Area").map(current.prop("Last Edited Time")),
	content,prop("Last Edited Time"),

	[Area,note,subArea,category,author,author,extract,task,project,content].flat().unique().sort().reverse().first()
)

This change doesn't affect any functionality, just removes a piece of useless code.

Homepage Navigation Error Fix

Important

If your template was duplicated after 2025.09.14, you don't need to handle this fix

Issue Manifestation

In some cases, if you open a database and click the [Homepage] button at the top

Homepage Button

But it jumps to some place on the web

Jump Error

Please follow the method below to fix.

Solution

Wishlist Button Fix

Important

If your template was duplicated after 2025.09.14, you don't need to handle this fix

Issue Manifestation

In the [Life - Wishlist] module, there's an [Add to Purchased] button

Add to Purchased Button

If clicking this button causes an error, it may be that a step in this button has an error

Button Error

Solution

Follow the method shown below to re-edit this button

Re-edit Button

Import Troubleshooting

Use this Notion template and encounter problems during import? Here are various causes of copy failures and their solutions to ensure a smooth start to your productivity journey.

Technical Support

Use this Notion template to get comprehensive technical support. Learn how to upgrade by paying the price difference, get Lark group join links, and master efficient question-asking guidelines to reduce troubleshooting time.

Table of Contents

Clipper Complete Button Error Fix
Issue Manifestation
Solution
Habit Check-in Heatmap Error Fix
Issue Manifestation
Solution
Issue Manifestation
Solution
Homepage Navigation Error Fix
Issue Manifestation
Solution
Wishlist Button Fix
Issue Manifestation
Solution