Applies identically to whichever of the three apps above you deployed — only the app name in step 01 changes.
5.1 — What a domain name actually is. Computers address each other by IP address, not by name. A domain name is a lookup table entry: "when someone asks for notesapp.davidsdomain.com, tell them where to actually go." DNS (the Domain Name System) is that global lookup table, and Cloudflare, once your domain's nameservers point to it, is where you write the entries for your slice of it.
5.2 — Why Heroku hands you a name, not an address. Recall 1.4: dynos are containers that get destroyed and recreated. If Heroku gave you a fixed IP address to point at, that address would become invalid the moment your app's underlying infrastructure shifted — which happens often, invisibly, outside your control. Instead, Heroku gives you a hostname (ending in herokudns.com) that it keeps pointing at the correct address on its end, permanently. Your job is only to point your domain at that hostname, using a CNAME record — a DNS entry that means "this name is really just another name for that name," rather than a fixed address.
5.3 — Why the root domain is the awkward case. DNS technically forbids a CNAME on the bare root of a domain (davidsdomain.com with no subdomain) because a root position is also where other required records live, and the two can't coexist under the original spec. Cloudflare's answer is CNAME flattening: you write it as a CNAME in their dashboard, and Cloudflare quietly serves it to the internet as the record type that's actually legal at the root, while keeping it behaving like a CNAME. It's a workaround for a decades-old rule, not a special Heroku requirement.
5.4 — What TLS/SSL is actually encrypting. "HTTPS" means the connection between two specific points is encrypted — nothing more, nothing less. With Cloudflare sitting in front of your app, there are two hops: browser→Cloudflare, and Cloudflare→Heroku. "Flexible" SSL only encrypts the first hop and sends the second one in plain text — which causes real problems the moment your app itself insists on HTTPS (it sees a plain-text request arrive and redirects to HTTPS, Cloudflare re-requests the same way, and you get a loop). Full (strict) encrypts and verifies both hops, which works cleanly because Heroku already issues your app a real, auto-renewing certificate the instant you add a custom domain — there's nothing left unverified.
!
One more link back to Part One: add the new domain to ALLOWED_HOSTS (Django) or wherever your app checks the request host — 1.8's environment config, again. Django will otherwise refuse requests arriving under a hostname it wasn't told to expect.