Dec. 16, 2025

Stop Building Apps in Teams: It's the SharePoint Graveyard All Over Again

Stop Building Apps in Teams: It's the SharePoint Graveyard All Over Again

Stop building apps in Teams. You already feel it: Teams is becoming the new SharePoint graveyard — same chaos, better emojis. “Quick” Adaptive Card Extensions (ACEs) seem harmless, but they quietly create a compliance landfill while leaving your Viva...

Stop building apps in Teams.
You already feel it: Teams is becoming the new SharePoint graveyard — same chaos, better emojis. “Quick” Adaptive Card Extensions (ACEs) seem harmless, but they quietly create a compliance landfill while leaving your Viva dashboard full of orphaned cards. In this episode, you’ll learn:

  • Why SPFx ACEs rot fast even when they “work”
  • The five governance failures that always appear
  • A reference architecture that doesn’t implode
  • A decision tree to say “no” without being the villain
  • A checklist you can deploy today to stop dashboard decay
By the end, you’ll know exactly how to use SharePoint, Viva, and Power Platform the right way — with real ALM, strong governance, and fewer 2 a.m. incidents. 💀 The ACE Trap: Why “Quick Apps” Become Long-Term Risk “Just a SharePoint list.”
“Just JSON.”
“Just a rotating announcement.” That’s the trap. ACEs demo beautifully but age like milk because:
  • They hide logic in lists with no versioning
  • They have no built-in lifecycle or ownership tracking
  • They surface unlabeled or unmanaged content in Teams
  • They multiply unpredictably across departments
  • They store schema in places with no governance guardrails
The result?
A sprawl of cards, ghost owners, inconsistent schemas, broken automations, and compliance gaps that leaders find after the screenshot goes viral. ⚠️ The Five Governance Failures (You See Them Every Time) 1. App Sprawl Every team builds “their” card. No portfolio view. No prioritization. The dashboard becomes a digital flea market. 2. Orphaned Owners The contractor leaves. The card doesn’t.
Nobody knows who maintains it, updates it, or sunsets it. 3. Data Silos Each ACE uses its own schema and its own list.
Analytics break, consistency dies, and schema drift becomes inevitable. 4. Compliance Gaps Content appears in Teams mobile without labels, retention, or DLP.
Broadcast channel + unmanaged data = a quiet compliance nightmare. 5. Broken Lifecycle No expiry. No archiving. No governance.
Stale outage notices and forgotten campaigns haunt your dashboard forever. Each failure compounds. Together, they recreate SharePoint 2013 chaos — except now it’s pushed directly to everyone’s pocket. 🏗️ The Reference Architecture That Doesn’t Rot The fix is simple but non-negotiable: ✔ Treat the ACE as a skin — not an application. All business logic, schema, and lifecycle live below the card in governed systems. Layers that keep you clean:
  • Governed data storage (SharePoint content types or Dataverse tables)
  • Canonical content contracts (Announcement, Event, Alert)
  • Proper ALM via SPFx repo + CI/CD + non-production environments
  • Purview labels + retention at the data layer, not the card
  • DLP enforcement on the content source
  • Placement governance (slots, schedules, expiration rules)
  • Telemetry + monitoring so failing cards are automatically pulled
The ACE renders; the platform governs. 🧭 The Decision Tree: Block or Allow That Teams App This is how you say “no” with receipts:
  1. Is there a governed data contract?
    If not → BLOCK.
  2. Is the data stored in a labeled, retention-enabled site/table?
    If not → BLOCK until migrated.
  3. Are there two named owners?
    If not → BLOCK.
  4. Does the ACE write data?
    If yes → MOVE to Power Apps or web app.
  5. Is there a placement record + expiry?
    If not → BLOCK.
  6. Are Purview/DLP requirements met?
    If not → BLOCK.
  7. Is there telemetry + rollback?
    If not → BLOCK.
If all green → limited rollout → then expand after a clean telemetry window. 📋 Governance Checklist (Fast, Brutal, Effective) Run this at intake, pre-prod, and quarterly reviews:
  • Catalog entry exists
  • Two owners assigned
  • Contract schema validated
  • Governed data store only
  • Read-only verified
  • Placement scoping + expiry
  • Labels + retention enforced
  • Telemetry wired
  • No manual package deployments
  • Accessibility + localization compliant
  • Rollback plan ready
  • No duplicates in the portfolio
Fail two items? Freeze deployment. 🏁 The One Rule That Saves You The ACE is a skin.
Govern everything under it — not inside it. Stick to that rule and your dashboard stays clean.
Break it, and you’re rebuilding SharePoint’s graveyard one card at a time. 📣 CTA Want the full governance kit — checklist PDF, architecture diagram, and the ACE decision tree? Subscribe and watch the next episode, where we rebuild a real ACE the right way and show how to avoid the rot from day one.

Become a supporter of this podcast: https://www.spreaker.com/podcast/m365-show-podcast--6704921/support.

Follow us on:
LInkedIn
Substack
Transcript
1
00:00:00,000 --> 00:00:01,680
Stop building apps in Teams.

2
00:00:01,680 --> 00:00:03,540
You know it, I know it.

3
00:00:03,540 --> 00:00:06,000
Teams is becoming the SharePoint graveyard

4
00:00:06,000 --> 00:00:09,560
with better emojis, custom ACs feel quick

5
00:00:09,560 --> 00:00:12,440
while quietly building a compliance landfill.

6
00:00:12,440 --> 00:00:15,760
Today I'll show you why SPFX Adaptive Card extensions

7
00:00:15,760 --> 00:00:18,560
rot fast and how to stop the mess.

8
00:00:18,560 --> 00:00:20,400
You'll get a ruthless checklist,

9
00:00:20,400 --> 00:00:23,160
a reference architecture that doesn't implode,

10
00:00:23,160 --> 00:00:26,560
and a decision tree so you can say no without being the villain.

11
00:00:26,560 --> 00:00:28,160
Then we'll fix it with SharePoint,

12
00:00:28,160 --> 00:00:31,200
a Viva and Power Platform, proper ALM,

13
00:00:31,200 --> 00:00:34,920
real governance, fewer 2AM incidents.

14
00:00:34,920 --> 00:00:38,720
The ASE Trap, why quick apps rot fast.

15
00:00:38,720 --> 00:00:41,120
You know that simple ASE request,

