Context
I have a Power BI semantic model that serves as the source for my Plan model. On top of it I've built a monthly target planning sheet with Customer, Product, and Sales Rep as planning dimensions, and Month on columns.
The planning sheet works fine for everything that already exists in the model. My problem is with members that don't exist in it yet.
The problem
Sales planning runs ahead of the transactional systems. A customer gets signed, a SKU gets approved, a rep joins — and the business wants a target against them this month or next. But the record doesn't reach the source system, and therefore the semantic model, until the first invoice posts, the item master is finalised, or the HR record syncs.
So at plan time the member simply isn't in the dimension, and I have no row to type a target into.
Concrete example:
- A new customer is onboarded in week 1 of the month. Sales leadership wants a $50K target for them this month and $80K next month.
- The customer will not exist in the semantic model's Customer dimension until their first transaction posts, which may be four to six weeks away.
- Once they do appear, actuals will start flowing against them — and my plan needs to line up with those actuals, on the same member key, so plan vs. actual variance doesn't break.
The same pattern applies to a new product added mid-quarter and to a sales rep who starts next month.
I know we can directly add rows in the planning sheet, but my questions are as follows:
What I'm trying to figure out
- What is the recommended pattern in Plan for entering a target against a dimension member that isn't in the source semantic model yet?
- When the real member eventually arrives from the source system, how do people handle the reconciliation so the plan value follows the member and doesn't end up orphaned or double-counted?
3 Replies
Yes, later I thought of a similar way this case can be handled. I will give it a try.
Hi Abdul,
Apologies for the delay in getting back to you. We realize it has been a couple of weeks since your initial query. This is a common situation, and PowerTable handles it well. Instead of relying on the source model as the only home for dimension members, give the planning sheet its own governed master table, and keep a small mapping table that ties it back to the source.
What this setup needs
- The planning master, the mapping table, and the list of source members need to sit in OneLake, or in the database behind your PowerTable sheets, which is where the stored procedure will run. A Direct Lake on OneLake semantic model is the setup this is built for.
- This approach is designed for Direct Lake or DirectQuery models. If your Power BI semantic model is in Import mode, the stored procedure will still update the database, but your model won't reflect the newly mapped keys or dimension members until the next dataset refresh.
To illustrate how this works in practice: imagine a new employee is added to the planning master as P006 with no source key, and is then mapped to source key 88 once the HR source record arrives.
- Creating a member that isn't in the source yet
Create a PowerTable sheet to act as the “planning master” for the dimension in question (e.g., customers, products, sales reps). Each row needs:
- a planning key that you control
- the source system key, left blank until the record exists
- the attributes you need for planning (Name, Department, etc.)
- a placeholder flag
Use this master, instead of the source dimension, on the rows of your planning sheet. Existing members sit in this same table with their source key already filled in, ensuring the sheet works from one consistent dimension.
When a new member needs to be planned before the source knows about it, add a row with a new planning key, leave the source key blank, and tick the placeholder flag. Assign this Planning Key to the Planning Sheet, instead of the Source Master’s key. Because the planning sheet reads from this master, the new member appears on the grid straight away and can be planned against immediately. Nothing waits on the source system.
- Reconciling when the real member arrives
Plan values are written back and stored against the planning key, which never changes. Because of this, your plan data never has to move.
- When the member finally appears in the source system with its own key, enter that key against the member's planning key in the mapping table.
- The mapping table already holds a row for the planning key, with the source key blank. Update the Source’s SystemKey against the PlanningKey.
- Once the mapping is saved, a stored procedure updates the planning master with the source key and clears the placeholder flag. Nothing needs to be edited by hand in the planning master.
- Because actuals arrive on the source key, just relate your fact table to the planning master using that source key. The actuals will land on the exact same row that already holds your plan values, making Plan vs. Actual reporting work without re-keying anything.
This architecture avoids orphaned or double-counted values. Since the plan was never tied directly to the source key, there is nothing to re-point. The planning master remains the only dimension on the sheet, ensuring each member appears exactly once. The placeholder and the real record become the exact same row the moment they're mapped.
A few notes on this setup:
- This approach works seamlessly across any dimension, including customers, products, and sales reps.
- Treat the mapping as a deliberate step where someone manually confirms the planning member matches the source record. Avoid automating this based on name alone, as similar names easily mismatch.
- Filtering the master table on the placeholder flag gives you an instant list of members still waiting for a source record.
- For neatness, the demo keeps the mapping in its own sheet, but you can also configure this directly within a single sheet.
Viewing 3 replies - 1 through 3 (of 3 total)