16
00:00:41,120 --> 00:00:43,640
a rotating announcement card pulling from a list,

17
00:00:43,640 --> 00:00:46,240
no back end, no database.

18
00:00:46,240 --> 00:00:48,320
Just Jason, that's the trap.

19
00:00:48,320 --> 00:00:52,240
It ships fast, it demos great, then it ages like milk.

20
00:00:52,240 --> 00:00:53,640
Here's the pattern.

21
00:00:53,640 --> 00:00:58,120
Someone hard codes ASE behavior to a SharePoint list,

22
00:00:58,120 --> 00:01:00,760
because it's configurable.

23
00:01:00,760 --> 00:01:03,080
The schema and data live in list columns,

24
00:01:03,080 --> 00:01:06,240
it's flexible until the moment you need validation,

25
00:01:06,240 --> 00:01:10,120
versioning of card templates or an audit trail.

26
00:01:10,120 --> 00:01:13,000
Then your schema is a rumor and your data is cosplay.

27
00:01:13,000 --> 00:01:15,920
The thing most people miss is governance is a workload,

28
00:01:15,920 --> 00:01:16,800
not a feature.

29
00:01:16,800 --> 00:01:19,720
ASEs don't give you life cycle out of the box.

30
00:01:19,720 --> 00:01:22,600
Owners leave, cards keep surfacing.

31
00:01:22,600 --> 00:01:24,680
You end up with often solutions,

32
00:01:24,680 --> 00:01:27,080
front and center in Viva connections,

33
00:01:27,080 --> 00:01:28,920
powered by a list nobody owns,

34
00:01:28,920 --> 00:01:30,960
referencing a template nobody remembers.

35
00:01:30,960 --> 00:01:31,720
Can you hear me?

36
00:01:31,720 --> 00:01:34,880
That's the sound of your compliance officer opening a new ticket.

37
00:01:34,880 --> 00:01:36,040
Why this rot fast?

38
00:01:36,040 --> 00:01:36,840
Apps Brawl.

39
00:01:36,840 --> 00:01:39,840
ASEs are easy to deploy to the dashboard,

40
00:01:39,840 --> 00:01:43,720
so people do a lot, one per department, one per campaign.

41
00:01:43,720 --> 00:01:46,160
Then they multiply like shared Excel files.

42
00:01:46,160 --> 00:01:49,040
Your dashboard turns into a flea market.

43
00:01:49,040 --> 00:01:53,120
Orphaned owners, teams changes, contractors roll off,

44
00:01:53,120 --> 00:01:55,440
the original app catalog approvals leaves.

45
00:01:55,440 --> 00:01:58,720
No ownership register, no life cycle policy,

46
00:01:58,720 --> 00:02:00,280
no succession plan.

47
00:02:00,280 --> 00:02:02,160
The ASE doesn't die.

48
00:02:02,160 --> 00:02:04,440
It haunts data silos.

49
00:02:04,440 --> 00:02:08,120
Each ace points at its own list, its own schema,

50
00:02:08,120 --> 00:02:10,480
its own power automate.

51
00:02:10,480 --> 00:02:14,240
Suddenly the organization has five announcement systems

52
00:02:14,240 --> 00:02:17,600
and none agree on what today means.

53
00:02:17,600 --> 00:02:18,960
Compliance gaps.

54
00:02:18,960 --> 00:02:22,640
Content shows up in Teams mobile without sensitivity labels,

55
00:02:22,640 --> 00:02:26,600
retention logic or DLP context because the JSON payload

56
00:02:26,600 --> 00:02:28,800
isn't tied to data classification.

57
00:02:28,800 --> 00:02:32,000
Broadcast meets breach risk, broken life cycle,

58
00:02:32,000 --> 00:02:35,520
no archiving triggers, no sunset rules,

59
00:02:35,520 --> 00:02:37,440
no environment boundaries.

60
00:02:37,440 --> 00:02:41,440
Production becomes a museum of one's urgent cards.

61
00:02:41,440 --> 00:02:44,560
Now why does the quick approach fail even when it works?

62
00:02:44,560 --> 00:02:47,920
Because it assumes the surface area is tiny.

63
00:02:47,920 --> 00:02:50,080
But ASEs live in Teams and Viva,

64
00:02:50,080 --> 00:02:53,080
which means mobile endpoints, offline caches

65
00:02:53,080 --> 00:02:55,400
and users forwarding screenshots.

66
00:02:55,400 --> 00:02:57,120
You want it just a card.

67
00:02:57,120 --> 00:03:00,360
Aseesh Taissev, E. Kissel.

68
00:03:00,360 --> 00:03:02,760
You accidentally built a distribution channel.

69
00:03:02,760 --> 00:03:07,200
This clicked for me when clients, one ace, to rule announcements,

70
00:03:07,200 --> 00:03:09,400
morphed into six variants.

71
00:03:09,400 --> 00:03:11,640
Each with a slightly different schema

72
00:03:11,640 --> 00:03:14,560
jammed into a multi-line text column.

73
00:03:14,560 --> 00:03:16,880
One power automate tried to keep them fresh.

74
00:03:16,880 --> 00:03:20,320
It broke every time someone pasted JSON with smart quotes.

75
00:03:20,320 --> 00:03:22,960
Fast forward, marketing complaints that Tuesday's card

76
00:03:22,960 --> 00:03:24,640
shows last quarter's pricing.

77
00:03:24,640 --> 00:03:28,280
It gets pulled in, governance shows up late to the party

78
00:03:28,280 --> 00:03:32,240
and has to retrofit labels, ownership and change control.

79
00:03:32,240 --> 00:03:35,560
That quick win just became a slow bleed.

80
00:03:35,560 --> 00:03:37,840
Here's the shortcut nobody teaches.

81
00:03:37,840 --> 00:03:41,920
Treat an ace like a UI skin, not an application.

82
00:03:41,920 --> 00:03:45,680
If the data matters, govern the system of record, not the card.

83
00:03:45,680 --> 00:03:48,600
If the process matters, push it into a platform

84
00:03:48,600 --> 00:03:52,280
with environments, ALM and policy enforcement.

85
00:03:52,280 --> 00:03:55,600
The card should be the final mile, not the whole highway.

86
00:03:55,600 --> 00:03:58,560
Let me show you exactly how this spirals.

87
00:03:58,560 --> 00:04:02,680
A developer deploys the ace tenant wide from the app catalog.

88
00:04:02,680 --> 00:04:05,080
No scope draw-out plan, no owner of owners.

89
00:04:05,080 --> 00:04:06,240
Success!

90
00:04:06,240 --> 00:04:09,320
Site owners copy the list for flexibility.

91
00:04:09,320 --> 00:04:12,800
Now you've got three sources of truth and a scavenger hunt.

92
00:04:12,800 --> 00:04:15,400
Someone asks for submit in the quick view.

93
00:04:15,400 --> 00:04:18,040
Sorry, ace quick views are great for read.

94
00:04:18,040 --> 00:04:22,800
Rights mean APIs, a youth, CSRF and support you did not budget.

95
00:04:22,800 --> 00:04:25,040
Legal asks for retention.

96
00:04:25,040 --> 00:04:27,320
You discover the card payload isn't labeled

97
00:04:27,320 --> 00:04:30,560
and the list has no retention policy tied to content type.

98
00:04:30,560 --> 00:04:33,120
Oops, security requests and access review.

99
00:04:33,120 --> 00:04:35,800
You can't find the owner because there isn't one.

100
00:04:35,800 --> 00:04:37,520
Now here's where most people mess up.

101
00:04:37,520 --> 00:04:40,280
They try to fix it with more ACs.

102
00:04:40,280 --> 00:04:41,800
A governance notice ace.

103
00:04:41,800 --> 00:04:43,440
A tips ace.

104
00:04:43,440 --> 00:04:45,880
A catalog of aces ace.

105
00:04:45,880 --> 00:04:48,440
It's like installing more printers to fix a jam.

106
00:04:48,440 --> 00:04:52,200
If you remember nothing else, an ace is a distribution layer.

107
00:04:52,200 --> 00:04:56,400
Govn the source, the deployment and the life cycle outside the card.

108
00:04:56,400 --> 00:05:00,000
The reason this works is you move risk to places with controls.

109
00:05:00,000 --> 00:05:01,960
SharePoint with classification.

110
00:05:01,960 --> 00:05:04,480
Viva for curated experiences.

111
00:05:04,480 --> 00:05:07,680
Power platform for ALM and environments.

112
00:05:07,680 --> 00:05:11,320
Then keep the card dead, simple and disposable.

113
00:05:11,320 --> 00:05:13,320
Quick win you can do today.

114
00:05:13,320 --> 00:05:18,560
Every ace in your tenant, map each to its data source, owner and retention label.

115
00:05:18,560 --> 00:05:20,680
If any are missing two of those three,

116
00:05:20,680 --> 00:05:24,880
freeze new ace deployments until you fix ownership and policy.

117
00:05:24,880 --> 00:05:26,080
It's boring.

118
00:05:26,080 --> 00:05:27,760
It saves weekends.

119
00:05:27,760 --> 00:05:31,240
The five governance failures you'll see every time.

120
00:05:31,240 --> 00:05:33,680
Let's name the five ghosts that always show up.

121
00:05:33,680 --> 00:05:39,320
Apps Brawl, orphaned owners, data silos, compliance gaps and broken life cycle.

122
00:05:39,320 --> 00:05:41,320
You've met them, you tried to ignore them.

123
00:05:41,320 --> 00:05:42,920
They ate your roadmap.

124
00:05:42,920 --> 00:05:44,520
Apps Brawl first.

125
00:05:44,520 --> 00:05:47,080
Aces are tiny, like gremlins.

126
00:05:47,080 --> 00:05:50,240
And like gremlins, if you feed them after the demo, they multiply.

127
00:05:50,240 --> 00:05:52,120
Every department wants their card.

128
00:05:52,120 --> 00:05:57,480
HR wants announcements, facilities wants outages, marketing wants campaigns,

129
00:05:57,480 --> 00:05:59,680
finance wants quarter close reminders.

130
00:05:59,680 --> 00:06:00,640
None of that is evil.

131
00:06:00,640 --> 00:06:04,720
The mess happens when each card brings its own list, its own JSON schema,

132
00:06:04,720 --> 00:06:07,160
and its own power automate babysitter.

133
00:06:07,160 --> 00:06:10,720
Suddenly your Viva Connections dashboard looks like a yard sale.

134
00:06:10,720 --> 00:06:15,120
There's no portfolio of you, no capacity planning, no rollout schedule,

135
00:06:15,120 --> 00:06:17,120
just tiles and hope.

136
00:06:17,120 --> 00:06:18,960
The fix is boring and effective.

137
00:06:18,960 --> 00:06:25,120
Central intake, catalog every ace, require a data source registration and a business owner.

138
00:06:25,120 --> 00:06:29,720
Publish a dashboard placement calendar like you would a home page hero slot

139
00:06:29,720 --> 00:06:32,520
and cap the number of concurrent cards.

140
00:06:32,520 --> 00:06:39,000
Scarsity forces prioritization, prioritization kills sprawl, now orphaned owners.

141
00:06:39,000 --> 00:06:42,960
Corporate musical chairs means someone's leaving every quarter.

142
00:06:42,960 --> 00:06:47,360
Meanwhile your ace is cling to life like ancient workflow emails.

143
00:06:47,360 --> 00:06:49,720
The person who uploaded the package, gone.

144
00:06:49,720 --> 00:06:51,240
The SharePoint list owner?

145
00:06:51,240 --> 00:06:52,240
Left the org.

146
00:06:52,240 --> 00:06:53,520
The dashboard admin?

147
00:06:53,520 --> 00:06:54,600
Transferred.

148
00:06:54,600 --> 00:06:58,360
Ownership drift is how simple UI turns into operational risk.

149
00:06:58,360 --> 00:06:59,560
You don't need heroics.

150
00:06:59,560 --> 00:07:01,280
You need an owner of owners.

151
00:07:01,280 --> 00:07:07,800
Create a solution record per ace in your catalog with business owner, technical owner, platform

152
00:07:07,800 --> 00:07:10,240
steward, require two owners minimum.

153
00:07:10,240 --> 00:07:12,560
Back it with a quarterly access review.

154
00:07:12,560 --> 00:07:18,880
If an owner loses mailbox access or leaves the Entra ID tenant, the app's active status

155
00:07:18,880 --> 00:07:24,640
auto flips to degraded and placement is yanked until a successor is assigned.

156
00:07:24,640 --> 00:07:27,360
It's not punishment, it's uptime protection.

157
00:07:27,360 --> 00:07:29,200
Data silos next.

158
00:07:29,200 --> 00:07:36,080
When each ace hard codes its own configurable schema, you aren't flexible, you're fragmented.

159
00:07:36,080 --> 00:07:42,620
The restaurant menu card uses items, the news card uses entries, the event card uses sessions,

160
00:07:42,620 --> 00:07:45,160
and none of them agree on date formats.

161
00:07:45,160 --> 00:07:46,760
Then someone asks for analytics.

162
00:07:46,760 --> 00:07:50,520
You can't roll anything up because your schema is performance art.

163
00:07:50,520 --> 00:07:53,200
The way out is a reference data contract.

164
00:07:53,200 --> 00:07:56,920
Define canonical content types for announcement, event alert.

165
00:07:56,920 --> 00:08:00,560
Store the content in a govern site or a dataverse table.

166
00:08:00,560 --> 00:08:03,440
The ACE only reads from those bounded sources.

167
00:08:03,440 --> 00:08:04,440
New card idea?

168
00:08:04,440 --> 00:08:07,080
It maps to a known contract or it doesn't ship.

169
00:08:07,080 --> 00:08:08,920
And yes, add schema versioning.

170
00:08:08,920 --> 00:08:14,200
A single template version field saves you from the smart quotes apocalypse.

171
00:08:14,200 --> 00:08:15,200
Compliance gaps.

172
00:08:15,200 --> 00:08:18,480
Aces look harmless because they just show Jason.

173
00:08:18,480 --> 00:08:21,840
That's like saying a megaphone just amplifies air.

174
00:08:21,840 --> 00:08:27,560
If the underlying content lacks sensitivity labels, retention or DLP, you've built a broadcast

175
00:08:27,560 --> 00:08:29,560
channel for unlabeled data.

176
00:08:29,560 --> 00:08:31,520
Mobile notifications make it worse.

177
00:08:31,520 --> 00:08:33,560
People screenshot everything.

178
00:08:33,560 --> 00:08:35,760
Mitigation is policy not vibes.

179
00:08:35,760 --> 00:08:38,600
Tie ace placement to data classification.

180
00:08:38,600 --> 00:08:40,800
No label, no surface.

181
00:08:40,800 --> 00:08:45,240
Use Microsoft purview retention labels on the source list or dataverse table.

182
00:08:45,240 --> 00:08:50,600
Block tenant-wide deployment until the package passes a deployment checklist.

183
00:08:50,600 --> 00:08:56,520
A location documented label required retention policy linked external sharing scoped.

184
00:08:56,520 --> 00:09:02,560
If the content is external API data, document the processor, data flow and cache rules.

185
00:09:02,560 --> 00:09:05,080
We pull it live is not a compliance plan.

186
00:09:05,080 --> 00:09:06,400
Broken life cycle.

187
00:09:06,400 --> 00:09:08,080
This is the graveyard part.

188
00:09:08,080 --> 00:09:10,480
Without life cycle, content never dies.

189
00:09:10,480 --> 00:09:12,160
It just lingers.

190
00:09:12,160 --> 00:09:16,840
That critical outage card from two winters ago still rotates in the queue because nobody

191
00:09:16,840 --> 00:09:18,000
set an end date.

192
00:09:18,000 --> 00:09:25,720
The list used start and end but the power automate failed on daylight savings and nobody noticed.

193
00:09:25,720 --> 00:09:27,760
Solve it with three rails.

194
00:09:27,760 --> 00:09:33,040
Content life cycle, app life cycle and placement life cycle.

195
00:09:33,040 --> 00:09:34,480
Content life cycle.

196
00:09:34,480 --> 00:09:36,600
Start an end date required.

197
00:09:36,600 --> 00:09:42,280
Retention label applied and a nightly job archives expired items to a read only library.

198
00:09:42,280 --> 00:09:43,720
App life cycle.

199
00:09:43,720 --> 00:09:50,160
Reace has a sunset date by default, reviewed at QBR, renewed or removed.

200
00:09:50,160 --> 00:09:51,640
Placement life cycle.

201
00:09:51,640 --> 00:09:53,840
Dashboard slots expire.

202
00:09:53,840 --> 00:09:58,120
Owners must re-assert or the slot freeze for other content.

203
00:09:58,120 --> 00:09:59,920
Automation enforces all three.

204
00:09:59,920 --> 00:10:02,280
Manual enforcement is how you get museums.

205
00:10:02,280 --> 00:10:05,520
Now how these five stack into one disaster.

206
00:10:05,520 --> 00:10:08,680
Sproul means 10 cards compete for attention.

207
00:10:08,680 --> 00:10:11,680
Often ownership means nobody answers the page.

208
00:10:11,680 --> 00:10:15,080
Silos mean you can't fix one without breaking three.

209
00:10:15,080 --> 00:10:20,760
Compliance gaps mean leadership gets a screenshot of unlabeled HR data on a phone.

210
00:10:20,760 --> 00:10:24,480
And broken life cycle means it keeps happening because nothing ever exits.

211
00:10:24,480 --> 00:10:28,640
Then your exec asks, why is teams full of stale stuff?

212
00:10:28,640 --> 00:10:33,880
And you with a straight face say, because we build five apps instead of one platform.

213
00:10:33,880 --> 00:10:37,360
The thing most people miss is the unit of governance.

214
00:10:37,360 --> 00:10:43,240
For governing the distribution layer, while letting the systems of record run feral, flip

215
00:10:43,240 --> 00:10:49,320
it, standardize the data layer, centralize ownership, restrict surfaces and automate life

216
00:10:49,320 --> 00:10:50,440
cycle.

217
00:10:50,440 --> 00:10:56,200
The ace becomes a view on a governed pipeline, not a bespoke snowflake demanding constant

218
00:10:56,200 --> 00:10:57,720
care.

219
00:10:57,720 --> 00:11:01,840
Quick checks you can run tomorrow, count aces per dashboard.

220
00:11:01,840 --> 00:11:04,360
If it's over five, you're in sprawl.

221
00:11:04,360 --> 00:11:06,000
Pull an ownership export.

222
00:11:06,000 --> 00:11:09,160
If fewer than two owners per ace, you're in drift.

223
00:11:09,160 --> 00:11:11,360
Sample three ace schemas.

224
00:11:11,360 --> 00:11:16,720
If they don't share an ID, a timestamp and a label, you're in silo land.

225
00:11:16,720 --> 00:11:22,080
Scan for labels if cards display unlabeled content, pause deployments.

226
00:11:22,080 --> 00:11:24,080
Review expiration.

227
00:11:24,080 --> 00:11:30,600
If half your content has no end date, turn off auto rotate until life cycle is enforced.

228
00:11:30,600 --> 00:11:31,920
Fix these five.

229
00:11:31,920 --> 00:11:34,200
And the rest actually gets easier.

230
00:11:34,200 --> 00:11:36,520
Think nor them and congrats.

231
00:11:36,520 --> 00:11:43,280
You've rebuilt SharePoint 2013, but this time it's in everyone's pocket.

232
00:11:43,280 --> 00:11:45,840
The reference architecture that doesn't rot.

233
00:11:45,840 --> 00:11:47,160
Here's the fix.

234
00:11:47,160 --> 00:11:49,960
Treat the ace like a thin shell over governed platforms.

235
00:11:49,960 --> 00:11:50,960
Uiskin on top.

236
00:11:50,960 --> 00:11:52,600
Zero business logic in the card.

237
00:11:52,600 --> 00:11:55,600
All risk and rules live beneath it.

238
00:11:55,600 --> 00:11:58,400
Layer one, identity and environments.

239
00:11:58,400 --> 00:12:03,560
Start with Entra ID groups that mirror responsibility.

240
00:12:03,560 --> 00:12:08,800
This owner, tech owner, platform stewards, then split environments.

241
00:12:08,800 --> 00:12:10,320
Dev test, prod.

242
00:12:10,320 --> 00:12:16,880
If you're using dataverse grade, if not use three SharePoint sites, content dev, content

243
00:12:16,880 --> 00:12:19,480
test, content prod.

244
00:12:19,480 --> 00:12:26,240
Provision with site designs that auto apply sensitivity labels, default retention, versioning

245
00:12:26,240 --> 00:12:28,560
and blocked external sharing.

246
00:12:28,560 --> 00:12:30,040
No personal ownership.

247
00:12:30,040 --> 00:12:32,280
All lists and tables owned by groups.

248
00:12:32,280 --> 00:12:35,000
Layer two, contracts, not vibes.

249
00:12:35,000 --> 00:12:37,480
Define canonical content contracts.

250
00:12:37,480 --> 00:12:39,560
Announcement, alert, event.

251
00:12:39,560 --> 00:12:46,120
Each has an ID, title, summary, body, start, end, label, template, version, source system,

252
00:12:46,120 --> 00:12:47,640
and last modified by.

253
00:12:47,640 --> 00:12:49,960
Put them in dataverse tables if you can.

254
00:12:49,960 --> 00:12:54,120
Otherwise SharePoint with content types that enforce required fields.

255
00:12:54,120 --> 00:12:57,600
Add Jason Schema versions for anything the ace renders.

256
00:12:57,600 --> 00:13:00,680
Your card maps to contract V1 or V2.

257
00:13:00,680 --> 00:13:03,960
It doesn't invent V1.5 on a Tuesday.

258
00:13:03,960 --> 00:13:08,880
Layer three, data pipelines, content flows into the contract tables through controlled

259
00:13:08,880 --> 00:13:10,080
ingestion.

260
00:13:10,080 --> 00:13:13,040
Use power automate or Azure functions.

261
00:13:13,040 --> 00:13:18,480
Each flow writes to dev first, validate Schema, stamps the label and promotes to test and

262
00:13:18,480 --> 00:13:25,080
prod through solution exports if dataverse or controlled flow connections if SharePoint.

263
00:13:25,080 --> 00:13:26,800
No direct writes from the card.

264
00:13:26,800 --> 00:13:29,800
No, we'll just let Combs paste Jason.

265
00:13:29,800 --> 00:13:35,000
In logs every change, rollbacks are possible because versions are real.

266
00:13:35,000 --> 00:13:38,320
Layer four, policy guard rails.

267
00:13:38,320 --> 00:13:43,560
Microsoft purview enforces sensitivity and retention on the data layer, not the card.

268
00:13:43,560 --> 00:13:47,160
DLP rules block exfiltration from those sites and tables.

269
00:13:47,160 --> 00:13:50,080
If an item lacks a label, it can't reach prod.

270
00:13:50,080 --> 00:13:54,400
If a label conflicts with the surface, the card refuses to bind.

271
00:13:54,400 --> 00:13:58,400
The ace checks the label and template version before rendering.

272
00:13:58,400 --> 00:14:04,720
If they don't match allowed combinations, it displays a safe fallback or nothing.

273
00:14:04,720 --> 00:14:07,040
Layer five, deployment control.

274
00:14:07,040 --> 00:14:12,960
The spfx package lives in a repo with branch policies, automated builds and tenon scope

275
00:14:12,960 --> 00:14:15,480
deployment disabled by default.

276
00:14:15,480 --> 00:14:21,560
You publish to the tenon app catalog through CI, but you scope availability to specific dashboards

277
00:14:21,560 --> 00:14:23,800
via a placement registry.

278
00:14:23,800 --> 00:14:29,840
Note of it as an allo list, site ID, slot name, dates and the contract it's allowed to read.

279
00:14:29,840 --> 00:14:31,600
No placement record, no card.

280
00:14:31,600 --> 00:14:33,640
That registry lives with change control.

281
00:14:33,640 --> 00:14:36,520
Layer six, observability.

282
00:14:36,520 --> 00:14:38,440
Telemetry is not optional.

283
00:14:38,440 --> 00:14:45,920
The ace emits events, render success, contract mismatch, empty data set, blocked by policy,

284
00:14:45,920 --> 00:14:49,000
store that in application insights or lock analytics.

285
00:14:49,000 --> 00:14:55,320
Dashboards show which placements are failing, which contracts are hot and where labels are

286
00:14:55,320 --> 00:14:56,640
missing.

287
00:14:56,640 --> 00:14:58,880
Tile alerts to your platform Stuart Group.

288
00:14:58,880 --> 00:15:04,200
If render errors spike, pull the placement until data passes validation.

289
00:15:04,200 --> 00:15:07,120
Layer seven, life cycle automation.

290
00:15:07,120 --> 00:15:08,120
Content lifecycle.

291
00:15:08,120 --> 00:15:14,560
Nightly job archives, expired items to immutable storage and writes a summary card.

292
00:15:14,560 --> 00:15:18,120
State so users see, this announcement ended.

293
00:15:18,120 --> 00:15:21,520
Rye sheds bali, hee hee hee.

294
00:15:21,520 --> 00:15:22,920
App lifecycle.

295
00:15:22,920 --> 00:15:25,600
Every placement has an end date.

296
00:15:25,600 --> 00:15:30,720
Owners reassert quarterly during access review or the placement deactivates.

297
00:15:30,720 --> 00:15:31,720
Solution lifecycle.

298
00:15:31,720 --> 00:15:35,560
SPFX, major versions require re-approval.

299
00:15:35,560 --> 00:15:38,080
Minor versions can hot swap.

300
00:15:38,080 --> 00:15:43,840
Deprecated contracts display a banner and stop accepting new content after a grace window.

301
00:15:43,840 --> 00:15:46,600
What does the ace actually do in this world?

302
00:15:46,600 --> 00:15:51,480
Three things, one, query the contract endpoint for its placement, two, validate label and

303
00:15:51,480 --> 00:15:52,880
template version.

304
00:15:52,880 --> 00:15:55,560
Three, render the template with the data.

305
00:15:55,560 --> 00:15:59,240
That's it, no rights, no business rules, no secret power automate dance.

306
00:15:59,240 --> 00:16:00,960
It's a reader with opinions.

307
00:16:00,960 --> 00:16:03,720
Where do SharePoint and Viva fit?

308
00:16:03,720 --> 00:16:08,680
SharePoint hosts the governed content sites with content types, labels and retention.

309
00:16:08,680 --> 00:16:11,800
Viva connections is the curated surface.

310
00:16:11,800 --> 00:16:13,680
The dashboard is not a playground.

311
00:16:13,680 --> 00:16:16,520
It's a broadcast surface with a schedule.

312
00:16:16,520 --> 00:16:20,760
You run a placement calendar the same way you'd manage a home page hero.

313
00:16:20,760 --> 00:16:23,960
If a department wants a slot they bring a contract and an owner.

314
00:16:23,960 --> 00:16:25,760
Where does Power Platform fit?

315
00:16:25,760 --> 00:16:30,000
Use data verse for canonical data and manage solutions for ALM.

316
00:16:30,000 --> 00:16:32,760
Flows handle ingestion, enrichment and promotion.

317
00:16:32,760 --> 00:16:37,240
Power apps handle authoring if you need friendly forms.

318
00:16:37,240 --> 00:16:42,840
Each is bound to environments with DLP policies so connectors can't sneak data to the wrong

319
00:16:42,840 --> 00:16:44,160
place.

320
00:16:44,160 --> 00:16:45,960
What about external feeds?

321
00:16:45,960 --> 00:16:49,800
Tap them in an Azure function that normalizes to your contract.

322
00:16:49,800 --> 00:16:53,480
Stamps provenance in source system and caches to govern storage.

323
00:16:53,480 --> 00:16:56,520
The AC never calls third party APIs directly.

324
00:16:56,520 --> 00:16:59,800
The function owns secrets, retries and rate limits.

325
00:16:59,800 --> 00:17:02,960
Per view policy still apply because the cache is yours.

326
00:17:02,960 --> 00:17:06,840
This architecture scales because each layer owns one problem.

327
00:17:06,840 --> 00:17:11,120
Data is governed, policies enforced, UI is disposable.

328
00:17:11,120 --> 00:17:15,920
And when someone leaves, the group still owns it, the slot expires and your dashboard does

329
00:17:15,920 --> 00:17:18,040
not turn into a museum.

330
00:17:18,040 --> 00:17:22,240
The decision tree, block or allow that teams app.

331
00:17:22,240 --> 00:17:27,680
Here's the decision tree I use so you don't end up approving a tiny card that grows teeth.

332
00:17:27,680 --> 00:17:30,080
Question one, what's the data contract?

333
00:17:30,080 --> 00:17:37,880
If the app can't point to an existing governed contract, announcement, alert, event, or

334
00:17:37,880 --> 00:17:43,960
data verse table with required fields, labels and versioning it's a block, no contract,

335
00:17:43,960 --> 00:17:44,880
no card.

336
00:17:44,880 --> 00:17:49,800
If they say it's just Jason translation, we have no schema discipline.

337
00:17:49,800 --> 00:17:51,920
Block and root them to the contract catalog.

338
00:17:51,920 --> 00:17:56,680
If there is a contract question two, where does the content live today?

339
00:17:56,680 --> 00:18:01,480
If the answer is a team site list will create, that's a provisional block.

340
00:18:01,480 --> 00:18:06,120
Content must live in a governed site or data verse with sensitivity labels and retention

341
00:18:06,120 --> 00:18:07,840
turned on.

342
00:18:07,840 --> 00:18:11,440
If they can migrate or point to the governed store, proceed.

343
00:18:11,440 --> 00:18:13,920
If not block until the source is compliant.

344
00:18:13,920 --> 00:18:15,520
Question three, who owns it?

345
00:18:15,520 --> 00:18:19,560
You need named business and technical owners plus a platform steward group.

346
00:18:19,560 --> 00:18:21,240
Single owner requests get a yellow card.

347
00:18:21,240 --> 00:18:24,600
If they can't produce two owners with mailboxes in your tenant, it's a block.

348
00:18:24,600 --> 00:18:26,360
No owner, no surface.

349
00:18:26,360 --> 00:18:28,640
Question four, what's the right story?

350
00:18:28,640 --> 00:18:33,120
If the ace needs to collect data in quick view, that's a stealth app.

351
00:18:33,120 --> 00:18:34,120
Reads only?

352
00:18:34,120 --> 00:18:35,120
Good.

353
00:18:35,120 --> 00:18:36,120
Rights?

354
00:18:36,120 --> 00:18:40,400
It needs API design, AUTH, CSRF protection and support.

355
00:18:40,400 --> 00:18:46,280
Either move the right path to a power app or web app with proper ALM or block until a

356
00:18:46,280 --> 00:18:49,280
real app is scoped.

357
00:18:49,280 --> 00:18:51,560
Question five, what's the life cycle?

358
00:18:51,560 --> 00:18:56,000
If they can't give you start and end dates for content, a placement end date and a review

359
00:18:56,000 --> 00:18:57,960
cadence, block.

360
00:18:57,960 --> 00:19:03,400
Will keep it fresh is not a life cycle, require auto-expiring quarterly renewal.

361
00:19:03,400 --> 00:19:05,640
Question six, what's the deployment scope?

362
00:19:05,640 --> 00:19:09,000
If they ask for tenant-wide with no placement plan, block?

363
00:19:09,000 --> 00:19:13,040
Questions get scoped to define dashboards and slots via an allow list.

364
00:19:13,040 --> 00:19:15,520
No placement record, no deploy.

365
00:19:15,520 --> 00:19:21,000
Tenant-wide is earned after two stable releases, telemetry in place and an incident-free

366
00:19:21,000 --> 00:19:22,000
quarter.

367
00:19:22,000 --> 00:19:24,400
Question seven, what's the compliance posture?

368
00:19:24,400 --> 00:19:28,840
The content sensitivity label must be compatible with team surfaces.

369
00:19:28,840 --> 00:19:33,080
If HR wants highly confidential in a public dashboard, that's a no.

370
00:19:33,080 --> 00:19:35,640
Per view, DLP must cover the data source.

371
00:19:35,640 --> 00:19:40,440
After data, you need the data flow documented, the processor identified and a cache under

372
00:19:40,440 --> 00:19:41,440
your control.

373
00:19:41,440 --> 00:19:43,200
If any of that is missing, block.

374
00:19:43,200 --> 00:19:45,120
Question eight, what's the rollback plan?

375
00:19:45,120 --> 00:19:51,080
If the app can't fail safe, I'd render nothing on invalid label or contract mismatch.

376
00:19:51,080 --> 00:19:53,920
And the team doesn't have a versioned package ready, block.

377
00:19:53,920 --> 00:19:56,600
You're not deploying a trampoline without a net.

378
00:19:56,600 --> 00:19:59,640
Now the allow path, because sometimes the answer is yes.

379
00:19:59,640 --> 00:20:07,000
You allow when the app uses a standard contract, reads from govern storage, has two owners,

380
00:20:07,000 --> 00:20:14,200
is read only, has life cycle dates, is scoped by placement, passes label, DLP checks and

381
00:20:14,200 --> 00:20:15,680
has a rollback.

382
00:20:15,680 --> 00:20:22,640
Plus, CICD to the app catalog, no manual zip uploads and telemetry wired to your steward

383
00:20:22,640 --> 00:20:23,640
group.

384
00:20:23,640 --> 00:20:29,760
If all green ship it to dev, then test then a limited prod placement with a 30 day probation.

385
00:20:29,760 --> 00:20:34,560
Any render or policy violations over threshold auto pause, the placement.

386
00:20:34,560 --> 00:20:36,160
There's one more fork.

387
00:20:36,160 --> 00:20:42,040
Could this be a SharePoint hero slot, a Viva news card, or a power app tab instead?

388
00:20:42,040 --> 00:20:46,040
If a native surface exists that meets the need, default to that.

389
00:20:46,040 --> 00:20:51,760
Custom ACs are for format specialization, not for replacing first party features.

390
00:20:51,760 --> 00:20:58,800
If they insist, they must justify the delta, accessibility, performance, localization,

391
00:20:58,800 --> 00:21:01,320
analytics against native.

392
00:21:01,320 --> 00:21:04,160
Last check portfolio impact.

393
00:21:04,160 --> 00:21:09,920
If the new app duplicates an existing contract or competes for a critical slot during a busy

394
00:21:09,920 --> 00:21:11,640
window it waits.

395
00:21:11,640 --> 00:21:14,400
Scarsity is policy.

396
00:21:14,400 --> 00:21:19,040
Priority belongs to the highest impact governed content with owners who show up.

397
00:21:19,040 --> 00:21:23,000
You want less graveyard, not a bigger cemetery.

398
00:21:23,000 --> 00:21:25,560
The governance checklist you actually use.

399
00:21:25,560 --> 00:21:27,400
This isn't a 40 page policy.

400
00:21:27,400 --> 00:21:31,400
It's a clipboard you can run in 15 minutes and nobody argues with.

401
00:21:31,400 --> 00:21:32,560
Catalog and owners.

402
00:21:32,560 --> 00:21:35,800
Is the ace in your solution catalog with a unique ID?

403
00:21:35,800 --> 00:21:38,520
Does it list two owners, business and technical?

404
00:21:38,520 --> 00:21:40,360
Are they current entra mailboxes?

405
00:21:40,360 --> 00:21:43,560
If no to any pause placement, contract check?

406
00:21:43,560 --> 00:21:46,240
Does the AC bind to a standard contract?

407
00:21:46,240 --> 00:21:47,240
Announcement?

408
00:21:47,240 --> 00:21:56,080
A word event with required fields, ID, title, summary, start, end, label, template version,

409
00:21:56,080 --> 00:21:57,480
source system.

410
00:21:57,480 --> 00:22:02,760
If they say custom Jason, route to contract onboarding, source of truth.

411
00:22:02,760 --> 00:22:07,440
Is the data stored in governed share point or dataverse with sensitivity labels and retention

412
00:22:07,440 --> 00:22:08,440
on?

413
00:22:08,440 --> 00:22:11,440
Not a random team site, if not migrate or block.

414
00:22:11,440 --> 00:22:12,440
Read only verification.

415
00:22:12,440 --> 00:22:13,960
Does the ace only read?

416
00:22:13,960 --> 00:22:19,480
If it writes, where is the API, AUTH, CSRF protection and support plan?

417
00:22:19,480 --> 00:22:23,320
If missing, move writes to power apps or web app.

418
00:22:23,320 --> 00:22:24,320
Placement scope.

419
00:22:24,320 --> 00:22:28,920
Is there a placement record with site ID, slot, dates and contract version?

420
00:22:28,920 --> 00:22:30,680
No record, no render.

421
00:22:30,680 --> 00:22:32,400
Tenant wide is not the default.

422
00:22:32,400 --> 00:22:33,400
It's an outcome.

423
00:22:33,400 --> 00:22:34,720
Life cycle.

424
00:22:34,720 --> 00:22:38,240
Content has start and dates, placement has an expiry.

425
00:22:38,240 --> 00:22:40,800
App has a sunset unless renewed at QBR.

426
00:22:40,800 --> 00:22:46,960
Writerly archive moves expired content to read only storage, all three documented, compliance,

427
00:22:46,960 --> 00:22:49,920
purview label required and compatible with teams.

428
00:22:49,920 --> 00:22:52,520
DLP policy applied to the data store.

429
00:22:52,520 --> 00:22:55,240
External data has processor, flow diagram and governed cache.

430
00:22:55,240 --> 00:22:58,400
If any of that's guess work, you're not compliant.

431
00:22:58,400 --> 00:22:59,400
Telemetry.

432
00:22:59,400 --> 00:23:01,240
Application insights wired.

433
00:23:01,240 --> 00:23:02,240
Events.

434
00:23:02,240 --> 00:23:03,240
Render success.

435
00:23:03,240 --> 00:23:04,240
Fail.

436
00:23:04,240 --> 00:23:05,240
Empty data set.

437
00:23:05,240 --> 00:23:06,240
Contract mismatch.

438
00:23:06,240 --> 00:23:07,240
Blocked by policy.

439
00:23:07,240 --> 00:23:09,480
Alerts go to platform stewards.

440
00:23:09,480 --> 00:23:11,360
No telemetry, no production.

441
00:23:11,360 --> 00:23:19,040
CI, CD, repo, branch policies, automated build, app catalog deploy via pipeline.

442
00:23:19,040 --> 00:23:22,720
No manual zip uploads from a laptop named Steve.

443
00:23:22,720 --> 00:23:24,800
Scope deployment by allo list.

444
00:23:24,800 --> 00:23:27,640
Accessibility and localization.

445
00:23:27,640 --> 00:23:33,120
Does the card meet contrast, keyboard nav and localization strings?

446
00:23:33,120 --> 00:23:39,840
If this replaces a native card, justify the delta with measurable criteria.

447
00:23:39,840 --> 00:23:40,840
Rollback.

448
00:23:40,840 --> 00:23:44,800
Can the ace fail save to no content on label or contract mismatch?

449
00:23:44,800 --> 00:23:46,480
Is the prior version available?

450
00:23:46,480 --> 00:23:50,360
If not, you're one typo from a banner incident.

451
00:23:50,360 --> 00:23:51,680
Portfolio fit.

452
00:23:51,680 --> 00:23:55,480
Does it duplicate an existing contract or collide with a busy window?

453
00:23:55,480 --> 00:23:58,920
If yes, it waits, scarcity is policy.

454
00:23:58,920 --> 00:24:04,280
On this checklist at three points, intake, pre-prod and quarterly review.

455
00:24:04,280 --> 00:24:09,200
If you fail two items at any stage, pause the placement, onus fix it or the slot goes back

456
00:24:09,200 --> 00:24:10,440
to the pool.

457
00:24:10,440 --> 00:24:12,880
And yes, track time to green.

458
00:24:12,880 --> 00:24:15,320
Slow teams don't get premium slots.

459
00:24:15,320 --> 00:24:17,240
The one rule that saves you.

460
00:24:17,240 --> 00:24:19,080
Treat the ace as a skin.

461
00:24:19,080 --> 00:24:20,680
Everything else lives under governance.

462
00:24:20,680 --> 00:24:23,200
If you hold that line, three good things happen.

463
00:24:23,200 --> 00:24:28,680
First risk moves to places with guardrails, labels, retention, DLP environments.

464
00:24:28,680 --> 00:24:33,760
Second, the card stays disposable, so failures degrade gracefully.

465
00:24:33,760 --> 00:24:37,720
Third, you can scale because you're adding views, not inventing new systems.

466
00:24:37,720 --> 00:24:39,040
You'll get pressure to bend it.

467
00:24:39,040 --> 00:24:41,840
We just need a tiny submit in quick view.

468
00:24:41,840 --> 00:24:43,160
That's a right path.

469
00:24:43,160 --> 00:24:46,600
Redirect to a power app with ALM and policies.

470
00:24:46,600 --> 00:24:48,240
We'll paste Jason into a list.

471
00:24:48,240 --> 00:24:49,880
It's faster.

472
00:24:49,880 --> 00:24:51,040
That's schema drift.

473
00:24:51,040 --> 00:24:53,680
Redirect to the contract and ingestion flow.

474
00:24:53,680 --> 00:24:55,440
Can we go tenant-wide now?

475
00:24:55,440 --> 00:25:00,000
Not until telemetry proves stability and owner's past two reviews.

476
00:25:00,000 --> 00:25:03,080
Use this short test before every approval.

477
00:25:03,080 --> 00:25:08,560
Does the data exist in a governed store under a standard contract with labels and retention?

478
00:25:08,560 --> 00:25:11,080
And does the ace only read and render?

479
00:25:11,080 --> 00:25:12,320
If yes, green.

480
00:25:12,320 --> 00:25:13,880
If no, it's not a card.

481
00:25:13,880 --> 00:25:14,880
It's a project.

482
00:25:14,880 --> 00:25:17,480
Road it to the platform with a real backlog.

483
00:25:17,480 --> 00:25:18,680
Hold this line.

484
00:25:18,680 --> 00:25:20,680
And the dashboard stays clean.

485
00:25:20,680 --> 00:25:22,280
Break it once and congrats.

486
00:25:22,280 --> 00:25:24,400
You're running a museum gift shop.

487
00:25:24,400 --> 00:25:28,720
If you remember nothing else, the ace is just the skin.

488
00:25:28,720 --> 00:25:33,200
Govern the data, the owners, the placement and the life cycle underneath.

489
00:25:33,200 --> 00:25:34,200
Want the full kit?

490
00:25:34,200 --> 00:25:39,600
Grab my governance checklist, reference architecture diagram, and the block or allow decision tree

491
00:25:39,600 --> 00:25:41,160
in the next video.

492
00:25:41,160 --> 00:25:44,400
Subscribe so you can say no with receipts and ship fewer incidents.